Files
wechat_ipad_pro/srv/wxcore/wxfilehelpermgr.go
2026-02-17 13:06:23 +08:00

166 lines
3.9 KiB
Go

package wxcore
import (
"encoding/xml"
"time"
"xiawan/wx/api/req"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/srv/wxface"
"github.com/lunny/log"
)
// WXFileHelperMgr 文件传输助手消息管理器
type WXFileHelperMgr struct {
wxConn wxface.IWXConnect
msgList chan *MsgItem
endChan chan bool
isStarted bool
}
// MsgItem MsgItem
type MsgItem struct {
TextMsg string
ImageData []byte
MsgType uint32
}
// NewWXFileHelperMgr 新建文件传输助手管理器
func NewWXFileHelperMgr(wxConn wxface.IWXConnect) *WXFileHelperMgr {
return &WXFileHelperMgr{
wxConn: wxConn,
msgList: make(chan *MsgItem, 100),
endChan: make(chan bool, 1),
isStarted: false,
}
}
// Start 开启
func (wxfhm *WXFileHelperMgr) Start() {
if wxfhm.isStarted {
return
}
wxfhm.isStarted = true
go wxfhm.startDealMsg()
}
// Stop 关闭
func (wxfhm *WXFileHelperMgr) Stop() {
wxfhm.isStarted = false
wxfhm.endChan <- true
wxfhm.isStarted = false
}
// AddNewTipMsg 新增提示
func (wxfhm *WXFileHelperMgr) AddNewTipMsg(newMsg string) {
if wxfhm.isStarted {
newMsgItem := &MsgItem{}
newMsgItem.MsgType = 1
newMsgItem.TextMsg = newMsg
wxfhm.msgList <- newMsgItem
}
}
// 新增名片消息 AddNewCardMsg
func (wxfhm *WXFileHelperMgr) AddNewCardMsg(newMsg string) {
if wxfhm.isStarted {
newMsgItem := &MsgItem{}
newMsgItem.MsgType = 42
newMsgItem.TextMsg = newMsg
wxfhm.msgList <- newMsgItem
}
}
// AddImageMsg 新增图片消息
func (wxfhm *WXFileHelperMgr) AddImageMsg(imgData []byte) {
if wxfhm.isStarted {
newMsgItem := &MsgItem{}
newMsgItem.MsgType = 2
newMsgItem.ImageData = imgData
wxfhm.msgList <- newMsgItem
}
}
// 转发图片
func (wxfhm *WXFileHelperMgr) ForwardImageMsg(imgData []byte) {
if wxfhm.isStarted {
newMsgItem := &MsgItem{}
newMsgItem.MsgType = 3
newMsgItem.ImageData = imgData
wxfhm.msgList <- newMsgItem
}
}
// 转发表情
func (wxfhm *WXFileHelperMgr) ForwardEmoticonMsg(imgData []byte) {
if wxfhm.isStarted {
newMsgItem := &MsgItem{}
newMsgItem.MsgType = 47
newMsgItem.ImageData = imgData
wxfhm.msgList <- newMsgItem
}
}
// 处理消息
func (wxfhm *WXFileHelperMgr) startDealMsg() {
defer TryE("(wxfhm *WXFileHelperMgr) startDealMsg()")
currentReqInvoker := wxfhm.wxConn.GetWXReqInvoker()
for {
// 最少1秒发送一次
time.Sleep(1 * time.Second)
select {
case newMsgItem := <-wxfhm.msgList:
if newMsgItem.MsgType == 1 {
// 文字
currentReqInvoker.SendTextMsgToFileHelperRequest(newMsgItem.TextMsg)
} else if newMsgItem.MsgType == 2 {
// 图片
currentReqInvoker.SendImageToFileHelper(newMsgItem.ImageData)
} else if newMsgItem.MsgType == 42 {
// 名片
// 发送消息
currentReqInvoker.SendCardMsgToFileHelperRequest(newMsgItem.TextMsg)
// currentReqInvoker.SendCardMsgToFileHelper(newMsgItem.TextMsg)
} else if newMsgItem.MsgType == 3 {
// 图片
var msg baseinfo.Msg3
err := xml.Unmarshal(newMsgItem.ImageData, &msg)
if err != nil {
log.Fatalf("Error parsing XML: %v", err)
return
}
if msg.Img.CdnThumbURL != "" {
sendMsg := baseinfo.ForwardImageItem{
ToUserName: baseinfo.FileHelperWXID,
AesKey: msg.Img.AESKey,
CdnMidImgUrl: msg.Img.CdnThumbURL,
CdnMidImgSize: msg.Img.CdnThumbLength,
CdnThumbImgSize: msg.Img.Length,
}
_, _ = currentReqInvoker.ForwardCdnImageRequest(sendMsg)
}
} else if newMsgItem.MsgType == 47 {
// 表情
var msg baseinfo.Msg47
err := xml.Unmarshal(newMsgItem.ImageData, &msg)
if err != nil {
log.Fatalf("Error parsing XML: %v", err)
return
}
if msg.Emoji.MD5 != "" {
sendMsg := req.SendEmojiItem{
ToUserName: baseinfo.FileHelperWXID,
EmojiMd5: msg.Emoji.MD5,
EmojiSize: msg.Emoji.Len,
}
_, _ = currentReqInvoker.ForwardEmojiRequest(sendMsg.EmojiMd5, sendMsg.ToUserName, sendMsg.EmojiSize)
}
}
case <-wxfhm.endChan:
return
}
}
}