[Server] Add multiple query searching

master
Sfan5 2013-05-01 09:23:41 +02:00
parent 1a59ab867f
commit 73646e636b
2 changed files with 116 additions and 66 deletions

View File

@ -53,18 +53,22 @@ Required arguments are enclosed in { and }, optional arguments are enclosed in \
<tr> <td><b>seen.py</b></td> <td></td> <td></td> </tr>
<tr> <td>!seen {person}</td> <td>Output when person was last seen</td> <td>Anyone</td> </tr>
<tr> <td><b>server.py</b></td> <td></td> <td></td> </tr>
<tr> <td>!server [searchstring]</td> <td>Search servers at servers.minetest.net</td> <td>Anyone</td> </tr>
<tr> <td>!server [query] [query] ...</td> <td>Search servers at servers.minetest.net</td> <td>Anyone</td> </tr>
<tr> <td></td> <td>addr:{string} searches in Address</td> <td></td> </tr>
<tr> <td></td> <td>name:{string} searches in Server name</td> <td></td> </tr>
<tr> <td></td> <td>players:{modifier} uses Player count</td> <td></td> </tr>
<tr> <td></td> <td>- most finds server with most players</td> <td></td> </tr>
<tr> <td></td> <td>- least finds server with least players</td> <td></td> </tr>
<tr> <td></td> <td>- >{number} finds server with players > x</td> <td></td> </tr>
<tr> <td></td> <td>- &lt;{number} finds server with players < &lt;</td> <td></td> </tr>
<tr> <td></td> <td>- [=]{number} finds server with x players</td> <td></td> </tr>
<tr> <td></td> <td>- most finds servers with most players</td> <td></td> </tr>
<tr> <td></td> <td>- least finds servers with least players</td> <td></td> </tr>
<tr> <td></td> <td>- >{number} finds servers with players > x</td> <td></td> </tr>
<tr> <td></td> <td>- &lt;{num} finds servers with players &lt; x</td> <td></td> </tr>
<tr> <td></td> <td>- [=]{number} finds servers with x players</td> <td></td> </tr>
<tr> <td></td> <td>- !{number} finds servers with not x players</td> <td></td> </tr>
<tr> <td></td> <td>ping:{modifier} uses Player count</td> <td></td> </tr>
<tr> <td></td> <td>- same modifiers as players:</td> <td></td> </tr>
<tr> <td></td> <td>port:{modifier} uses Port</td> <td></td> </tr>
<tr> <td></td> <td>- same modifiers as players:</td> <td></td> </tr>
<tr> <td></td> <td>i:{number/'last'} return Server no. x</td> <td></td> </tr>
<tr> <td></td> <td>random pick random entry from results</td> <td></td> </tr>
<tr> <td><b>serverup.py</b></td> <td></td> <td></td> </tr>
<tr> <td>!up {IP/hostname} [port]</td> <td>Check if server at IP/hostname is up</td> <td>Anyone</td> </tr>
<tr> <td></td> <td>Supports multiple Ports e.g. 123-456,999</td> <td></td> </tr>

166
server.py
View File

