-
Notifications
You must be signed in to change notification settings - Fork 2
/
infobot.py
121 lines (103 loc) · 5.26 KB
/
infobot.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
from pyrcb import IRCBot
import redis
import parse
import config
class InfoBot(IRCBot):
def __init__(self, *args, **kwargs):
self.r = redis.StrictRedis(host=config.REDIS_HOST,
port=config.REDIS_PORT,
db=config.REDIS_DB,
password=config.REDIS_PASS)
super().__init__(*args, **kwargs)
def add_info(self, nickname, channel, reply_to, info):
#Send server a whois to check that a user is authenticated with NickServ # Whois not doing anything??
# self.send_raw("whois " + nickname)
#Assumes * is not allowed at the start of nicknames
info_meta = self.r.get("*" + nickname.lower())
if info_meta != None: info_meta = info_meta.decode("utf-8")
if info_meta == "frozen":
if channel in self.nicklist and nickname in self.nicklist[channel] and self.nicklist[channel][nickname].is_op:
self.r.set(nickname.lower(), info)
self.send(reply_to, "Set info: " + info)
else:
self.send(reply_to, "Only mods can do this.")
else:
self.r.set(nickname.lower(), info)
self.send(reply_to, "Set info: " + info)
def get_info(self, nickname, channel, reply_to, name_raw):
name = name_raw.strip()
if name.startswith("*"):
self.send(reply_to, "No info found for " + name + ".")
else:
info = self.r.get(name.lower())
if info is None:
self.send(reply_to, "No info found for " + name + ".")
else:
self.send(reply_to, name + ": " + info.decode('utf-8'))
def delete_info(self, nickname, channel, reply_to, name_raw):
name = name_raw.strip()
if channel in self.nicklist and nickname in self.nicklist[channel] and self.nicklist[channel][nickname].is_op:
self.send(reply_to, "Deleted info for " + name + ".")
self.r.delete(name.lower()) # does not delete freezing!!
else:
self.send(reply_to, "Only mods can do this.")
def freeze_info(self, nickname, channel, reply_to, name_raw):
name = name_raw.strip()
if channel in self.nicklist and nickname in self.nicklist[channel] and self.nicklist[channel][nickname].is_op:
self.send(reply_to, "Froze info for " + name + ".")
self.r.set("*" + name.lower(), "frozen")
else:
self.send(reply_to, "Only mods can do this.")
def unfreeze_info(self, nickname, channel, reply_to, name_raw):
name = name_raw.strip()
if channel in self.nicklist and nickname in self.nicklist[channel] and self.nicklist[channel][nickname].is_op:
self.send(reply_to, "Unfroze info for " + name + ".")
self.r.set("*" + name.lower(), "")
else:
self.send(reply_to, "Only mods can do this.")
def set_info(self, nickname, channel, reply_to, name_raw, info):
name = name_raw.strip()
if channel in self.nicklist and nickname in self.nicklist[channel] and self.nicklist[channel][nickname].is_op:
self.send(reply_to, "Set info for " + name + ".")
self.r.set(name.lower(), info)
else:
self.send(reply_to, "Only mods can do this.")
def prompt(self, input_form, output_form):
def output_func(nick, chan, reply_to, **args):
self.send(reply_to, str.format(output_form, **args))
return (parse.compile(input_form), output_func)
def on_message(self, message, nickname, channel, is_query):
#Checks if message was from a PM or channel
if is_query:
reply_to = nickname
else:
reply_to = channel
commands = [
(parse.compile(".add {info}"), self.add_info),
(parse.compile(".info {name_raw}"), self.get_info),
(parse.compile(".delete {name_raw}"), self.delete_info),
(parse.compile(".freeze {name_raw}"), self.freeze_info),
(parse.compile(".unfreeze {name_raw}"), self.unfreeze_info),
(parse.compile(".set {name_raw:S} {info}"), self.set_info), # technically this means extra spaces before the name will cause issues
self.prompt(".add", "Usage: '.add some info about yourself here'"),
self.prompt(".info", "Usage: '.info username'"),
self.prompt(".delete", "Mod only usage: '.delete username'"),
self.prompt(".freeze", "Mod only usage: '.freeze username'"),
self.prompt(".unfreeze", "Mod only usage: '.freeze username'"),
self.prompt(".set", "Mod only usage: '.set username then some info about them'")
]
for parser, func in commands:
attempt = parser.parse(message.strip()) #stripping the message here
if attempt != None:
return func(nickname, channel, reply_to, **attempt.named)
#TODO: Check for whois from server
def on_raw(self, nickname, command, args):
pass
def main():
bot = InfoBot()
bot.connect(config.IRC_HOST, config.IRC_PORT)
bot.register(config.IRC_USER)
bot.join(config.IRC_CHAN)
bot.listen()
if __name__ == "__main__":
main()