99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
package wechat
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
|
||
"wechatbot/config"
|
||
"wechatbot/openai"
|
||
"wechatbot/utils"
|
||
|
||
"github.com/eatmoreapple/openwechat"
|
||
log "github.com/sirupsen/logrus"
|
||
)
|
||
|
||
var _ MessageHandlerInterface = (*GroupMessageHandler)(nil)
|
||
|
||
type GroupMessageHandler struct {
|
||
}
|
||
|
||
func (gmh *GroupMessageHandler) handle(msg *openwechat.Message) error {
|
||
if !msg.IsText() {
|
||
return nil
|
||
}
|
||
|
||
return gmh.ReplyText(msg)
|
||
}
|
||
|
||
func NewGroupMessageHandler() MessageHandlerInterface {
|
||
return &GroupMessageHandler{}
|
||
}
|
||
|
||
func (gmh *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)
|
||
|
||
wechat := config.GetWechatKeyword()
|
||
requestText := msg.Content
|
||
if wechat != nil {
|
||
content, key := utils.ContainsI(requestText, *wechat)
|
||
if len(key) == 0 {
|
||
return nil
|
||
}
|
||
|
||
splitItems := strings.Split(content, key)
|
||
if len(splitItems) < 2 {
|
||
return nil
|
||
}
|
||
|
||
requestText = strings.TrimSpace(splitItems[1])
|
||
}
|
||
|
||
log.Println("问题:", requestText)
|
||
reply, err := openai.Completions(requestText)
|
||
if err != nil {
|
||
log.Println(err)
|
||
if reply != nil {
|
||
result := *reply
|
||
// 如果文字超过4000个字会回错,截取前4000个文字进行回复
|
||
if len(result) > 4000 {
|
||
_, err = msg.ReplyText(result[:4000])
|
||
if err != nil {
|
||
log.Println("回复出错:", err.Error())
|
||
return err
|
||
}
|
||
}
|
||
}
|
||
|
||
text, err := msg.ReplyText(fmt.Sprintf("bot error: %s", err.Error()))
|
||
log.Println(text)
|
||
return err
|
||
}
|
||
|
||
// 如果在提问的时候没有包含?,AI会自动在开头补充个?看起来很奇怪
|
||
result := *reply
|
||
if strings.HasPrefix(result, "?") {
|
||
result = strings.Replace(result, "?", "", -1)
|
||
}
|
||
|
||
if strings.HasPrefix(result, "?") {
|
||
result = strings.Replace(result, "?", "", -1)
|
||
}
|
||
|
||
// 微信不支持markdown格式,所以把反引号直接去掉
|
||
if strings.Contains(result, "`") {
|
||
result = strings.Replace(result, "`", "", -1)
|
||
}
|
||
|
||
if reply != nil {
|
||
_, err = msg.ReplyText(*reply)
|
||
if err != nil {
|
||
log.Println(err)
|
||
}
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|