経緯
最近身内マイクラ鯖を立てまして結構みんな楽しんでやってくれているようなのですが、みんなで一緒にできないことが多いっぽいのです。
誰かがログインして通知をもらえたらみんな幸せなのではと思ったのでBotを召喚することにしました。
開発環境
- DockerのArch Linux (動作環境: Ubuntu 18.04 Server)
- Python 3.6.6
概要
-
Minecraftからデータをn秒間隔で取得。
- mcstatsrv.usのJSONAPIを1分ごとに叩いて取得
- mcapi.deなんてものもあるようです。
SlackのWebhookを叩いて通知
ここから簡単にWebhookURLを取得できます。
中身
import time
import json
import requests
import threading
from lib.slack import *
# Polling Motsunabe minecraft
def motsunabeMinecraft():
preHowManyPlayer = 0
prePlayers = []
players = []
while True:
res = requests.get("https://api.mcsrvstat.us/1/example.com")
data = res.json()
howManyPlayer = data["players"]["online"]
if howManyPlayer > 0:
players = data["players"]["list"]
if howManyPlayer > preHowManyPlayer:
## Someone has logined.
diffSet = set(players) - set(prePlayers)
loginUsers = list(diffSet)
for loginUser in loginUsers:
send_slack("マイクラ鯖へ{}がログインしました。".format(loginUser))
if howManyPlayer < preHowManyPlayer:
## Someone has logouted.
diffSet = set(prePlayers) - set(players)
loginUsers = list(diffSet)
for loginUser in loginUsers:
send_slack("マイクラ鯖から{}がログアウトしました。".format(loginUser))
print("Number of login players is {}".format(howManyPlayer))
preHowManyPlayer = howManyPlayer
prePlayers = players
time.sleep(60)
if __name__ == "__main__":
threading.Thread(target=motsunabeMinecraft).start()
print("Connected..")
ちなみにThreadingをつかっているのは同時にDiscord.pyのログインBotを動かしているためです。単体で動かす場合は必要無いとおもわれ。
結果
うるさくなりすぎてみんなミュートにするのでありました。