lr2irproxyでLR2上に擬似ライバル内ランキングを実現する
前回と同じ構造の記事になるけど、lr2irproxyを更新、exrivalプラグイン(とlptoolsにlr2files.py)を追加した。
その名の通りライバル機能の拡張で、exgradeと同様にlr2irproxyでDBを持ってライバルのスコアを管理する。
このプラグインの売りは、www.dream-pro.infoがlr2irproxyの構築するサーバに名前解決される場合(前々回くらいの記事参照)に 通常のIR取得処理を横取りしてライバル内ランキングへと書き換えることである。
参考画像(名前無許可使用ですごめんなさい) この曲のIR:http://www.dream-pro.info/~lavalse/LR2IR/search.cgi?mode=ranking&bmsid=192763
(asdasdは俺です。LR2.exeに表示される名前を使う)
exrivalの設定
exrivalへのライバルの追加はexgradeの時と同じくLR2IR上で行えるようにしている。アクティブ機能も同様。
自分のスコアはLR2files/Database/Score/username.dbを見ているので最新、ライバルのスコアはサーバ起動時に取得したものとなる。また更新したスコアはLR2IRにきちんと送信される。あくまでもランキングを書き換えるだけ。
次やるとしたらマイページとか自分のライバル一覧からライバルのインポートする機能とかかな?
lr2irproxyを使っていろんな段位認定をLR2IRに表示する
いろいろ試行錯誤したけど結局リクエスト、レスポンスとか全部で判定してボディを弄るのが一番良いという結論に至った。
lr2irproxy.pyはもうあんまりいじらない、はず。
前回あたりからhtml/XMLパーサにlxmlを標準で使うようにしたので、動作にはこれが必要。
lxml - Processing XML and HTML with Python
本題。
上記リポジトリのplugins内に(確か前回から試験的に入ってた気もするけど)exgradeというプラグインを追加しました。
こいつは何ができるのかというと、
- 第3者が作った段位認定をLR2IRに擬似的に登録可能(もちろんデータは自前DBに貯める)
- ランキングとマイページにその段位認定を表示できる(発狂SP/DP段位の下に持っている奴の最高段を表示)
段位の削除、編集機能はまだ作っていないけど、段位の追加、表示/非表示の変更はできるはず。
段位の追加はJSONを用いて行う。ファイル名をgrade.jsonとする。grade.jsonは以下の形式のJSONとする(余計なものが付いていてもまあ大丈夫)。
{ "name" : "段位認定セットの名前", "order" : [ [courseid(Integer), "段位の表示(例えば'◆01')"]], [次の段位(上と同様)], ... [最後の段位(最高位)] ] }
例を兼ねて、主要なやつ(というか知ってるやつ)はgistに上げてある。参考にどうぞ。
インポート方法はhttp://ほにゃらら/LR2IR/exgradeにアクセスして追加→JSONをアップロードするまたはJSONのURL指定でOK。俺のgistの場合は各ファイル名の欄の右端にあるRawのURLを指定することになる。
合格情報の手動更新はまだ。前回更新から1日以上経った段位は起動時に自動更新される。
もしよければ使ってみて欲しい。
書いていて思ったんだけど、grade["order"]の中身は2要素のリストじゃなくて辞書のほうが良さそうだなあ。タイトル、曲目とか追加すれば段位ページの表示にそのまま使えそうだし。
lr2irproxy
というクソ愚直な名前をとりあえずつけて、Githubに上げた。
ApacheやめてBaseHTTPServerにしたら思った以上にコンパクトになった。Pythonだけで纏まったし一応exe単体にもできるのかな?あまりその辺は詳しくない。
使うにあたり必要なものとしては
- Python 2.7.x
- hostsファイルに
127.0.0.1 www.dream-pro.info
を追加 - 従って
127.0.0.1:80
が使用中でないこと
だけやれば多分なんとかなるかなあ。
前記事にSSを貼った2機能(発狂&通常レベル追加,LN表タグ)だけとりあえず入れてある。
アイディアが尽きないかぎりはこれのmodを今後しばらくのネタにしようと思う。
LR2/LR2IR用のプロキシサーバのようなものを作っている
きっかけ
ランキング取得クソ重くてむかつきません?
構成
ブラウザから見るLR2IRを好き放題いじる分には適当にプロキシサーバ立ててプロキシ自動構成か何かするのが簡単だろうけど、俺はLR2body.exeの通信をどうにかしたかったのでそれは無し(ちょっと怪しいかもしれない)。
LR2は通信をhttpのPOSTで行っている。URLはプログラム内で固定されているため変更はできない(やろうと思えばできると思うけどバイナリそのものはあんまり触りたくない)。
そこで、パワープレイではあるけど名前解決の部分を上手く使うことにした。
LR2のhttp通信はWinsockを使用して行われているけど、gethostbyname
関数でwww.dream-pro.infoを名前解決しているっぽい。
gethostbyname
は
の順で問い合わせるらしい(普通そうだろうけど)ので、hostsに
aaa.bbb.ccc.ddd www.dream-pro.info
みたいに書いて、aaa.bbb.ccc.ddd
でリクエストを処理することを考える。
俺の取った方法としては、apacheを127.0.0.1:80
で立てて
RewriteEngine On RewriteCond %{REQUEST_URI} !^/cgi-bin/rewrite\.cgi/(.*)$ RewriteRule ^/(.+)$ /cgi-bin/rewrite\.cgi/$1 [PT]
みたいに設定して、ルート以下のアクセスを/cgi-bin/rewrite.cgiに丸投げする。ちなみに[PT]
を知らなくてかなり嵌った。
こう書くことでrewrite.cgi
にURIがPATH_INFO
として渡されるので、あとはrewrite.cgi
側で自由に書けばいい。
通常通りの処理をしたければ普通にwww.dream-pro.infoにリクエストを飛ばせばいいけど、hostsに書いてある設定が優先されるのでソケット通信で書く必要があった(俺は)。
あれこれあって書き終わって、一昨日辺りようやくまともに動くようになってくれた。
出来そうかつ需要がありそうな事としては
- LR2上でライバル内ランキングの実現(当初の目的, 通常のIRと併用不可)
search.cgi
ブラウジング時の機能追加- 選曲履歴の保存
くらいが簡単に思いつくかなあ。2.については軽くやっていて、
- 発狂BMS一覧ページに★25とか通常難易度表とかをちょっと追加
- 特定タグ検索時に関連タグ(事前に指定)を挿入
みたいなことをやってみた。
もう少しいろいろ試してみようと思う。公開とかはどうなんだろう。