1.1.0アカウントのメールアドレスと確認
最新登録にメールアドレスが必要になり、アカウント作成前に確認するようになりました。管理者向けのアカウント一覧も追加されました。
- 登録すると6桁のコードがそのアドレスに送られ、入力して初めてアカウントが作成されます。それまで users テーブルに行は存在しません。
- アドレスの変更にもコードが必要で、まずアカウント削除と同じ本人確認を求めます。完了後は古いアドレスに通知が届き、ほかの端末はすべてログアウトされます。
- これ以前に作られたアカウントにアドレスはなく、これまでどおり使えます。何も制限されません。
- 第三者ログインはプロバイダーが報告したアドレスを使い、プロバイダーが確認済みと明示した場合のみ確認済みとして記録します。
- 送信の上限:1つのアドレスにつき1日3通、1つのブラウザにつき1日3つの異なるアドレス、サイト全体で1時間あたり40通。
- 管理者向けアカウント一覧を追加:アドレスは既定で伏せられ、表示のたびに記録され、停止・パスワード強制リセット・削除ができます。パスワードは表示されません。データベースに平文のパスワードは存在しません。
- アカウント削除で、アバター・プロフィール設定・チャット投稿・確認待ちの行も消えるようになりました。以前はどれも残っていました。
1.0.0募集掲示板
5つの掲示板がそれぞれ投稿・絞り込み・投稿ごとのチャットを持ち、ほかの機能と同じローカルデータベースで動きます。
- チーム・フレンド・クラブの募集掲示板に、雑談掲示板とテーマ掲示板を加えた5つ。
- 投稿ごとにチャットスレッドが付き、メッセージを送ると投稿は掲示板の最上部に戻ります。
- 募集投稿はモード・トロフィー条件・最低ランク帯・言語を持ち、各掲示板はモード・トロフィー条件・言語・状態で絞り込めます。
- 新規投稿フォームの段位条件欄は、このインスタンスが実際に観測したランク帯名から選択肢を作るため、もう存在しない段位が並ぶことはありません。
- 投稿にはアカウントが必要です。作者は募集を終えた投稿を閉じることも、削除することもできます。
- アカウントを削除しても掲示板の投稿は残り、行には作者名が記録されます——詳しくはプライバシーポリシーへ。
0.4.0ランク戦・プレステージ・フェイムを実データ化
公式 API は、当サイトが推定していた複数の項目を実は公開していました。その推定値はフォールバックとして残さず削除しました。
- ランク帯のインデックス・段位名・elo・シーズン id を、シーズンと全期間のピークとあわせてプレイヤーごとに保存します。
- 合計プレステージレベル・フェイム・フェイム階級を実測値として保存・表示します。
- キャラごとのプレステージ、現在と最長の連勝、装備中のスキンを索引します。
- ランク帯ラベルの一覧はハードコードをやめ、観測したプロフィールから学習します。Supercell が名称を変えても古いラベルは残りません。
- 装備スキンはプレイヤー別・キャラ別に記録され、スキン使用率ランキングはこのデータを集計します。
- 既存インストールには明示的な ALTER ステップで新しい列を適用するため、アップグレードでデータベースを捨てる必要はありません。
- 「ランク戦スコアは推定値」という公告は「ランク戦スコア・プレステージ・フェイムを API から取得」に置き換えられ、修正前にシード済みのインストールもその場で更新されます。
0.3.0キャラ名簿を公式 API から同期
同梱のキャラ一覧は手作業での管理をやめました。同期スクリプトが最新の名簿を取得し、アプリが読み込む生成ファイルを書き出します。
- npm run sync が公式 API から名簿を取得し、同梱データファイルを再生成します。
- すべてのキャラが実際のスターパワー・ガジェット・ハイパーチャージ・ギアを、実際の id と名前つきで持ちます。
- レア度とクラスだけは API が返さない項目です。別テーブルから名前で引き、見つからなければ推測せず「不明」のままにします。
- そのテーブルより新しいキャラはニュートラルグレーで表示され、レア度集計から除外されます。未分類の一覧はチェックスクリプトで確認できます。
- キャラ・アイコン・クラブバッジ・マップの画像はオープンな Brawlify CDN から配信し、素材が無いときは頭文字チップにフォールバックします。
0.2.0ライブ API 連携と更新キュー
デモデータの読み込みから、公式 API を継続的にポーリングし、見たものを自前の索引に保存する構成へ移行しました。
- 公式エンドポイントを包む API モジュールは1つだけ。ページはサービス層とだけやり取りし、値が API・ローカルキャッシュ・デモ生成器のどれから来たかが報告されます。
- プレイヤーとクラブのプロフィールは SQLite に短時間キャッシュされ、API 障害時はそこから配信されるため、レート制限でページが空白になりません。
- 優先更新キューはブックマークと最近閲覧したアカウントを積極的に、それ以外をゆっくりポーリングし、共有トークンバケットで全体を API のレート制限内に収めます。
- API は常に直近 25 戦しか返さないため、バトルログは取得のたびに保存され、ティアリストが読む日次集計にまとめられます。
- トークン付きの初回起動では 8 か国の公式ランキングを巡回し、名前検索がすぐ使えるだけのデータを揃えます。
- バックグラウンド同期は常駐サーバーではプロセス内で動き、インターバルを維持できないプラットフォームでは外部スケジューラーから cron エンドポイント経由で動きます。
- タグごとのクールダウン付き手動更新と、索引サイズ・キュー深さ・直近の API エラーを報告するヘルスエンドポイント。IP 制限付きトークンの失敗には明示的なヒントが出ます。
- トークン設定前に投入されたデモデータは、本物のトークンが現れた時点ですべて削除されます。
0.1.0最初のビルド
サイトの骨組み:ルーティング、翻訳、コンポーネント群、ローカルデータベース。
- ロケール接頭辞付きの App Router ページ(繁体字中国語・簡体字中国語・英語・日本語)。ロケールは middleware が cookie、次いで Accept-Language から決定します。
- 少数の共有 UI プリミティブと、手書き SVG チャート 5 種——コンポーネントライブラリもチャートライブラリも使いません。
- ダークとライトのテーマは CSS 変数だけで駆動し、選択はブラウザに記憶され、初回描画の前に適用されます。
- プレイヤーとクラブのページ、タグ検索と名前検索、ティアリスト、ランキング、各種計算ツール、マップローテーション。
- Node 標準バインディングの SQLite に、アカウント・ブックマーク・閲覧履歴・プレイヤーとクラブのディレクトリを保存。
- メールアドレス不要のアカウント:ユーザー名、scrypt でハッシュ化したパスワード、セッション cookie。
- API トークンが無くてもサイト全体を試せる決定的なデモモード。