minecraft-monitor/update-status.py

62 lines
1.9 KiB
Python

from mcstatus import MinecraftServer
from datetime import datetime
from makeline import make_line
from json import loads, dumps
from sys import argv
log_path = '/dev/null'
def get_status():
time = datetime.now().timestamp()
try:
server = MinecraftServer("xkcd.cbouton.com", 25555)
query = server.query(retries=1)
players = query.players.names
return {'time': time, 'status': 'online', 'players': players}
except:
return {'time': time, 'status': 'unreachable', 'players': []}
def log(event):
if event['period'][0] != event['period'][1]:
with open(log_path+'events.json', 'a') as fout:
fout.write(dumps(event)+'\n')
with open(log_path+'events.log', 'a') as fout:
fout.write(make_line(event)+'\n')
def new_state_and_log():
prev = {'period': [0,0], 'status': 'undefined', 'players': []}
cur = get_status()
with open(log_path+'current-state.json', 'r') as fin:
prev = loads(fin.read())
if cur['time'] - prev['period'][1] > 110:
log(prev)
log({'period': [prev['period'][1], cur['time']], 'status': 'monitor-offline' })
return {'period': [cur['time'],cur['time']], 'status': cur['status'], 'players': cur['players']}
else:
prev['period'][1] = cur['time']
if prev['status'] == cur['status'] and prev['players'] == cur['players']:
return prev
else:
log(prev)
return {'period': [cur['time'],cur['time']], 'status': cur['status'], 'players': cur['players']}
def update():
next = new_state_and_log()
if next['status'] != 'online':
del next['players']
with open(log_path+'current-state.json', 'w') as fout:
fout.write(dumps(next))
if __name__ == "__main__":
if len(argv) > 1:
log_path = argv[1]+'/'
update()
else:
print('error: specify target path')