Example #1
0
def handle_gamer_info(engine: ClientEngine, signals: ClientSignal, **kwargs):
    gamers = parse_gamer_info_command(kwargs)
    if gamers is None:
        logger.warning('client.handle_gamer_info'
                       'gamers were not extracted from command body')
        return

    engine.update_gamers(gamers)
Example #2
0
def handle_common_chat(engine: ClientEngine, signals: ClientSignal, **kwargs):
    name, ID, content = parse_chat_command(kwargs)
    if name is None or content is None:
        logger.warning('client.handle_common_chat',
                       f'no name or content extracted: {name},{content}')
        return

    engine.add_chat_message(name, content)
Example #3
0
def handle_inform(engine: ClientEngine, signals: ClientSignal, **kwargs):
    try:
        # inform = extract_kwargs(kwargs, ('Content', 'content'), 'client.handlers.handle_inform')
        inform = parse_inform_command(kwargs)
        if inform is None:
            return

        engine.update_inform(inform)
    except Exception as e:
        logger.error('client.handlers.handle_inform', 'err: {}'.format(e))
Example #4
0
    def activate(self, socket_obj, id_, usrname):
        try:
            self.Signals = ClientSignal()
            self.init_slots()
            self.Engine = ClientEngine(self.Signals, socket_obj)
            self.Engine.set_gamer_name_id(id_, usrname)
            logger.info('client.activate', 'activating...')

            cmd, gamers = self.Engine.recv_cmd()
            while cmd != 'GamerInfo':
                time.sleep(1)  # 忽略其他指令
                cmd, gamers = self.Engine.recv_cmd()

            for gname, gscore in gamers['gamers']:
                self.Engine.add_gamer(gname)

            # 启动一个额外的线程用于background任务
            self.GameThread.start()
            self.Engine.show()

        except Exception as e:
            logger.critical('client.core.activate',
                            'Err when activate: {}'.format(e))
            raise e
Example #5
0
def handle_begin_paint(engine: ClientEngine, signals: ClientSignal, **kwargs):

    try:
        engine.Panel.set_painting(True)
        engine.Panel.State = 'painting'
        logger.info('client.handlers.handle_begin_paint',
                    'getting answer and hint')
        answer = engine.Panel.get_input_by_dialog('出题', '请输入谜底', '谜底不能为空',
                                                  True, lambda s: len(s) <= 20,
                                                  '谜底长度不能超过20个字符')
        hint = engine.Panel.get_input_by_dialog('出题', '请输入提示', '', False,
                                                lambda s: len(s) <= 20,
                                                '提示长度不能超过20个字符')

        logger.info('client.handlers.handle_begin_paint',
                    '谜题: {}, 提示: {}'.format(answer, hint))

        # engine.send_cmd(command=CMD_BEGIN_PAINT, answer=answer, hint=hint)
        engine.send_cmd(**make_make_puzzle_command(answer, hint))
        # 只有要画图的人才能看到设置面板
        engine.Panel.PaintPanel.set_setting_visible(True)

    except BaseException as e:
        logger.error('client.handlers.handle_begin_paint', 'err: {}'.format(e))
Example #6
0
class Client:
    def __init__(self):
        self.Engine = None
        self.Signals = None
        self.GameThread = GameThread(self)

    def init_slots(self):
        self.Signals.bind_exit_signal(self.exit)

    # 激活状态,登录成功后的状态
    # 主要做游戏开始前的前置准备工作
    def activate(self, socket_obj, id_, usrname):
        try:
            self.Signals = ClientSignal()
            self.init_slots()
            self.Engine = ClientEngine(self.Signals, socket_obj)
            self.Engine.set_gamer_name_id(id_, usrname)
            logger.info('client.activate', 'activating...')

            cmd, gamers = self.Engine.recv_cmd()
            while cmd != 'GamerInfo':
                time.sleep(1)  # 忽略其他指令
                cmd, gamers = self.Engine.recv_cmd()

            for gname, gscore in gamers['gamers']:
                self.Engine.add_gamer(gname)

            # 启动一个额外的线程用于background任务
            self.GameThread.start()
            self.Engine.show()

        except Exception as e:
            logger.critical('client.core.activate',
                            'Err when activate: {}'.format(e))
            raise e

    def wait_for_ready(self):
        while True:
            try:
                cmd, vals = self.Engine.recv_cmd()
                logger.debug('client.core.wait_for_ready',
                             'recv cmd: {}, {}'.format(cmd, vals))

                handler = get_handler(C_WAIT_FOR_READY_STATE, cmd)
                ret = handler(self.Engine, self.Signals, **vals)
                if ret is not None and check_game_is_begin(ret):
                    break
            except Exception as e:
                logger.error(
                    'client.core.activate',
                    'err when handling, cmd: {}, vals: {}, err: {}'.format(
                        cmd, vals, e))

        self.game()

    def game(self):
        while not self.Engine.GameEndFlag:
            try:
                cmd, vals = self.Engine.recv_cmd()

                logger.info('client.core.game', f'cmd: {cmd}, vals: {vals}')

                handler = get_handler(C_GAME_STATE, cmd)
                handler(self.Engine, self.Signals, **vals)

                logger.info('client.core.game', f'cmd: {cmd} executed')

            except BaseException as e:
                logger.error('client.core.game', 'err when game: {}'.format(e))

        self.exit()

    # 绑定的退出的回调函数
    def exit(self):
        self.GameThread.exit(0)
        sys.exit(0)
Example #7
0
def handle_end_game(engine: ClientEngine, signals: ClientSignal, **kwargs):
    engine.GameEndFlag = True