マイクラサーバーのログをDiscordに転送する
友人たちとやっているマイクラサーバーのログイン状況って気になりますよね。
誰かいるなら入ろうかなとか...
反対に誰もいないし、今のうちに一人でないとできないことを進めておこうとか...
今までは、実際にログインするか、クライアントを立ち上げて確認するしかなかったのですが、Discordで確認できるようにします!!
※java版での実装になります。
一応プラグインや、既存のスクリプトを使ったらわざわざ作らなくてもありますが、最低限「ログを出力する」という機能だけで十分だったので、今回は自作することにしました。
参考
環境
OS : Ubuntu "20.04.6 LTS (Focal Fossa)"
必要機能
- サーバーへのログイン・ログアウト・チャットがDiscordから見れる。
- サーバーログがDiscordから見れる。
- それぞれ、別のチャンネルにメッセージを送信する。
作成
今回は、DiscordWebHookを使用してDiscordチャンネルへのメッセージ送信を行います。
さらに、マインクラフトは、Logファイルをlatest.logとして保存・追記が行われます。そのためlatest.logを監視することで、実装が可能です。
手順
1. Discordの設定
まずは、Discordチャンネルを作成します。(私の場合は2つ/ログイン監視とログ用)
次に、チャンネル設定から連携サービスを選択し、新たなウェブフックを作成します。
ウェブフックURLをコピーし、メモ帳などに張り付けておきます。
2.Bashの作成
#! bin/bash
LOGGER_URL="{Webook_URL1}"
CHAT_URL="{Webhook_URL2}"
LOG_PATH="$1"
#---main---
tail -F "$LOG_PATH" | while read -r line; do
#echo message_content
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"$line\"}"\
$LOGGER_URL
if [[ "$line" == *"<"* ]] || [[ "$line" == *"the game"* ]]; then
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"$line\"}" \
$CHAT_URL
fi
done
LOGGER_URLは、ログを出力するだけのDiscordチャンネルのwebhookURLを使用し、CHAT_URLは、ログイン状況と、チャットのみ抽出して出力を行っています。
また、実行時にログファイルのパスを渡すこと必要があります。
# 実行コード
$ bash logger.sh {ログファイルのパス}
これで完成です。
スクリプトの使用方法
実行の時は、screenなどのを使用して、このプロセスを常に走らせておきます。
付録
スクリプトの詳細説明
見ればわかるかもしれないが、後で自分が分からなくならないように
あと、誤ったことを書いているかもしれないので、その辺はご容赦ください。
#! bin/bash
LOGGER_URL="{Webook_URL1}"
CHAT_URL="{Webhook_URL2}"
LOG_PATH="$1"
#---main---
tail -F "$LOG_PATH" | while read -r line; do
#echo message_content
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"$line\"}"\
$LOGGER_URL
if [[ "$line" == *"<"* ]] || [[ "$line" == *"the game"* ]]; then
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"$line\"}" \
$CHAT_URL
fi
done
LOGGER_URLとCHAT_URLはDiscordWebHookのURLを格納している。
LOG_PATHは、第一引数を使用しており、マインクラフトサーバーのログファイル(logs/latest.log)を保管させる。
tail -F ファイルの追記を監視する。fとFの違いとしては、名前の変更があった時の挙動が異なります。今回の場合、latest.logという名前のファイルを常に追い続けたいので、Fオプションを使用しています。
tail -F で見つかった、更新内容をlineという変数に格納して、whileループを行う。
1つ目のcurl文では、変更内容をそのままDiscordチャンネルに送信している。
2つ目のcurl文では、その前に、"<"が含まれているか、"the game"という文字列が含まれているかの判定を行っている。
マインクラフトでは、ユーザのチャットログは<ユーザー名> チャット内容として出力されている。また、ログイン・ログアウトではユーザー名 joined the game/ユーザー名 left the gameと出力されるので、その部分を判定として、使用している。
Discussion