はじめに
私はLoLが好きです。
特に、友だちを集めてみんなでLoLをするのが大好きです。
ドラフトで練習したり、メイヘムで殴り合ったり、スイフトでオフメタしたり。
夕飯後に、Discordでボイスチャットしながら、みんなでワイワイ数戦やって、
「じゃあ今日はこのへんで」と解散する。
ここまでは平和です。
でも、問題はそのあと。
最後の試合で負けたり、自分の思うようなプレイができなかったりすると、
「いや、さすがにこのまま寝られない」
「ラスト1回だけ」
「勝って終わろう」
みたいな気持ちになって、気づいたらソロキューを入れてしまう。
そして、気づけば深夜3時。まじかよ。
やばい、今日も寝不足。
作ったもの
そんな自分を止めるために、ソロキューだけマッチングを自動キャンセルするプログラムを作りました。
やることはシンプルです。
- LoLクライアントの状態を監視する
- 1人ロビー、つまりソロ状態か確認する
- ソロ状態でマッチング検索が始まったらキャンセルする
- 検索キャンセル前にマッチングしてもReadyCheckを辞退する
- 2人以上のパーティでは何もしない
- 対戦中の操作には関与しない
今回止めたいのは、解散後に始まる「納得できないからもう1戦」だけです。
他には影響が出ないように、ソロキューだけ阻止する仕組みを作りました。
※この記事では、細かい実装よりも「なぜ作ったか」と「どういう仕組みにしたか」を中心に記載しています。
LCU APIの詳しい呼び出し方やWindowsサービス化の話は、別記事でまとめる予定です。
仕組み
LoLクライアントには、ローカルで動いているAPIがあります。
いわゆるLCU APIです。
このAPIを使って、現在のロビー人数やマッチング検索状態を確認します。
ざっくりした流れはこんな感じです。
LoLクライアント起動
↓
ロビー人数を確認
↓
1人ロビーか判定
↓
マッチング検索中か確認
↓
ソロ検索中ならキャンセル
使っている主なAPIは以下です。
| 目的 | メソッド | パス |
|---|---|---|
| ロビー取得 | GET | /lol-lobby/v2/lobby |
| ロビー人数取得の補助 | GET | /lol-lobby/v2/lobby/members |
| 検索状態取得 | GET | /lol-lobby/v2/lobby/matchmaking/search-state |
| 検索キャンセル | DELETE | /lol-lobby/v2/lobby/matchmaking/search |
| Ready Check取得 | GET | /lol-matchmaking/v1/ready-check |
| Ready Check辞退 | POST | /lol-matchmaking/v1/ready-check/decline |
大事にした判定
一番大事にしたのは、ソロのときだけ動くことです。
2人以上で遊んでいるときに勝手にマッチングを止めたら、ただの迷惑ツールになってしまいます。
なので、ロビー人数が確認できて、かつ1人だと分かった場合だけ動くようにしました。
is_solo_lobby = member_count is not None and member_count < 2
if is_solo_lobby and searching:
cancel_matchmaking(lcu)
if is_solo_lobby and should_decline_ready_check(ready_check):
decline_ready_check(lcu)
ポイントは、member_count is not None を入れているところです。
ロビー人数が分からないときは、ソロだと決めつけません。
分からないなら何もしない。
こういう自動化では、動くことよりも「動かないべき場面で動かないこと」のほうが大事だと思っています。
Windowsで常駐させる
毎回手動でスクリプトを起動していたら、そのうち面倒になって使わなくなります。
なので、Windowsサービスとして常駐させました。
構成はこんな感じです。
| 名前 | 役割 |
|---|---|
LoLSQGWorkerSvc |
実際にLCUを監視するサービス |
LoLSQGuardianSvc |
workerの監視と復旧を行うサービス |
LoLSoloQueueGuard_Bootstrap |
OS起動時やログオン時の復旧用タスク |
意識したのは以下です。
- PC再起動後も動く
- スリープ復帰後も復旧する
- 余計なウィンドウを出さない(バックグラウンドで完結する)
- 落ちても復旧できる
- 必要なときは状態確認や緊急停止ができる

