wechatbot/handlers/group_msg_handler.go
2023-04-15 18:46:39 +08:00

102 lines
2.8 KiB
Go

package handlers
import (
"github.com/bujnlc8/wechatbot/config"
"log"
"strings"
"github.com/bujnlc8/wechatbot/gpt"
"github.com/eatmoreapple/openwechat"
)
var _ MessageHandlerInterface = (*GroupMessageHandler)(nil)
// GroupMessageHandler 群消息处理
type GroupMessageHandler struct {
}
// handle 处理消息
func (g *GroupMessageHandler) handle(msg *openwechat.Message) error {
bingWakeWord := config.LoadConfig().BingChatWakeWord
gptWakeWord := config.LoadConfig().GptChatWakeWord
if msg.IsText() {
return g.ReplyText(msg)
} else {
if strings.Contains(msg.Content, gptWakeWord) || strings.Contains(msg.Content, bingWakeWord) {
msg.ReplyText("目前我只支持文字哦~")
}
}
if msg.IsPaiYiPai() {
msg.ReplyText("我是机器人🤖️,会拍坏的哦~")
}
return nil
}
// NewGroupMessageHandler 创建群消息处理器
func NewGroupMessageHandler() MessageHandlerInterface {
return &GroupMessageHandler{}
}
// ReplyText 发送文本消息到群
func (g *GroupMessageHandler) ReplyText(msg *openwechat.Message) error {
sender, err := msg.Sender()
group := openwechat.Group{User: sender}
log.Printf("Received Group %v Text Msg : %v", group.NickName, msg.Content)
inGroup, _ := msg.SenderInGroup()
// 组合群名+用户名
userName := inGroup.UserName + group.UserName
bingWakeWord := config.LoadConfig().BingChatWakeWord
gptWakeWord := config.LoadConfig().GptChatWakeWord
// gpt上下文清理
if strings.EqualFold(msg.Content, config.LoadConfig().GptCleanContext) {
cleanReply, _ := gpt.CleanContext(userName)
msg.ReplyText(cleanReply)
}
// @GPTBot 或者 @bing的消息才处理
if !(strings.Contains(msg.Content, gptWakeWord) || strings.Contains(msg.Content, bingWakeWord)) {
return nil
}
requestText := strings.TrimSpace(strings.ReplaceAll(msg.Content, gptWakeWord, ""))
var reply = ""
if strings.Contains(msg.Content, bingWakeWord) {
requestText = strings.TrimSpace(strings.ReplaceAll(msg.Content, bingWakeWord, ""))
reply, err = gpt.BingSearch(requestText, userName)
if reply != "" && strings.HasPrefix(reply, "[") {
reply = "\n" + reply
}
} else {
reply, err = gpt.Completions(requestText, userName)
}
if err != nil {
log.Printf("gpt request error: %v \n", err)
msg.ReplyText("机器人神了,我一会发现了就去修。")
return err
}
if reply == "" {
msg.ReplyText("机器人响应为空")
return nil
}
// 获取@我的用户
groupSender, err := msg.SenderInGroup()
if err != nil {
log.Printf("get sender in group error :%v \n", err)
return err
}
// 回复@我的用户
reply = strings.TrimSpace(reply)
reply = strings.Trim(reply, "\n")
atText := "@" + groupSender.NickName
replyText := atText + " " + reply
_, err = msg.ReplyText(replyText)
if err != nil {
log.Printf("response group error: %v \n", err)
}
return err
}