def handlePdu(self): if len(self._buffer) < 16: log.info('recv data error: {}, length: {}'.format( self._buffer, len(self._buffer))) return pdu = ImPdu() try: pdu.FromString(self._buffer) except Exception: log.info('=========> buffer is : [{}]'.format(self._buffer)) log.info(traceback.format_exc()) self._buffer = '' if pdu.command_id == CID_LOGIN_RES_USERLOGIN: self.handleLoginResponse(pdu) elif pdu.command_id == CID_BUDDY_LIST_RECENT_CONTACT_SESSION_RESPONSE: self.handleRecentContactSessionResponse(pdu) elif pdu.command_id == CID_BUDDY_LIST_USER_INFO_RESPONSE: self.hanledUserInfo(pdu) elif pdu.command_id == CID_MSG_DATA_ACK: self.handleSendMsg(pdu) elif pdu.command_id == CID_MSG_UNREAD_CNT_RESPONSE: self.handleUnreadCnt(pdu) elif pdu.command_id == CID_MSG_DATA: self.handleMsgData(pdu) elif pdu.command_id == CID_MSG_LIST_RESPONSE: self.handleListResponse(pdu) elif pdu.command_id == CID_OTHER_HEARTBEAT: self.handleHeartBeat(pdu) elif pdu.command_id == CID_MSG_READ_NOTIFY: self.handleReadNotify(pdu) else: log.info('Invalid command_id: {}'.format(pdu.command_id))
def _Logout(): logoutReq = Login_pb2.IMLogoutReq() logoutReq.Clear() pdu = ImPdu.ImPdu() pdu.setMsg(logoutReq.SerializeToString()) pdu.setServiceId(BaseDefine_pb2.SID_LOGIN) pdu.setCommandId(BaseDefine_pb2.CID_LOGIN_REQ_LOGINOUT) return pdu.SerializeToString()
def _Heartbeat(): hb = Other_pb2.IMHeartBeat() hb.Clear() pdu = ImPdu.ImPdu() pdu.setMsg(hb.SerializeToString()) pdu.setServiceId(BaseDefine_pb2.SID_OTHER) pdu.setCommandId(BaseDefine_pb2.CID_OTHER_HEARTBEAT) return pdu.SerializeToString()
def _pduProc(self, pduBuf): pdu = ImPdu.ImPdu() pdu.FromString(pduBuf) if self.pdu.command_id == BaseDefine_pb2.CID_LOGIN_RES_USERLOGIN: self._onLogin() elif self.pdu.command_id == BaseDefine_pb2.CID_LOGIN_KICK_USER: pass
def _UnreadMsgCntReq(user_id): req = Message_pb2.IMUnreadMsgCntReq() req.Clear() req.user_id = user_id pdu = ImPdu.ImPdu() pdu.setMsg(req.SerializeToString()) pdu.setServiceId(BaseDefine_pb2.SID_MSG) pdu.setCommandId(BaseDefine_pb2.CID_MSG_UNREAD_CNT_REQUEST) return pdu.SerializeToString()
def _ClientUserInfoRequest(user_id, user_id_list): req = Buddy_pb2.IMUsersInfoReq() req.Clear() req.user_id = user_id req.user_id_list.extend(user_id_list) pdu = ImPdu.ImPdu() pdu.setMsg(req.SerializeToString()) pdu.setServiceId(BaseDefine_pb2.SID_BUDDY_LIST) pdu.setCommandId(BaseDefine_pb2.CID_BUDDY_LIST_USER_INFO_REQUEST)
def _RecentContactSessionReq(user_id, last_update_time=0): req = Buddy_pb2.IMRecentContactSessionReq() req.Clear() req.user_id = user_id req.latest_update_time = last_update_time pdu = ImPdu.ImPdu() pdu.setMsg(req.SerializeToString()) pdu.setServiceId(BaseDefine_pb2.SID_BUDDY_LIST) pdu.setCommandId( BaseDefine_pb2.CID_BUDDY_LIST_RECENT_CONTACT_SESSION_REQUEST) return pdu.SerializeToString()
def recvData(self): pdu = ImPdu() try: pduheaderbuf = self._socket.recv(16) except Exception as e: if e.errno == errno.ECONNRESET: log.error('receive failed: {}'.format(traceback.format_exc())) self._connected = False else: if len(pduheaderbuf) != 16: log.error("read pdu len errror, len: {}".format( len(pduheaderbuf))) self._connected = False return try: pdu.FromString(pduheaderbuf) except Exception: log.error('unpack pdu length error: {}'.format( traceback.format_exc())) else: buf = self._socket.recv(pdu.length - 16) self._buffer = pduheaderbuf self._buffer += buf self.handlePdu()
def _MsgReadAck(from_user_id, session_id, msg_id, session_type=BaseDefine_pb2.SESSION_TYPE_SINGLE): log.debug('_MsgReadAck, from: {}, to: {}, msg_id: {}'.format( from_user_id, session_id, msg_id)) req = Message_pb2.IMMsgDataReadAck() req.Clear() req.user_id = from_user_id req.session_id = session_id req.session_type = session_type req.msg_id = msg_id pdu = ImPdu.ImPdu() pdu.setMsg(req.SerializeToString()) pdu.setServiceId(BaseDefine_pb2.SID_MSG) pdu.setCommandId(BaseDefine_pb2.CID_MSG_READ_ACK) return pdu.SerializeToString()
def _MsgData(from_user_id, to_user_id, msg_data, msg_type=BaseDefine_pb2.MSG_TYPE_SINGLE_TEXT): log.info('_MsgData, from {} -> {}'.format(from_user_id, to_user_id)) req = Message_pb2.IMMsgData() req.Clear() req.msg_data = msg_data req.from_user_id = from_user_id req.to_session_id = to_user_id req.msg_id = 0 req.msg_type = msg_type req.create_time = int(time.time()) pdu = ImPdu.ImPdu() pdu.setMsg(req.SerializeToString()) pdu.setServiceId(BaseDefine_pb2.SID_MSG) pdu.setCommandId(BaseDefine_pb2.CID_MSG_DATA) return pdu.SerializeToString()
def _Login(username, password, client_type=BaseDefine_pb2.CLIENT_TYPE_IOS): loginReq = Login_pb2.IMLoginReq() loginReq.Clear() pdu = ImPdu.ImPdu() try: loginReq.user_name = username loginReq.password = password loginReq.online_status = BaseDefine_pb2.USER_STATUS_ONLINE loginReq.client_type = client_type loginReq.SerializeToString() loginReq.client_version = 'v1.1.0' except Exception as e: print traceback.format_exc() raise e else: pdu.setMsg(loginReq.SerializeToString()) pdu.setServiceId(BaseDefine_pb2.SID_LOGIN) pdu.setCommandId(BaseDefine_pb2.CID_LOGIN_REQ_USERLOGIN) return pdu.SerializeToString()