minetestbot-modules/serverup.py

61 lines
1.6 KiB
Python
Executable File

#!/usr/bin/env python3
"""
serverup.py - Minetest server ping module
Copyright 2018, sfan5
Licensed under GNU General Public License v2.0
"""
import socket
import time
def check(address, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(2.0)
try:
buf = b"\x4f\x45\x74\x03\x00\x00\x00\x01"
sock.sendto(buf, (address, port))
start = time.time()
data = sock.recv(1024)
if not data:
return
end = time.time()
peer_id = data[12:14]
buf = b"\x4f\x45\x74\x03" + peer_id + b"\x00\x00\x03"
sock.sendto(buf, (address, port))
sock.close()
return (end - start)
except (socket.gaierror, socket.error):
return
def serverup(phenny, input):
arg = input.group(2)
if not arg:
return phenny.reply("give me an address and port (optional)")
arg = arg.replace(":", " ")
if ' ' in arg:
address, port = arg.split(' ')
try:
port = int(port)
except ValueError:
return phenny.reply("invalid port")
else:
address = arg
port = 30000
if '.' not in address:
return phenny.reply("invalid address")
if port < 1024 and port >= 2**16:
return phenny.reply("invalid port")
desc = "%s:%d" % (address, port)
result = check(address, port)
if result is None:
phenny.say("%s seems to be down" % desc)
else:
phenny.say("%s is up (%dms)" % (desc, result*1000))
serverup.commands = ['up']
if __name__ == '__main__':
print(__doc__)