Merge pull request '🐛 修复AI插件会响应@所有人消息事件 #7' (#9) from dev into main

Reviewed-on: lxh/go-wxhelper#9
This commit is contained in:
李寻欢 2024-01-09 11:12:52 +08:00
commit 0c2010c348
2 changed files with 34 additions and 2 deletions

View File

@ -26,13 +26,13 @@ func Plugin() {
// 私聊指令消息 // 私聊指令消息
dispatcher.RegisterHandler(func(m *model.Message) bool { dispatcher.RegisterHandler(func(m *model.Message) bool {
// 私聊消息 或 群聊艾特机器人并且以/开头的消息 // 私聊消息 或 群聊艾特机器人并且以/开头的消息
return (m.IsPrivateText() || (m.IsAt() && m.CleanContentStartWith("/"))) && service.CheckIsEnableCommand(m.FromUser) return (m.IsPrivateText() || (m.IsAt() && !m.IsAtAll() && m.CleanContentStartWith("/"))) && service.CheckIsEnableCommand(m.FromUser)
}, plugins.Command) }, plugins.Command)
// AI消息插件 // AI消息插件
dispatcher.RegisterHandler(func(m *model.Message) bool { dispatcher.RegisterHandler(func(m *model.Message) bool {
// 群内@或者私聊文字消息 // 群内@或者私聊文字消息
return m.IsAt() || m.IsPrivateText() return m.IsAt() && !m.IsAtAll() || m.IsPrivateText()
}, plugins.AI) }, plugins.AI)
// 欢迎新成员 // 欢迎新成员

View File

@ -2,6 +2,7 @@ package model
import ( import (
"encoding/xml" "encoding/xml"
"github.com/duke-git/lancet/v2/slice"
"go-wechat/types" "go-wechat/types"
"regexp" "regexp"
"strings" "strings"
@ -31,6 +32,21 @@ type systemMsgDataXml struct {
Type string `xml:"type,attr"` Type string `xml:"type,attr"`
} }
// atMsgDataXml
// @description: 微信@消息的xml结构
type atMsgDataXml struct {
XMLName xml.Name `xml:"msgsource"`
Text string `xml:",chardata"`
AtUserList string `xml:"atuserlist"`
Silence string `xml:"silence"`
MemberCount string `xml:"membercount"`
Signature string `xml:"signature"`
TmpNode struct {
Text string `xml:",chardata"`
PublisherID string `xml:"publisher-id"`
} `xml:"tmp_node"`
}
// sysMsg // sysMsg
// @description: 消息主体 // @description: 消息主体
type sysMsg struct{} type sysMsg struct{}
@ -92,6 +108,22 @@ func (m Message) IsAt() bool {
return strings.HasSuffix(m.DisplayFullContent, "在群聊中@了你") return strings.HasSuffix(m.DisplayFullContent, "在群聊中@了你")
} }
// IsAtAll
// @description: 是否是At所有人的消息
// @receiver m
// @return bool
func (m Message) IsAtAll() bool {
// 解析raw里面的xml
var d atMsgDataXml
if err := xml.Unmarshal([]byte(m.Raw), &d); err != nil {
return false
}
// 转换@用户列表为数组
atUserList := strings.Split(d.AtUserList, ",")
// 判断是否包含@所有人
return slice.Contain(atUserList, "notify@all")
}
// IsPrivateText // IsPrivateText
// @description: 是否是私聊消息 // @description: 是否是私聊消息
// @receiver m // @receiver m