Last active 1450565359

Multicraft Python Cloudbot plugin

Revision 17c4f10868069a02aae0d3299fb9ebdf1566fc61

multicraft.py Raw
1# For use with CloudBot (http://git.io/cbgit), although it'll also work as a Python module
2# ('import multicraft; data = multicraft.multicraft("METHOD PARAM=VALUE")')
3# Full API documentation coming soon (better than Multicraft's PHP-specific documentation, I'm hoping)
4
5# This file (multicraft.py) created by Steven Smith (blha303) 2013
6# GPLv3 license (because CloudBot is GPL)
7# http://opensource.org/licenses/GPL-3.0
8
9# Updated to use hashlib instead of calling an external website for md5 hashing
10
11from util import hook, http
12from urllib import urlencode
13import json
14import hashlib
15
16url = "MULTICRAFTURL/api.php"
17user = "USER"
18apikey = 'APIKEY'
19
20
21@hook.command(adminonly=True)
22def multicraft(inp, reply=''):
23 """multicraft <method> [option=value]... - Call multicraft server"""
24 def getqstring(method, user, key, data={}):
25 values = []
26 for k, v in data.iteritems():
27 values.append(v)
28 key = hashlib.md5("%s%s%s%s" % (key, method, user, "".join(values))).hexdigest()
29 string = urlencode(dict(_MulticraftAPIMethod=method,
30 _MulticraftAPIUser=user,
31 _MulticraftAPIKey=key))
32 string += "&" + urlencode(data)
33 return string
34
35 method = inp.split(" ")[0]
36 moredata = {}
37 if len(inp.split(" ")) > 1:
38 for i in inp.split(" ")[1:]:
39 if not "=" in i:
40 return "Invalid data at '%s'." % i
41 moredata[i.split("=")[0]] = i.split("=")[1]
42 data = http.get_json(url, post_data=getqstring(method, user, apikey,
43 data=moredata))
44 if not data['success']:
45 return "Failure: %s" % ", ".join(data['errors'])
46 else:
47 return json.dumps(data['data'])
48
49
50def getCommand(inp, method):
51 try:
52 id = int(inp.split(" ")[0])
53 except:
54 return "id must be an integer."
55 data = multicraft("%s id=%s" % (method, id))
56 if not "Failure: " in data:
57 return data
58 else:
59 return None
60
61
62def updateCommand(inp, method):
63 inp = inp.split(" ")
64
65 def fix(text):
66 return str(text).replace('"', "'").replace("u'", "'")
67
68 dats = {}
69 for i in inp:
70 if not "=" in i:
71 return "Invalid data at %s" % i
72 dats[i.split("=")[0]] = i.split("=")[1]
73 fields = []
74 values = []
75 for k in dats:
76 fields.append(k)
77 values.append(dats[k])
78 data = multicraft("%s field=%s value=%s"
79 % (method, fix(fields), fix(values)))
80 if not "Failure: " in data:
81 return data
82 else:
83 return None
84
85
86@hook.command(adminonly=True)
87def mcrestart(inp):
88 """mcrestart <id> - Restart specified server.
89 Admin only. id must be an integer."""
90 data = getCommand(inp, "restartServer")
91 if data == "[]":
92 return "Success restarting server %s" % inp.split(" ")[0]
93 else:
94 return "Error restarting server %s." \
95 "Invalid server ID?" % inp.split(" ")[0]
96
97
98@hook.command(adminonly=True, autohelp=False)
99def mclist(inp):
100 """mclist - List servers."""
101 out = ""
102 data = multicraft("listServers")
103 if not "Failure " in data:
104 data = json.loads(data)["Servers"]
105 for k in data:
106 v = data[k]
107 if out == "":
108 out = "%s (%s)" % (v, k)
109 else:
110 out = out + ", " + "%s (%s)" % (v, k)
111 return "Servers: " + out
112 else:
113 return data
114
115
116@hook.command(adminonly=True)
117def mcfindusers(inp):
118 """mcfindusers [name=value] [email=value] ...
119 - Find user matching name, email, role, etc"""
120 data = updateCommand(inp, "findUsers")
121 if data:
122 data = json.loads(data)
123 if data["Users"] == []:
124 return "No results."
125 else:
126 out = ""
127 for i in data["Users"]:
128 if not out:
129 out = "%s (%s)" % (data["Users"][i], i)
130 else:
131 out = out + ", %s (%s)" % (data["Users"][i], i)
132 return "Users: %s" % out
133 else:
134 return "Error getting data!"
135