Result API
Result APIは、レベルのリザルト画面からのリプレイ投稿機能を提供します。
注意: Result APIはlevels専用です。他のitem_typeでは404エラーが返されます。
result_info
リザルト投稿情報を提供します
path: GET /sonolus/levels/result/info
Registration
py
from sonolus_fastapi import Sonolus
from sonolus_models import ServerLevelResultInfo, ServerForm
sonolus = Sonolus(
address='https://example.com',
port=8000,
enable_cors=True,
dev=True,
)
@sonolus.level.result_info(ServerLevelResultInfo)
async def level_result_info(ctx):
return ServerLevelResultInfo(
submits=[
ServerForm(
type="replayUpload",
title="リプレイを投稿",
options=[]
)
]
)result_submit
リザルトからのリプレイ投稿を処理します
path: POST /sonolus/levels/result/submit
Registration
py
from sonolus_fastapi import Sonolus
from sonolus_models import ServerSubmitLevelResultRequest, ServerSubmitLevelResultResponse
@sonolus.level.result_submit(ServerSubmitLevelResultResponse)
async def level_result_submit(ctx, submit_request: ServerSubmitLevelResultRequest):
# submit_request.replay: リプレイアイテム
# submit_request.values: フォームの値
# リプレイを処理
replay = submit_request.replay
# ファイルアップロードが必要な場合
return ServerSubmitLevelResultResponse(
key="upload-key-456",
hashes=[
# アップロードが必要なファイルのハッシュ
]
)result_upload
リザルト投稿時のファイルアップロードを処理します
path: POST /sonolus/levels/result/upload
Registration
py
from sonolus_fastapi import Sonolus
from sonolus_models import ServerUploadLevelResultResponse
@sonolus.level.result_upload(ServerUploadLevelResultResponse)
async def level_result_upload(ctx, upload_key: str, files: list):
# upload_key: result_submit時に返したkey
# files: アップロードされたファイルのリスト
for file in files:
filename = file.filename
content = await file.read()
# ファイルを保存
return ServerUploadLevelResultResponse()Example
完全な例:
py
from sonolus_fastapi import Sonolus
from sonolus_models import (
ServerLevelResultInfo,
ServerSubmitLevelResultRequest,
ServerSubmitLevelResultResponse,
ServerUploadLevelResultResponse,
ServerForm,
ReplayItem
)
import time
sonolus = Sonolus(
address='https://example.com',
port=8000,
enable_cors=True,
dev=True,
)
@sonolus.level.result_info(ServerLevelResultInfo)
async def level_result_info(ctx):
return ServerLevelResultInfo(
submits=[
ServerForm(
type="replayUpload",
title="Submit Replay",
options=[]
)
]
)
@sonolus.level.result_submit(ServerSubmitLevelResultResponse)
async def level_result_submit(ctx, submit_request: ServerSubmitLevelResultRequest):
# リプレイをストアに保存
replay = submit_request.replay
sonolus.items.replay.add(replay)
# ファイルアップロードは不要
return ServerSubmitLevelResultResponse(
key="",
hashes=[]
)
@sonolus.level.result_upload(ServerUploadLevelResultResponse)
async def level_result_upload(ctx, upload_key: str, files: list):
# ファイル処理(必要な場合のみ)
return ServerUploadLevelResultResponse()
if __name__ == "__main__":
sonolus.run()Level Only
Result APIはlevelsのみで動作します:
py
# ✅ 動作する
@sonolus.level.result_info(ServerLevelResultInfo)
# ❌ 定義はできるが実行時に404エラー
@sonolus.skin.result_info(ServerLevelResultInfo)GET /sonolus/skins/result/infoにアクセスすると:
json
{
"detail": "result info is only available for levels"
}