151 lines
3.6 KiB
Go
151 lines
3.6 KiB
Go
package wxcore
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"time"
|
|
|
|
"xiawan/wx/api/req"
|
|
"xiawan/wx/clientsdk/baseinfo"
|
|
"xiawan/wx/srv/wxface"
|
|
|
|
"github.com/lunny/log"
|
|
)
|
|
|
|
// WXUSerMsgMgr WX用户消息管理器
|
|
type WXUSerMsgMgr struct {
|
|
wxConn wxface.IWXConnect
|
|
msgList chan *USerMsgItem
|
|
endChan chan bool
|
|
isStarted bool
|
|
}
|
|
|
|
// USerMsgItem MsgItem
|
|
type USerMsgItem struct {
|
|
TextMsg string
|
|
ImageData []byte
|
|
MsgType uint32
|
|
TOUserName string
|
|
}
|
|
|
|
// NewWXFileHelperMgr 新建用户消息管理器
|
|
func NewWXUSerMsgMgr(wxConn wxface.IWXConnect) *WXUSerMsgMgr {
|
|
return &WXUSerMsgMgr{
|
|
wxConn: wxConn,
|
|
msgList: make(chan *USerMsgItem, 100),
|
|
endChan: make(chan bool, 1),
|
|
isStarted: false,
|
|
}
|
|
}
|
|
|
|
// Start 开启
|
|
func (wxfhm *WXUSerMsgMgr) Start() {
|
|
if wxfhm.isStarted {
|
|
return
|
|
}
|
|
wxfhm.isStarted = true
|
|
go wxfhm.startDealMsg()
|
|
}
|
|
|
|
// Stop 关闭
|
|
func (wxfhm *WXUSerMsgMgr) Stop() {
|
|
wxfhm.endChan <- true
|
|
wxfhm.isStarted = false
|
|
}
|
|
|
|
// AddNewMsg 新增提示
|
|
func (wxfhm *WXUSerMsgMgr) AddNewTextMsg(newMsg, toUSerName string) {
|
|
if wxfhm.isStarted {
|
|
newMsgItem := &USerMsgItem{}
|
|
newMsgItem.TOUserName = toUSerName
|
|
newMsgItem.MsgType = 1
|
|
newMsgItem.TextMsg = newMsg
|
|
wxfhm.msgList <- newMsgItem
|
|
}
|
|
}
|
|
|
|
// AddImageMsg 新增图片消息
|
|
func (wxfhm *WXUSerMsgMgr) AddImageMsg(imgData []byte, toUSerName string) {
|
|
if wxfhm.isStarted {
|
|
newMsgItem := &USerMsgItem{}
|
|
newMsgItem.TOUserName = toUSerName
|
|
newMsgItem.MsgType = 2
|
|
newMsgItem.ImageData = imgData
|
|
wxfhm.msgList <- newMsgItem
|
|
}
|
|
}
|
|
|
|
// 转发图片
|
|
func (wxfhm *WXUSerMsgMgr) ForwardImageMsg(imgData []byte, toUSerName string) {
|
|
if wxfhm.isStarted {
|
|
newMsgItem := &USerMsgItem{}
|
|
newMsgItem.TOUserName = toUSerName
|
|
newMsgItem.MsgType = 3
|
|
newMsgItem.ImageData = imgData
|
|
wxfhm.msgList <- newMsgItem
|
|
}
|
|
}
|
|
|
|
// 转发表情
|
|
func (wxfhm *WXUSerMsgMgr) ForwardEmoticonMsg(imgData []byte, toUSerName string) {
|
|
if wxfhm.isStarted {
|
|
newMsgItem := &USerMsgItem{}
|
|
newMsgItem.TOUserName = toUSerName
|
|
newMsgItem.MsgType = 47
|
|
newMsgItem.ImageData = imgData
|
|
wxfhm.msgList <- newMsgItem
|
|
}
|
|
}
|
|
|
|
// 处理消息
|
|
func (wxfhm *WXUSerMsgMgr) startDealMsg() {
|
|
//处理异常
|
|
defer TryE("(wxfhm *WXUSerMsgMgr) startDealMsg()")
|
|
currentReqInvoker := wxfhm.wxConn.GetWXReqInvoker()
|
|
for {
|
|
// 最少1秒发送一次
|
|
time.Sleep(1 * time.Second)
|
|
select {
|
|
case newMsgItem := <-wxfhm.msgList:
|
|
if newMsgItem.MsgType == 1 {
|
|
// 文字
|
|
_, _ = currentReqInvoker.SendTextMsgRequest(newMsgItem.TOUserName, newMsgItem.TextMsg, []string{}, 1)
|
|
} else if newMsgItem.MsgType == 2 {
|
|
// 图片
|
|
_, _ = currentReqInvoker.SendCdnUploadImageReuqest(newMsgItem.ImageData, newMsgItem.TOUserName)
|
|
} 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
|
|
}
|
|
sendMsg := baseinfo.ForwardImageItem{
|
|
ToUserName: newMsgItem.TOUserName,
|
|
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
|
|
}
|
|
sendMsg := req.SendEmojiItem{
|
|
ToUserName: newMsgItem.TOUserName,
|
|
EmojiMd5: msg.Emoji.MD5,
|
|
EmojiSize: msg.Emoji.Len,
|
|
}
|
|
_, _ = currentReqInvoker.ForwardEmojiRequest(sendMsg.EmojiMd5, sendMsg.ToUserName, sendMsg.EmojiSize)
|
|
}
|
|
case <-wxfhm.endChan:
|
|
return
|
|
}
|
|
}
|
|
}
|