Ticket #2440: 0001-Add-proper-CTCP-support-sending-and-receiving.patch

File 0001-Add-proper-CTCP-support-sending-and-receiving.patch, 6.3 KB (added by fran, 13 years ago)

Add proper CTCP support - sending and receiving

  • purk/irc.py

    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): 
    295295    def msg(self, target, msg):
    296296        self.raw("PRIVMSG %s :%s" % (target, msg))
    297297       
    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                )
    302316
    303317    def notice(self, target, msg):
    304318        self.raw("NOTICE %s :%s" % (target, msg))
    305319       
    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                )
    310331
    311332#a Network that is never connected
    312333class DummyNetwork(Network):
  • purk/scripts/irc_script.py

    diff --git a/purk/scripts/irc_script.py b/purk/scripts/irc_script.py
    index 6e38005..4537aff 100644
    a b def setdownRaw(e): 
    120120            e.done = True
    121121           
    122122        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)
    124131            e.done = True
    125132       
    126133        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)
    128139            e.done = True
    129140       
    130141        elif e.msg[1] == "TOPIC":
    def onCommandSay(e): 
    238249    else:
    239250        raise core.events.CommandError("There's no one here to speak to.")
    240251
     252def 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
    241260def onCommandMsg(e):
    242261    e.network.msg(e.args[0], ' '.join(e.args[1:]))
    243262
  • purk/scripts/theme.py

    diff --git a/purk/scripts/theme.py b/purk/scripts/theme.py
    index 5afd8fa..7d762cb 100644
    a b def onText(e): 
    165165    color = getsourcecolor(e)
    166166    to_write = prefix(e)
    167167   
    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
    173169        if e.window.id == e.network.norm_case(e.source):
    174170            to_write += "\x02<\x0F%s\x0F\x02>\x0F " % (format_source(e))
    175171        else:
    def onOwnText(e): 
    191187    color = getsourcecolor(e)
    192188    to_write = prefix(e)
    193189
    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):
    199191        to_write += "\x02<\x0F%s\x0F\x02>\x0F %s" % (format_source(e), e.text)
    200192    else:
    201193        to_write += "%s->\x0F \x02*\x0F%s\x0F\x02*\x0F %s" % (color, e.target, e.text)
    def onCtcp(e): 
    243235    if not e.quiet:
    244236        e.window.write(to_write)
    245237
     238def 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
    246245def onCtcpReply(e):
    247246    color = getsourcecolor(e)
    248247    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): 
    252251        window = windows.get_default(e.network)
    253252    window.write(to_write, widgets.TEXT)
    254253
     254def 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
    255263def onJoin(e):
    256264    if e.source == e.network.me:
    257265        to_write = "%s%s %sjoin %s" % (prefix(e), format_info_source(e), address(e), e.target)