はじめに

研究室の人たちとマイクラのマルチで遊んでるんですが、誰がインしているかを知りたいため、ログイン通知をつけています。せっかくなのでその方法を公開します。

前提条件

通知を送信する際に Python 製のライブラリを使用するので Python が使用できることが前提です。

僕の環境の場合は 3.8.0 で動作しています。

必要ライブラリのインストールは以下のコマンドでできます。

pip install pynotificator

インストールした PyNotificator は Slack、Discord、LINE にメッセージを送信することができるので、受け取り先を決めて必要なURL、トークンを以下から取得します。

-Slack: Slack API
-Discord: サーバー設定 > ウェブフック より、Webhook 用の URL を取得
-LINE: LINE Notify

通知用のスクリプト

マイクラのサーバ実行スクリプトからパイプで通知用コマンドにログを流します。

実行コマンドの大枠は以下のとおりです。

<マイクラのサーバ実行コマンド> | while read -r line
do
  if [[ $line == *joined\ the\ game* ]]; then echo "${line:33}" | <slack|discord|line>-notify -m "$(cut -d ' ' -f 1) がログインしました。" <URL|token> ; fi
  if [[ $line == *left\ the\ game* ]]; then echo "${line:33}" | <slack|discord|line>-notify -m "$(cut -d ' ' -f 1) がログアウトしました。" <URL|token> ; fi
done;

これをもとに Slack か Discord か LINE を選択して、上記の <> で囲まれた部分を書き換えてください。
例えば以下のようなコマンドになります。

java -jar server.jar nogui | while read -r line
do
  if [[ $line == *joined\ the\ game* ]]; then echo "${line:33}" | slack-notify -m "$(cut -d ' ' -f 1) がログインしました。" https://hooks.slack.com/services/xxx ; fi
  if [[ $line == *left\ the\ game* ]]; then echo "${line:33}" | slack-notify -m "$(cut -d ' ' -f 1) がログアウトしました。" https://hooks.slack.com/services/yyy ; fi
done;

動作例

僕の環境では Discordに送っているので、このようになります。

ちなみに、このスクリプトを少し応用すると、死亡通知などもつけることができるようになります。

おわりに

情報系の研究室っぽく、マイクラをやる環境もどんどん便利にしていきたいですね。

6件のコメント

  1. コピペ&書き換えして実行はできたのですが、「discord-notify: コマンドが見つかりません」と返されてBotメッセージが送信されません。ログイン、ログアウトいずれもです。
    条件分岐までは正しく動作していて、真のときの処理がうまくいっていないように思案されます。(Python初心者なので大まかな部分しか理解できませんでした)環境はubuntu20.04LTS、pythonやpynotificatorは正しくインストールできています。

    maglev
    1. 一度うまく通知を飛ばすことができましたが、再びとばなくなってしまいました…
      discord-notify: コマンドが見つかりません と表示されてしまいます。
      同じコマンドしか打ってない(つもり)なので何がキッカケでうまく行ったのか、失敗しているのかサッパリわからない状況です。
      ちゃんと1から勉強しないとダメですね。

      maglev
  2. コピペしての中を替えてみたのですが全然できません><

    ちび
  3. こんにちは。
    私もぜひ同じことをしてみたいのですが、こういったことに関して全くの素人なので困っています。
    “マイクラのサーバ実行スクリプトからパイプで通知用コマンドにログを流します。”
    というのは、サーバーを起動するバッチファイルに追記するということでしょうか?
    もしそうでしたら、以下のどの部分に追記すれば良いのでしょうか。

    @echo off

    call settings.bat

    :start_server
    echo Starting SevTech Ages Server…
    java -server -Xms%MIN_RAM% -Xmx%MAX_RAM% %JAVA_PARAMETERS% -jar %SERVER_JAR% nogui
    pause
    exit /B

    goto start_server

    実行コマンドのnogui~の後に繋がるようにwhile~を打つとサーバーが起動しなくなったので、その下に別個に記述したのですが、それもうまくいきませんでした。

    全くの素人の質問で煩わしいとは思いますが、よろしければご教授いただければ幸いです。

    佐藤
    1. 記事中に書いていませんでしたが、今回のスクリプトは Z Shell を使用して実行しています。

      > バッチファイルに追記するということでしょうか?
      と書かれているので、おそらく Windows を使用しているかと思いますが、Windows のコマンドプロンプトでは使用するコマンドが変わってきます。

      Windows で開発をしていないので、詳細は分かりませんが、おそらく以下の2点の問題が起きています。
      – `@echo off` を指定しているため、ログが流れない → そもそも通知を送る条件に引っかからない
      – `while` や `read` などのコマンドが Windows のコマンドプロンプトでは使用できない or 違うコマンドになっている

      先にも述べたように、Windows で開発を行なっていないため、具体的な修正案を提示することはできませんが、参考までに。

      hgrs
      1. 非常に丁寧な説明ありがとうございます。
        頂いた助言をもとに自分なりに改良してみたいと思います。
        貴重な助言をどうもありがとうございました。

        佐藤

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です