package wxrouter import ( "bytes" "time" "xiawan/wx/clientsdk" "xiawan/wx/clientsdk/baseinfo" "xiawan/wx/clientsdk/baseutils" "xiawan/wx/db" "xiawan/wx/db/table" "xiawan/wx/protobuf/wechat" "xiawan/wx/srv/wxcore" "xiawan/wx/srv/wxface" "github.com/gogo/protobuf/proto" "github.com/lunny/log" ) // WXNewInitRouter 获取二维码响应路由 type WXNewInitRouter struct { wxcore.WXBaseRouter } // Handle 处理conn业务的方法 func (hbr *WXNewInitRouter) Handle(wxResp wxface.IWXResponse) error { currentWXConn := wxResp.GetWXConncet() currentWXAccount := currentWXConn.GetWXAccount() currentUserInfo := currentWXAccount.GetUserInfo() currentWXCache := currentWXConn.GetWXCache() // currentSyncMgr := currentWXConn.GetWXSyncMgr() // 同步响应 var initResp wechat.NewInitResponse err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &initResp) if err != nil { // 请求出问题了,判断是否掉线,并重连 time.Sleep(1 * time.Second) go currentWXConn.CheckOnLineStatusLogin() return err } // 跟新同步Key syncKey := initResp.GetCurrentSyncKey().GetBuffer() syncKeyMgr := currentUserInfo.SyncKeyMgr() syncKeyMgr.SetMaxKey(initResp.GetMaxSyncKey()) syncKeyMgr.SetMaxKey(initResp.GetCurrentSyncKey()) //保存SyncKey if len(currentUserInfo.SyncKey) <= 0 || !bytes.Equal(currentUserInfo.SyncKey, syncKey) { currentUserInfo.SyncKey = syncKey db.UpdateUserInfo(currentUserInfo) } if initResp.GetContinueFlag() <= 0 { if !currentWXCache.IsInitNewSyncFinished() { // 禁用历史消息推送,不设置初始化完成标志 currentWXCache.SetInitNewSyncFinished(true) } } // 如果没有同步到数据则返回 cmdList := initResp.GetCmdList() syncCount := initResp.GetCmdCount() //log.Info(initResp.GetContinueFlag()) //log.Info(initResp.GetContinueFlag(), syncCount) //redis 发布结构体 messageResp := new(table.SyncMessageResponse) // 遍历同步的信息和群 itemList := cmdList for index := uint32(0); index < syncCount; index++ { item := itemList[index] itemID := item.GetCmdId() // 同步到消息 if itemID == baseinfo.CmdIDAddMsg { print(currentWXCache.IsInitNewSyncFinished(), 111) if !currentWXCache.IsInitNewSyncFinished() { // fmt.Println("跳过初始化历史消息 - IsInitNewSyncFinished=false") continue } // fmt.Println("处理初始化消息 - IsInitNewSyncFinished=true") addMsg := &wechat.AddMsg{} err := proto.Unmarshal(item.CmdBuf.Data, addMsg) if err != nil { baseutils.PrintLog(err.Error()) continue } go dealAddMsgRun(currentWXConn, addMsg, "init") } // 同步到联系人 if itemID == baseinfo.CmdIDModContact { contact := new(wechat.ModContact) err := proto.Unmarshal(item.GetCmdBuf().GetData(), contact) if err != nil { continue } log.Info("dealModContact") // dealModContact(currentWXConn, contact) } // 删除联系人 if itemID == baseinfo.CmdIDDelContact { delContact := &wechat.DelContact{} err := proto.Unmarshal(item.CmdBuf.Data, delContact) if err != nil { continue } // go dealDelContact(currentWXConn, delContact.GetUserName().GetStr()) } messageResp.SetMessage(item.GetCmdBuf().GetData(), int32(itemID)) } //发布同步信息消息 _ = db.PublishSyncMsgWxMessage(currentWXAccount, *messageResp) // 如果数量超过10条则继续同步 if !currentWXCache.IsInitNewSyncFinished() { // currentSyncMgr.SendSyncInitRequest() } return nil }