👋

マイクラサーバーのログをDiscordに転送する

に公開

友人たちとやっているマイクラサーバーのログイン状況って気になりますよね。
誰かいるなら入ろうかなとか...
反対に誰もいないし、今のうちに一人でないとできないことを進めておこうとか...
今までは、実際にログインするか、クライアントを立ち上げて確認するしかなかったのですが、Discordで確認できるようにします!!
※java版での実装になります。

一応プラグインや、既存のスクリプトを使ったらわざわざ作らなくてもありますが、最低限「ログを出力する」という機能だけで十分だったので、今回は自作することにしました。


参考

https://x.com/Y4D0K4R1/status/1682632709590614016
https://note.com/nashidaicraft/n/n8e7b3f7e91f6


環境

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オプションを使用しています。

fとFの違い
https://qiita.com/sakito/items/7f65e16f10b3d754f307

tail -F で見つかった、更新内容をlineという変数に格納して、whileループを行う。
1つ目のcurl文では、変更内容をそのままDiscordチャンネルに送信している。
2つ目のcurl文では、その前に、"<"が含まれているか、"the game"という文字列が含まれているかの判定を行っている。
マインクラフトでは、ユーザのチャットログは<ユーザー名> チャット内容として出力されている。また、ログイン・ログアウトではユーザー名 joined the game/ユーザー名 left the gameと出力されるので、その部分を判定として、使用している。

Discussion