forked from mrphlip/lrrbot
/
serverevents.py
133 lines (122 loc) · 3.96 KB
/
serverevents.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
from lrrbot import bot, log
import utils
import storage
import commands.static, commands.explain, commands.show
import random
import re
import googlecalendar
@bot.server_event()
def current_game(lrrbot, user, data):
game = lrrbot.get_current_game()
if game:
return game['id']
else:
return None
@bot.server_event()
def get_data(lrrbot, user, data):
if not isinstance(data['key'], (list, tuple)):
data['key'] = [data['key']]
node = storage.data
for subkey in data['key']:
node = node.get(subkey, {})
return node
@bot.server_event()
def set_data(lrrbot, user, data):
if not isinstance(data['key'], (list, tuple)):
data['key'] = [data['key']]
log.info("Setting storage %s to %r" % ('.'.join(data['key']), data['value']))
# if key is, eg, ["a", "b", "c"]
# then we want to effectively do:
# storage.data["a"]["b"]["c"] = value
# But in case one of those intermediate dicts doesn't exist:
# storage.data.setdefault("a", {}).setdefault("b", {})["c"] = value
node = storage.data
for subkey in data['key'][:-1]:
node = node.setdefault(subkey, {})
node[data['key'][-1]] = data['value']
storage.save()
@bot.server_event()
def modify_commands(lrrbot, user, data):
commands.static.modify_commands(data)
bot.compile()
@bot.server_event()
def modify_explanations(lrrbot, user, data):
commands.explain.modify_explanations(data)
bot.compile()
@bot.server_event()
def modify_spam_rules(lrrbot, user, data):
storage.data['spam_rules'] = data
storage.save()
lrrbot.spam_rules = [(re.compile(i['re']), i['message']) for i in storage.data['spam_rules']]
@bot.server_event()
def get_commands(lrrbot, user, data):
bind = lambda maybe, f: f(maybe) if maybe is not None else None
ret = []
for command in lrrbot.commands.values():
doc = utils.parse_docstring(command['func'].__doc__)
for cmd in doc.walk():
if cmd.get_content_maintype() == "multipart":
continue
if cmd.get_all("command") is None:
continue
ret += [{
"aliases": cmd.get_all("command"),
"mod-only": cmd.get("mod-only") == "true",
"sub-only": cmd.get("sub-only") == "true",
"throttled": bind(cmd.get("throttled"), int),
"literal-response": cmd.get("literal-response") == "true",
"description": cmd.get_payload(),
}]
return ret
@bot.server_event()
def get_header_info(lrrbot, user, data):
game = lrrbot.get_current_game()
data = {}
if game is not None:
data['current_game'] = {
"name": game['name'],
"display": game.get("display", game["name"]),
"id": game["id"],
"is_override": lrrbot.game_override is not None,
}
show = lrrbot.show_override or lrrbot.show
data['current_show'] = {
"id": show,
"name": storage.data.get("shows", {}).get(show, {}).get("name", show),
}
stats = [{
"count": v,
"type": storage.data['stats'][k].get("singular" if v == 1 else "plural", k)
} for (k,v) in game['stats'].items() if v]
stats.sort(key=lambda i: (-i['count'], i['type']))
data['current_game']['stats'] = stats
if game.get("votes"):
good = sum(game['votes'].values())
total = len(game['votes'])
data["current_game"]["rating"] = {
"good": good,
"total": total,
"perc": 100.0 * good / total,
}
if user is not None:
data["current_game"]["my_rating"] = game.get("votes", {}).get(user.lower())
if 'advice' in storage.data['responses']:
data['advice'] = random.choice(storage.data['responses']['advice']['response'])
if user is not None:
data['is_mod'] = lrrbot.is_mod_nick(user)
data['is_sub'] = lrrbot.is_sub_nick(user)
else:
data['is_mod'] = data['is_sub'] = False
return data
@bot.server_event()
def nextstream(lrrbot, user, data):
return googlecalendar.get_next_event_text(googlecalendar.CALENDAR_LRL, verbose=False)
@bot.server_event()
def set_show(lrrbot, user, data):
if user is not None and lrrbot.is_mod_nick(user):
commands.show.set_show(lrrbot, data["show"])
return {"status": "OK"}
return {"status": "error: %s is not a mod" % user}
@bot.server_event()
def get_show(lrrbot, user, data):
return lrrbot.show_override or lrrbot.show