Skip to content

Leaderboard API

Leaderboard APIは、アイテムに対するリーダーボード機能を提供します。

detail

リーダーボード詳細を提供します

path: GET /sonolus/{item_type}/{item_name}/leaderboards/{leaderboard_name}

Registration

py
from sonolus_fastapi import Sonolus
from sonolus_models import ServerItemLeaderboardInfo

@sonolus.level.leaderboard.detail(ServerItemLeaderboardInfo)
async def level_leaderboard_detail(ctx, item_name: str, leaderboard_name: str):
    return ServerItemLeaderboardInfo(
        actions=[]
    )

records

リーダーボードレコード一覧を提供します

path: GET /sonolus/{item_type}/{item_name}/leaderboards/{leaderboard_name}/records/list

Registration

py
from sonolus_fastapi import Sonolus
from sonolus_models import ServerItemLeaderboardRecordList

@sonolus.level.leaderboard.records(ServerItemLeaderboardRecordList)
async def level_leaderboard_records(ctx, item_name: str, leaderboard_name: str, query):
    # レコードストアから取得
    store = sonolus.items.level_leaderboards.for_item(item_name, leaderboard_name)
    records = store.list(limit=query.page_size, offset=(query.page - 1) * query.page_size)
    
    return ServerItemLeaderboardRecordList(
        pageCount=1,
        items=records
    )

record_detail

特定レコードの詳細(リプレイ一覧)を提供します

path: GET /sonolus/{item_type}/{item_name}/leaderboards/{leaderboard_name}/records/{record_name}

Registration

py
from sonolus_fastapi import Sonolus
from sonolus_models import ServerItemLeaderboardRecordDetails

@sonolus.level.leaderboard.record_detail(ServerItemLeaderboardRecordDetails)
async def level_leaderboard_record_detail(ctx, item_name: str, leaderboard_name: str, record_name: str):
    # レコードからリプレイを取得
    return ServerItemLeaderboardRecordDetails(
        replays=[
            # リプレイアイテムのリスト
        ]
    )

Storage

リーダーボードレコードは自動的にストレージに保存されます。詳細はStorageを参照してください。

py
# レコードストアへのアクセス
store = sonolus.items.level_leaderboards.for_item("song1", "standard")

# レコードの追加
from sonolus_models import ServerItemLeaderboardRecord
record = ServerItemLeaderboardRecord(
    name="record1",
    rank="1",
    player="Player1",
    playerUser=None,
    value="1000000"
)
store.add(record)

# レコードの取得
records = store.list(limit=10, offset=0)
record = store.get("record1")

# レコード数
count = store.count()

Example

完全な例:

py
from sonolus_fastapi import Sonolus
from sonolus_models import (
    ServerItemLeaderboardInfo,
    ServerItemLeaderboardRecordList,
    ServerItemLeaderboardRecordDetails,
    ServerItemLeaderboardRecord
)
import time

sonolus = Sonolus(
    address='https://example.com',
    port=8000,
    enable_cors=True,
    dev=True,
)

# レコードを追加
store = sonolus.items.level_leaderboards.for_item("example-level", "standard")
record = ServerItemLeaderboardRecord(
    name="record1",
    rank="1",
    player="TopPlayer",
    playerUser=None,
    value="999999"
)
store.add(record)

@sonolus.level.leaderboard.detail(ServerItemLeaderboardInfo)
async def level_leaderboard_detail(ctx, item_name: str, leaderboard_name: str):
    return ServerItemLeaderboardInfo(actions=[])

@sonolus.level.leaderboard.records(ServerItemLeaderboardRecordList)
async def level_leaderboard_records(ctx, item_name: str, leaderboard_name: str, query):
    store = sonolus.items.level_leaderboards.for_item(item_name, leaderboard_name)
    records = store.list(limit=20, offset=0)
    
    return ServerItemLeaderboardRecordList(
        pageCount=1,
        items=records
    )

@sonolus.level.leaderboard.record_detail(ServerItemLeaderboardRecordDetails)
async def level_leaderboard_record_detail(ctx, item_name: str, leaderboard_name: str, record_name: str):
    return ServerItemLeaderboardRecordDetails(replays=[])