sashimi4’s diary

日々の雑多なメモを書きます

Minecraftの入退室をWebhookで通知する

概要

ゲームサーバーのログをポーリングして入退室等々の通知を行います。 追加インストール不要(OS同梱のもの)で設定します。

環境

  • Ubuntu 14.x or later
    • ディストリビューションによっては curl が同梱されていない場合があるようなので sudo apt install -y curl でインストールしましょう。

設定手順

sudo su - 等々で root に昇格した上で、下記コマンドをコピー&ペーストで実行します。

cat << 'EOF' > /opt/minecraft/notify_log.sh
#!/bin/bash

HOST_NAME=$(hostname)
CHANNEL=#minecraft-notice
USERNAME=Minecraft
ICON_EMOJI=:minecraft:
# NOTE: DiscordはWebhook URL末尾に /slack とつけるとSlack互換のpayloadを扱えます
#       See: https://discordapp.com/developers/docs/resources/webhook#execute-slackcompatible-webhook
WEBHOOK_URL=https://hooks.slack.com/services/****/****/********

post_webhook() {
  while read i
  do
    echo $i | grep -iq -e "joined the game" -e "left the game"
    if [ $? = "0" ];then
      echo $i
      curl -X POST --data-urlencode "payload=\
      {\
        \"channel\": \"$CHANNEL\", \
        \"username\": \"$USERNAME\", \
        \"icon_emoji\": \"$ICON_EMOJI\", \
        \"text\": \"[HOST_NAME: $HOST_NAME]$i\" \
      }" \
      $WEBHOOK_URL
    fi
  done
}

tail -n 0 -F $1 | post_webhook
EOF
chmod +x /opt/minecraft/notify_log.sh
chown ubuntu /opt/minecraft/notify_log.sh
cat << EOF > /etc/systemd/system/minecraft_notifier.service
# /etc/systemd/system/minecraft_notifier.service
[Unit]
Description=Server daemon for Minecraft notifier

[Service]
Type=forking
User=ubuntu
KillMode=none
Restart=on-failure
ExecStart=/usr/bin/screen -dmS minecraft_notifier /bin/bash -c "/opt/minecraft/notify_log.sh /opt/minecraft/logs/latest.log"
ExecStop=/usr/bin/screen -S minecraft_notifier -X quit

[Install]
WantedBy=multi-user.target
EOF
systemctl enable minecraft_notifier
systemctl start minecraft_notifier

ポイント

HOST_NAME

HOST_NAME=$(hostname) の部分は、愛称やドメイン・アドレス等々を直書きしても良いと思います。特に複数サーバーの運用をしている方などは。 HOST_NAME=example.com といった感じに。

WEBHOOK_URL

スクリプト中にもコメントを挿しましたが、なんと Discord は Slack の Incoming Webhook に互換があります!

Discord に通知したい場合は Webhook URL の末尾に /slack を付加すると Slack 互換になります。(イケてますよね、さすが Discord)

なお、本スクリプトでは payload で送っているので channel icon_emoji 等は指定しても Discord では効きません。

echo $i | grep -iq -e "joined the game" -e "left the game"

ここで joined / left のログを検知して通知処理に飛ばしています。 サーバーの警告等も合わせて通知したい場合は、ここで追加で grep すると良いと思います。

操作方法

状態確認

  • sudo systemctl status minecraft_notifier

停止

  • sudo systemctl stop minecraft_notifier

起動/再起動

  • sudo systemctl start minecraft_notifier
  • sudo systemctl restart minecraft_notifier

自動起動設定(OS起動時に自動で起動させる/させない)

  • sudo systemctl enable minecraft_notifier
  • sudo systemctl disable minecraft_notifier

ご一緒にサーバーはいかがでしょうか←

「ご一緒にポテトは」的な()

さくらインターネット からも Minecraftサーバ の スタートアップスクリプト が出ましたね。 vps-news.sakura.ad.jp

私は早速移行し、ここで個人のサーバーを運用しています。

さくらから提供されているスクリプトで鯖立てしつつ、↑で紹介したような通知設定を行っています。快適です。

同様に screen + systemd でスッキリ収まっていて良い感じです。

おまけ

Minecraft とタイトルに入れましたが、ポーリングするログファイルと grep パターン、通知テキストを少し修正すれば、他のゲームやツール等々でも普通に使えますよね。 直近でいうと Factorio でも使えそうですね。はい。

以上、良いゲームライフを :wave: