121 lines
3.4 KiB
Go
121 lines
3.4 KiB
Go
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
|
||
}
|