diff options
Diffstat (limited to 'web.py')
-rwxr-xr-x[-rw-r--r--] | web.py | 113 |
1 files changed, 96 insertions, 17 deletions
@@ -160,6 +160,8 @@ class Backlog(resource.Resource): class IRCBotProtocol(irc.IRCClient): admins = config.cfg.get("irc").get("admins") nickname = config.cfg.get("irc").get("nick") + names = {} + _namestmp = {} def connectionMade(self): irc.IRCClient.connectionMade(self) @@ -173,6 +175,8 @@ class IRCBotProtocol(irc.IRCClient): def joined(self, channel): log.msg("Joined %s" % channel) cache.addChannel(channel) + self.names[channel] = [] + self._namestmp[channel] = [] #self.topic(channel, None) def topicUpdated(self, user, channel, newTopic): @@ -249,10 +253,17 @@ class IRCBotProtocol(irc.IRCClient): cache.addMsg(msg, channel) def userLeft(self, user, channel): - ### Keep track of users if channel == self.nickname: return - + + nick = user.split('!')[0] + if nick in self.names[channel]: + self.names[channel].remove(nick) + else: + log.msg("%s left %s, but was not in channel" % (nick, channel)) + + log.msg("%s" % self.names) + msg = { "type": "leave", "user": user, @@ -265,10 +276,17 @@ class IRCBotProtocol(irc.IRCClient): cache.addMsg(msg, channel) def userJoined(self, user, channel): - ### Keep track of users if channel == self.nickname: return + nick = user.split('!')[0] + if nick not in self.names[channel]: + self.names[channel].append(nick) + else: + log.msg("%s joined %s, but allready joned" % (nick, channel)) + + log.msg("%s" % self.names) + msg = { "type": "join", "user": user, @@ -281,11 +299,35 @@ class IRCBotProtocol(irc.IRCClient): cache.addMsg(msg, channel) def userQuit(self, user, quitMessage): - ### We need to keep track of names if we want to use this... - return + nick = user.split('!')[0] + + for channel in self.names.keys(): + if nick in self.names[channel]: + self.names[channel].remove(nick) + + msg = { + "type": "quit", + "user": user, + "channel": channel, + "time": time.strftime("%H:%M:%S", time.localtime(time.time())), + "date": time.strftime("%Y-%m-%d", time.localtime(time.time())), + "quitMsg": quitMessage, + } + + subscribe.publishToAll("%s" % json.dumps(msg), channel) + cache.addMsg(msg, channel) + + log.msg("%s" % self.names) def userKicked(self, kickee, channel, kicker, message): - ### Keep track of users + nick = kickee.split('!')[0] + if nick in self.names[channel]: + self.names[channel].remove(nick) + else: + log.msg('%s kicked from %s, but not in channel' % (nick, channel)) + + log.msg("%s" % self.names) + msg = { "type": "kick", "kickee": kickee, @@ -300,21 +342,58 @@ class IRCBotProtocol(irc.IRCClient): cache.addMsg(msg, channel) def userRenamed(self, oldname, newname): - ### We might need to keep track of users here to... :( - msg = { - "type": "rename", - "oldname": oldname, - "newname": newname, - "time": time.strftime("%H:%M:%S", time.localtime(time.time())), - "date": time.strftime("%Y-%m-%d", time.localtime(time.time())), - } - - subscribe.publishToAll("%s" % json.dumps(msg), None) - cache.addMsg(msg, None) + oldnick = oldname.split('!')[0] + newnick = newname.split('!')[0] + + for channel in self.names.keys(): + if oldnick in self.names[channel]: + if newnick not in self.names[channel]: + self.names[channel].remove(oldnick) + self.names[channel].append(newnick) + else: + log.msg("%s allready in channel %s" % (newnick, channel)) + else: + log.msg("%s not in channel %s" % (oldnick, channel)) + + log.msg("%s" % self.names) + + msg = { + "type": "rename", + "oldname": oldname, + "newname": newname, + "time": time.strftime("%H:%M:%S", time.localtime(time.time())), + "date": time.strftime("%Y-%m-%d", time.localtime(time.time())), + } + + subscribe.publishToAll("%s" % json.dumps(msg), channel) + cache.addMsg(msg, channel) + + log.msg("%s" % self.names) def alterCollideNick(self, nick): return nick + "^" + def irc_RPL_NAMREPLY(self, prefix, params): + channel = params[2] + nicklist = params[3].split(' ') + + if channel not in self._namestmp: + return + + self._namestmp[channel] += nicklist + + def irc_RPL_ENDOFNAMES(self, prefix, params): + channel = params[1] + + if channel not in self._namestmp: + return + + self.names[channel] = self._namestmp[channel] + + del self._namestmp[channel] + + log.msg("%s" % self.names) + class IRCBotFactory(protocol.ClientFactory): protocol = IRCBotProtocol |