def user_input(self, tag, attachment=None, timeout=15, g=None, st=None): # Peer player, get his input from server g = g if g else Game.getgame() st = st if st else g.get_synctag() input = DataHolder() input.timeout = timeout input.player = self input.input = None input.tag = tag g.emit_event('user_input_start', input) input.input = Executive.server.gexpect('input_%s_%d' % (tag, st)) g.emit_event('user_input_finish', input) return input.input
def user_input(self, tag, attachment=None, timeout=15, g=None, st=None): g = g if g else Game.getgame() st = st if st else g.get_synctag() input = DataHolder() input.tag = tag input.input = None input.attachment = attachment input.timeout = timeout input.player = self class Break(Exception): pass cur_greenlet = gevent.getcurrent() def waiter_func(): rst = Executive.server.gexpect('input_%s_%d' % (tag, st)) cur_greenlet.kill(Break(), block=False) return rst try: tle = TimeLimitExceeded(timeout + 1) tle.start() waiter = gevent.spawn(waiter_func) g.emit_event('user_input_start', input) gevent.sleep(0) rst = g.emit_event('user_input', input) Executive.server.gwrite('input_%s_%d' % (tag, st), rst.input) except (Break, TimeLimitExceeded) as e: if isinstance(e, TimeLimitExceeded) and e is not tle: raise g.emit_event('user_input_timeout', input) rst = input except: waiter.kill() raise finally: tle.cancel() g.emit_event('user_input_finish', input) try: waiter.join() gevent.sleep(0) except Break: pass rst.input = waiter.get() g.emit_event('user_input_finish', input) return rst.input
def user_input(self, tag, attachment=None, timeout=15, g=None, st=None): g = g if g else Game.getgame() st = st if st else g.get_synctag() input = DataHolder() input.tag = tag input.input = None input.attachment = attachment input.timeout = timeout input.player = self class Break(Exception): pass cur_greenlet = gevent.getcurrent() def waiter_func(): rst = Executive.server.gexpect('input_%s_%d' % (tag, st)) cur_greenlet.kill(Break(), block=False) return rst try: tle = TimeLimitExceeded(timeout+1) tle.start() waiter = gevent.spawn(waiter_func) g.emit_event('user_input_start', input) gevent.sleep(0) rst = g.emit_event('user_input', input) Executive.server.gwrite('input_%s_%d' % (tag, st), rst.input) except (Break, TimeLimitExceeded) as e: if isinstance(e, TimeLimitExceeded) and e is not tle: raise g.emit_event('user_input_timeout', input) rst = input except: waiter.kill() raise finally: tle.cancel() g.emit_event('user_input_finish', input) try: waiter.join() gevent.sleep(0) except Break: pass rst.input = waiter.get() g.emit_event('user_input_finish', input) return rst.input
def user_input_any(self, tag, expects, attachment=None, timeout=15): g = Game.getgame() st = g.get_synctag() tagstr = 'inputany_%s_%d' % (tag, st) g.emit_event('user_input_any_begin', (self, tag, attachment)) input = DataHolder() input.tag = tag input.input = None input.attachment = attachment input.timeout = timeout input.player = g.me class Break(Exception): pass # ('Input: you are too late!') def waiter_func(): pid, data = Executive.server.gexpect(tagstr + '_resp') g.kill(Break(), block=False) return pid, data if isinstance(g.me, TheChosenOne) and g.me in self: try: waiter = gevent.spawn(waiter_func) tle = TimeLimitExceeded(timeout) tle.start() g.emit_event('user_input_start', input) rst = g.emit_event('user_input', input) Executive.server.gwrite(tagstr, rst.input) except (Break, TimeLimitExceeded) as e: if isinstance(e, TimeLimitExceeded) and e is not tle: raise g.emit_event('user_input_timeout', input) rst = input rst.input = None Executive.server.gwrite(tagstr, rst.input) except: waiter.kill() raise finally: tle.cancel() g.emit_event('user_input_finish', input) try: waiter.join() gevent.sleep(0) except Break: pass else: # none of my business, just wait for the result try: waiter = gevent.spawn(waiter_func) waiter.join() gevent.sleep(0) except Break: pass pid, data = waiter.get() g.emit_event('user_input_any_end', tag) if pid is None: return None, None p = g.player_fromid(pid) if not expects(p, data): raise GameError('WTF?! Server cheats!') return p, data