sashimi4’s diary

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

マイクラマルチサーバーの入退室をSlackに通知する

どうも、おさしみです。 今回は、下記記事のおまけで、タイトルの通り、やっていきたいと思います。 sashimi4.hatenablog.com

もっと頑張ればLightweightになる気がしているんですが、妥協で運用しているのでなかなか手間がかかる方法になっています。

※ 前回とは違い、もはやエンジニアでないと理解できない内容になっていると思います。 ご参考までに(強め)。

手順(ざっくり)

  • Rubyをインストール

2.3を使用します。 私はanyenvからのrbenvでインストールしました。

# ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
  • Guard(Ruby gem)をインストール
$ gem install guard-rspec --no-ri --no-doc
$ gem install guard-shell --no-ri --no-doc

と言った感じでインストールします。

  • Guardfileを設置

マイクラのサーバーのログが溜まる場所と同ディレクトリに設置します。

$ cat  Guardfile
guard :shell do
  ll = ''
  watch(/latest.log/) {|m|
    # regexp joined|left|drown|slain
    ll = `tail -n 1 #{m[0]}`

    if ll.include?('joined') || ll.include?('left')
      message = ':white_check_mark: ' + ll.gsub(/(\r\n|\r|\n|\f)/,"") if ll.include?('joined')
      message = ':black_square_for_stop: ' + ll.gsub(/(\r\n|\r|\n|\f)/,"") if ll.include?('left')
      message = "[マイクラ鯖の通知だよ!] #{message}"
      channel = '#minecraft'
      username = 'Minecraft'
      icon = ':minecraft:'
      token = 'SLACK_INCOMING_WEBHOOK_TOKEN'

      cmd = %Q{curl -X POST --data-urlencode 'payload={"channel": \"#{channel}\", "username": \"#{username}\", "text": \"#{message}\", "icon_emoji": \"#{icon}\"}' https://hooks.slack.com/services/#{token}}

      `#{cmd}` unless message.nil?
    end
  }
end

こんな感じのファイルを設置します。

SLACK_INCOMING_WEBHOOK_TOKEN の部分は、ご自分のSlackチームでIncoming-Webhookを追加・設定し、トークンで置き換えてください。

  • Guardを実行
$ guard -p -l 5

といった感じで実行します。 screenセッション上などで実行すると良いと思います。

以上で設定が完了するはずです。

結果

マイクラへjoin/leftすると、このように通知がされるはずです! f:id:sashimi4:20171116230353p:plain

余談

Guardはファイルを監視し、差分を検知した時に任意のスクリプトを実行できます。 通常は、RSpecなどのテストを駆動するために用いるんですが…こういう使い方もできなくはないです。 まあこのためだけにRubyやらなにやらをセットアップするのは微妙ですね…。 CRONでもwatchでもなんでも良いんですけどね…。

はい、ざっくりですが、以上です。 何かあればコメントで。批判は頂けません><。