えいむーさんは明日も頑張るよ

Salmon Statsよ、永遠に

価格

Salmon Stats の突然の終焉

何やら数日前から Salmon Stats に繋ぐことができなくなってしまいました。

調べてみたところ、どうも API 側のドメインが切れたか、サーバが落ちてしまっている様子。Salmon Stats の API は Splatoon Stats と同一のサーバで動いているようなので、多分後者かと思われます。

で、管理人の方はもうかなり長いこと Salmon Stats を弄っていないので復旧の見込みもないということで、本格的に New!! Salmon Stats を稼働させることにしました。

New!! Salmon Stats

これは、以下のコンセプトで開発されています。

  • Typescript(NodeJS)で動作する
    • Salmon Stats は PHP(Laravel)で動作していました
  • RESTful API
    • ほとんどの API は REST API を採用しています
    • 直感的にわかりやすい API になっています
  • 完全にオープンソースなプロジェクト
    • これは Salmon Stats の理念を引き継いでいます
    • MIT ライセンスなので誰でも利用可能です
  • 充実したドキュメント
    • Salmon Stats は API ドキュメントなどが全くありませんでした
    • それに対して New!! Salmon Stats では Redoc と Swagger で全ての API がドキュメント (opens new window)として公開されています
    • これにより、第三者が API を使った連携サービスを容易に開発することができます
  • 環境に依存しない
    • New!! Salmon Stats は Docker を利用しており、環境に依存せず誰でもテスト環境を構築できます
  • Salmon Run Next Wave に対応する
    • Splatoon3 にも問題なく対応できるような仕組みにしています
  • Salmon Stats が非対応だった API に対応する
    • Salmon Stats ではランキング API などがありませんでした

ソースコード自体が Typescript で書かれているので Javascript を触ったことがある人ならなんとなく内容が理解できます。オープンソースではあったものの、ブラックボックス化していた Salmon Stats に比べて、メンテナンスがしやすいという特徴があります。

Salmon Stats との差異

Salmon Stats の API を利用していて都合が悪いと思ったところには全て対応しています。

アップロードに APIToken を必要としない

Salmon Stats ではリザルトをアップロードするために Twitter 連携をして APIToken を必要としましたが、New!! Salmon Stats では認証用のトークンを必要としません。

では、何故 Salmon Stats ではトークンを必要とし、New!! Salmon Stats では利用しないようになったのかを解説します。

まず、Salmon Stats はツイッターアカウントに対してイカリング 2 のアカウントが紐付けられています。要するに、ツイッターでログインしたらマイページが開き、マイページには紐付けられているイカリング 2 のアカウントが表示されます。

ではどうやってツイッターアカウントとイカリング 2 のアカウントを紐付けしているかというと、ツイッターアカウントごとに発行された認証トークンを利用しています。つまり、A というツイッターアカウントで発行された認証トークンで X というイカリング 2 のアカウントのデータをアップロードすると、X が A に連携されるというわけです。

リザルトをアップロードする、というのはある種のイカリング 2 アカウントの本人確認であるため、アップロード時に連携すれば間違いなくその人が利用しているツイッターアカウントとイカリング 2 のアカウントが紐付けできるというわけです。

問題点

一つのイカリング 2 アカウントは一つのツイッターアカウントにしか連携できないため、ツイッターアカウントを変えてしまうと、別のアカウントに対して連携を試みるためリザルトのアップロードができなくなってしまいます。アカウントが凍結された際や、パスワードを忘れてしまった、何らかの理由でアカウントを変更したときにこれが問題になります。

連携が解除できないため、一度間違ったツイッターアカウントでアップロードしてしまうとやり直しが効きません。

よって、New!! Salmon Stats ではツイッターアカウントとイカリング 2 の連携をユニークにしないようにしました。

何故しないようにしたかというと、そもそもそのような連携が不要だからです。Salmon Stats にはツイッターアカウントとイカリング 2 のアカウントの紐付け機能がありますが、その機能は殆ど使われていません。

Salmon Stats では他人にアップロードされると「アップロードした人の戦績」として記録が残ってしまうため認証トークンを採用していました。しかし、残念ながら「アップロードした人の戦績」という機能が実装されませんでした。

これはどういうことかというと、例えばツイッターアカウント A でイカリング 2 の X, Y, Z のアカウントのリザルトをアップロードしたとしましょう。

もし A から X, Y, Z の情報を誰でもたどることができれば、Z のアカウントが他人のアカウントであった場合に、A のアカウントを知っている人は Z のリザルトが見れてしまうのでリザルトの偽証のようなことが可能になります。

しかし、Salmon Stats には A から X, Y, Z を検索する方法は存在しません。あるツイッターアカウントに連携しているイカリング 2 のアカウントを見るには認証トークンが必要で、この認証トークンはツイッターアカウント所有者しか知りません。

よって、他人 Z のリザルトをアップロードしたとして、リザルト詐欺のための A = Z という偽の関係性に気付く人はアップロードした A 以外にいません。一応、Z の名前を検索すれば A と紐ついていることはわかるのですが、A から辿ることはできないということです。

というか、そもそも他人に勝手にリザルトをアップロードされるようなことは ID とパスワードが洩れない限りあり得ません。これが New!! Salmon Stats で認証トークンを採用しない理由になります。

ランキング機能

Salmon Stats ではランキング機能としてあるスケジュールごとの納品数 TOP のプレイヤーとその記録が見れるようになっていました。

問題点

記録は一位しか見ることができませんでした。参加者が多くなればなるほど一位を取るのは難しくなります。Salmon Stats の理念としては、トップ層以外であっても自分の順位を確認して、モチベーションを上げるための機能があるべきと考えます。

よって、New!! Salmon Stats では自分の順位を確認できるようにします。

リザルトの一括取得

Salmon Stats のリザルト一括取得はユーザーごとにしかできませんでした。

また、取得してもあるべきデータが欠けているなど問題点も多くありました。

つまり、あるシフトで登録されているリザルトを全件取得したいということは不可能でした。

それではあまりに不便なのでユーザーごとまたはシフトごとにリザルトを取得できるような API を整備しました。

リザルトのアップロード

Salmon Stats では一度に 10 件までしかリザルトをアップロードできませんでした。イカリング 2 からデータを取得したときでさえ最大 50 件アップロードされる可能性があるのですから、これはいくらなんでも少なすぎます。

解消方法

New!! Salmon Stats では一度に 50 件まで登録可能にしました。

ただし、データを一括登録する場合などはこれでも不足する場面が考えられます。

サーバの問題もあるのですが、200 件くらいは同時に登録できるようにしたいです。

進捗報告

夜から手を付けたばかりなのですが、かなり進んでいます。

完成したもの

  • リザルトを保存するためのデータベース
  • リザルトを受け取るための仕組み
    • 不正なリザルトが送られた場合に受け付けない仕組みも導入
  • ユーザを保存するためのデータベース
    • といっても New!! Salmon Stats 自体にユーザは不要ではあるので使うかは未定

未着手

  • 実際のデータの受取テスト
  • 実際のデータの書き込みテスト

まとめ

意外と進んでいるので、大型連休中に仮リリースできるかもしれません。

ほしいものリスト (opens new window)からなんかくれるとモチベーションが上がります。

記事は以上。

価格
    えいむーさんは明日も頑張るよ © 2022