Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFran Rogers <fran@dumetella.net>2010-11-08 08:19:49 (GMT)
committer Fran Rogers <fran@dumetella.net>2010-11-08 08:19:49 (GMT)
commitee6b25625ada0e24589c926b4d55d8c2d5346996 (patch)
tree5e851c166995175e7102f1041885a50fb5a3a7f8
parent5ba731c9ba3fa29a1b7c10f01c9d63519c7ebd47 (diff)
Add proper CTCP support - sending and receiving
-rw-r--r--purk/irc.py37
-rw-r--r--purk/scripts/irc_script.py23
-rw-r--r--purk/scripts/theme.py28
3 files changed, 68 insertions, 20 deletions
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)