Esempio n. 1
0
    def __init__(self, user_data_dir: Path):
        super().__init__()
        NetworkClient.__init__(self, user_data_dir.joinpath("network_client"), randovania.get_configuration())
        from randovania.gui.lib import common_qt_lib
        common_qt_lib.set_default_window_icon(self)

        if self.configuration.get("discord_client_id") is not None:
            self.discord = pypresence.AioClient(self.configuration["discord_client_id"])
            self.discord._events_on = False  # workaround for broken AioClient
        else:
            self.discord = None
def test_get_configuration_default(mock_get_data_path, tmpdir):
    # Setup
    mock_get_data_path.return_value = Path(tmpdir)

    # Run
    config = randovania.get_configuration()

    # Assert
    assert config == {
        "server_address": "http://127.0.0.1:5000",
        "socketio_path": "/socket.io",
    }
def test_get_configuration_file(mock_get_data_path, tmpdir):
    # Setup
    mock_get_data_path.return_value = Path(tmpdir)
    Path(tmpdir).joinpath("configuration.json").write_text('{"foo": 5}')

    # Run
    config = randovania.get_configuration()

    # Assert
    assert config == {
        "foo": 5,
    }
def apply_migrations():
    import playhouse.migrate
    import randovania
    from randovania.server import database

    randovania.setup_logging('DEBUG', None)

    configuration = randovania.get_configuration()
    database.db.init(configuration["server_config"]['database_path'])
    database.db.connect(reuse_if_open=True)
    migrator = playhouse.migrate.SqliteMigrator(database.db)

    with database.db.atomic():
        playhouse.migrate.migrate(
            migrator.rename_table("gamesession", "game_session"),
            migrator.rename_table("gamesessionmembership",
                                  "game_session_membership"),
            migrator.rename_table("gamesessionpreset", "game_session_preset"),
            migrator.rename_table("gamesessionteamaction",
                                  "game_session_team_action"),
            migrator.add_column("game_session", "dev_features",
                                database.GameSession.dev_features),
        )
Esempio n. 5
0
def run():
    configuration = randovania.get_configuration()["discord_bot"]

    client = RandovaniaBot(configuration)
    client.run(configuration["token"])
Esempio n. 6
0
def create_app():
    configuration = randovania.get_configuration()

    dictConfig({
        'version': 1,
        'formatters': {
            'default': {
                'format':
                '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
            }
        },
        'handlers': {
            'wsgi': {
                'class': 'logging.StreamHandler',
                'stream': 'ext://flask.logging.wsgi_errors_stream',
                'formatter': 'default'
            }
        },
        'root': {
            'level': 'INFO',
            'handlers': ['wsgi']
        }
    })

    app = flask.Flask(__name__)
    app.wsgi_app = werkzeug.middleware.proxy_fix.ProxyFix(app.wsgi_app,
                                                          x_proto=1,
                                                          x_prefix=1)
    app.config['SECRET_KEY'] = configuration["server_config"]["secret_key"]
    app.config["GUEST_KEY"] = configuration["guest_secret"].encode(
        "ascii") if "guest_secret" in configuration else None
    app.config["DISCORD_CLIENT_ID"] = configuration["discord_client_id"]
    app.config["DISCORD_CLIENT_SECRET"] = configuration["server_config"][
        "discord_client_secret"]
    app.config[
        "DISCORD_REDIRECT_URI"] = f'{configuration["server_address"]}/login_callback'
    app.config["FERNET_KEY"] = configuration["server_config"][
        "fernet_key"].encode("ascii")
    version_checking = ClientVersionCheck(
        configuration["server_config"]["client_version_checking"])

    database.db.init(configuration["server_config"]['database_path'])
    database.db.connect(reuse_if_open=True)
    database.db.create_tables(database.all_classes)

    sio = ServerApp(app)
    app.sio = sio
    game_session.setup_app(sio)
    user_session.setup_app(sio)

    connected_clients = sio.metrics.info(
        "connected_clients", "How many clients are connected right now.")
    connected_clients.set(0)

    @app.route("/")
    def index():
        return "ok"

    server_version = randovania.VERSION

    @sio.sio.server.on("connect")
    def connect(sid, environ):
        if "HTTP_X_RANDOVANIA_VERSION" not in environ:
            raise ConnectionRefusedError("unknown client version")

        client_app_version = environ["HTTP_X_RANDOVANIA_VERSION"]
        check_client_version(version_checking, client_app_version,
                             server_version)
        connected_clients.inc()

        forwarded_for = environ.get('HTTP_X_FORWARDED_FOR')
        app.logger.info(
            f"Client at {environ['REMOTE_ADDR']} ({forwarded_for}) with "
            f"version {client_app_version} connected.")

    @sio.sio.server.on("disconnect")
    def disconnect(sid):
        connected_clients.dec()
        sio_environ = sio.get_server().environ

        forwarded_for = sio_environ[sid].get('HTTP_X_FORWARDED_FOR')
        app.logger.info(
            f"Client at {sio_environ[sid]['REMOTE_ADDR']} ({forwarded_for}) disconnected."
        )

        session = sio.get_server().get_session(sid)
        if "user-id" in session:
            game_session.report_user_disconnected(sio, session["user-id"],
                                                  app.logger)

    return app
