≒ screenで起動しているプログラムに管理者コマンドを差し込む
やりたいこと
- マイクラプレイヤーの方であれば、「一緒に遊んでいた人が寝落ちてしまって、ゲーム内で夜を明かせない」というとき、その人をマルチサーバから一時退出させたいといった場面が稀によくあるかと思います。
- マイクラはサーバコンソールから直接コマンドを入力すれば、operator権限の処理を実行できます。
- 或いは、サーバコンソールから、
op HOGE
とすればユーザHOGEにop権限を付与し、HOGEがゲーム内チャットでop権限の処理を実行することも可能です。
- 或いは、サーバコンソールから、
- op権限を持つとkickコマンドが扱えるようになります。
- しかし、大人数がアクセスするワールドで参加者全員にop権限を与えるのは無謀の極み…。
- そこで、特定のopコマンドのみを別インタフェースから誰でも実行できるような手段を用意したい
運用しているマイクラサーバの状況
- 1つのサーバで4つのワールドを同時に建てています。
- それぞれのワールドをscreen内で実行し、別々のポートを開放して割り当てることで容易に並列動作が可能です。(そこそこサーバスペックが必要ですが)
- 僕が建てているサーバで遊んでいる人は例外なく、 とあるDiscordサーバにも参加している ということで…
そりゅーしょん
Discord botにお願いしよう!(Discord botについてはこちら)
-
以下のようなshellscriptの実行で、screenに文字列を差し込めます。
- (今回は"minecraft"という名前でscreenを起動)
minecraft_scripts/kick.sh
screen -S minecraft -X stuff "kick $1\n"
- discord botに追加するメソッドがこちら。
main.py
# send kick signal to Minecraft
# メソッドへの入力(text) = discordチャンネルからのテキストメッセージ
def send_signal_to_minecraft(text):
response_string = ''
if text.find("minecraft kick") > -1:
index_st = text.find('kick ') + 5
#index_ed = text.find('')
user_name = text[index_st:]
response_string = "了解いたしました。"+ user_name + "さんをキックします。"
try:
subprocess.call(["sh", "minecraft_scripts/kick.sh", user_name])
except Exception as e:
response_string = '構文エラーです>< :cold_sweat:\n' + e.message + '\n' + str(e)
else:
response_string = "構文エラーです>< :cold_sweat:\n 正しく入力してね!"
return response_string
使い方
- Discordのチャットチャンネルで
雲さん minecraft kick マイクラID名
と入力すると、botがマイクラの管理コンソールから指定ユーザをキックしてくれます! - 今回はキック機能のみ実装しましたが、管理コンソールから実行できるコマンドであればどんな内容でもbot経由で実行することができます。
- 勢いでダダダっと書いてしまいましたが、皆さんの快適マイクラライフの参考になれば幸いです🌟