↑タスクスケジューラはスタートアップ時、ログオン時、定期実行で設定。
動作確認
確認した内容は以下です。
- 1人ロビーで検索を開始すると、すぐに検索がキャンセルされる
- 1人ロビーでReady Checkが出ると、すぐに辞退される
- 2人以上のパーティでは検索キャンセルもReady Check辞退も行われない
- ロビー人数が取得できない場合は何もしない
- 対戦中の状態には干渉しない
- サービス停止後に復旧できる
ステータス確認と緊急停止
常駐系のツールなので、動いているか確認できるようにしています。
cd <project-root>
.\Check-LoLSoloQueueGuardStatus.ps1
止めたいとき用に、緊急停止スクリプトも用意しました。
cd <project-root>
.\Emergency-Stop-LoLSoloQueueGuard.ps1
それでも止めようと思えば止められる
もちろん、自分のPCなので、自分には管理者権限があります。
やろうと思えば、サービスを止めることはできてしまいます。
別に完全な強制力があるわけではありません。
というか、しっかり自制心を働かせていれば、こんなものはそもそも必要ありません。
でも、今回実装してみて書き残したかったのは、そういう身も蓋もない話ではありません。
自分で仕様を考えて、LCU APIを調べて、サービス化して、復旧処理も入れて、動作確認までしました。
そこまで時間と工数をかけると、
「せっかく作ったんだから、ちゃんと機能させたい」
という気持ちが出てきます。
結果として、深夜に勢いでソロキューを始めることはなくなりました。
技術的にはただの自動キャンセルですが、実際には自分の行動にワンクッション置くための仕組みでした。
作ってみて思ったこと
今回のプログラムは、ものすごく高度なことをしているわけではありません。
でも、自分の悪い習慣に対して、コードで物理的な摩擦を作れたのがよかったです。
「やめたい」と思っているだけだと、欲望に負けてしまうこともあると思います。
(特に休日前だと、言い訳できてしまいますからね…。)
でも、仕組みを作っておくと、一歩踏みとどまることができるかもしれません。
これは、何もゲームのやりすぎだけに効く話ではないと思います。
SNSやYoutubeでの時間浪費を防ぎたいなら、Wiresharkとか使ってトラフィックログでも取って、閾値を超えたら制限してしまうとか。
逆に、継続したい習慣に対しても利用できる考え方です。
筋トレ管理アプリを自分で作ってしまえば、そのアプリを使うために筋トレの習慣が付くかもしれません。
そして、それでQiitaの記事を書いてしまえば、一石二鳥ではないですか。
遠回りに見えることが、実は効率的で省エネな制御法になることも、覚えておこうと思える開発体験でした。
まとめ
LoLがやめられないので、ソロキューだけマッチングを自動キャンセルする常駐ガードを作りました。
技術的には、LCU APIを監視して、ソロロビーでのマッチング検索とReady Checkを止めるだけのシンプルな仕組みです。
ただ、自分にとって大事だったのは、完全にゲームを禁止することではありませんでした。
友だちと遊ぶLoLは残しつつ、
解散後に始まる「納得できないからもう1戦」だけを止める。
そのために、以下を意識しました。
- ソロロビーのときだけ動作する
- 2人以上のパーティでは何もしない
- ロビー人数が分からないときも何もしない
- Windowsサービスとして常駐させる
- 自分の行動にワンクッション置く
意思の力だけで毎回勝てるなら、それが一番です。
でも、深夜の自分はだいたい強いですからね。
正面から欲求と戦うのではなく、コードで少しだけ摩擦を作ることにしました。
ゲームを完全に禁止するのではなく、
「やりすぎる瞬間」だけをターゲットにして、仕組みで止める。
自分には、これくらいのゆるい制御がちょうどよかったです。
実装の詳細、LCU APIの扱い、Windowsサービスとして常駐させる構成については、長くなってしまうので、別記事であらためて整理しようと思います。
ここまで読んでいただき、ありがとうございました。

