Example #1
0
    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
Example #2
0
    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
Example #3
0
 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)
Example #4
0
 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)