diff options
author | Marius Halden <marius.h@lden.org> | 2016-01-11 21:13:57 +0100 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2016-01-11 21:13:57 +0100 |
commit | 52111f6d6b369346eb998338e485aa7bfc991536 (patch) | |
tree | 91d4ef9a786384e314490d51fe2c12ee93fe4465 | |
parent | 82f748855794d15ef84e836e80077be9233d68d4 (diff) | |
download | irc-sse-52111f6d6b369346eb998338e485aa7bfc991536.tar.gz irc-sse-52111f6d6b369346eb998338e485aa7bfc991536.tar.bz2 irc-sse-52111f6d6b369346eb998338e485aa7bfc991536.tar.xz |
Track users in channels
-rw-r--r-- | irc-sse.js | 22 | ||||
-rwxr-xr-x[-rw-r--r--] | web.py | 113 |
2 files changed, 114 insertions, 21 deletions
@@ -39,8 +39,13 @@ function printMessage(msg) { } function setTopic(newTopic) { - $("#topic").children("h3").html(newTopic); - document.title = newTopic + " - IRC-SSE"; + if (newTopic === "") { + $("#topic").children("h3").html(" "); + document.title = "IRC-SSE"; + } else { + $("#topic").children("h3").html(newTopic); + document.title = newTopic + " - IRC-SSE"; + } } function getUser(user) { @@ -63,12 +68,17 @@ function leave(msg) { printMessage(msg.time + " -!- " + msg.user + " left"); } +function quit(msg) { + var output = msg.time + " -!- " + msg.user + " quit (" + msg.quitMsg + ")"; + printMessage(output); +} + function kick(msg) { - printMessage(msg.time + " -!- " + getUser(msg.kickee) + " was kicked by " + getUser(msg.kicker) + " reason: " + msg.message); + printMessage(msg.time + " -!- " + msg.kickee + " was kicked by " + msg.kicker + " reason: " + msg.message); } function rename(msg) { - printMessage(msg.time + " -!- " + getUser(msg.oldname) + " is now known as " + getUser(msg.newname)); + printMessage(msg.time + " -!- " + msg.oldname + " is now known as " + msg.newname); } function mode(msg) { @@ -127,6 +137,9 @@ function parseMsg(msg) { case 'refresh': location.reload(); break; + case 'quit': + quit(msg); + break; default: break; } @@ -179,5 +192,6 @@ $(document).ready(function() { var evtSrc = new EventSource("/subscribe?" + channel); evtSrc.onmessage = function(e) { + console.log(e.data) parseMsg($.parseJSON(e.data)) } @@ -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 |