62 lines
1.9 KiB
Python
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] > 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')
|