summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2016-01-11 21:13:57 +0100
committerMarius Halden <marius.h@lden.org>2016-01-11 21:13:57 +0100
commit52111f6d6b369346eb998338e485aa7bfc991536 (patch)
tree91d4ef9a786384e314490d51fe2c12ee93fe4465
parent82f748855794d15ef84e836e80077be9233d68d4 (diff)
downloadirc-sse-52111f6d6b369346eb998338e485aa7bfc991536.tar.gz
irc-sse-52111f6d6b369346eb998338e485aa7bfc991536.tar.bz2
irc-sse-52111f6d6b369346eb998338e485aa7bfc991536.tar.xz
Track users in channels
-rw-r--r--irc-sse.js22
-rwxr-xr-x[-rw-r--r--]web.py113
2 files changed, 114 insertions, 21 deletions
diff --git a/irc-sse.js b/irc-sse.js
index 97d4663..17d1be4 100644
--- a/irc-sse.js
+++ b/irc-sse.js
@@ -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("&nbsp;");
+ 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))
}
diff --git a/web.py b/web.py
index afff5a9..9b71606 100644..100755
--- a/web.py
+++ b/web.py
@@ -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