diff --git a/irc.py b/irc.py index 5ab8157..066d659 100644 --- a/irc.py +++ b/irc.py @@ -164,6 +164,16 @@ class PesterIRC(QtCore.QThread): except socket.error as e: PchumLog.warning(e) self.setConnectionBroken() + @QtCore.pyqtSlot(QString, QString,) + def sendCTCP(self, handle, text): + #cmd = text.split(' ')[0] + #msg = text.replace(cmd + ' ', '') + #msg = msg.replace(cmd, '') + try: + helpers.ctcp(self.cli, handle, text) + except socket.error as e: + PchumLog.warning(e) + self.setConnectionBroken() @QtCore.pyqtSlot(QString, bool) def startConvo(self, handle, initiated): h = str(handle) @@ -369,12 +379,6 @@ class PesterIRC(QtCore.QThread): class PesterHandler(DefaultCommandHandler): def notice(self, nick, chan, msg): - #try: - # msg = msg.decode('utf-8') - #except UnicodeDecodeError: - # msg = msg.decode('iso-8859-1', 'ignore') - #nick = nick.decode('utf-8') - #chan = chan.decode('utf-8') handle = nick[0:nick.find("!")] PchumLog.info("---> recv \"NOTICE %s :%s\"" % (handle, msg)) if handle == "ChanServ" and chan == self.parent.mainwindow.profile().handle and msg[0:2] == "[#": @@ -382,28 +386,46 @@ class PesterHandler(DefaultCommandHandler): else: self.parent.noticeReceived.emit(handle, msg) def privmsg(self, nick, chan, msg): - #try: - # msg = msg.decode('utf-8') - #except UnicodeDecodeError: - # msg = msg.decode('iso-8859-1', 'ignore') - # display msg, do other stuff + handle = nick[0:nick.find("!")] if len(msg) == 0: return - # silently ignore CTCP - # Notice IRC /me (The CTCP kind) + + # CTCP + # ACTION, IRC /me (The CTCP kind) if msg[0:8] == '\x01ACTION ': msg = '/me' + msg[7:-1] - # silently ignore the rest of the CTCPs - if msg[0] == '\x01': - handle = nick[0:nick.find("!")] - PchumLog.warning("---> recv \"CTCP %s :%s\"" % (handle, msg[1:-1])) - if msg[1:-1] == "VERSION": + # CTCPs that don't need to be shown + elif msg[0] == '\x01': + PchumLog.info("---> recv \"CTCP %s :%s\"" % (handle, msg[1:-1])) + # VERSION, return version + if msg[1:-1].startswith("VERSION"): helpers.ctcp_reply(self.parent.cli, handle, "VERSION", "Pesterchum %s" % (_pcVersion)) + # CLIENTINFO, return supported CTCP commands. + elif msg[1:-1].startswith("CLIENTINFO"): + helpers.ctcp_reply(self.parent.cli, handle, "CLIENTINFO", + "ACTION VERSION CLIENTINFO PING SOURCE NOQUIRKS GETMOOD") + # PING, return pong + elif msg[1:-1].startswith("PING"): + if len(msg[1:-1].split("PING ")) > 1: + helpers.ctcp_reply(self.parent.cli, handle, "PING", msg[1:-1].split("PING ")[1]) + else: + helpers.ctcp_reply(self.parent.cli, handle, "PING") + # SOURCE, return source + elif msg[1:-1].startswith("SOURCE"): + helpers.ctcp_reply(self.parent.cli, handle, "SOURCE", "https://github.com/Dpeta/pesterchum-alt-servers") + # ??? elif msg[1:-1].startswith("NOQUIRKS") and chan[0] == "#": op = nick[0:nick.find("!")] self.parent.quirkDisable.emit(chan, msg[10:-1], op) + # GETMOOD via CTCP + elif msg[1:-1].startswith("GETMOOD"): + # GETMOOD via CTCP + # Maybe we can do moods like this in the future... + mymood = self.mainwindow.profile().mood.value() + helpers.ctcp_reply(self.parent.cli, handle, "MOOD >%d" % (mymood)) + # Backwards compatibility + helpers.msg(self.client, "#pesterchum", "MOOD >%d" % (mymood)) return - handle = nick[0:nick.find("!")] if chan != "#pesterchum": # We don't need anywhere near that much spam. diff --git a/oyoyo/helpers.py b/oyoyo/helpers.py index 537ee05..b30f7da 100644 --- a/oyoyo/helpers.py +++ b/oyoyo/helpers.py @@ -56,7 +56,12 @@ def mode(cli, channel, mode, options=None): cli.send(cmd) def ctcp(cli, handle, cmd, msg=""): - cli.send("PRIVMSG", handle, "\x01%s %s\x01" % (cmd, msg)) + # Space breaks protocol if msg is absent + if msg=="": + cli.send("PRIVMSG", handle, "\x01%s\x01" % (cmd)) + else: + cli.send("PRIVMSG", handle, "\x01%s %s\x01" % (cmd, msg)) + def ctcp_reply(cli, handle, cmd, msg=""): notice(cli, str(handle), "\x01%s %s\x01" % (cmd.upper(), msg)) diff --git a/pesterchum.py b/pesterchum.py index 65c6d2a..7c8cc23 100644 --- a/pesterchum.py +++ b/pesterchum.py @@ -3529,6 +3529,7 @@ class PesterWindow(MovingWindow): newConvoStarted = QtCore.pyqtSignal('QString', bool, name="newConvoStarted") sendMessage = QtCore.pyqtSignal('QString', 'QString') sendNotice = QtCore.pyqtSignal('QString', 'QString') + sendCTCP = QtCore.pyqtSignal('QString', 'QString') convoClosed = QtCore.pyqtSignal('QString') profileChanged = QtCore.pyqtSignal() animationSetting = QtCore.pyqtSignal(bool) @@ -3694,6 +3695,8 @@ Click this message to never see this again.") 'sendMessage(QString, QString)'), ('sendNotice(QString, QString)', 'sendNotice(QString, QString)'), + ('sendCTCP(QString, QString)', + 'sendCTCP(QString, QString)'), ('newConvoStarted(QString, bool)', 'startConvo(QString, bool)'), ('convoClosed(QString)', @@ -3767,6 +3770,7 @@ Click this message to never see this again.") # IRC --> Main window return ((widget.sendMessage, irc.sendMessage), (widget.sendNotice, irc.sendNotice), + (widget.sendCTCP, irc.sendCTCP), (widget.newConvoStarted, irc.startConvo), (widget.convoClosed, irc.endConvo), (widget.profileChanged, irc.updateProfile),