vrowser
Left 4 Dead 2 や Team Fortress 2 など、HalfLife2 系(Source Engine)ゲームのサーバーブラウザを作るための Ruby ライブラリです。ゲームサーバー統計取得ツールの QStat をラップして、サーバー一覧の取得・データベースへの記録・JSON API での配信までを一式でやります。
gem として公開していて、コマンドラインツールも同梱しています。
gem install vrowser
vrowser sample # サンプル設定ファイルを生成
vrowser -f config.yml fetch # マスターサーバーからサーバー一覧を取得
vrowser -f config.yml update # 登録済みサーバーの状態を更新
vrowser -f config.yml daemon # 常駐デーモンとして起動
内部設計
コンポーネント構成です。中核の Vrowser クラスが QStat の呼び出しと Sequel(ORM)経由の DB 記録を束ねていて、CLI・常駐デーモン・Sinatra アプリのどこからでも同じ処理を呼べる作りになっています。
- Vrowser(
lib/vrowser.rb)—fetch(マスターサーバーからサーバー一覧を取得して DB に登録)、update(登録済みサーバーを全件クエリして状態更新)、clear(DOWN したサーバーの削除)を提供します - VrowserModel::Servers — Sequel のモデル。スキーマ定義もコード内に持っていて、テーブルがなければ初回接続時に作ります。
hostカラムが unique キーです - Vrowser::HTTPDaemon(
lib/vrowser/http_daemon.rb)— WEBrick で JSON API(/api/updated/json・/api/connected/json)とpublic_html/の一覧 UI(jQuery DataTables 製)を配信しつつ、別スレッドで取得ループを回します - plugins/ — ゲーム別の追加ロジック。同梱の
l4d2.rbは、サーバー情報からゲームタイプが判定できないときにサーバー名の正規表現マッチ(co-?op、versus、scavengeなど)でゲームタイプを推定します
デーモンの更新サイクルはこうなっています。マスターサーバーへの問い合わせは重いので、一覧の再取得は約30分に1回、その間は登録済みサーバーへの個別クエリ(A2S)を150秒間隔で回す二段構えです。
応答がなくなったサーバーは即削除せず status=DOWN にマークしておき、clear でまとめて掃除します。
自作 gem の組み合わせでできていて、QStat の呼び出しとパースは ruby-qstat、マスターサーバー取得の失敗時リトライは retry-handler を使っています。