From ee6b25625ada0e24589c926b4d55d8c2d5346996 Mon Sep 17 00:00:00 2001
From: Fran Rogers <fran@dumetella.net>
Date: Mon, 8 Nov 2010 03:19:49 -0500
Subject: [PATCH] Add proper CTCP support - sending and receiving
---
purk/irc.py | 37 +++++++++++++++++++++++++++++--------
purk/scripts/irc_script.py | 23 +++++++++++++++++++++--
purk/scripts/theme.py | 28 ++++++++++++++++++----------
3 files changed, 68 insertions(+), 20 deletions(-)
diff --git a/purk/irc.py b/purk/irc.py
index edd8a4b..f5bc6bd 100644
a
|
b
|
class Network(object): |
295 | 295 | def msg(self, target, msg): |
296 | 296 | self.raw("PRIVMSG %s :%s" % (target, msg)) |
297 | 297 | |
298 | | self.events.trigger( |
299 | | 'OwnText', source=self.me, target=str(target), text=msg, |
300 | | network=self, window=windows.get_default(self, self.manager) |
301 | | ) |
| 298 | |
| 299 | if len(msg) > 8 and msg[0:7] == "\x01ACTION": |
| 300 | self.events.trigger( |
| 301 | 'OwnAction', source=self.me, target=str(target), |
| 302 | text=msg[8:-1], |
| 303 | network=self, window=windows.get_default(self, self.manager) |
| 304 | ) |
| 305 | elif len(msg) > 1 and msg[0:1] == "\x01": |
| 306 | self.events.trigger( |
| 307 | 'OwnCtcp', source=self.me, target=str(target), |
| 308 | text=msg[1:-1], |
| 309 | network=self, window=windows.get_default(self, self.manager) |
| 310 | ) |
| 311 | else: |
| 312 | self.events.trigger( |
| 313 | 'OwnText', source=self.me, target=str(target), text=msg, |
| 314 | network=self, window=windows.get_default(self, self.manager) |
| 315 | ) |
302 | 316 | |
303 | 317 | def notice(self, target, msg): |
304 | 318 | self.raw("NOTICE %s :%s" % (target, msg)) |
305 | 319 | |
306 | | self.events.trigger( |
307 | | 'OwnNotice', source=self.me, target=str(target), text=msg, |
308 | | network=self, window=windows.get_default(self) |
309 | | ) |
| 320 | if len(msg) > 1 and msg[0:1] == "\x01": |
| 321 | self.events.trigger( |
| 322 | 'OwnCtcpReply', source=self.me, target=str(target), |
| 323 | text=msg[1:-1], |
| 324 | network=self, window=windows.get_default(self, self.manager) |
| 325 | ) |
| 326 | else: |
| 327 | self.events.trigger( |
| 328 | 'OwnNotice', source=self.me, target=str(target), text=msg, |
| 329 | network=self, window=windows.get_default(self) |
| 330 | ) |
310 | 331 | |
311 | 332 | #a Network that is never connected |
312 | 333 | class DummyNetwork(Network): |
diff --git a/purk/scripts/irc_script.py b/purk/scripts/irc_script.py
index 6e38005..4537aff 100644
a
|
b
|
def setdownRaw(e): |
120 | 120 | e.done = True |
121 | 121 | |
122 | 122 | elif e.msg[1] == "PRIVMSG": |
123 | | core.events.trigger('Text', e) |
| 123 | if len(e.msg[3]) > 8 and e.msg[3][0:7] == "\x01ACTION": |
| 124 | e.text = ' '.join(e.msg[3:])[8:-1] |
| 125 | core.events.trigger('Action', e) |
| 126 | elif len(e.msg[3]) > 1 and e.msg[3][0:1] == "\x01": |
| 127 | e.text = ' '.join(e.msg[3:])[1:-1] |
| 128 | core.events.trigger('Ctcp', e) |
| 129 | else: |
| 130 | core.events.trigger('Text', e) |
124 | 131 | e.done = True |
125 | 132 | |
126 | 133 | elif e.msg[1] == "NOTICE": |
127 | | core.events.trigger('Notice', e) |
| 134 | if len(e.msg[3]) > 1 and e.msg[3][0:1] == "\x01": |
| 135 | e.text = ' '.join(e.msg[3:])[1:-1] |
| 136 | core.events.trigger('CtcpReply', e) |
| 137 | else: |
| 138 | core.events.trigger('Notice', e) |
128 | 139 | e.done = True |
129 | 140 | |
130 | 141 | elif e.msg[1] == "TOPIC": |
… |
… |
def onCommandSay(e): |
238 | 249 | else: |
239 | 250 | raise core.events.CommandError("There's no one here to speak to.") |
240 | 251 | |
| 252 | def onCommandCtcp(e): |
| 253 | if len(e.args) > 2: |
| 254 | message = ('\x01' + e.args[1].upper() + ' ' + |
| 255 | ' '.join(e.args[2:]) + '\x01') |
| 256 | else: |
| 257 | message = ('\x01' + e.args[1].upper() + '\x01') |
| 258 | e.network.msg(e.args[0], message) |
| 259 | |
241 | 260 | def onCommandMsg(e): |
242 | 261 | e.network.msg(e.args[0], ' '.join(e.args[1:])) |
243 | 262 | |
diff --git a/purk/scripts/theme.py b/purk/scripts/theme.py
index 5afd8fa..7d762cb 100644
a
|
b
|
def onText(e): |
165 | 165 | color = getsourcecolor(e) |
166 | 166 | to_write = prefix(e) |
167 | 167 | |
168 | | if len(e.text) > 8 and e.text[0:7] == "\x01ACTION": |
169 | | |
170 | | # This is an action. |
171 | | to_write += "%s %s" % (format_source(e), e.text[7:-1]) |
172 | | elif e.network.me == e.target: # this is a pm |
| 168 | if e.network.me == e.target: # this is a pm |
173 | 169 | if e.window.id == e.network.norm_case(e.source): |
174 | 170 | to_write += "\x02<\x0F%s\x0F\x02>\x0F " % (format_source(e)) |
175 | 171 | else: |
… |
… |
def onOwnText(e): |
191 | 187 | color = getsourcecolor(e) |
192 | 188 | to_write = prefix(e) |
193 | 189 | |
194 | | if len(e.text) > 8 and e.text[0:7] == "\x01ACTION": |
195 | | |
196 | | # This is an action. |
197 | | to_write += "%s%s" % (format_source(e), e.text[7:-1]) |
198 | | elif e.window.id == e.network.norm_case(e.target): |
| 190 | if e.window.id == e.network.norm_case(e.target): |
199 | 191 | to_write += "\x02<\x0F%s\x0F\x02>\x0F %s" % (format_source(e), e.text) |
200 | 192 | else: |
201 | 193 | to_write += "%s->\x0F \x02*\x0F%s\x0F\x02*\x0F %s" % (color, e.target, e.text) |
… |
… |
def onCtcp(e): |
243 | 235 | if not e.quiet: |
244 | 236 | e.window.write(to_write) |
245 | 237 | |
| 238 | def onOwnCtcp(e): |
| 239 | color = getsourcecolor(e) |
| 240 | to_write = "%s-> \x02[\x02%s\x0F\x02]\x0F %s" % (prefix(e), format_source(e), e.text) |
| 241 | |
| 242 | if not e.quiet: |
| 243 | e.window.write(to_write) |
| 244 | |
246 | 245 | def onCtcpReply(e): |
247 | 246 | color = getsourcecolor(e) |
248 | 247 | to_write = "%s%s--- %s reply from %s:\x0F %s" % (prefix(e), color, e.name.capitalize(), format_source(e), ' '.join(e.args)) |
… |
… |
def onCtcpReply(e): |
252 | 251 | window = windows.get_default(e.network) |
253 | 252 | window.write(to_write, widgets.TEXT) |
254 | 253 | |
| 254 | def onOwnCtcpReply(e): |
| 255 | color = getsourcecolor(e) |
| 256 | to_write = "%s-> %s--- %s reply from %s:\x0F %s" % (prefix(e), color, e.name.capitalize(), format_source(e), ' '.join(e.args)) |
| 257 | |
| 258 | window = windows.manager.get_active() |
| 259 | if window.network != e.network: |
| 260 | window = windows.get_default(e.network) |
| 261 | window.write(to_write, widgets.TEXT) |
| 262 | |
255 | 263 | def onJoin(e): |
256 | 264 | if e.source == e.network.me: |
257 | 265 | to_write = "%s%s %sjoin %s" % (prefix(e), format_info_source(e), address(e), e.target) |