示例#1
0
 async def websocket_handler(self, websocket, path):
     logger.debug("websocket_handler: {}, {}".format(
         websocket.remote_address, path))
     while True:
         try:
             data = await asyncio.wait_for(
                 websocket.recv(), timeout=GlobalObject().ws_timeout)
             logger.debug('websocketserver received {!r}'.format(data))
             # await websocket.send("hello")
             while data:  # 解决TCP粘包问题
                 data = await websocket.process_data(data, websocket)
         except asyncio.TimeoutError:
             logger.info("{} connection timeout!".format(
                 websocket.remote_address))
             await websocket.close()
         except ConnectionClosed as e:
             logger.info("{} connection lose ({}, {})".format(
                 websocket.remote_address, e.code, e.reason))
             return 0
         except DataException as e:
             logger.info("data decrypt error!")
             await websocket.close()
             return 0
示例#2
0
 async def schedule(self):
     # 定时rpc断线重连
     while True:
         await asyncio.sleep(3)
         # logger.info("start new schedule task~")
         # print("schedule:", RpcConnectionManager().type_dict, RpcConnectionManager().conns)
         for node_type, name_lst in RpcConnectionManager().type_dict.items(
         ):
             for name in name_lst:
                 if name not in RpcConnectionManager().conns.keys()\
                         or ConnectionStatus.ESTABLISHED != RpcConnectionManager().conns[name]["status"]:
                     host = RpcConnectionManager().conns[name]["host"]
                     port = RpcConnectionManager().conns[name]["port"]
                     try:
                         logger.debug("try to reconnect:{}".format(
                             [name, host, port]))
                         await self.loop.create_connection(RpcPushProtocol,
                                                           host=host,
                                                           port=port)
                         logger.info("success connect to {}:{}".format(
                             host, port))
                     except ConnectionRefusedError as e:
                         logger.error(
                             "schedule try connect to {}:{} failed!")
示例#3
0
    def execute(self, type_list=[SettleType.HU]):
        """
        执行结算
        :param params:  {settletype:[], settletype2:[,...], ...}
        :return:
        """
        logger.debug(u"执行结算: %s", str(type_list))
        for i in range(self.game_data.max_player_num):
            self.players[i].hand_card.handle_hand_card_for_settle_show()
            # 联合手牌,用于计算胡牌番型
            self.game_data.players[i].hand_card.union_hand_card()

        for t in type_list:
            if SettleType.GANG == t:
                self.settle_gang()
            elif SettleType.GEN_ZHUANG == t:
                self.settle_gen_zhuang()
            elif SettleType.HU == t:
                self.settle_hu()
            elif SettleType.DRAW == t:
                self.settle_draw()

        # 返回结算数据
        notify_settle_data(self.desk_id, self.game_data.settle_data)
示例#4
0
 def execute(self, seat_id, card_num=1, is_last=False):
     """
     执行摸牌
     :param seat_id:
     :param card_num:
     :param is_last:
     :return:
     """
     logger.debug(u"摸牌: %s", str([seat_id, card_num, is_last]))
     print("### sid=%s draw_card len=%s hand-card =%s ," %
           (seat_id, len(self.players[seat_id].hand_card.hand_card_vals),
            self.players[seat_id].hand_card.hand_card_vals))
     for step in self.game_config.draw_card_step:
         for name, cfg in step.items():
             ret = self.step_handlers.get(name)(seat_id=seat_id,
                                                card_num=card_num,
                                                is_last=is_last,
                                                config_params=cfg)
             if not ret:
                 logger.error("step:%s", step)
                 return
             elif ret != 1:
                 return 0
     return 1
示例#5
0
    def param_check(self, **kwargs):      # 参数验证
        act_params = kwargs.get("act_params")
        if 1 != len(act_params):
            # 同时只允许有一个玩家发生点杠操作
            logger.debug(u"act_diangang_error:%s", str(act_params))
            return

        seat_id = list(act_params.keys())[0]
        params = act_params[seat_id]

        card_val = self.game_data.last_chu_card_val

        if not card_val or -1 == self.game_data.last_chu_card_seat_id:
            logger.error("dian_gang params error: %s", str([seat_id, params]))
            return

        hand_card = self.players[seat_id].hand_card
        if 3 != hand_card.hand_card_info[Card.cal_card_type(card_val)][Card.cal_card_digit(card_val)]:
            logger.error("dian_gang params error: %s", str([seat_id, params]))
            return

        self.seat_id = seat_id
        self.hand_card = self.game_data.players[seat_id].hand_card
        return 1
