From 7cd6bc361604fed4844e97f0e54e53b4a0413002 Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Sun, 21 Oct 2018 00:49:15 +0100 Subject: [PATCH] Purge metadata entries on quit and escape glob characters --- core/bot.py | 2 ++ modules/userinfo.py | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/bot.py b/core/bot.py index d733693..18e9956 100644 --- a/core/bot.py +++ b/core/bot.py @@ -383,6 +383,7 @@ class IRCBotFactory(ReconnectingClientFactory): def __init__(self, name): self.instance = main.pool[name] self.name = name + self.net = "".join([x for x in self.name if not x in digits]) self.client = None self.maxDelay = self.instance["maxdelay"] self.initialDelay = self.instance["initialdelay"] @@ -396,6 +397,7 @@ class IRCBotFactory(ReconnectingClientFactory): return entry def clientConnectionLost(self, connector, reason): + userinfo.delNetwork(self.net, self.client.channels) if not self.client == None: self.client.connected = False self.client.channels = [] diff --git a/modules/userinfo.py b/modules/userinfo.py index ac4bd5a..42f2d48 100644 --- a/modules/userinfo.py +++ b/modules/userinfo.py @@ -100,9 +100,16 @@ def delUser(name, channel, nick, user): p.srem(chanspace, channel) p.execute() +def escape(text): + chars = ["[", "]", "^", "-", "*", "?"] + text = text.replace("\\", "\\\\") + for i in chars: + text = text.replace(i, "\\"+i) + return text + def getUserByNick(name, nick): gnamespace = "live.who.%s" % name - usermatch = main.r.sscan(gnamespace, match=nick+"!*") + usermatch = main.r.sscan(gnamespace, match=escape(nick)+"!*", count=9999999) if usermatch[1] == []: return False else: @@ -110,6 +117,7 @@ def getUserByNick(name, nick): user = usermatch[1][0] return user else: + warn("Entry doesn't exist: %s on %s" % (nick, gnamespace)) return False def renameUser(name, oldnick, olduser, newnick, newuser): @@ -130,7 +138,6 @@ def renameUser(name, oldnick, olduser, newnick, newuser): p.execute() def delUserByNick(name, channel, nick): - gnamespace = "live.who.%s" % name user = getUserByNick(name, nick) delUser(name, channel, nick, user) @@ -153,8 +160,15 @@ def delChannel(name, channel): if main.r.smembers("live.chan."+name+"."+i.decode()) == {channel.encode()}: if user: p.srem(gnamespace, user) + p.delete("live.chan."+name+"."+i.decode()) else: p.srem("live.chan."+name+"."+i.decode(), channel) p.delete(namespace) p.execute() + +def delNetwork(name, channels): + log("Purging channels for %s" % name) + for i in channels: + delChannel(name, i) + return