Ejemplo n.º 1
0
def setup_app(sio: ServerApp):
    sio.on("login_with_discord", login_with_discord)
    sio.on("login_with_guest", login_with_guest)
    sio.on("restore_user_session", restore_user_session)
    sio.on("logout", logout)

    @sio.app.route("/login")
    def browser_login_with_discord():
        return sio.discord.create_session()

    @sio.app.route("/login_callback")
    def browser_discord_login_callback():
        sio.discord.callback()
        discord_user = sio.discord.fetch_user()

        user: User = User.get(discord_id=discord_user.id)
        if user is None:
            return "Unknown user", 404

        return flask.redirect(flask.url_for("browser_me"))

    @sio.admin_route("/me")
    def browser_me(user: User):
        return f"Hello {user.name}. Admin? {user.admin}"
Ejemplo n.º 2
0
def setup_app(sio: ServerApp):
    sio.on("login_with_discord", login_with_discord)
    sio.on("login_with_guest", login_with_guest)
    sio.on("restore_user_session", restore_user_session)
    sio.on("logout", logout)
    sio.on("disconnect_game_session", disconnect_game_session)
Ejemplo n.º 3
0
def setup_app(sio: ServerApp):
    sio.on("list_game_sessions", list_game_sessions, with_header_check=True)
    sio.on("create_game_session", create_game_session, with_header_check=True)
    sio.on("join_game_session", join_game_session, with_header_check=True)
    sio.on("disconnect_game_session", disconnect_game_session)
    sio.on("game_session_request_update", game_session_request_update)
    sio.on("game_session_admin_session", game_session_admin_session)
    sio.on("game_session_admin_player", game_session_admin_player)
    sio.on("game_session_collect_locations", game_session_collect_locations)
    sio.on("game_session_self_update", game_session_self_update)

    @sio.admin_route("/sessions")
    def admin_sessions(user):
        paginated_query = flask_utils.PaginatedQuery(
            GameSession.select().order_by(GameSession.creation_date.desc()),
            paginate_by=20,
            check_bounds=True,
        )

        lines = []
        for session in paginated_query.get_object_list():
            lines.append(
                "<tr><td><a href='{}'>{}</a></td><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>"
                .format(
                    flask.url_for('admin_session', session_id=session.id),
                    session.name,
                    session.creator.name,
                    session.creation_date,
                    session.state,
                    len(session.players),
                ))

        page = paginated_query.get_page()
        previous = "Previous"
        if page > 1:
            previous = "<a href='{}'>Previous</a>".format(
                flask.url_for(".admin_sessions", page=page - 1))

        next_link = "Next"
        if page < paginated_query.get_page_count():
            next_link = "<a href='{}'>Next</a>".format(
                flask.url_for(".admin_sessions", page=page + 1))

        return (
            "<table border='1'>"
            "<tr><th>Name</th><th>Creator</th><th>Creation Date</th><th>State</th><th>Num Players</th></tr>"
            "{content}</table>Page {page} of {num_pages}. {previous} / {next}."
        ).format(
            content="".join(lines),
            page=page,
            num_pages=paginated_query.get_page_count(),
            previous=previous,
            next=next_link,
        )

    @sio.admin_route("/session/<session_id>")
    def admin_session(user, session_id):
        session: GameSession = GameSession.get_by_id(session_id)

        rows = []
        presets = session.all_presets

        for player in session.players:
            player = typing.cast(GameSessionMembership, player)
            if player.is_observer:
                rows.append([
                    player.effective_name,
                    "Observer",
                    "",
                ])
            else:
                preset = presets[player.row]
                db = default_database.resource_database_for(preset.game)

                inventory = []
                if player.inventory is not None:
                    try:
                        parsed_inventory: list[dict] = BinaryInventory.parse(
                            player.inventory)
                    except construct.ConstructError:
                        # Handle old format in an adhoc way
                        # TODO 4.3: remove this code and purge all old inventory from the server db
                        items_by_id: dict[int, ItemResourceInfo] = {
                            item.extra["item_id"]: item
                            for item in db.item
                        }
                        parsed_inventory = [{
                            "name":
                            items_by_id[item["index"]].short_name,
                            **item,
                        } for item in OldBinaryInventory.parse(
                            player.inventory)]

                    for item in parsed_inventory:
                        if item["amount"] + item["capacity"] > 0:
                            inventory.append("{} x{}/{}".format(
                                db.get_item(item["name"]).long_name,
                                item["amount"], item["capacity"]))

                rows.append([
                    player.effective_name,
                    preset.name,
                    ", ".join(inventory),
                ])

        header = ["Name", "Preset", "Inventory"]

        return "<table border='1'><tr>{}</tr>{}</table>".format(
            "".join(f"<th>{h}</th>" for h in header),
            "".join("<tr>{}</tr>".format("".join(f"<td>{h}</td>" for h in r))
                    for r in rows),
        )
