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] > 90: 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')