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)
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)
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))
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 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))
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)
def handle_end_game(engine: ClientEngine, signals: ClientSignal, **kwargs): engine.GameEndFlag = True