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 } } }