示例#6
0
 def execute(self, act_params={}):
     """
     执行点炮胡牌
     :param act_params:
     :return:
     """
     logger.debug(u"点炮胡牌: %s", str(act_params))
     for seat_id, params in act_params.items():
         for step in self.game_config.player_act_step.get(Act.DIAN_HU):
             for name, cfg in step.items():
                 ret = self.step_handlers.get(name)(seat_id=seat_id,
                                                    params=params,
                                                    config_params=cfg)
                 if not ret:
                     logger.error("step:%s", step)
                     return
         if not self.game_config.has_tong_pao:
             # 如果不能通炮胡,则只取第一个胡牌的玩家
             break
     self.settle(settle_type_list=[SettleType.HU])
     if self.game_config.is_hu_end:
         # 当回合胡牌后结束当局游戏
         self.end_game()
     return 1
示例#7
0
    def param_check(self, **kwargs):      # 参数验证
        act_params = kwargs.get("act_params")
        if 1 != len(act_params):
            # 同时只允许有一个玩家发生出牌操作
            logger.debug(u"act_chu_error:%s", str(act_params))
            return

        seat_id = list(act_params.keys())[0]
        params = act_params[seat_id]

        card_val = params.get("card", None)
        if isinstance(card_val, list):
            card_val = card_val[0]
        if not card_val:
            logger.debug(u"chu_card error: card_val=%s", str(card_val))
            return
        if 1 > self.players[seat_id].hand_card.hand_card_info[Card.cal_card_type(card_val)][Card.cal_card_digit(card_val)]:
            logger.debug(u"chu_card error: not hava card %s", str([seat_id, params]))
            return

        self.seat_id = seat_id
        self.chu_cardval = card_val
        return 1
示例#8
0
 def connnection_lost(self, exc):
     logger.debug('server closed connection')
     RpcConnectionManager().lost_connection(self.host, self.port)
     super(RpcPushProtocol, self).connection_lost(exc)
示例#9
0
 def eof_received(self):
     logger.debug('rpc_push received EOF')
     if self.transport and self.transport.can_write_eof():
         self.transport.write_eof()
     RpcConnectionManager().lost_connection(self.host, self.port)
示例#10
0
 def data_received(self, data):
     logger.debug('rpc_push received response {}'.format(data))
     super().data_received(data)
示例#11
0
 async def send_message(self, command_id, message, session_id, to=None):
     logger.debug("rpc push:{}".format([message, type(message)]))
     data = self.pack(message, command_id, session_id, to)
     logger.debug("rpc_push send_message:{}".format([data, type(data)]))
     self.transport.write(data)
示例#12
0
 def store_connection(self, host, port, connect, status=ConnectionStatus.LOSE):
     logger.debug("store_connection:{}".format([host, port, connect]))
     self.conns[RpcConnectionManager.gen_node_name(host, port)] = {
         "status": status, "conn": connect, "host": host, "port": port}
示例#13
0
 def execute(self, call_func_type=CallbackFuncType.NOTHING, call_params={}):
     if call_func_type not in self.handler.keys():
         logger.debug(u"CallbackManager error: %s",
                      str([call_func_type, call_params]))
         return
     return self.handler.get(call_func_type)(call_params)
示例#14
0
 async def send_message(self, result, command_id):
     data = self.pack(result, command_id)
     logger.debug("send_message:{}".format([data, type(self), self]))
     await self.send(data)
示例#15
0
 def connection_lost(self, error):
     if error:
         logger.error('ERROR: {}'.format(error))
     else:
         logger.debug('closing')
     super().connection_lost(error)
示例#16
0
 def eof_received(self):
     logger.debug('received EOF')
     if self.transport.can_write_eof():
         self.transport.write_eof()
示例#17
0
 def data_received(self, data):
     logger.debug('rpcserver received {!r}'.format(data))
     super().data_received(data)
示例#18
0
 def connection_made(self, transport):
     self.transport = transport
     address = transport.get_extra_info('peername')
     logger.debug('connection accepted {}'.format(address))