Skip to content

Storage

Sonolusのアイテム情報などを保存する機能です。 切り替えるだけで、保存先を変更することが可能です。

memory,json,databaseの三つが使えます。

  • memory: 開発用(デフォルト)
  • json: 小規模・デモ向け
  • database: 本番・拡張向け

Supported Data

以下のデータがストレージに保存されます:

  • Items: Level, Skin, Background, Effect, Particle, Engine, Post, User
  • Community Comments: アイテムごとのコメント
  • Leaderboard Records: リーダーボードのレコード

Memory

py
import time
from sonolus_fastapi import Sonolus
from sonolus_fastapi.model.items import PostItem
from sonolus_fastapi.model.sections import PostSection

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

now = int(time.time() * 1000) # to milliseconds
new_post = PostItem(
    name="example-post-1",
    author="example-author",
    title="Example Post",
    tags=[],
    description="This is an example post item.",
    time=now,
    thumbnail=None
)
sonolus.items.post.add(new_post)

JSON

py
import time
from sonolus_fastapi import Sonolus
from sonolus_fastapi.model.items import PostItem
from sonolus_fastapi.model.sections import PostSection

sonolus = Sonolus(
    address="https://example.com",
    port=8000,
    dev=False,
    enable_cors=True,
    backend=StorageBackend.JSON,
    backend_options={"path": "./data"}   
)

now = int(time.time() * 1000) # to milliseconds
new_post = PostItem(
    name="example-post-1",
    author="example-author",
    title="Example Post",
    tags=[],
    description="This is an example post item.",
    time=now,
    thumbnail=None
)
sonolus.items.post.add(new_post)

DataBase

py
import time
from sonolus_fastapi import Sonolus
from sonolus_fastapi.model.items import PostItem
from sonolus_fastapi.model.sections import PostSection

sonolus = Sonolus(
    address="https://example.com",
    port=8000,
    dev=False,
    enable_cors=True,
    backend=StorageBackend.DATABASE, 
    backend_options={"url": "sqlite:////data/sonolus.db"}
)

now = int(time.time() * 1000) # to milliseconds
new_post = PostItem(
    name="example-post-1",
    author="example-author",
    title="Example Post",
    tags=[],
    description="This is an example post item.",
    time=now,
    thumbnail=None
)
sonolus.items.post.add(new_post)

Community Comments Storage

コメントも同じバックエンドを使用します。

Memory

py
from sonolus_fastapi import Sonolus, StorageBackend
from sonolus_models import ServerItemCommunityComment
import time

sonolus = Sonolus(
    address="https://example.com",
    port=8000,
    backend=StorageBackend.MEMORY
)

# コメントストアにアクセス
store = sonolus.items.level_comments.for_item("example-level")

# コメントを追加
comment = ServerItemCommunityComment(
    name=f"comment-{int(time.time())}",
    author="User1",
    time=int(time.time() * 1000),
    content="Great level!",
    actions=[]
)
store.add(comment)

# コメント一覧を取得
comments = store.list(limit=10, offset=0)

JSON

データ構造: data/comments/{item_type}/{item_name}.json

py
from sonolus_fastapi import Sonolus, StorageBackend

sonolus = Sonolus(
    address="https://example.com",
    port=8000,
    backend=StorageBackend.JSON,
    path="./data"
)

# 同じAPI
store = sonolus.items.level_comments.for_item("example-level")
store.add(comment)

Database

テーブル: comments (parent_type, parent_name, time でインデックス)

py
from sonolus_fastapi import Sonolus, StorageBackend

sonolus = Sonolus(
    address="https://example.com",
    port=8000,
    backend=StorageBackend.DATABASE,
    url="sqlite:///./data/sonolus.db"
)

# 同じAPI
store = sonolus.items.level_comments.for_item("example-level")
store.add(comment)

Leaderboard Records Storage

リーダーボードレコードも同様に保存されます。

Memory

py
from sonolus_fastapi import Sonolus, StorageBackend
from sonolus_models import ServerItemLeaderboardRecord

sonolus = Sonolus(
    address="https://example.com",
    port=8000,
    backend=StorageBackend.MEMORY
)

# レコードストアにアクセス
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)

# レコード一覧を取得
records = store.list(limit=10, offset=0)

JSON

データ構造: data/leaderboards/{item_type}/{item_name}/{leaderboard_name}.json

py
from sonolus_fastapi import Sonolus, StorageBackend

sonolus = Sonolus(
    address="https://example.com",
    port=8000,
    backend=StorageBackend.JSON,
    path="./data"
)

# 同じAPI
store = sonolus.items.level_leaderboards.for_item("example-level", "standard")
store.add(record)

Database

テーブル: leaderboard_records (parent_type, parent_name, leaderboard_name, rank でインデックス)

py
from sonolus_fastapi import Sonolus, StorageBackend

sonolus = Sonolus(
    address="https://example.com",
    port=8000,
    backend=StorageBackend.DATABASE,
    url="sqlite:///./data/sonolus.db"
)

# 同じAPI
store = sonolus.items.level_leaderboards.for_item("example-level", "standard")
store.add(record)

Store API

すべてのストアは共通のAPIを提供します:

py
# 取得
item = store.get(name)

# 一覧(ページネーション対応)
items = store.list(limit=10, offset=0)

# 追加
store.add(item)

# 更新
store.update(item)

# 削除
store.delete(name)

# 件数
count = store.count()