※ システム全体の構成要素と各要素の整合性のとれるバージョンについてはSRCGI - READMEにあります
『SHOWROOM イベント 獲得ポイント一覧』(5) 枠別貢献ポイントの取得
これは『SHOWROOM イベント 獲得ポイント一覧』(1) 関連ソースの公開についてから始まる一連の記事の一つです。
このモジュールは枠別、リスナー別のイベント貢献ポイントを算出するためのものです。デーモンとして起動しており、配信が終わって獲得ポイント・貢献ポイントが落ち着いたのを検出すると貢献ランキングを取得します。配信が始まる前の貢献ランキングと比較することによって各リスナーさんの直近配信枠での貢献ポイントを求めるということをやっています(ポイントが落ち着いたのを検出するところはGSE5Mのお仕事ですが)
しかし問題があって、貢献ランキングのデータにはリスナー名だけしかなくリスナーを識別するコードがありません。そこで前回の配信から今回の配信までのあいだにリスナー名を変更したリスナーさんがいると困ったことになります。
ただリスナー名の変更といっても大半は"無音"であることを示す文字・記号が追加されたり、特定ルームの配信時間を付加したりするもので、リスナー名を比べると似通っていることが多いです。そこで
・前回の配信と同一のリスナー名があれば同一のリスナーとみなす。
・同一名のリスナーがいなければ、リスナー名の一致度が高い(=(重み付き)レーベンシュタイン距離が小さい)データを探す。一致度がある程度あれば同一のリスナーとみなす。
・前回の貢献ポイント以上のリスナーの中に突き合わせができていないリスナーが一人しかいなければ同一リスナーとみなす(貢献ポイントは減算が発生しようが減ることはぜったいない)
みたいなことをやっていきます。もちろん100%一致することはなさそうですが、実用的にはなんとなくそれらしい結果が得られています。
さらに本格的にやるのなら視聴中リスナーのデータを取得し、これと貢献ポイントのデータを突き合わせ、リスナー名に対するuser_idを取得してから、貢献ポイントの突き合わせを行う、という方法でしょうか。現在の方法でも貢献上位のリスナーの突き合わせがだいたいできるし、実際問題としてみたいのは貢献上位のリスナーさんのデータなので、まあいいか、とそのままになっています。
それからこの機能には各リスナーの貢献ポイントと期待値との差を表示する表も含まれています。つまり三周枠であれば期待値1,780となるわけですが、この期待値をどうやって求めるかがけっこう問題でした。今は出現度数が多い貢献ポイントを期待値とするという雑なことをやっています。もちろん、それらしい(つまり1,780と1,250といった)貢献ポイントを優先的に採用する、1,780が1,250よりちょっとだけ少ないくらいだったら1,780を優先する、くらいのことはやっています。
なお12時、15時、18時配信だったら3周枠3回だ、みたいな判断はしてません。そういうことをやるのは面倒ということもあるのですが、たとえばこの場合最初の予定が12時、18時で、突然15時配信があったとするとそこで3周できるリスナーさんは限られていると思うからです。
とはいっても、今みたいなやり方はルームに手慣れたリスナーさんが相当数いるという前提ですから、スケジュールを考慮したやり方も必要かもしれません。
ロードモジュールの作成
現在 Linux Mint 21.1 Vera base: Ubuntu 22.04 jammy 、 go version go1.20.4 linux/amd64 で作成したロードモジュールを VPS(Ubuntu 20.04.4 LTS focal)に持っていって動かしているのですが、この場合次のような手順になります。
まず
https://github.com/Chouette2100/SRGPC
から入手したソースを~/go/src/SRGPC 以下におきます。
以下
$ cd ~/go/src/SRGPC
$ go mod init
$ go mod tidy
$ CGO_ENABLED=0 go build SRGPC.go
$ sftp -oServerAliveInterval=60 -i ~/.ssh/id_ed25519 -P nnnn xxxxxxxxnnn.nnn.nnn.nnn
sftp> cd ~/MyProject/Showroom/SRGPC
sftp> put SRGPC
sftp> put ServerConfig.yml
みたいな感じで進めます。
あとはSeverConfig.ymlを環境にあわせて設定しSRGPCを起動するだけです。daemonとして起動しておくのが安心でしょう。