def sock_recv(self): data = super(ChatWorker, self).sock_recv() if not data: return data if self.first_receive: self.first_receive = False msg = PlayerSession() try: msg.ParseFromString(data) except: # 首次连接,可能是flash在请求安全认证 self.sock.sendall(xml) return ContinueFlag # 验证playersession if not verify_game_session(msg.uid, msg.session): # 断开连接 return None self.uid = msg.uid cid = r.get(rediskey.user_own_char(self.uid)) name, gender = r.hmget(rediskey.char(cid), 'name', 'gender') self.name = name.decode('utf-8') self.gender = int(gender) # 将自身添加入master的workers中 self.master.workers.add(msg.uid, self) msg = ChatInitializeResponse() msg.ret = 0 # 取私聊信息 private_msgs = r.lrange(rediskey.user_chat_msgs(self.uid), 0, -1) for pm in private_msgs: cm = msg.msgs.add() cm.MergeFromString(pm) r.delete(rediskey.user_chat_msgs(self.uid)) self.sendall(msg.SerializeToString()) return ContinueFlag msg = ChatMsg() try: msg.ParseFromString(data) except: # 断开连接 log.error("{0} Wrong Data, ChatMsg cannot parse it".format( self.address)) return None # client发送过来不用填充who,这里将其填充 msg.who.uid = self.uid msg.who.name = self.name msg.who.gender = self.gender data = msg.SerializeToString() if msg.channel == 1: # 私聊,填充to log.debug("{0} from {1}, to {2}: {3}".format( self.address, msg.who.uid, msg.to.uid, msg.text.encode('utf-8'))) cid = r.get(rediskey.user_own_char(msg.to.uid)) if not cid: # 没找到这个人 log.error("{0}, {1} chat to {2}, But can not find {2}".format( self.address, self.uid, msg.to.uid)) return None name, gender = r.hmget(rediskey.char(cid), 'name', 'gender') msg.to.name = name.decode('utf-8') msg.to.gender = int(gender) # 将消息发回去 self.sendall(msg.SerializeToString()) else: # 世界频道,限制发送速度 interval_result = self.check_interval() if interval_result is ContinueFlag: log.debug('{0} {1} speak too fast, ignore'.format( self.address, msg.who.uid)) return ContinueFlag log.debug("{0} from {1}, to all: {2}".format( self.address, msg.who.uid, msg.text.encode('utf-8'))) return data
def sock_recv(self): data = super(ChatWorker, self).sock_recv() if not data: return data if self.first_receive: self.first_receive = False msg = PlayerSession() try: msg.ParseFromString(data) except: # 首次连接,可能是flash在请求安全认证 self.sock.sendall(xml) return ContinueFlag # 验证playersession if not verify_game_session(msg.uid, msg.session): # 断开连接 return None self.uid = msg.uid cid = r.get(rediskey.user_own_char(self.uid)) name, gender = r.hmget(rediskey.char(cid), 'name', 'gender') self.name = name.decode('utf-8') self.gender = int(gender) # 将自身添加入master的workers中 self.master.workers.add(msg.uid, self) msg = ChatInitializeResponse() msg.ret = 0 # 取私聊信息 private_msgs = r.lrange(rediskey.user_chat_msgs(self.uid), 0, -1) for pm in private_msgs: cm = msg.msgs.add() cm.MergeFromString(pm) r.delete(rediskey.user_chat_msgs(self.uid)) self.sendall(msg.SerializeToString()) return ContinueFlag msg = ChatMsg() try: msg.ParseFromString(data) except: # 断开连接 log.error("{0} Wrong Data, ChatMsg cannot parse it".format(self.address)) return None # client发送过来不用填充who,这里将其填充 msg.who.uid = self.uid msg.who.name = self.name msg.who.gender = self.gender data = msg.SerializeToString() if msg.channel == 1: # 私聊,填充to log.debug("{0} from {1}, to {2}: {3}".format(self.address, msg.who.uid, msg.to.uid, msg.text.encode('utf-8'))) cid = r.get(rediskey.user_own_char(msg.to.uid)) if not cid: # 没找到这个人 log.error("{0}, {1} chat to {2}, But can not find {2}".format(self.address, self.uid, msg.to.uid)) return None name, gender = r.hmget(rediskey.char(cid), 'name', 'gender') msg.to.name = name.decode('utf-8') msg.to.gender = int(gender) # 将消息发回去 self.sendall(msg.SerializeToString()) else: # 世界频道,限制发送速度 interval_result = self.check_interval() if interval_result is ContinueFlag: log.debug('{0} {1} speak too fast, ignore'.format(self.address, msg.who.uid)) return ContinueFlag log.debug("{0} from {1}, to all: {2}".format(self.address, msg.who.uid, msg.text.encode('utf-8'))) return data
def save_private_msg(self, uid, msg): key = rediskey.user_chat_msgs(uid) length = r.rpush(key, msg) if length > PRIVATE_MSG_LIMIT: r.lpop(key)