Skip to content

Commit 4ae412a

Browse files
committed
fix: 修复reply中at消息
1 parent acbb8af commit 4ae412a

File tree

7 files changed

+58
-14
lines changed

7 files changed

+58
-14
lines changed

README.MD

+5
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@
55
```bash
66
ChatGPT-API-server 8848 Alice
77
```
8+
9+
### 开发注意事项
10+
- 如果要在`Reply`类型的消息的开始部位加入`At`消息,需要加入两次才能生效。
11+
如:`sendingMessage.Elements = append(sendingMessage.Elements, at, reply, at, msgStr)`
12+
`sendingMessage.Elements = append(sendingMessage.Elements, reply, at, at, msgStr)`

internal/logic/chatGPT/chat_gpt.go

+16-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"context"
1111
"encoding/json"
1212
"fmt"
13+
"github.com/Mrs4s/MiraiGo/message"
1314
"io"
1415
"sync"
1516
"time"
@@ -27,7 +28,8 @@ const (
2728
groupRedisKeyFormat = "botAlice:chatGPT:group:%d" // 群聊的redis会话消息保存key
2829
privateRedisKeyFormat = "botAlice:chatGPT:private:%d" // 私聊的redis会话消息保存key
2930

30-
tryTimes = 2 // 最多尝试次数
31+
tryTimes = 10 // 最多尝试次数。半分钟刷新时间,是很正常的
32+
refreshTime = time.Second * 3 // 重试的等待时间
3133
)
3234

3335
var (
@@ -55,21 +57,28 @@ func init() {
5557
service.RegisterChatGPT(new_())
5658
}
5759

58-
func (s *sChatGPT) GroupChat(code int64, msg string) (string, error) {
60+
func (s *sChatGPT) GroupChat(groupMessage *message.GroupMessage, msg string) (string, error) {
61+
code := groupMessage.GroupCode
62+
replyMsg := message.NewReply(groupMessage)
5963
// 锁
64+
ch <- true
6065
if ok := mutex.TryLock(); !ok {
6166
// 有人正在使用
62-
sendMsg := utils.BuildTextMessage(fmt.Sprintf("有%d人正在使用chatGPT,稍后将为您重新调用~", len(ch)))
67+
sendMsg := utils.BuildTextMessage(fmt.Sprintf("有%d条消息在您之前使用chatGPT,稍后将为您重新调用~", len(ch)-1)).Append(replyMsg)
6368
global.Alice.SendGroupMessage(code, sendMsg)
6469
mutex.Lock()
70+
} else {
71+
// 发送消息表示已经接收到了请求
72+
sendMsg := message.NewSendingMessage()
73+
textMsg := message.NewText("让我想想呢🤔...") // 单独🤔 不支持reply消息,哈软!
74+
sendMsg.Elements = append(sendMsg.Elements, replyMsg, textMsg)
75+
global.Alice.SendGroupMessage(code, sendMsg)
6576
}
6677
defer func() {
6778
mutex.Unlock() // 解锁
6879
<-ch
6980
}()
7081

71-
ch <- true
72-
7382
return s.chat(consts.Group, code, msg)
7483
}
7584

@@ -95,11 +104,12 @@ func (s *sChatGPT) chat(type_ int, code int64, msg string) (string, error) {
95104
// 说明有错
96105
g.Log().Errorf(gctx.New(), err.Error())
97106
reTryCount++
107+
time.Sleep(refreshTime) // 等待页面刷新
98108
}
99109
if err != nil {
100110
return "", gerror.Wrapf(err, "发送聊天请求失败")
101111
}
102-
112+
103113
msgData.ConversationId = resp.ConversationId
104114
msgData.ParentId = resp.ResponseId
105115
err = s.saveMsgData(type_, code, *msgData)

internal/logic/groupMessageEvent/at_event.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@ func (s *groupMessageEventPerformer) atEvent(msg string) (bool, error) {
3232

3333
// callChatGPT 调用chatGPT
3434
func (s *groupMessageEventPerformer) callChatGPT(msg string) error {
35-
sendMsg := utils.BuildTextMessage("🤔")
36-
s.Client.SendGroupMessage(s.Event.GroupCode, sendMsg)
3735
// 开始调用chatGPT
38-
res, err := service.ChatGPT().GroupChat(s.Event.GroupCode, msg)
36+
res, err := service.ChatGPT().GroupChat(s.Event, msg)
3937
if err != nil {
4038
if gerror.Is(err, consts.ErrChatIsLocked) {
4139
// 因为有人正在聊天而失败
@@ -49,8 +47,9 @@ func (s *groupMessageEventPerformer) callChatGPT(msg string) error {
4947
}
5048
sendingMessage := message.NewSendingMessage()
5149
reply := message.NewReply(s.Event)
50+
at := message.NewAt(s.Event.Sender.Uin) // at并没有起效果qaq
5251
msgStr := message.NewText(res)
53-
sendingMessage.Elements = append(sendingMessage.Elements, reply, msgStr)
52+
sendingMessage.Elements = append(sendingMessage.Elements, at, reply, at, msgStr)
5453
s.Client.SendGroupMessage(s.Event.GroupCode, sendingMessage)
5554
return nil
5655
}

internal/logic/groupMessageEvent/strategy.go

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package groupMessageEvent
33
import (
44
"bot-Alice/internal/service"
55
"bot-Alice/internal/utils"
6-
76
"github.com/Mrs4s/MiraiGo/client"
87
"github.com/Mrs4s/MiraiGo/message"
98
"github.com/gogf/gf/v2/frame/g"

internal/service/chat_gpt.go

+5-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/utils/msg.go

+29-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,34 @@ func RemoveChat(msg string) string {
2525
// BuildTextMessage 构建发送文本信息
2626
func BuildTextMessage(msg string) *message.SendingMessage {
2727
sendingMessage := message.NewSendingMessage()
28-
sendingMessage.Elements = append(sendingMessage.Elements, message.NewText(msg))
28+
SendMsgAppends(sendingMessage, message.NewText(msg))
2929
return sendingMessage
3030
}
31+
32+
// SendMsgAppends 添加需要发送的消息
33+
func SendMsgAppends(sendMsg *message.SendingMessage, messages ...message.IMessageElement) {
34+
// 回复消息中,如果有at,需要at两次
35+
sendMsg.Elements = append(sendMsg.Elements, messages...)
36+
}
37+
38+
// RemoveReplyAt 在回复消息中移除多余的at
39+
func RemoveReplyAt(messages []message.IMessageElement) []message.IMessageElement {
40+
for index, msg := range messages {
41+
if msg.Type() == message.Reply {
42+
if index < 2 { // 由qq群聊发送的reply消息,reply是第三个元素。
43+
return messages
44+
}
45+
if messages[index-1].Type() == message.Text && messages[index-2].Type() == message.At {
46+
// 当reply的前两个元素分别人At和内容为" "的text元素时,进行移除
47+
textMsg := messages[index-1].(*message.TextElement)
48+
if textMsg.Content == " " {
49+
if index == 2 {
50+
return append(messages[2:])
51+
}
52+
return append(messages[:index-3], messages[index:]...)
53+
}
54+
}
55+
}
56+
}
57+
return messages
58+
}

main.go

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bot-Alice/internal/core"
55
_ "bot-Alice/internal/core"
66
_ "bot-Alice/internal/packed"
7-
87
"github.com/gogf/gf/v2/frame/g"
98
"github.com/gogf/gf/v2/os/gctx"
109
)

0 commit comments

Comments
 (0)