minetestbot-modules/server.py

257 lines
7.4 KiB
Python
Raw Normal View History

2013-01-07 10:00:44 -08:00
#!/usr/bin/env python
"""
server.py - Phenny Minetest Server Module
2013-05-01 00:23:41 -07:00
Copyright 2013, Sfan5
2013-01-07 10:00:44 -08:00
"""
import web, json, random
2013-01-07 10:00:44 -08:00
def by_random(tbl, arg):
2013-05-01 00:23:41 -07:00
return [random.randrange(0, len(tbl))]
def by_address(tbl, arg):
2013-05-01 00:23:41 -07:00
results = []
for i in range(0, len(tbl)):
e = tbl[i]
if arg.lower().strip() in e["address"].lower().strip():
2013-05-01 00:23:41 -07:00
results.append(i)
return results
def by_name(tbl, arg):
2013-05-01 00:23:41 -07:00
results = []
for i in range(0, len(tbl)):
e = tbl[i]
if arg.lower().strip() in e["name"].lower().strip():
2013-05-01 00:23:41 -07:00
results.append(i)
return results
def by_players(tbl, arg):
2013-05-01 00:23:41 -07:00
results = []
if arg.startswith("<"): # less comparing
try:
nu = int(arg[1:])
except:
2013-05-01 00:23:41 -07:00
return []
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) < nu:
2013-05-01 00:23:41 -07:00
results.append(i)
elif arg.startswith(">"): # more comparing
try:
nu = int(arg[1:])
except:
2013-05-01 00:23:41 -07:00
return []
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) > nu:
2013-05-01 00:23:41 -07:00
results.append(i)
elif arg == "most": # most
ranking = (-1, None)
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) > ranking[0]:
ranking = (int(tbl[i]["clients"]), i)
results.append(ranking[1])
elif arg == "least": # least
ranking = (9999, None)
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) < ranking[0]:
ranking = (int(tbl[i]["clients"]), i)
results.append(ranking[1])
2013-05-01 00:23:41 -07:00
elif arg.startswith("!"): # not comparing
try:
nu = int(arg[1:])
except:
return []
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) != nu:
results.append(i)
else:
if arg.startswith("="): # support "3" and "=3"
arg = arg[1:]
try:
nu = int(arg)
except:
2013-05-01 00:23:41 -07:00
return []
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) == nu:
2013-05-01 00:23:41 -07:00
results.append(i)
return results
2013-01-07 10:00:44 -08:00
def by_ping(tbl, arg):
2013-05-01 00:23:41 -07:00
results = []
if arg.startswith("<"): # less comparing
try:
nu = float(arg[1:])
except:
2013-05-01 00:23:41 -07:00
return []
for i in range(0, len(tbl)):
if float(tbl[i]["ping"]) < nu:
2013-05-01 00:23:41 -07:00
results.append(i)
elif arg.startswith(">"): # more comparing
try:
2013-05-01 00:23:41 -07:00
nu = float(arg[1:])
except:
2013-05-01 00:23:41 -07:00
return []
for i in range(0, len(tbl)):
if float(tbl[i]["ping"]) > nu:
2013-05-01 00:23:41 -07:00
results.append(i)
elif arg == "most": # most
ranking = (-1, None)
for i in range(0, len(tbl)):
if float(tbl[i]["ping"]) > ranking[0]:
ranking = (float(tbl[i]["ping"]), i)
results.append(ranking[1])
elif arg == "least": # least
ranking = (9999, None)
for i in range(0, len(tbl)):
if float(tbl[i]["ping"]) < ranking[0]:
ranking = (float(tbl[i]["ping"]), i)
results.append(ranking[1])
2013-05-01 00:23:41 -07:00
elif arg.startswith("!"): # not comparing
try:
nu = float(arg[1:])
except:
return []
for i in range(0, len(tbl)):
if float(tbl[i]["ping"]) != nu:
results.append(i)
else:
if arg.startswith("="): # support "0.6" and "=0.6"
arg = arg[1:]
try:
nu = float(arg)
except:
2013-05-01 00:23:41 -07:00
return []
for i in range(0, len(tbl)):
if float(tbl[i]["clients"]) == nu:
2013-05-01 00:23:41 -07:00
results.append(i)
return results
def by_index(tbl, arg):
if arg == "last":
2013-05-01 00:23:41 -07:00
return [len(tbl) - 1]
else:
try:
2013-05-01 00:23:41 -07:00
if int(arg) < len(tbl) - 1:
return [int(arg)]
except:
2013-05-01 00:23:41 -07:00
return []
2013-04-29 05:50:43 -07:00
def by_port(tbl, arg):
2013-05-01 00:23:41 -07:00
results = []
2013-04-29 05:50:43 -07:00
if arg.startswith("<"): # less comparing
try:
nu = int(arg[1:])
except:
2013-05-01 00:23:41 -07:00
return []
2013-04-29 05:50:43 -07:00
for i in range(0, len(tbl)):
if int(tbl[i]["port"]) < nu:
2013-05-01 00:23:41 -07:00
results.append(i)
2013-04-29 05:50:43 -07:00
elif arg.startswith(">"): # more comparing
try:
nu = int(arg[1:])
except:
2013-05-01 00:23:41 -07:00
return []
2013-04-29 05:50:43 -07:00
for i in range(0, len(tbl)):
if int(tbl[i]["port"]) > nu:
2013-05-01 00:23:41 -07:00
results.append(i)
elif arg.startswith("!"): # not comparing
try:
nu = int(arg[1:])
except:
return []
for i in range(0, len(tbl)):
if int(tbl[i]["port"]) != nu:
results.append(i)
2013-04-29 05:50:43 -07:00
else:
if arg.startswith("="): # support "3" and "=3"
arg = arg[1:]
try:
nu = int(arg)
except:
2013-05-01 00:23:41 -07:00
return []
2013-04-29 05:50:43 -07:00
for i in range(0, len(tbl)):
if int(tbl[i]["port"]) == nu:
2013-05-01 00:23:41 -07:00
results.append(i)
return results
2013-04-29 05:50:43 -07:00
2013-01-07 10:00:44 -08:00
def server(phenny, input):
for x in phenny.bot.commands["high"].values():
if x[0].__name__ == "aa_hook":
if x[0](phenny, input):
return # Abort function
arg = input.group(2)
if not arg:
cfuncs = [by_random]
cargs = [None]
else:
arg = arg.strip().split(" ")
2013-05-01 00:23:41 -07:00
cfuncs = []
cargs = []
for a in arg:
if a == "": continue
2013-05-01 00:23:41 -07:00
if a.startswith("addr:"):
choicefunc = by_address
carg = a[len("addr:"):]
elif a.startswith("name:"):
2013-06-08 11:06:17 -07:00
choicefunc = by_name
2013-05-01 00:23:41 -07:00
carg = a[len("name:"):]
elif a.startswith("players:"):
choicefunc = by_players
2013-05-17 23:32:59 -07:00
carg = a[len("players:"):]
2013-05-01 00:23:41 -07:00
elif a.startswith("ping:"):
choicefunc = by_ping
carg = a[len("ping:"):]
elif a.startswith("i:"):
choicefunc = by_index
carg = a[len("i:"):]
elif a.startswith("port:"):
choicefunc = by_port
carg = a[len("port:"):]
elif a == "random":
choicefunc = by_random
carg = ""
else:
choicefunc = by_name
2013-05-01 12:55:23 -07:00
carg = a
2013-05-01 00:23:41 -07:00
cfuncs.append(choicefunc)
cargs.append(carg)
text = web.get("http://servers.minetest.net/list")
server_list = json.loads(text)["list"]
2013-05-01 00:23:41 -07:00
prep_table = server_list
for i in range(0, len(cfuncs)):
choicefunc = cfuncs[i]
carg = cargs[i]
choices = choicefunc(prep_table, carg)
if len(choices) == 0:
return phenny.reply("No results")
prep_table_ = []
for c in choices:
prep_table_.append(prep_table[c])
prep_table = prep_table_
choice = prep_table[0]
name = choice["name"]
address = choice["address"]
if choice["port"] != "30000":
if ':' in address: # IPv6
address = "[" + address + "]"
address += ":" + choice["port"]
clients = choice["clients"]
2013-04-27 11:11:09 -07:00
try:
version = choice["version"] + " " + server_list[choice]["gameid"]
2013-04-27 11:11:09 -07:00
except:
version = choice["version"]
ping = choice["ping"]
clients_max = choice["clients_max"]
clients_top = choice["clients_top"]
phenny.reply("%s | %s | Clients: %s/%s, %s | Version: %s | ping: %s" % (name, address, clients, clients_max, clients_top, version, ping))
2013-01-07 10:00:44 -08:00
server.commands = ['sv', 'server']
server.thread = True
if __name__ == '__main__':
print __doc__