示例#1
0
    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),
        )
示例#2
0
def game_session_request_update(sio: ServerApp, session_id: int):
    current_user = sio.get_current_user()
    session: GameSession = GameSession.get_by_id(session_id)
    membership = GameSessionMembership.get_by_ids(current_user.id, session_id)

    _emit_session_meta_update(session)
    if session.layout_description is not None:
        _emit_session_actions_update(session)

    if not membership.is_observer and session.state != GameSessionState.SETUP:
        _emit_game_session_pickups_update(sio, membership)

    _emit_session_audit_update(session)
示例#3
0
def join_game_session(sio: ServerApp, session_id: int,
                      password: Optional[str]):
    session = GameSession.get_by_id(session_id)

    if session.password is not None:
        if password is None or _hash_password(password) != session.password:
            raise WrongPassword()
    elif password is not None:
        raise WrongPassword()

    membership = GameSessionMembership.get_or_create(
        user=sio.get_current_user(),
        session=session,
        defaults={
            "row": None,
            "admin": False
        })[0]

    _emit_session_update(session)
    sio.join_game_session(membership)

    return session.create_session_entry()
示例#4
0
    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),
        )