Files

121 lines
3.4 KiB
Go
Raw Permalink Normal View History

2026-02-17 13:06:23 +08:00
package wxtask
import (
"regexp"
"strings"
"sync"
"time"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/db"
"xiawan/wx/protobuf/wechat"
"xiawan/wx/srv/wxface"
)
// WXRevokeTask 消息防撤回管理器
type WXRevokeTask struct {
wxConn wxface.IWXConnect
// 防撤回开关
bAvoidRevoke bool
// 读写数据的读写锁
revokeLock sync.RWMutex
}
// NewWXRevokeTask 新建消息防撤回任务管理器
func NewWXRevokeTask(wxConn wxface.IWXConnect) *WXRevokeTask {
return &WXRevokeTask{
wxConn: wxConn,
bAvoidRevoke: false,
}
}
// Start 开启防消息撤回任务
func (wxrt *WXRevokeTask) Start() {
}
// Stop 停止防消息撤回任务
func (wxrt *WXRevokeTask) Stop() {
}
// AddNewMsg 新增缓存消息
func (wxrt *WXRevokeTask) AddNewMsg(addMsg *wechat.AddMsg, uuid string) {
wxrt.revokeLock.Lock()
defer wxrt.revokeLock.Unlock()
_ = db.SaveMsg(*addMsg, uuid)
}
// OnRevokeMsg 某人移除了消息
func (wxrt *WXRevokeTask) OnRevokeMsg(revokeMsg baseinfo.RevokeMsg, groupWXID string, toGroupWXID string, uuid string) {
wxrt.revokeLock.Lock()
defer wxrt.revokeLock.Unlock()
// fmt.Printf("撤回消息:groupWXID %s\n", groupWXID)
currentReqInvoker := wxrt.wxConn.GetWXReqInvoker()
now := time.Now()
timeStr := now.Format("2006-01-02 15:04:05")
groupName := ""
if groupWXID != "" {
groupInfo, _, _ := currentReqInvoker.SendGetContactRequestForCache(groupWXID, true)
if groupInfo != nil {
groupName = groupInfo.GetNickName().GetStr()
}
}
if groupName != "" {
groupName = "【" + groupName + "】\n"
}
groupName = timeStr + "\n" + groupName
currentWXFileHelperMgr := wxrt.wxConn.GetWXFileHelperMgr()
tmpAddMsg := db.GetAndDeleteMsg(revokeMsg.NewMsgID, uuid)
if tmpAddMsg == nil {
return
}
strMsg := tmpAddMsg.GetContent().GetStr()
// fmt.Println("撤回消息 MsgType" + fmt.Sprintf("%d", tmpAddMsg.GetMsgType()))
if tmpAddMsg.GetMsgType() == 1 {
if groupWXID != "" && toGroupWXID == "" && strings.Contains(strMsg, ":") {
// 群聊,去掉第一个冒号之前的内容
strMsg = strings.Split(strMsg, ":")[1]
}
showMsg := groupName + revokeMsg.ReplaceMsg + ":" + strMsg
currentWXFileHelperMgr.AddNewTipMsg(showMsg)
}
if tmpAddMsg.GetMsgType() == baseinfo.MMAddMsgTypeRefer && strings.Contains(strMsg, "<type>57</type>") {
// 引用消息,只可能是文本
// <title>了解一下</title>
titleRegex := regexp.MustCompile(`<title>([\s\S]*?)<\/title>`)
match := titleRegex.FindStringSubmatch(strMsg)
if len(match) > 1 {
strMsg = match[1]
showMsg := groupName + revokeMsg.ReplaceMsg + ":" + strMsg
currentWXFileHelperMgr.AddNewTipMsg(showMsg)
}
}
// 图片消息
if tmpAddMsg.GetMsgType() == baseinfo.MMAddMsgTypeImage {
strMsgByte := []byte(strMsg)
showMsg := groupName + revokeMsg.ReplaceMsg + ":[图片]"
currentWXFileHelperMgr.AddNewTipMsg(showMsg)
currentWXFileHelperMgr.ForwardImageMsg(strMsgByte)
}
// 表情消息
if tmpAddMsg.GetMsgType() == baseinfo.MMAddMsgTypePic {
strMsgByte := []byte(strMsg)
showMsg := groupName + revokeMsg.ReplaceMsg + ":[表情]"
currentWXFileHelperMgr.AddNewTipMsg(showMsg)
currentWXFileHelperMgr.ForwardEmoticonMsg(strMsgByte)
}
}
// SetAvoidRevoke 设置是否防消息撤回
func (wxrt *WXRevokeTask) SetAvoidRevoke(bFlag bool) {
wxrt.bAvoidRevoke = bFlag
}
// IsAvoidRevoke 是否防消息撤回
func (wxrt *WXRevokeTask) IsAvoidRevoke() bool {
return wxrt.bAvoidRevoke
}