Move user metadata info into redis
This commit is contained in:
107
core/bot.py
107
core/bot.py
@@ -2,6 +2,7 @@ from twisted.internet.protocol import ReconnectingClientFactory
|
||||
from twisted.words.protocols.irc import IRCClient
|
||||
from twisted.internet.defer import Deferred
|
||||
from twisted.internet.task import LoopingCall
|
||||
|
||||
from string import digits
|
||||
from random import randint
|
||||
|
||||
@@ -19,6 +20,8 @@ class IRCBot(IRCClient):
|
||||
self.connected = False
|
||||
self.channels = []
|
||||
self.net = "".join([x for x in name if not x in digits])
|
||||
if self.net == "":
|
||||
error("Network with all numbers: %s" % name)
|
||||
self.buffer = ""
|
||||
self.name = name
|
||||
instance = main.pool[name]
|
||||
@@ -37,6 +40,8 @@ class IRCBot(IRCClient):
|
||||
self._who = {}
|
||||
self._getWho = {}
|
||||
|
||||
self._names = {}
|
||||
|
||||
self.authtype = instance["authtype"]
|
||||
if self.authtype == "ns":
|
||||
self.authpass = instance["password"]
|
||||
@@ -71,7 +76,7 @@ class IRCBot(IRCClient):
|
||||
|
||||
def privmsg(self, user, channel, msg):
|
||||
nick, ident, host = self.parsen(user)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.editUser(self.net, channel, nick, user)
|
||||
count.event(self.name, "privmsg")
|
||||
|
||||
keyword.actKeyword(user, channel, msg, self.nickname, "MSG", self.name)
|
||||
@@ -79,7 +84,7 @@ class IRCBot(IRCClient):
|
||||
|
||||
def noticed(self, user, channel, msg):
|
||||
nick, ident, host = self.parsen(user)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.editUser(self.net, channel, nick, user)
|
||||
count.event(self.name, "notice")
|
||||
|
||||
keyword.actKeyword(user, channel, msg, self.nickname, "NOTICE", self.name)
|
||||
@@ -87,7 +92,7 @@ class IRCBot(IRCClient):
|
||||
|
||||
def action(self, user, channel, msg):
|
||||
nick, ident, host = self.parsen(user)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.editUser(self.net, channel, nick, user)
|
||||
count.event(self.name, "action")
|
||||
|
||||
keyword.actKeyword(user, channel, msg, self.nickname, "ACTION", self.name)
|
||||
@@ -109,8 +114,10 @@ class IRCBot(IRCClient):
|
||||
newnick = nickname + "_"
|
||||
return newnick
|
||||
|
||||
def nickChanged(self, nick):
|
||||
self.nickname = nick
|
||||
def nickChanged(self, olduser, newnick):
|
||||
oldnick, ident, host = self.parsen(olduser)
|
||||
userinfo.renameUser(self.net, oldnick, olduser, newnick, newnick+"!"+ident+"@"+host)
|
||||
self.nickname = newnick
|
||||
count.event(self.name, "selfnick")
|
||||
|
||||
def irc_ERR_NICKNAMEINUSE(self, prefix, params):
|
||||
@@ -122,10 +129,9 @@ class IRCBot(IRCClient):
|
||||
sendAll("%s: password mismatch" % self.name)
|
||||
|
||||
def who(self, channel):
|
||||
channel = channel
|
||||
d = Deferred()
|
||||
if channel not in self._who:
|
||||
self._who[channel] = ([], {})
|
||||
self._who[channel] = ([], [])
|
||||
self._who[channel][0].append(d)
|
||||
self.sendLine("WHO %s" % channel)
|
||||
return d
|
||||
@@ -141,7 +147,7 @@ class IRCBot(IRCClient):
|
||||
if channel not in self._who:
|
||||
return
|
||||
n = self._who[channel][1]
|
||||
n[nick] = [nick, user, host, server, status, realname]
|
||||
n.append([nick, user, host, server, status, realname])
|
||||
count.event(self.name, "whoreply")
|
||||
monitor.event(self.net, channel, {"type": "who", "exact": nick+"!"+user+"@"+host, "nick": nick, "ident": user, "host": host, "realname": realname, "server": server, "status": status})
|
||||
|
||||
@@ -155,7 +161,50 @@ class IRCBot(IRCClient):
|
||||
del self._who[channel]
|
||||
|
||||
def got_who(self, whoinfo):
|
||||
userinfo.setWho(self.name, whoinfo[1])
|
||||
userinfo.initialUsers(self.net, whoinfo[0], whoinfo[1])
|
||||
|
||||
def sanit(self, data):
|
||||
if len(data) >= 1:
|
||||
if data[0] in ["!", "~", "&", "@", "%", "+"]:
|
||||
data = data[1:]
|
||||
return data
|
||||
return data
|
||||
else:
|
||||
return False
|
||||
|
||||
def names(self, channel):
|
||||
d = Deferred()
|
||||
if channel not in self._names:
|
||||
self._names[channel] = ([], [])
|
||||
self._names[channel][0].append(d)
|
||||
self.sendLine("NAMES %s" % channel)
|
||||
return d
|
||||
|
||||
def irc_RPL_NAMREPLY(self, prefix, params):
|
||||
channel = params[2]
|
||||
nicklist = params[3].split(' ')
|
||||
if channel not in self._names:
|
||||
return
|
||||
n = self._names[channel][1]
|
||||
n.append(nicklist)
|
||||
|
||||
def irc_RPL_ENDOFNAMES(self, prefix, params):
|
||||
channel = params[1]
|
||||
if channel not in self._names:
|
||||
return
|
||||
callbacks, namelist = self._names[channel]
|
||||
for cb in callbacks:
|
||||
cb.callback((channel, namelist))
|
||||
del self._names[channel]
|
||||
|
||||
def got_names(self, nicklist):
|
||||
newNicklist = []
|
||||
for i in nicklist[1]:
|
||||
for x in i:
|
||||
f = self.sanit(x)
|
||||
if f:
|
||||
newNicklist.append(f)
|
||||
userinfo.initialNames(self.net, nicklist[0], newNicklist)
|
||||
|
||||
#twisted sucks so i have to do this to actually get the user info
|
||||
def irc_JOIN(self, prefix, params):
|
||||
@@ -197,7 +246,7 @@ class IRCBot(IRCClient):
|
||||
"""
|
||||
nick = prefix.split('!', 1)[0]
|
||||
if nick == self.nickname:
|
||||
self.nickChanged(params[0])
|
||||
self.nickChanged(prefix, params[0])
|
||||
else:
|
||||
self.userRenamed(prefix, params[0])
|
||||
|
||||
@@ -236,61 +285,63 @@ class IRCBot(IRCClient):
|
||||
self.join(i)
|
||||
count.event(self.name, "signedon")
|
||||
|
||||
def getWho(self, channel):
|
||||
self.who(channel).addCallback(self.got_who)
|
||||
|
||||
def joined(self, channel):
|
||||
if not channel in self.channels:
|
||||
self.channels.append(channel)
|
||||
self.names(channel).addCallback(self.got_names)
|
||||
self.who(channel).addCallback(self.got_who)
|
||||
count.event(self.name, "selfjoin")
|
||||
if self.name == main.config["Master"][0] and channel == main.config["Master"][1]:
|
||||
for i in range(len(main.masterbuf)):
|
||||
self.msg(channel, main.masterbuf.pop(0))
|
||||
main.saveConf("masterbuf")
|
||||
lc = LoopingCall(self.getWho, channel)
|
||||
lc = LoopingCall(self.who, channel)
|
||||
self._getWho[channel] = lc
|
||||
intrange = main.config["Tweaks"]["Delays"]["WhoRange"]
|
||||
minint = main.config["Tweaks"]["Delays"]["WhoLoop"]
|
||||
interval = randint(minint, minint+intrange)
|
||||
lc.start(interval)
|
||||
|
||||
def left(self, channel, message):
|
||||
def botLeft(self, channel):
|
||||
if channel in self.channels:
|
||||
self.channels.remove(channel)
|
||||
if channel in self._getWho.keys():
|
||||
lc = self._getWho[channel]
|
||||
lc.stop()
|
||||
del self._getWho[channel]
|
||||
userinfo.delChannel(self.net, channel)
|
||||
|
||||
def left(self, channel, message):
|
||||
keyword.actKeyword(self.nickname, channel, message, self.nickname, "SELFPART", self.name)
|
||||
count.event(self.name, "selfpart")
|
||||
monitor.event(self.net, channel, {"type": "part", "message": message})
|
||||
lc = self._getWho[channel]
|
||||
lc.stop()
|
||||
self.botLeft(channel)
|
||||
|
||||
def kickedFrom(self, channel, kicker, message):
|
||||
nick, ident, host = self.parsen(kicker)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
if channel in self.channels:
|
||||
self.channels.remove(channel)
|
||||
keyword.sendMaster("KICK %s: (%s/%s) %s" % (self.name, kicker, channel, message))
|
||||
count.event(self.name, "selfkick")
|
||||
monitor.event(self.net, channel, {"type": "kick", "exact": kicker, "nick": nick, "ident": ident, "host": host, "message": message})
|
||||
lc = self._getWho[channel]
|
||||
lc.stop()
|
||||
self.botLeft(channel)
|
||||
|
||||
def userJoined(self, user, channel):
|
||||
nick, ident, host = self.parsen(user)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.addUser(self.net, channel, nick, user)
|
||||
count.event(self.name, "join")
|
||||
monitor.event(self.net, channel, {"type": "join", "exact": user, "nick": nick, "ident": ident, "host": host})
|
||||
|
||||
def userLeft(self, user, channel, message):
|
||||
nick, ident, host = self.parsen(user)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.delUser(self.net, channel, nick, user)
|
||||
keyword.actKeyword(user, channel, message, self.nickname, "PART", self.name)
|
||||
count.event(self.name, "part")
|
||||
monitor.event(self.net, channel, {"type": "part", "exact": user, "nick": nick, "ident": ident, "host": host, "message": message})
|
||||
|
||||
def userQuit(self, user, quitMessage):
|
||||
nick, ident, host = self.parsen(user)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.delUserByNetwork(self.net, nick, user)
|
||||
count.event(self.name, "quit")
|
||||
|
||||
keyword.actKeyword(user, None, quitMessage, self.nickname, "QUIT", self.name)
|
||||
@@ -298,7 +349,8 @@ class IRCBot(IRCClient):
|
||||
|
||||
def userKicked(self, kickee, channel, kicker, message):
|
||||
nick, ident, host = self.parsen(kicker)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.editUser(self.net, channel, nick, kicker)
|
||||
userinfo.delUserByNick(self.net, channel, kickee)
|
||||
count.event(self.name, "kick")
|
||||
|
||||
keyword.actKeyword(kicker, channel, message, self.nickname, "KICK", self.name)
|
||||
@@ -306,14 +358,13 @@ class IRCBot(IRCClient):
|
||||
|
||||
def userRenamed(self, oldname, newname):
|
||||
nick, ident, host = self.parsen(oldname)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.setWhoSingle(self.net, newname, ident, host)
|
||||
userinfo.renameUser(self.net, nick, oldname, newname, newname+"!"+ident+"@"+host)
|
||||
count.event(self.name, "nick")
|
||||
monitor.event(self.net, None, {"type": "nick", "exact": oldname, "nick": nick, "ident": ident, "host": host, "user": newname})
|
||||
|
||||
def topicUpdated(self, user, channel, newTopic):
|
||||
nick, ident, host = self.parsen(user)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.editUser(self.net, channel, nick, user)
|
||||
count.event(self.name, "topic")
|
||||
|
||||
keyword.actKeyword(user, channel, newTopic, self.nickname, "TOPIC", self.name)
|
||||
@@ -321,7 +372,7 @@ class IRCBot(IRCClient):
|
||||
|
||||
def modeChanged(self, user, channel, toset, modes, args):
|
||||
nick, ident, host = self.parsen(user)
|
||||
userinfo.setWhoSingle(self.net, nick, ident, host)
|
||||
userinfo.editUser(self.net, channel, nick, user)
|
||||
count.event(self.name, "mode")
|
||||
argList = list(args)
|
||||
modeList = [i for i in modes]
|
||||
|
||||
Reference in New Issue
Block a user