Ejemplo n.º 4
0
def setup_app(sio: ServerApp):
    sio.on("list_game_sessions", list_game_sessions)
    sio.on("create_game_session", create_game_session)
    sio.on("join_game_session", join_game_session)
    sio.on("disconnect_game_session", disconnect_game_session)
    sio.on("game_session_request_update", game_session_request_update)
    sio.on("game_session_admin_session", game_session_admin_session)
    sio.on("game_session_admin_player", game_session_admin_player)
    sio.on("game_session_collect_locations", game_session_collect_locations)
    sio.on("game_session_request_pickups", game_session_request_pickups)
    sio.on("game_session_self_update", game_session_self_update)
Ejemplo n.º 5
0
def setup_app(sio: ServerApp):
    sio.on("list_game_sessions", list_game_sessions)
    sio.on("create_game_session", create_game_session)
    sio.on("join_game_session", join_game_session)
    sio.on("disconnect_game_session", disconnect_game_session)
    sio.on("game_session_request_update", game_session_request_update)
    sio.on("game_session_admin_session", game_session_admin_session)
    sio.on("game_session_admin_player", game_session_admin_player)
    sio.on("game_session_collect_locations", game_session_collect_locations)
    sio.on("game_session_request_pickups", game_session_request_pickups)
    sio.on("game_session_self_update", game_session_self_update)

    @sio.admin_route("/sessions")
    def admin_sessions(user):
        lines = []
        for session in GameSession.select().order_by(
                GameSession.creation_date):
            lines.append(
                "<tr><td><a href='{}'>{}</a></td><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>"
                .format(
                    flask.url_for('admin_session', session_id=session.id),
                    session.name,
                    session.creator.name,
                    session.creation_date,
                    session.state,
                    len(session.players),
                ))

        return (
            "<table border='1'>"
            "<tr><th>Name</th><th>Creator</th><th>Creation Date</th><th>State</th><th>Num Players</th></tr>"
            "{}</table>").format("".join(lines))

    @sio.admin_route("/session/<session_id>")
    def admin_session(user, session_id):
        session: GameSession = GameSession.get_by_id(session_id)

        rows = []
        presets = session.all_presets

        for player in session.players:
            player = typing.cast(GameSessionMembership, player)
            if player.is_observer:
                rows.append([
                    player.effective_name,
                    "Observer",
                    "",
                ])
            else:
                preset = presets[player.row]
                db = default_database.resource_database_for(preset.game)

                inventory = []
                for item in json.loads(player.inventory):
                    if item["amount"] + item["capacity"] > 0:
                        inventory.append("{} x{}/{}".format(
                            db.get_item(item["index"]).long_name,
                            item["amount"], item["capacity"]))

                rows.append([
                    player.effective_name,
                    preset.name,
                    ", ".join(inventory),
                ])

        header = ["Name", "Preset", "Inventory"]

        return "<table border='1'><tr>{}</tr>{}</table>".format(
            "".join(f"<th>{h}</th>" for h in header),
            "".join("<tr>{}</tr>".format("".join(f"<td>{h}</td>" for h in r))
                    for r in rows),
        )