def testProphetInputlet(self): from game import autoenv autoenv.init('Server') from game.autoenv import user_input from gamepack.thb.inputlets import ProphetInputlet g, p = self.makeGame() cards = g.deck.getcards(5) c0, c1, c2, c3, c4 = cards ilet = ProphetInputlet(self, cards=cards) ilet.set_result([c2, c3, c1], [c0, c4]) eq_(ilet.data(), [[2, 3, 1], [0, 4]]) p.client.gdlist.append([r'>I:Prophet:\d+', [[2, 3, 1], [0, 4]]]) ilet = ProphetInputlet(self, cards=cards) eq_(user_input([p], ilet), [[c2, c3, c1], [c0, c4]]) p.client.gdlist.append([r'>I:Prophet:\d+', [[2, 3], [0, 4]]]) ilet = ProphetInputlet(self, cards=cards) eq_(user_input([p], ilet), [cards, []]) p.client.gdlist.append([r'>I:Prophet:\d+', [[2, 3, 1, 0], [0, 4]]]) ilet = ProphetInputlet(self, cards=cards) eq_(user_input([p], ilet), [cards, []]) p.client.gdlist.append([r'>I:Prophet:\d+', [[2, 3, 0], [0, 4]]]) ilet = ProphetInputlet(self, cards=cards) eq_(user_input([p], ilet), [cards, []])
def init(self): import options from UnityEngine import Debug L = lambda s: Debug.Log("PyWrap: " + s) L("init") self.events = [] # should set them options.no_update options.show_hidden_mode options.freeplay = False if options.no_update: import autoupdate autoupdate.Autoupdate = autoupdate.DummyAutoupdate L("before gevent") from gevent import monkey monkey.patch_socket() monkey.patch_os() monkey.patch_select() L("after gevent") from game import autoenv autoenv.init('Client') import thb.ui.ui_meta # noqa, init ui_meta from client.core.executive import Executive self.executive = ExecutiveWrapper(Executive, self)
def testChooseOptionInputlet(self): from game import autoenv from game.autoenv import user_input from client.core import TheChosenOne, PeerPlayer from thb.thb3v3 import THBattle from thb.inputlets import ChooseOptionInputlet from utils import BatchList autoenv.init('Server') g = THBattle() g.IS_DEBUG = True pl = [create_mock_player([]) for i in xrange(6)] p = pl[0] g.me = p p.client.gdlist.extend([ ['I:ChooseOption:1', True], ['I&:ChooseOption:2', False], ['I|:ChooseOption:3', True], ]) p.client.gdevent.set() g.players = BatchList(pl) hook_game(g) g.gr_groups = WeakSet() ilet = ChooseOptionInputlet(self, (False, True)) eq_(user_input([p], ilet), True) eq_(user_input([p], ilet, type='all'), {p: False}) eq_(user_input([p], ilet, type='any'), (p, True)) for p in pl: eq_(p.client.gdhistory, [ ['RI:ChooseOption:1', True], ['RI&:ChooseOption:2', False], ['RI|:ChooseOption:3', True], ]) autoenv.init('Client') g = THBattle() pl = [PeerPlayer() for i in xrange(6)] svr = MockConnection([ ['RI:ChooseOption:1', True], ['RI&:ChooseOption:2', False], ['RI|:ChooseOption:3', True], ]) p = TheChosenOne(svr) pl[0] = p g.me = p svr.gdevent.set() g.players = BatchList(pl) hook_game(g) assert autoenv.Game.getgame() is g ilet = ChooseOptionInputlet(self, (False, True)) eq_(user_input([p], ilet), True) eq_(user_input([p], ilet, type='all'), {p: False}) eq_(user_input([p], ilet, type='any'), (p, True))
def test_thb_import(self): from game import autoenv autoenv.init('Server') import gamepack.thb # import gamepack.thb.ui import gamepack.thb.cards import gamepack.thb.characters
def setUpClass(cls): import os try: os.unlink('/dev/shm/thbtest.sqlite3') except: pass import db.session db.session.init('sqlite:////dev/shm/thbtest.sqlite3') from game import autoenv autoenv.init('Server')
def start_server(): def _exit_handler(*a, **k): gevent.kill(MAIN, SystemExit) sig(signal.SIGTERM, _exit_handler) from game import autoenv import argparse parser = argparse.ArgumentParser(prog=sys.argv[0]) parser.add_argument('node', type=str) parser.add_argument('--host', default='0.0.0.0', type=str) parser.add_argument('--port', default=9999, type=int) parser.add_argument('--backdoor-host', default='127.0.0.1', type=str) parser.add_argument('--backdoor-port', default=19999, type=int) parser.add_argument('--no-backdoor', action='store_true') parser.add_argument('--freeplay', action='store_true') parser.add_argument('--log', default='INFO') parser.add_argument('--logfile', default='') parser.add_argument('--gidfile', default='') parser.add_argument('--credit-multiplier', type=float, default=1) parser.add_argument('--no-counting-flee', action='store_true') parser.add_argument('--archive-path', default='') parser.add_argument('--interconnect', action='store_true', default=False) parser.add_argument('--redis-url', default='redis://localhost:6379') parser.add_argument('--discuz-authkey', default='Proton rocks') parser.add_argument('--db', default='sqlite:////dev/shm/thb.sqlite3') options = parser.parse_args() import options as opmodule opmodule.options = options import db.session db.session.init('sqlite://' if options.freeplay else options.db) autoenv.init('Server') import settings utils.logging.init_server(getattr(logging, options.log.upper()), settings.SENTRY_DSN, settings.VERSION, options.logfile) if not options.no_backdoor: from gevent.backdoor import BackdoorServer gevent.spawn(BackdoorServer((options.backdoor_host, options.backdoor_port)).serve_forever) from server.core import Client root = logging.getLogger() root.info('=' * 20 + settings.VERSION + '=' * 20) server = StreamServer((options.host, options.port), Client.serve, None) server.serve_forever()
def start_server(): def _exit_handler(*a, **k): gevent.kill(MAIN, SystemExit) sig(signal.SIGTERM, _exit_handler) from game import autoenv import argparse parser = argparse.ArgumentParser(prog=sys.argv[0]) parser.add_argument('node', type=str) parser.add_argument('--host', default='0.0.0.0', type=str) parser.add_argument('--port', default=9999, type=int) parser.add_argument('--backdoor-host', default='127.0.0.1', type=str) parser.add_argument('--backdoor-port', default=19999, type=int) parser.add_argument('--no-backdoor', action='store_true') parser.add_argument('--freeplay', action='store_true') parser.add_argument('--log', default='INFO') parser.add_argument('--logfile', default='') parser.add_argument('--gidfile', default='') parser.add_argument('--credit-multiplier', type=float, default=1) parser.add_argument('--no-counting-flee', action='store_true') parser.add_argument('--archive-path', default='') parser.add_argument('--interconnect', action='store_true', default=False) parser.add_argument('--redis-url', default='redis://localhost:6379') parser.add_argument('--discuz-authkey', default='Proton rocks') parser.add_argument('--db', default='sqlite:////dev/shm/thb.sqlite3') options = parser.parse_args() import options as opmodule opmodule.options = options import db.session db.session.init(options.db) autoenv.init('Server') import settings utils.logging.init_server(getattr(logging, options.log.upper()), settings.SENTRY_DSN, settings.VERSION, options.logfile) if not options.no_backdoor: from gevent.backdoor import BackdoorServer gevent.spawn(BackdoorServer((options.backdoor_host, options.backdoor_port)).serve_forever) from server.core import Client root = logging.getLogger() root.info('=' * 20 + settings.VERSION + '=' * 20) server = StreamServer((options.host, options.port), Client.serve, None) server.serve_forever()
def main(): autoenv.init('Client') parser = argparse.ArgumentParser('log2thbrep') parser.add_argument('replay_file', help='Server side replay') parser.add_argument('client_version', help='Desired client version (git commit)') parser.add_argument('--freeplay', action='store_true', help='Use freeplay account module?') options = parser.parse_args() if options.replay_file.endswith('.gz'): data = gzip.open(options.replay_file, 'r').read() else: data = open(options.replay_file, 'r').read() data = data.decode('utf-8').split('\n') names = data.pop(0)[2:].split(', ') # Names data.pop(0) # Ver gid = int(data.pop(0).split()[-1]) # GameId data.pop(0) # Time game_mode, game_params, game_items, rnd_seed, usergdhist, gdhist = data gdhist = json.loads(gdhist) game_params = json.loads(game_params) rep = Replay() rep.client_version = options.client_version rep.game_mode = game_mode rep.game_params = game_params rep.game_items = json.loads(game_items) rep.users = [gen_fake_account(i, options.freeplay) for i in names] assert len(names) == len(gdhist), [names, len(gdhist)] for i, gd in enumerate(gdhist): fn = '%s_%s.thbrep' % (gid, i) with open(fn, 'w') as f: print 'Writing %s...' % fn rep.me_index = i rep.gamedata = gd f.write(rep.dumps())
def makeGame(self): from game import autoenv from thb.thb3v3 import THBattle from thb.cards import Deck, CardList from thb.characters.eirin import FirstAid, Medic from utils import BatchList autoenv.init('Server') g = THBattle() g.IS_DEBUG = True g.random = random hook_game(g) deck = Deck() g.deck = deck g.action_stack = [autoenv.Action(None, None)] g.gr_groups = WeakSet() pl = [create_mock_player([]) for i in xrange(6)] for p in pl: p.skills = [FirstAid, Medic] p.cards = CardList(p, 'cards') # Cards in hand p.showncards = CardList( p, 'showncard' ) # Cards which are shown to the others, treated as 'Cards in hand' p.equips = CardList(p, 'equips') # Equipments p.fatetell = CardList(p, 'fatetell') # Cards in the Fatetell Zone p.faiths = CardList(p, 'faiths') # Cards in the Fatetell Zone p.special = CardList(p, 'special') # used on special purpose p.showncardlists = [p.showncards, p.fatetell] p.tags = defaultdict(int) p.dead = False p = pl[0] p.client.gdevent.set() g.players = BatchList(pl) return g, p
def init(self): import options from UnityEngine import Debug L = lambda s: Debug.Log("PyWrap: " + s) L("init") self.events = [] # should set them options.no_update options.no_crashreport options.show_hidden_mode options.freeplay = False if options.no_update: import autoupdate autoupdate.Autoupdate = autoupdate.DummyAutoupdate L("before gevent") from gevent import monkey monkey.patch_socket() monkey.patch_os() monkey.patch_select() L("after gevent") from game import autoenv autoenv.init('Client') import gamepack.thb.ui.ui_meta # noqa, init ui_meta # For debug @gevent.spawn def beat(): while True: gevent.sleep(1) # self.events.append(("tick",)) from client.core.executive import Executive self.executive = ExecutiveWrapper(Executive, self)
def makeGame(self): from game import autoenv from thb.thb3v3 import THBattle from thb.cards import Deck, CardList from thb.characters.eirin import FirstAid, Medic from utils import BatchList autoenv.init('Server') g = THBattle() g.IS_DEBUG = True g.random = random hook_game(g) deck = Deck() g.deck = deck g.action_stack = [autoenv.Action(None, None)] g.gr_groups = WeakSet() pl = [create_mock_player([]) for i in xrange(6)] for p in pl: p.skills = [FirstAid, Medic] p.cards = CardList(p, 'cards') # Cards in hand p.showncards = CardList(p, 'showncard') # Cards which are shown to the others, treated as 'Cards in hand' p.equips = CardList(p, 'equips') # Equipments p.fatetell = CardList(p, 'fatetell') # Cards in the Fatetell Zone p.faiths = CardList(p, 'faiths') # Cards in the Fatetell Zone p.special = CardList(p, 'special') # used on special purpose p.showncardlists = [p.showncards, p.fatetell] p.tags = defaultdict(int) p.dead = False p = pl[0] p.client.gdevent.set() g.players = BatchList(pl) return g, p
def test_server_import(self): from game import autoenv autoenv.init('Server') import server.core
def start_client(): import ctypes try: ctypes.cdll.avbin # force avbin load except: pass import logging import os import argparse import utils.logging parser = argparse.ArgumentParser(prog=sys.argv[0]) parser.add_argument('--no-update', action='store_true') parser.add_argument('--with-gl-errcheck', action='store_true') parser.add_argument('--freeplay', action='store_true') parser.add_argument('--fastjoin', type=int, default=None) parser.add_argument('--dump-gameobj', action='store_true') parser.add_argument('--log', default='INFO') parser.add_argument('--color-log', action='store_true') parser.add_argument('--zoom', type=float, default=1.0) parser.add_argument('--show-hidden-modes', action='store_true') parser.add_argument('--multiple-instances', action='store_true') options = parser.parse_args() import options as opmodule opmodule.options = options IS_PROTON = hasattr(os, 'uname') and os.uname()[:2] == ('Linux', 'Proton') import settings utils.logging.init(options.log.upper(), settings.SENTRY_DSN, settings.VERSION, IS_PROTON or options.color_log) if options.no_update: import autoupdate autoupdate.Autoupdate = autoupdate.DummyAutoupdate log = logging.getLogger('start_client') if sys.platform.startswith('win32') and not options.multiple_instances: from utils.mutex import NamedMutex thb_mutex = NamedMutex('thbattle-mutex') if not thb_mutex.acquire(0): log.error('Multiple instances detected, exiting') ctypes.windll.user32.MessageBoxW( 0, u'请遵守社区规范,素质游戏,不要开启多个游戏实例!', u'东方符斗祭', 16, ) sys.exit(0) opmodule.mutex = thb_mutex else: opmodule.mutex = None from gevent import monkey monkey.patch_socket() monkey.patch_os() monkey.patch_select() monkey.patch_ssl() from game import autoenv autoenv.init('Client') import pyglet pyglet.options['shadow_window'] = False if not options.with_gl_errcheck: pyglet.options['debug_gl'] = False from pyglet.gl import gl_info if gl_info.get_renderer() == 'GDI Generic': ctypes.windll.user32.MessageBoxW( 0, u'你好像没有安装显卡驱动……?这样游戏是跑不起来的。快去安装!', u'需要显卡驱动', 16, ) sys.exit(0) if sys.platform.startswith('linux') and options.dump_gameobj: import atexit import game.base atexit.register(game.base.GameObjectMeta._dump_gameobject_hierarchy) atexit.register(game.base.EventHandler._dump_eh_dependency_graph) from client.ui.entry import start_ui # PIL compat from PIL import Image try: Image.frombytes Image.Image.tobytes except AttributeError: log.info('Patching PIL {from,to}bytes') Image.frombytes = Image.fromstring Image.Image.tobytes = Image.Image.tostring # ---------- try: start_ui() except KeyboardInterrupt: import pyglet pyglet.app.exit() raise except: import pyglet pyglet.app.exit() if options.fastjoin: import pdb pdb.post_mortem() log.exception(u'UI线程崩溃,正在报告bug,请稍等下……') from utils.stats import stats stats({'event': 'crash'}) raise
parser.add_argument('--freeplay', action='store_true') parser.add_argument('--log', default='INFO') parser.add_argument('--logfile', default='') parser.add_argument('--gidfile', default='') parser.add_argument('--archive-path', default='') parser.add_argument('--interconnect', action='store_true', default=False) parser.add_argument('--redis', default='localhost') parser.add_argument('--redis-port', default=6379) parser.add_argument('--member-service', default='localhost:7000') options = parser.parse_args() import options as opmodule opmodule.options = options autoenv.init('Server') import settings class ServerLogFormatter(logging.Formatter): def format(self, rec): if rec.exc_info: s = [] s.append('>>>>>>' + '-' * 74) s.append(self._format(rec)) import traceback s.append(u''.join( traceback.format_exception(*rec.exc_info)).strip()) s.append('<<<<<<' + '-' * 74)
def test_client_import(self): from game import autoenv autoenv.init('Client') import network import client.core
# -*- coding: utf-8 -*- # -- prioritized -- from game import autoenv autoenv.init("Server") # -- stdlib -- from argparse import ArgumentParser from weakref import WeakSet import gzip import json import logging import random import sys # -- third party -- from gevent.event import Event from gevent.queue import Queue import gevent # -- own -- from account.freeplay import Account from endpoint import EndpointDied from game import Gamedata from server.core import Player, NPCPlayer, NPCClient from utils import BatchList # -- code -- logging.basicConfig(stream=sys.stdout) logging.getLogger().setLevel(logging.DEBUG)
"feisuzhu.xen.prgmr.com", ] for host in domains: thread = ResolveIt(host) thread.daemon = True thread.start() from gevent import monkey monkey.patch_socket() from game import autoenv autoenv.init("Client") from client.core import Executive import pyglet pyglet.options["audio"] = ("directsound", "openal", "alsa", "silent") pyglet.options["shadow_window"] = False if not options.with_gl_errcheck: pyglet.options["debug_gl"] = False if sys.platform == "win32": from pyglet.media.drivers.directsound import DirectSoundAudioPlayer DirectSoundAudioPlayer._buffer_size = 44800 * 2
# -*- coding: utf-8 -*- # -- prioritized -- import sys sys.path.append('../src') from game import autoenv autoenv.init('Client') from game.autoenv import Game Game.CLIENT_SIDE = 'blah' # Hack: not loading ui resource # -- stdlib -- from argparse import ArgumentParser import gzip import json import logging import pdb # -- third party -- from colorlog import ColoredFormatter # -- own -- from account.freeplay import Account from client.core import PeerPlayer, TheLittleBrother from thb import modes from utils import BatchList, hook # -- code -- parser = ArgumentParser() parser.add_argument('replay_file', type=str) parser.add_argument('location', type=int) parser.add_argument('--catch', action='store_true', default=False)
def start_client(): import ctypes try: ctypes.cdll.avbin # force avbin load except: pass import logging import os import argparse import utils.logging parser = argparse.ArgumentParser(prog=sys.argv[0]) parser.add_argument('--no-update', action='store_true') parser.add_argument('--with-gl-errcheck', action='store_true') parser.add_argument('--freeplay', action='store_true') parser.add_argument('--fastjoin', action='store_true') parser.add_argument('--dump-gameobj', action='store_true') parser.add_argument('--log', default='INFO') parser.add_argument('--color-log', action='store_true') parser.add_argument('--show-hidden-modes', action='store_true') options = parser.parse_args() import options as opmodule opmodule.options = options IS_PROTON = hasattr(os, 'uname') and os.uname()[:2] == ('Linux', 'Proton') import settings utils.logging.init(options.log.upper(), settings.SENTRY_DSN, IS_PROTON or options.color_log) utils.logging.patch_gevent_hub_print_exception() if options.no_update: import autoupdate autoupdate.Autoupdate = autoupdate.DummyAutoupdate log = logging.getLogger('start_client') from gevent import monkey monkey.patch_socket() monkey.patch_os() monkey.patch_select() monkey.patch_ssl() from game import autoenv autoenv.init('Client') import pyglet pyglet.options['shadow_window'] = False if not options.with_gl_errcheck: pyglet.options['debug_gl'] = False from pyglet.gl import gl_info if gl_info.get_renderer() == 'GDI Generic': ctypes.windll.user32.MessageBoxW( 0, u'你好像没有安装显卡驱动……?这样游戏是跑不起来的。快去安装!', u'需要显卡驱动', 16, ) sys.exit(0) if sys.platform.startswith('linux') and options.dump_gameobj: import atexit import game atexit.register(game.GameObjectMeta._dump_gameobject_hierarchy) atexit.register(game.EventHandler._dump_eh_dependency_graph) from client.ui.entry import start_ui try: start_ui() except KeyboardInterrupt: import pyglet pyglet.app.exit() raise except: import pyglet pyglet.app.exit() if options.fastjoin: import pdb pdb.post_mortem() log.exception(u'UI线程崩溃,正在报告bug,请稍等下……') from utils.stats import stats stats({'event': 'crash'}) raise
def start_client(): import ctypes try: ctypes.cdll.avbin # force avbin load except: pass import logging import os import argparse import crashreport parser = argparse.ArgumentParser(prog=sys.argv[0]) parser.add_argument("--no-update", action="store_true") parser.add_argument("--with-gl-errcheck", action="store_true") parser.add_argument("--freeplay", action="store_true") parser.add_argument("--fastjoin", action="store_true") parser.add_argument("--dump-gameobj", action="store_true") parser.add_argument("--log", default="INFO") parser.add_argument("--color-log", action="store_true") parser.add_argument("--no-crashreport", action="store_true") parser.add_argument("--show-hidden-modes", action="store_true") options = parser.parse_args() import options as opmodule opmodule.options = options IS_PROTON = hasattr(os, "uname") and os.uname()[:2] == ("Linux", "Proton") crashreport.install_tee(options.log.upper()) if options.no_update: import autoupdate autoupdate.Autoupdate = autoupdate.DummyAutoupdate if IS_PROTON or options.color_log: from colorlog import ColoredFormatter formatter = ColoredFormatter( "%(log_color)s%(message)s%(reset)s", log_colors={"CRITICAL": "bold_red", "ERROR": "red", "WARNING": "yellow", "INFO": "green", "DEBUG": "blue"}, ) logging.getLogger().handlers[0].setFormatter(formatter) log = logging.getLogger("start_client") from gevent import monkey monkey.patch_socket() monkey.patch_os() monkey.patch_select() monkey.patch_ssl() from game import autoenv autoenv.init("Client") import pyglet pyglet.options["shadow_window"] = False if not options.with_gl_errcheck: pyglet.options["debug_gl"] = False from pyglet.gl import gl_info if gl_info.get_renderer() == "GDI Generic": ctypes.windll.user32.MessageBoxW(0, u"你好像没有安装显卡驱动……?这样游戏是跑不起来的。快去安装!", u"需要显卡驱动", 16) sys.exit(0) if sys.platform.startswith("linux") and options.dump_gameobj: import atexit import game atexit.register(game.GameObjectMeta._dump_gameobject_hierarchy) atexit.register(game.EventHandler._dump_eh_dependency_graph) from client.ui.entry import start_ui try: start_ui() except KeyboardInterrupt: import pyglet pyglet.app.exit() raise except: import pyglet pyglet.app.exit() if options.fastjoin: import pdb pdb.post_mortem() if not options.no_crashreport: log.error(u"游戏崩溃,正在报告bug,请稍等下……") from utils.stats import stats stats({"event": "crash"}) from crashreport import do_crashreport do_crashreport() raise
def start_server(): def _exit_handler(*a, **k): gevent.kill(MAIN, SystemExit) sig(signal.SIGTERM, _exit_handler) from game import autoenv import argparse parser = argparse.ArgumentParser(prog=sys.argv[0]) parser.add_argument('node', type=str) parser.add_argument('--host', default='0.0.0.0', type=str) parser.add_argument('--port', default=9999, type=int) parser.add_argument('--backdoor-host', default='127.0.0.1', type=str) parser.add_argument('--backdoor-port', default=19999, type=int) parser.add_argument('--no-backdoor', action='store_true') parser.add_argument('--freeplay', action='store_true') parser.add_argument('--log', default='INFO') parser.add_argument('--logfile', default='') parser.add_argument('--gidfile', default='') parser.add_argument('--credit-multiplier', type=float, default=1) parser.add_argument('--no-counting-flee', action='store_true') parser.add_argument('--archive-path', default='') parser.add_argument('--interconnect', action='store_true', default=False) parser.add_argument('--redis-url', default='redis://localhost:6379') parser.add_argument('--member-service', default='localhost:7000') options = parser.parse_args() import options as opmodule opmodule.options = options autoenv.init('Server') import settings class ServerLogFormatter(logging.Formatter): def format(self, rec): if rec.exc_info: s = [] s.append('>>>>>>' + '-' * 74) s.append(self._format(rec)) import traceback s.append(u''.join(traceback.format_exception(*rec.exc_info)).strip()) s.append('<<<<<<' + '-' * 74) return u'\n'.join(s) else: return self._format(rec) def _format(self, rec): from game.autoenv import Game import time try: g = Game.getgame() except: g = gevent.getcurrent() gr_name = getattr(g, 'gr_name', None) or repr(g) gr_name = 'MAIN' if g is MAIN else gr_name return u'[%s %s %s] %s' % ( rec.levelname[0], time.strftime('%y%m%d %H:%M:%S'), gr_name.decode('utf-8'), rec.msg % rec.args if isinstance(rec.msg, basestring) else repr((rec.msg, rec.args)), ) fmter = ServerLogFormatter() root = logging.getLogger() root.setLevel(getattr(logging, options.log.upper())) std = logging.StreamHandler(stream=sys.stdout) std.setFormatter(fmter) root.handlers = [] root.addHandler(std) if options.logfile: from logging.handlers import WatchedFileHandler filehdlr = WatchedFileHandler(options.logfile) filehdlr.setFormatter(fmter) root.addHandler(filehdlr) if not options.no_backdoor: from gevent.backdoor import BackdoorServer gevent.spawn(BackdoorServer((options.backdoor_host, options.backdoor_port)).serve_forever) from server.core import Client root.info('=' * 20 + settings.VERSION + '=' * 20) server = StreamServer((options.host, options.port), Client.spawn, None) server.serve_forever()
# -*- coding: utf-8 -*- # -- prioritized -- from game import autoenv autoenv.init('Server') # -- stdlib -- from argparse import ArgumentParser from weakref import WeakSet import gzip import json import logging import random import sys # -- third party -- from gevent.event import Event from gevent.queue import Queue import gevent # -- own -- from account.freeplay import Account from endpoint import EndpointDied from game import Gamedata from server.core import Player, NPCPlayer, NPCClient from utils import BatchList # -- code -- logging.basicConfig(stream=sys.stdout) logging.getLogger().setLevel(logging.DEBUG) log = logging.getLogger('ReplayServer')
def start_client(): import ctypes try: ctypes.cdll.avbin # force avbin load except: pass import logging import os import argparse import utils.logging parser = argparse.ArgumentParser(prog=sys.argv[0]) parser.add_argument('--no-update', action='store_true') parser.add_argument('--with-gl-errcheck', action='store_true') parser.add_argument('--freeplay', action='store_true') parser.add_argument('--fastjoin', type=int, default=None) parser.add_argument('--dump-gameobj', action='store_true') parser.add_argument('--log', default='INFO') parser.add_argument('--color-log', action='store_true') parser.add_argument('--zoom', type=float, default=1.0) parser.add_argument('--show-hidden-modes', action='store_true') options = parser.parse_args() import options as opmodule opmodule.options = options IS_PROTON = hasattr(os, 'uname') and os.uname()[:2] == ('Linux', 'Proton') import settings utils.logging.init(options.log.upper(), settings.SENTRY_DSN, settings.VERSION, IS_PROTON or options.color_log) if options.no_update: import autoupdate autoupdate.Autoupdate = autoupdate.DummyAutoupdate log = logging.getLogger('start_client') from gevent import monkey monkey.patch_socket() monkey.patch_os() monkey.patch_select() monkey.patch_ssl() from game import autoenv autoenv.init('Client') import pyglet pyglet.options['shadow_window'] = False if not options.with_gl_errcheck: pyglet.options['debug_gl'] = False from pyglet.gl import gl_info if gl_info.get_renderer() == 'GDI Generic': ctypes.windll.user32.MessageBoxW( 0, u'你好像没有安装显卡驱动……?这样游戏是跑不起来的。快去安装!', u'需要显卡驱动', 16, ) sys.exit(0) if sys.platform.startswith('linux') and options.dump_gameobj: import atexit import game.base atexit.register(game.base.GameObjectMeta._dump_gameobject_hierarchy) atexit.register(game.base.EventHandler._dump_eh_dependency_graph) from client.ui.entry import start_ui # PIL compat from PIL import Image try: Image.frombytes Image.Image.tobytes except AttributeError: log.info('Patching PIL {from,to}bytes') Image.frombytes = Image.fromstring Image.Image.tobytes = Image.Image.tostring # ---------- try: start_ui() except KeyboardInterrupt: import pyglet pyglet.app.exit() raise except: import pyglet pyglet.app.exit() if options.fastjoin: import pdb pdb.post_mortem() log.exception(u'UI线程崩溃,正在报告bug,请稍等下……') from utils.stats import stats stats({'event': 'crash'}) raise
def start_client(): import ctypes try: ctypes.cdll.avbin # force avbin load except: pass import logging import os import argparse import crashreport parser = argparse.ArgumentParser(prog=sys.argv[0]) parser.add_argument('--no-update', action='store_true') parser.add_argument('--with-gl-errcheck', action='store_true') parser.add_argument('--freeplay', action='store_true') parser.add_argument('--fastjoin', action='store_true') parser.add_argument('--dump-gameobj', action='store_true') parser.add_argument('--log', default='INFO') parser.add_argument('--color-log', action='store_true') parser.add_argument('--no-crashreport', action='store_true') parser.add_argument('--show-hidden-modes', action='store_true') options = parser.parse_args() import options as opmodule opmodule.options = options IS_PROTON = hasattr(os, 'uname') and os.uname()[:2] == ('Linux', 'Proton') crashreport.install_tee(options.log.upper()) if options.no_update: import autoupdate autoupdate.Autoupdate = autoupdate.DummyAutoupdate if IS_PROTON or options.color_log: from colorlog import ColoredFormatter formatter = ColoredFormatter("%(log_color)s%(message)s%(reset)s", log_colors={ 'CRITICAL': 'bold_red', 'ERROR': 'red', 'WARNING': 'yellow', 'INFO': 'green', 'DEBUG': 'blue', }) logging.getLogger().handlers[0].setFormatter(formatter) log = logging.getLogger('start_client') from gevent import monkey monkey.patch_socket() monkey.patch_os() monkey.patch_select() monkey.patch_ssl() from game import autoenv autoenv.init('Client') import pyglet pyglet.options['shadow_window'] = False if not options.with_gl_errcheck: pyglet.options['debug_gl'] = False from pyglet.gl import gl_info if gl_info.get_renderer() == 'GDI Generic': ctypes.windll.user32.MessageBoxW( 0, u'你好像没有安装显卡驱动……?这样游戏是跑不起来的。快去安装!', u'需要显卡驱动', 16, ) sys.exit(0) if sys.platform.startswith('linux') and options.dump_gameobj: import atexit import game atexit.register(game.GameObjectMeta._dump_gameobject_hierarchy) atexit.register(game.EventHandler._dump_eh_dependency_graph) from client.ui.entry import start_ui try: start_ui() except KeyboardInterrupt: import pyglet pyglet.app.exit() raise except: import pyglet pyglet.app.exit() if options.fastjoin: import pdb pdb.post_mortem() if not options.no_crashreport: log.error(u'游戏崩溃,正在报告bug,请稍等下……') from utils.stats import stats stats({'event': 'crash'}) from crashreport import do_crashreport do_crashreport() raise