From ee6b25625ada0e24589c926b4d55d8c2d5346996 Mon Sep 17 00:00:00 2001 From: Fran Rogers Date: Mon, 08 Nov 2010 08:19:49 +0000 Subject: Add proper CTCP support - sending and receiving --- diff --git a/purk/irc.py b/purk/irc.py index edd8a4b..f5bc6bd 100644 --- a/purk/irc.py +++ b/purk/irc.py @@ -295,18 +295,39 @@ class Network(object): def msg(self, target, msg): self.raw("PRIVMSG %s :%s" % (target, msg)) - self.events.trigger( - 'OwnText', source=self.me, target=str(target), text=msg, - network=self, window=windows.get_default(self, self.manager) - ) + + if len(msg) > 8 and msg[0:7] == "\x01ACTION": + self.events.trigger( + 'OwnAction', source=self.me, target=str(target), + text=msg[8:-1], + network=self, window=windows.get_default(self, self.manager) + ) + elif len(msg) > 1 and msg[0:1] == "\x01": + self.events.trigger( + 'OwnCtcp', source=self.me, target=str(target), + text=msg[1:-1], + network=self, window=windows.get_default(self, self.manager) + ) + else: + self.events.trigger( + 'OwnText', source=self.me, target=str(target), text=msg, + network=self, window=windows.get_default(self, self.manager) + ) def notice(self, target, msg): self.raw("NOTICE %s :%s" % (target, msg)) - self.events.trigger( - 'OwnNotice', source=self.me, target=str(target), text=msg, - network=self, window=windows.get_default(self) - ) + if len(msg) > 1 and msg[0:1] == "\x01": + self.events.trigger( + 'OwnCtcpReply', source=self.me, target=str(target), + text=msg[1:-1], + network=self, window=windows.get_default(self, self.manager) + ) + else: + self.events.trigger( + 'OwnNotice', source=self.me, target=str(target), text=msg, + network=self, window=windows.get_default(self) + ) #a Network that is never connected class DummyNetwork(Network): diff --git a/purk/scripts/irc_script.py b/purk/scripts/irc_script.py index 6e38005..4537aff 100644 --- a/purk/scripts/irc_script.py +++ b/purk/scripts/irc_script.py @@ -120,11 +120,22 @@ def setdownRaw(e): e.done = True elif e.msg[1] == "PRIVMSG": - core.events.trigger('Text', e) + if len(e.msg[3]) > 8 and e.msg[3][0:7] == "\x01ACTION": + e.text = ' '.join(e.msg[3:])[8:-1] + core.events.trigger('Action', e) + elif len(e.msg[3]) > 1 and e.msg[3][0:1] == "\x01": + e.text = ' '.join(e.msg[3:])[1:-1] + core.events.trigger('Ctcp', e) + else: + core.events.trigger('Text', e) e.done = True elif e.msg[1] == "NOTICE": - core.events.trigger('Notice', e) + if len(e.msg[3]) > 1 and e.msg[3][0:1] == "\x01": + e.text = ' '.join(e.msg[3:])[1:-1] + core.events.trigger('CtcpReply', e) + else: + core.events.trigger('Notice', e) e.done = True elif e.msg[1] == "TOPIC": @@ -238,6 +249,14 @@ def onCommandSay(e): else: raise core.events.CommandError("There's no one here to speak to.") +def onCommandCtcp(e): + if len(e.args) > 2: + message = ('\x01' + e.args[1].upper() + ' ' + + ' '.join(e.args[2:]) + '\x01') + else: + message = ('\x01' + e.args[1].upper() + '\x01') + e.network.msg(e.args[0], message) + def onCommandMsg(e): e.network.msg(e.args[0], ' '.join(e.args[1:])) diff --git a/purk/scripts/theme.py b/purk/scripts/theme.py index 5afd8fa..7d762cb 100644 --- a/purk/scripts/theme.py +++ b/purk/scripts/theme.py @@ -165,11 +165,7 @@ def onText(e): color = getsourcecolor(e) to_write = prefix(e) - if len(e.text) > 8 and e.text[0:7] == "\x01ACTION": - - # This is an action. - to_write += "%s %s" % (format_source(e), e.text[7:-1]) - elif e.network.me == e.target: # this is a pm + if e.network.me == e.target: # this is a pm if e.window.id == e.network.norm_case(e.source): to_write += "\x02<\x0F%s\x0F\x02>\x0F " % (format_source(e)) else: @@ -191,11 +187,7 @@ def onOwnText(e): color = getsourcecolor(e) to_write = prefix(e) - if len(e.text) > 8 and e.text[0:7] == "\x01ACTION": - - # This is an action. - to_write += "%s%s" % (format_source(e), e.text[7:-1]) - elif e.window.id == e.network.norm_case(e.target): + if e.window.id == e.network.norm_case(e.target): to_write += "\x02<\x0F%s\x0F\x02>\x0F %s" % (format_source(e), e.text) else: to_write += "%s->\x0F \x02*\x0F%s\x0F\x02*\x0F %s" % (color, e.target, e.text) @@ -243,6 +235,13 @@ def onCtcp(e): if not e.quiet: e.window.write(to_write) +def onOwnCtcp(e): + color = getsourcecolor(e) + to_write = "%s-> \x02[\x02%s\x0F\x02]\x0F %s" % (prefix(e), format_source(e), e.text) + + if not e.quiet: + e.window.write(to_write) + def onCtcpReply(e): color = getsourcecolor(e) to_write = "%s%s--- %s reply from %s:\x0F %s" % (prefix(e), color, e.name.capitalize(), format_source(e), ' '.join(e.args)) @@ -252,6 +251,15 @@ def onCtcpReply(e): window = windows.get_default(e.network) window.write(to_write, widgets.TEXT) +def onOwnCtcpReply(e): + color = getsourcecolor(e) + to_write = "%s-> %s--- %s reply from %s:\x0F %s" % (prefix(e), color, e.name.capitalize(), format_source(e), ' '.join(e.args)) + + window = windows.manager.get_active() + if window.network != e.network: + window = windows.get_default(e.network) + window.write(to_write, widgets.TEXT) + def onJoin(e): if e.source == e.network.me: to_write = "%s%s %sjoin %s" % (prefix(e), format_info_source(e), address(e), e.target) -- cgit v0.9.1