Esempio n. 7
0
def create_app():
    configuration = randovania.get_configuration()

    dictConfig({
        'version': 1,
        'formatters': {
            'default': {
                'format':
                '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
            }
        },
        'handlers': {
            'wsgi': {
                'class': 'logging.StreamHandler',
                'stream': 'ext://flask.logging.wsgi_errors_stream',
                'formatter': 'default'
            }
        },
        'root': {
            'level': 'INFO',
            'handlers': ['wsgi']
        }
    })

    app = flask.Flask(__name__)
    app.config['SECRET_KEY'] = configuration["server_config"]["secret_key"]
    app.config["GUEST_KEY"] = configuration["guest_secret"].encode(
        "ascii") if "guest_secret" in configuration else None
    app.config["DISCORD_CLIENT_ID"] = configuration["discord_client_id"]
    app.config["DISCORD_CLIENT_SECRET"] = configuration["server_config"][
        "discord_client_secret"]
    app.config[
        "DISCORD_REDIRECT_URI"] = "http://127.0.0.1:5000/callback/"  # Redirect URI.
    app.config["FERNET_KEY"] = configuration["server_config"][
        "fernet_key"].encode("ascii")

    database.db.init(configuration["server_config"]['database_path'])
    database.db.connect(reuse_if_open=True)
    database.db.create_tables(database.all_classes)

    sio = ServerApp(app)
    app.sio = sio
    game_session.setup_app(sio)
    user_session.setup_app(sio)

    connected_clients = sio.metrics.info(
        "connected_clients", "How many clients are connected right now.")
    connected_clients.set(0)

    @app.route("/")
    def index():
        return "ok"

    server_version = randovania.VERSION

    @sio.sio.server.on("connect")
    def connect(sid, environ):
        if "HTTP_X_RANDOVANIA_VERSION" not in environ:
            raise ConnectionRefusedError("unknown client version")

        client_app_version = environ["HTTP_X_RANDOVANIA_VERSION"]
        if server_version != client_app_version:
            raise ConnectionRefusedError(
                f"Incompatible client version '{client_app_version}', "
                f"expected '{server_version}'")

        connected_clients.set(len(sio.get_server().environ))
        app.logger.info(
            f"Client at {environ['REMOTE_ADDR']} with "
            f"version {client_app_version} connected, while server is {server_version}"
        )

    @sio.sio.server.on("disconnect")
    def disconnect(sid):
        sio_environ = sio.get_server().environ
        num_clients = len(sio_environ)
        if sid in sio_environ:
            num_clients -= 1
        connected_clients.set(num_clients)
        app.logger.info(
            f"Client at {sio_environ[sid]['REMOTE_ADDR']} disconnected.")

    return app
Esempio n. 8
0
def run():
    global configuration
    configuration = randovania.get_configuration()["discord_bot"]
    client.run(configuration["token"])
Esempio n. 9
0
 def __init__(self, user_data_dir: Path):
     super().__init__()
     NetworkClient.__init__(self, user_data_dir.joinpath("network_client"),
                            randovania.get_configuration())
     from randovania.gui.lib import common_qt_lib
     common_qt_lib.set_default_window_icon(self)