@ -1,45 +1,48 @@
#!/usr/bin/env python
"""
server.py - Phenny Minetest Server Module
Copyright 2012, Sfan5
Copyright 2013, Sfan5
"""
import web, json, random
def by_random(tbl, arg):
return random.randrange(0, len(tbl))
return [random.randrange(0, len(tbl))]
def by_address(tbl, arg):
results = []
for i in range(0, len(tbl)):
e = tbl[i]
if arg.lower().strip() in e["address"].lower().strip():
return i
return None
results.append(i)
return results
def by_name(tbl, arg):
results = []
for i in range(0, len(tbl)):
e = tbl[i]
if arg.lower().strip() in e["name"].lower().strip():
return i
return None
results.append(i)
return results
def by_players(tbl, arg):
results = []
if arg.startswith("<"): # less comparing
try:
nu = int(arg[1:])
except:
return None
return []
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) < nu:
return i
results.append(i)
elif arg.startswith(">"): # more comparing
try:
nu = int(arg[1:])
except:
return None
return []
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) > nu:
return i
results.append(i)
elif arg == "most": # most
ranking = (-1, None)
for i in range(0, len(tbl)):
@ -52,99 +55,123 @@ def by_players(tbl, arg):
if int(tbl[i]["clients"]) < ranking[0]:
ranking = (int(tbl[i]["clients"]), i)
return ranking[1]
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:
return None
return []
for i in range(0, len(tbl)):
if int(tbl[i]["clients"]) == nu:
return i
return nu
return None
results.append(i)
return results
def by_ping(tbl, arg):
results = []
if arg.startswith("<"): # less comparing
try:
nu = float(arg[1:])
except:
return None
return []
for i in range(0, len(tbl)):
if float(tbl[i]["ping"]) < nu:
return i
results.append(i)
elif arg.startswith(">"): # more comparing
try:
nu = int(arg[1:])
nu = float(arg[1:])
except:
return None
return []
for i in range(0, len(tbl)):
if float(tbl[i]["ping"]) > nu:
return i
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)
return ranking[1]
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)
return ranking[1]
results.append(ranking[1])
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:
return None
return []
for i in range(0, len(tbl)):
if float(tbl[i]["clients"]) == nu:
return i
return nu
return None
results.append(i)
return results
def by_index(tbl, arg):
if arg == "last":
return len(tbl) - 1
return [len(tbl) - 1]
else:
try:
return int(arg)
if int(arg) < len(tbl) - 1:
return [int(arg)]
except:
return None
return []
def by_port(tbl, arg):
results = []
if arg.startswith("<"): # less comparing
try:
nu = int(arg[1:])
except:
return None
return []
for i in range(0, len(tbl)):
if int(tbl[i]["port"]) < nu:
return i
results.append(i)
elif arg.startswith(">"): # more comparing
try:
nu = int(arg[1:])
except:
return None
return []
for i in range(0, len(tbl)):
if int(tbl[i]["port"]) > nu:
return i
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)
else:
if arg.startswith("="): # support "3" and "=3"
arg = arg[1:]
try:
nu = int(arg)
except:
return None
return []
for i in range(0, len(tbl)):
if int(tbl[i]["port"]) == nu:
return i
return nu
return None
results.append(i)
return results
def server(phenny, input):
for x in phenny.bot.commands["high"].values():
@ -157,34 +184,53 @@ def server(phenny, input):
choicefunc = by_random
carg = None
else:
if arg.startswith("addr:"):
choicefunc = by_address
carg = arg[len("addr:"):]
elif arg.startswith("name:"):
choicefunc = by_address
carg = arg[len("name:"):]
elif arg.startswith("players:"):
choicefunc = by_players
carg = arg[len("players:"):]
elif arg.startswith("ping:"):
choicefunc = by_ping
carg = arg[len("ping:"):]
elif arg.startswith("i:"):
choicefunc = by_index
carg = arg[len("i:"):]
elif arg.startswith("port:"):
choicefunc = by_port
carg = arg[len("port:"):]
else:
choicefunc = by_name
carg = None
arg = arg.split(" ")
cfuncs = []
cargs = []
for a in arg:
if a.startswith("addr:"):
choicefunc = by_address
carg = a[len("addr:"):]
elif a.startswith("name:"):
choicefunc = by_address
carg = a[len("name:"):]
elif a.startswith("players:"):
choicefunc = by_players
ca = a[len("players:"):]
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
carg = ""
cfuncs.append(choicefunc)
cargs.append(carg)
text = web.get("http://servers.minetest.net/list")
server_list = json.loads(text)["list"]
choice = choicefunc(server_list, carg)
if choice == None:
return phenny.reply("No results")
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 idx in range(0, len(server_list)):
if idx in choices:
prep_table.append(server_list[idx])
choice = choices[0]
name = server_list[choice]["name"]
address = server_list[choice]["address"]
if server_list[choice]["port"] != "30000":