def leave_channel(self, msg): """ 离开临时会话.(一方退出即终结临时会话) :param msg: :return: """ debug("ChatSrv leave_channel", msg) user_id = msg.getParamInt('userId') target_user_id = msg.getParamInt('targetUserId') channel_key = _get_channel_key(user_id, target_user_id) if channel_key in self.channels: del self.channels[channel_key] debug("ChatSrv clean channel", channel_key) is_friend = _check_friend(user_id, target_user_id) if not is_friend: now = current_milli_time() msg_id = get_msg_id(user_id, target_user_id, now) content = ftstr.dumps({"code": "chat", "status": "leave_channel"}) system_message = ChatMessage(user_id, target_user_id, 7, now, content) self.service.save_record(user_id, target_user_id, msg_id, system_message) # 回应对方离线 self.write(target_user_id, user_id, msg_id, system_message) # TODO 清理临时聊天消息 ftcore.runOnceDelay(0.1, self.__do_leave_game_message,user_id, target_user_id) if channel_key in self.tmp_channels: del self.tmp_channels[channel_key] debug("ChatSrv clean temp channel", channel_key)
def clean_channel(self, user_id, target_user_id): """ 创建临时会话.(双方各发一条,创建临时会话,防止骚扰) :return: """ debug("ChatGameSrv do clean_channel", user_id, target_user_id) channel_key = _get_channel_key(user_id,target_user_id) if channel_key in self.tmp_channels: del self.tmp_channels[channel_key] debug("ChatSrv clean_channel", user_id, target_user_id)
def talk_message1(self, msg): """ 聊天消息. :param msg: userId,targetUserId,msgType,content,cid :return: msgId,ok """ debug("ChatSrv talk_message", msg) user_id = msg.getParamInt('userId') target_user_id = msg.getParamInt('targetUserId') msg_type = msg.getParamInt('msgType') content = msg.getParamStr('content') #客户端消息序号 sn = msg.getParamStr('sn') is_friend = _check_friend(user_id,target_user_id) debug("ChatSrv talk_message", user_id, target_user_id, msg_type, content, sn, is_friend) resp = MsgPack() resp.setCmd('chat') resp.setResult('action', 'send_message') try: msg_id, content, now = self.do_verify(msg) channel_key = _get_channel_key(user_id, target_user_id) if not is_friend and channel_key not in self.channels : # 临时会话已关闭,不允许发送消息 resp.setResult("status", "notFriend") else: obj = ftstr.loads(content) game_code = obj.get("code", "") if game_code == "" or game_code == "invite": info = { "time": now, "userId": user_id, "targetUserId": target_user_id, "msgType": msg_type, "content": content } else: # 游戏更新不更改初始来源 info = { "time": now, "userId": target_user_id, "targetUserId": user_id, "msgType": msg_type, "content": content } self.write(user_id,target_user_id,msg_id,info) self.service.save_record(user_id, target_user_id, msg_id, info) resp.setResult('sn', sn) resp.setResult('time', now) resp.setResult('msgId', msg_id) resp.setResult('status', "ok") except TYBizException, e: resp.setResult("status", "error") resp.setError(e.errorCode, e.message)
def talk_message(self, msg): """ 聊天消息. :param msg: userId,targetUserId,msgType,content,cid :return: msgId,ok """ debug("ChatSrv talk_message", msg) user_id = msg.getParamInt('userId') target_user_id = msg.getParamInt('targetUserId') msg_type = msg.getParamInt('msgType') content = msg.getParamStr('content') # 客户端消息序号 sn = msg.getParamStr('sn') is_friend = _check_friend(user_id, target_user_id) debug("ChatSrv talk_message", user_id, target_user_id, msg_type, content, sn, is_friend) resp = MsgPack() resp.setCmd('chat') resp.setResult('action', 'send_message') try: channel_key = _get_channel_key(user_id, target_user_id) if not is_friend and channel_key not in self.channels: # 临时会话已关闭,不允许发送消息 resp.setResult("status", "notFriend") else: game_obj = ftstr.loads(content) message_id = game_obj.get("msgId", "") if message_id: # 游戏应答 code = game_obj.get("code", "refuse") info = self.service.get_record(message_id) if info: chat_message = GameChatMessage.load_info(info) chat_message.code = code else: raise StrangerException() else: time = current_milli_time() message_id = get_msg_id(user_id,target_user_id,time) chat_message = ChatMessage(user_id,target_user_id,msg_type,time,content) self.write(user_id, target_user_id, message_id, chat_message) self.service.save_record(user_id, target_user_id, message_id, chat_message) resp.setResult('sn', sn) # resp.setResult('time', time) resp.setResult('msgId', message_id) resp.setResult('status', "ok") except TYBizException, e: resp.setResult("status", "error") resp.setError(e.errorCode, e.message)
def check_channel(self, msg): """ 检查通道是否存在. :param msg: :return: """ user_id = msg.getParamInt('userId') target_user_id = msg.getParamInt('targetUserId') channel_key = _get_channel_key(user_id, target_user_id) debug("ChatSrv check_channel", user_id, target_user_id) resp = MsgPack() resp.setCmd('chat') resp.setResult('action', 'check_channel') if channel_key in self.channels: resp.setResult('ok', 1) else: resp.setResult('ok', 0) tyrpcconn.sendToUser(user_id, resp)
def check_channel(self, user_id, target_user_id): """ 创建临时会话.(双方各发一条,创建临时会话,防止骚扰) :return: """ channel_key = _get_channel_key(user_id,target_user_id) debug("ChatGameSrv check_channel", channel_key, self.tmp_channels) if channel_key in self.tmp_channels: _ = self.tmp_channels[channel_key][0] if _ == user_id: now = self.tmp_channels[channel_key][1] msg_id = self.tmp_channels[channel_key][2] del self.tmp_channels[channel_key] debug("ChatGameSrv end_channel", user_id, target_user_id,now,msg_id) return True,now,msg_id now = current_milli_time() msg_id = get_msg_id(user_id, target_user_id, now) self.tmp_channels[channel_key] = [target_user_id,now,msg_id] debug("ChatGameSrv create_channel", user_id, target_user_id, now, msg_id) return False,now,msg_id
def create_channel(self, msg): """ 创建临时会话.(双方各发一条,创建临时会话,防止骚扰) :param msg: :return: """ debug("ChatSrv create_channel", msg) user_id = msg.getParamInt('userId') target_user_id = msg.getParamInt('targetUserId') is_friend = _check_friend(user_id, target_user_id) channel_key = _get_channel_key(user_id,target_user_id) #重用快速创建的通道 if channel_key not in self.channels: if channel_key in self.tmp_channels: _ = self.tmp_channels[channel_key][0] if _ == user_id : del self.tmp_channels[channel_key] channel_uuid = str(uuid.uuid1()) self.channels[channel_key] = channel_uuid debug("ChatSrv create_channel", user_id, target_user_id, channel_uuid) else: debug("ChatSrv create_channel again", user_id, target_user_id,self.tmp_channels[channel_key]) self.tmp_channels[channel_key] = [target_user_id] else: self.tmp_channels[channel_key] = [target_user_id] resp = MsgPack() resp.setCmd('chat') resp.setResult('action', 'create_channel') try: online_state = get_online_state(target_user_id) author_time,last_time = get_user_last_time(target_user_id) resp.setResult('userId', user_id) resp.setResult('targetUserId', target_user_id) resp.setResult('onlineState', online_state) resp.setResult('authorTime', author_time) resp.setResult('lastTime', last_time) resp.setResult('isFriend', is_friend) resp.setResult('status', "ok") except TYBizException, e: resp.setResult('status', "error") resp.setError(e.errorCode, e.message)