def monkeypatch_runner(): # monkey patch for greenlet support # monkey.patch_all() - raising key error in Py 2.7.9 monkey.patch_socket() monkey.patch_dns() monkey.patch_ssl() monkey.patch_os()
def run(self): if settings.NEED_PATCH_SOCKET_SSL: # gevent.pywsgi启动 from gevent.monkey import patch_socket, patch_ssl patch_socket() # 在patch socket之后,如果使用https会出错,需要连ssl也patch掉 patch_ssl() if not settings.NEED_GEVENT_THREADPOOL: def sync(func, *args, **kwargs): return func(*args, **kwargs) self.async_execute = sync self._listen_sock = socket(family=AF_INET) self._listen_sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self._listen_sock.bind((settings.HOST, settings.PORT)) self._listen_sock.listen(2048) self._listen_sock.setblocking(0) if settings.WORKERS == 1: # 只有一个worker 启用单进程运行 self.serve_forever() else: self.fork_workers(settings.WORKERS or settings.CPUS + 1) self.parent_execute()
def __http_get(self, url): ret = re.search('https://', url) if ret: try: from gevent import monkey monkey.patch_ssl() import requests ret = requests.get(url=str(url), verify=False, timeout=10) status = [200, 301, 302, 404, 403] if ret.status_code in status: return public.returnMsg(True, '添加成功') else: return public.returnMsg(False, '%s访问失败' % url) except: return public.returnMsg(False, '%s访问失败' % url) else: try: if sys.version_info[0] == 2: import urllib2 rec = urllib2.urlopen(url, timeout=3) else: import urllib.request rec = urllib.request.urlopen(url, timeout=3) status = [200, 301, 302, 404, 403] if rec.getcode() in status: return True return False except: return False
def main(self): import gevent from gevent import monkey monkey.patch_socket() monkey.patch_ssl() # 加密 gevent.joinall( [gevent.spawn(self.run) for i in range(CONCURRENT_NUMBER)])
def patch_http(): logger = logging.getLogger(__name__) logger.info( "Warning! You'are patching socket with gevent, parallel http/https calling by requests is activated" ) from gevent import monkey monkey.patch_ssl() monkey.patch_socket()
def getUserInfo(self, oauth2Session, token_url, client_secret, code, getUrl): # 暫解(2016/9/28) ValueError: do_handshake_on_connect should not be specified for non-blocking sockets monkey.patch_socket() monkey.patch_ssl() oauth2Session.fetch_token(token_url=token_url, client_secret=client_secret, code=code) # FB api 改版後,要改格式才捉得到email , 各家可能會不一樣 if 'https://www.googleapis.com' in getUrl: getUser = oauth2Session.get(getUrl) elif 'https://graph.facebook' in getUrl: getUser = oauth2Session.get('%s%s' % (getUrl, 'fields=name,email')) else: getUser = oauth2Session.get(getUrl) return getUser
def __call__(self): context = self.context request = self.request response = request.response catalog = context.portal_catalog portal = api.portal.get() # alsoProvides(request, IDisableCSRFProtection) profiles = portal['members'].getChildNodes() end = DateTime() + 0.1 # If we have some clock skew peek a little to the future start = DateTime() - 0.6 created_date_range = {'query':(start,end), 'range':'min:max'} errCount = 0 sendOkCount = 0 for profile in profiles: try: if not getattr(profile, 'subscribe'): continue if not getattr(profile, 'traceKeywords'): continue email = self.validateEmail(profile.email) if not email: logger.error('Invalid Email Address: %s' % profile.email) continue result = [] noticeURLs = [] for keyword in profile.traceKeywords: brain = list(api.content.find(context=portal['recent'], created=created_date_range, Title=keyword, sort_on='pccOrgCode')) while brain: if brain[0].noticeURL in noticeURLs: brain.remove(brain[0]) continue result.append(brain[0]) noticeURLs.append(brain[0].noticeURL) brain.remove(brain[0]) count = 0 try: html = '<strong>目前共有 %s 筆符合的公告,您目前的追蹤關鍵字:</strong><p>%s</p>' % (len(result), ' / '.join(profile.traceKeywords).encode('utf-8')) except: html = '<strong>目前共有 %s 筆符合的公告,您目前的追蹤關鍵字:</strong><p>%s</p>' % (len(result), ' / '.join(profile.traceKeywords)) for item in result: html += '<li><a href=%s>%s</a></li>' % (item.getURL(), item.Title) count += 1 show = 100 if api.group.get(groupname='paid') in api.group.get_groups(username=profile.id) else 10 if count >= show: html += '<p><a href=%s/@@today_notice>更多符合的公告內容,請上網查看</a></p>' % portal.absolute_url() break mimeBody = MIMEText('%s' % html, 'html', 'utf-8') # monkey patch for ssl monkey.patch_socket() monkey.patch_ssl() api.portal.send_email(recipient=profile.email, sender='*****@*****.**', subject=u'%s您好,今日商機王-政府採購公告:%s' % (safe_unicode(profile.title), str(DateTime()).split()[0]), body='%s' % (mimeBody.as_string())) transaction.commit() sendOkCount += 1 logger.info('Send 完成, %s, %s' % (sendOkCount, profile.id)) except: errCount +=1 logger.error('寄送錯誤, errCount=%s, %s' % (errCount, profile.id)) continue return
def main_locust(): """ Performance test with locust: parse command line options and run commands. """ try: # monkey patch ssl at beginning to avoid RecursionError when running locust. from gevent import monkey monkey.patch_ssl() import multiprocessing import sys from httprunner import logger from httprunner import locusts except ImportError: msg = "Locust is not installed, install first and try again.\n" msg += "install command: pip install locustio" print(msg) exit(1) sys.argv[0] = 'locust' if len(sys.argv) == 1: sys.argv.extend(["-h"]) if sys.argv[1] in ["-h", "--help", "-V", "--version"]: locusts.start_locust_main() sys.exit(0) # set logging level if "-L" in sys.argv: loglevel_index = sys.argv.index('-L') + 1 elif "--loglevel" in sys.argv: loglevel_index = sys.argv.index('--loglevel') + 1 else: loglevel_index = None if loglevel_index and loglevel_index < len(sys.argv): loglevel = sys.argv[loglevel_index] else: # default loglevel = "WARNING" logger.setup_logger(loglevel) # get testcase file path try: if "-f" in sys.argv: testcase_index = sys.argv.index('-f') + 1 elif "--locustfile" in sys.argv: testcase_index = sys.argv.index('--locustfile') + 1 else: testcase_index = None assert testcase_index and testcase_index < len(sys.argv) except AssertionError: print("Testcase file is not specified, exit.") sys.exit(1) testcase_file_path = sys.argv[testcase_index] sys.argv[testcase_index] = locusts.parse_locustfile(testcase_file_path) if "--processes" in sys.argv: """ locusts -f locustfile.py --processes 4 """ if "--no-web" in sys.argv: logger.log_error( "conflict parameter args: --processes & --no-web. \nexit.") sys.exit(1) processes_index = sys.argv.index('--processes') processes_count_index = processes_index + 1 if processes_count_index >= len(sys.argv): """ do not specify processes count explicitly locusts -f locustfile.py --processes """ processes_count = multiprocessing.cpu_count() logger.log_warning( "processes count not specified, use {} by default.".format( processes_count)) else: try: """ locusts -f locustfile.py --processes 4 """ processes_count = int(sys.argv[processes_count_index]) sys.argv.pop(processes_count_index) except ValueError: """ locusts -f locustfile.py --processes -P 8888 """ processes_count = multiprocessing.cpu_count() logger.log_warning( "processes count not specified, use {} by default.".format( processes_count)) sys.argv.pop(processes_index) locusts.run_locusts_with_processes(sys.argv, processes_count) else: locusts.start_locust_main()
#!/usr/bin/env python import os import sys import json try: import gevent from gevent import monkey, pool; monkey.patch_socket(); monkey.patch_ssl() has_gevent = 1 except: has_gevent=0 import random import subprocess import requests try: import requests_cache; requests_cache.install_cache( expire_after=300) except: pass ENDPOINT = 'https://api.flickr.com/services/rest/' ERROR_NO_DOWNLOAD = -1 ERROR_WRONG_SIZE = -2 ERROR_WRONG_RATIO = -3 ERROR_PARSING = -4 ENV_APIKEY = 'APIKEY_FLICKR' def log(msg, verbose=True): if verbose:
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
from __future__ import absolute_import, division, print_function, unicode_literals # Monkey-patching modules individually can be about 20% faster, # or, in absolute terms, instead of 275 ms it may take 220 ms. from gevent.monkey import patch_builtins, patch_contextvars, patch_thread, patch_time, patch_os, patch_queue, patch_select, \ patch_selectors, patch_signal, patch_socket, patch_ssl, patch_subprocess, patch_sys # Note that the order of patching matters, just like in patch_all patch_os() patch_time() patch_thread() patch_sys() patch_socket() patch_select() patch_selectors() patch_ssl() patch_subprocess() patch_builtins() patch_signal() patch_queue() patch_contextvars() # stdlib import locale import logging import os import ssl import sys from logging.config import dictConfig # ConcurrentLogHandler - updates stlidb's logging config on import so this needs to stay
def main(): args = docopt(__doc__, version='zenfeed ' + VERSION) log_arg, log_level = args['--log'].rsplit(':', 1) if log_arg not in ('stderr', 'syslog'): setup_logger(type='file', filename=path(log_arg).abspath(), level=log_level) else: setup_logger(type=log_arg, level=log_level) logger.info('Zenfeed %s booting...', VERSION) if args['genstatic']: return genstatic(args['PATH']) port = int(args['--port']) cache_disabled = args['--no-cache'] path_prefix = args['--prefix'] if path_prefix.endswith('/'): path_prefix = path_prefix[:-1] if path_prefix and not path_prefix.startswith('/'): path_prefix = '/' + path_prefix fixed_language = args['--lang'] if fixed_language == 'browser': fixed_language = None else: logger.info('Language fixed to "%s"', fixed_language) if (fixed_language not in LANGUAGES and fixed_language.split('_', 1)[0] not in LANGUAGES): return logger.critical('Fixed language not supported !') fixed_timezone = args['--tz'] logger.info('Timezone fixed to "%s"', fixed_timezone) if fixed_timezone not in all_timezones: return logger.critical('Fixed timezone not supported !') db_uri = args['--database'] if db_uri == ':memory:': db_uri = 'sqlite://' elif not "://" in db_uri: db_uri = 'sqlite:///%s' % path(db_uri).abspath() import app as app_module app = app_module.create_flask_app(prefix=path_prefix) app.config.update( DEBUG=args['--debug'], SQL_DEBUG=False, SECRET_KEY=urandom(32), SQLALCHEMY_DATABASE_URI=db_uri, FAVICON_DIR=path(args['--favicons']).abspath(), FIXED_LANGUAGE=fixed_language, FIXED_TIMEZONE=fixed_timezone, CACHE_ENABLED=not cache_disabled, PATH_PREFIX=path_prefix, ) Cache(app) from models import setup_tables, Feed patch_socket() patch_ssl() setup_tables() from deadline_manager import deadlineManager import views from werkzeug.contrib.fixers import ProxyFix app.wsgi_app = ProxyFix(app.wsgi_app) feeds = Feed.query.all() deadlineManager.favicon_dir = path(args['--favicons']).abspath() deadlineManager.launch_deadline_workers(feeds) deadlineManager.start() logger.info("Server started at port %d (prefix: %s/)", port, path_prefix) if args['--debug']: logger.warning("DEBUG mode activated") app.run(host='0.0.0.0', port=port, debug=True) else: from gevent.wsgi import WSGIServer http_server = WSGIServer(('0.0.0.0', port), app) try: http_server.serve_forever() except KeyboardInterrupt: pass
def main(): args = docopt(__doc__, version='zenfeed ' + VERSION) log_arg, log_level = args['--log'].rsplit(':', 1) if log_arg not in ('stderr', 'syslog'): setup_logger(type='file', filename=path(log_arg).abspath(), level=log_level) else: setup_logger(type=log_arg, level=log_level) logger.info('Zenfeed %s booting...', VERSION) if args['genstatic']: return genstatic(args['PATH']) port = int(args['--port']) cache_disabled = args['--no-cache'] path_prefix = args['--prefix'] if path_prefix.endswith('/'): path_prefix = path_prefix[:-1] if path_prefix and not path_prefix.startswith('/'): path_prefix = '/' + path_prefix fixed_language = args['--lang'] if fixed_language == 'browser': fixed_language = None else: logger.info('Language fixed to "%s"', fixed_language) if (fixed_language not in LANGUAGES and fixed_language.split('_', 1)[0] not in LANGUAGES): return logger.critical('Fixed language not supported !') fixed_timezone = args['--tz'] logger.info('Timezone fixed to "%s"', fixed_timezone) if fixed_timezone not in all_timezones: return logger.critical('Fixed timezone not supported !') db_uri = args['--database'] if db_uri == ':memory:': db_uri = 'sqlite://' elif not "://" in db_uri: db_uri = 'sqlite:///%s' % path(db_uri).abspath() import app as app_module app = app_module.create_flask_app(prefix=path_prefix) app.config.update( DEBUG = args['--debug'], SQL_DEBUG = False, SECRET_KEY = urandom(32), SQLALCHEMY_DATABASE_URI = db_uri, FAVICON_DIR = path(args['--favicons']).abspath(), FIXED_LANGUAGE = fixed_language, FIXED_TIMEZONE = fixed_timezone, CACHE_ENABLED = not cache_disabled, PATH_PREFIX = path_prefix, ) Cache(app) from models import setup_tables, Feed patch_socket() patch_ssl() setup_tables() from deadline_manager import deadlineManager import views from werkzeug.contrib.fixers import ProxyFix app.wsgi_app = ProxyFix(app.wsgi_app) feeds = Feed.query.all() deadlineManager.favicon_dir = path(args['--favicons']).abspath() deadlineManager.launch_deadline_workers(feeds) deadlineManager.start() logger.info("Server started at port %d (prefix: %s/)", port, path_prefix) if args['--debug']: logger.warning("DEBUG mode activated") app.run(host='0.0.0.0', port=port, debug=True) else: from gevent.wsgi import WSGIServer http_server = WSGIServer(('0.0.0.0', port), app) try: http_server.serve_forever() except KeyboardInterrupt: pass
from gevent.monkey import patch_socket, patch_ssl; patch_socket(); patch_ssl() from aiohttp import ClientSession from datetime import datetime from logging import getLogger, Formatter, StreamHandler, FileHandler, DEBUG, ERROR from os import listdir from os.path import isfile, join from sys import stderr from traceback import print_exc from time import sleep from discord import ClientException from discord.ext.commands import Bot, when_mentioned_or from steam.enums import EResult from steam.client import SteamClient from steam import guard from Login_details import preferences, sensitive_details class AutoCord(Bot): def __init__(self): super().__init__(command_prefix=when_mentioned_or(preferences.command_prefix), case_insensitive=True, description='**tf2-autocord** is a Discord bot that manages your tf2automatic bot. As it ' 'sends your Steam messages through Discord by logging into to your Steam ' 'account, then it will then monitor Steam chat messages from tf2automatic then ' 'send them to your Discord bot.') async def on_connect(self): bot.dsdone = True async def setup(self, bot):
from gevent import monkey from gevent import socket monkey.patch_os() monkey.patch_socket() monkey.patch_ssl() import time import gogo_cfg cfg = gogo_cfg.gogo_cfg() timelimit = float(cfg.get("Socket", "timeout")) loop = float(cfg.get("Socket", "loop")) def Socket_Test(IP, Port = 443): STA = time.time() #============== #print "Start", IP try: for i in range(int(loop)): s = socket.socket() s.settimeout(timelimit) s.connect((IP, Port)) s.close() cost = time.time()-STA return True ,IP , cost/loop except socket.error: #raise s.close() return False, IP , 65536 #finally: #print "End", IP if __name__ == "__main__":
def run(self): from gevent.monkey import patch_socket, patch_ssl patch_socket() # 在patch socket之后,如果使用https会出错,需要连ssl也patch掉 patch_ssl() self._engine.run()
import socket print (socket.socket) print("After monkey patch") from gevent import monkey monkey.patch_socket() print(socket.socket) import select print(select.select) monkey.patch_select() print("After monkey patch") print(select.select) import ssl print(ssl) print("After monkey patch") monkey.patch_ssl(); print(ssl)
def initialize(): monkey.patch_socket() monkey.patch_ssl()
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 preHook(self): if self.kwargs.url.startswith('https'): monkey.patch_ssl()
# to fix requests's SSL infinite recursion bug, SSL must be # monkeypatched first, and only then requests can be imported # the bug occurs with Python3.6, requests=2.8.14 and gevent==1.2.2 from gevent import monkey monkey.patch_ssl() import requests # noqa from .client import (Client, HTTPClient, DefaultHTTPClient) from .header import (HTTPHeaders) __all__ = [Client, HTTPClient, DefaultHTTPClient, HTTPHeaders]
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
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