mirror of
https://github.com/Mikaela/Limnoria.git
synced 2025-01-11 20:52:42 +01:00
Add experimental support for +draft/reply client capability on outgoing messages.
This commit is contained in:
parent
eb1e27e20b
commit
83a8afde16
@ -236,6 +236,14 @@ def _makeReply(irc, msg, s,
|
|||||||
# Finally, we'll return the actual message.
|
# Finally, we'll return the actual message.
|
||||||
ret = msgmaker(target, s)
|
ret = msgmaker(target, s)
|
||||||
ret.tag('inReplyTo', msg)
|
ret.tag('inReplyTo', msg)
|
||||||
|
if 'msgid' in msg.server_tags \
|
||||||
|
and conf.supybot.protocols.irc.experimentalExtensions() \
|
||||||
|
and 'message-tags' in irc.state.capabilities_ack:
|
||||||
|
# In theory, msgid being in server_tags implies message-tags was
|
||||||
|
# negotiated, but the +reply spec requires it explicitly. Plus, there's
|
||||||
|
# no harm in doing this extra check, in case a plugin is replying
|
||||||
|
# across network (as it may happen with '@network command').
|
||||||
|
ret.server_tags['+draft/reply'] = msg.server_tags['msgid']
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def error(*args, **kwargs):
|
def error(*args, **kwargs):
|
||||||
|
@ -1219,6 +1219,13 @@ registerGlobalValue(supybot.protocols.irc, 'strictRfc',
|
|||||||
requires you to message a nick such as services@this.network.server
|
requires you to message a nick such as services@this.network.server
|
||||||
then you you should set this to False.""")))
|
then you you should set this to False.""")))
|
||||||
|
|
||||||
|
registerGlobalValue(supybot.protocols.irc, 'experimentalExtensions',
|
||||||
|
registry.Boolean(False, _("""Determines whether the bot will enable
|
||||||
|
draft/experimental extensions of the IRC protocol. Setting this to True
|
||||||
|
may break your bot at any time without warning and/or break your
|
||||||
|
configuration irreversibly. So keep it False unless you know what you are
|
||||||
|
doing.""")))
|
||||||
|
|
||||||
registerGlobalValue(supybot.protocols.irc, 'certfile',
|
registerGlobalValue(supybot.protocols.irc, 'certfile',
|
||||||
registry.String('', _("""Determines what certificate file (if any) the bot
|
registry.String('', _("""Determines what certificate file (if any) the bot
|
||||||
will use connect with SSL sockets by default.""")))
|
will use connect with SSL sockets by default.""")))
|
||||||
|
@ -534,6 +534,70 @@ class PrivmsgTestCase(ChannelPluginTestCase):
|
|||||||
self.assertRegexp('help first firstcmd', 'First', 0) # no re.I flag.
|
self.assertRegexp('help first firstcmd', 'First', 0) # no re.I flag.
|
||||||
self.assertRegexp('help firstrepeat firstcmd', 'FirstRepeat', 0)
|
self.assertRegexp('help firstrepeat firstcmd', 'FirstRepeat', 0)
|
||||||
|
|
||||||
|
def testClientTagReply(self):
|
||||||
|
self.irc.addCallback(self.First(self.irc))
|
||||||
|
|
||||||
|
# no CAP, no msgid, no experimentalExtensions -> no +reply
|
||||||
|
self.irc.feedMsg(ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', prefix=self.prefix,
|
||||||
|
args=('#foo', '%s: firstcmd' % self.nick)))
|
||||||
|
msg = self.irc.takeMsg()
|
||||||
|
self.assertEqual(msg, ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', args=('#foo', '%s: foo' % self.nick)))
|
||||||
|
|
||||||
|
# CAP and msgid, not no experimentalExtensions -> no +reply
|
||||||
|
self.irc.feedMsg(ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', prefix=self.prefix,
|
||||||
|
args=('#foo', '%s: firstcmd' % self.nick),
|
||||||
|
server_tags={'msgid': 'foobar'}))
|
||||||
|
msg = self.irc.takeMsg()
|
||||||
|
self.assertEqual(msg, ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', args=('#foo', '%s: foo' % self.nick)))
|
||||||
|
|
||||||
|
with conf.supybot.protocols.irc.experimentalExtensions.context(True):
|
||||||
|
# no CAP, but msgid and experimentalExtensions -> no +reply
|
||||||
|
self.irc.feedMsg(ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', prefix=self.prefix,
|
||||||
|
args=('#foo', '%s: firstcmd' % self.nick),
|
||||||
|
server_tags={'msgid': 'foobar'}))
|
||||||
|
msg = self.irc.takeMsg()
|
||||||
|
self.assertEqual(msg, ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', args=('#foo', '%s: foo' % self.nick)))
|
||||||
|
|
||||||
|
# msgid and experimentalExtensions, but no CAP -> no +reply
|
||||||
|
# (note that in theory it's impossible to receive msgid without
|
||||||
|
# the CAP, but the +reply spec explicitly requires to check it)
|
||||||
|
self.irc.feedMsg(ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', prefix=self.prefix,
|
||||||
|
args=('#foo', '%s: firstcmd' % self.nick),
|
||||||
|
server_tags={'msgid': 'foobar'}))
|
||||||
|
msg = self.irc.takeMsg()
|
||||||
|
self.assertEqual(msg, ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', args=('#foo', '%s: foo' % self.nick)))
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.irc.state.capabilities_ack.add('message-tags')
|
||||||
|
|
||||||
|
# no msgid, but CAP and experimentalExtensions -> no +reply
|
||||||
|
self.irc.feedMsg(ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', prefix=self.prefix,
|
||||||
|
args=('#foo', '%s: firstcmd' % self.nick)))
|
||||||
|
msg = self.irc.takeMsg()
|
||||||
|
self.assertEqual(msg, ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', args=('#foo', '%s: foo' % self.nick)))
|
||||||
|
|
||||||
|
# all of CAP, msgid, experimentalExtensions -> yes +reply
|
||||||
|
self.irc.feedMsg(ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', prefix=self.prefix,
|
||||||
|
args=('#foo', '%s: firstcmd' % self.nick),
|
||||||
|
server_tags={'msgid': 'foobar'}))
|
||||||
|
msg = self.irc.takeMsg()
|
||||||
|
self.assertEqual(msg, ircmsgs.IrcMsg(
|
||||||
|
command='PRIVMSG', args=('#foo', '%s: foo' % self.nick),
|
||||||
|
server_tags={'+draft/reply': 'foobar'}))
|
||||||
|
finally:
|
||||||
|
self.irc.state.capabilities_ack.remove('message-tags')
|
||||||
|
|
||||||
class TwoRepliesFirstAction(callbacks.Plugin):
|
class TwoRepliesFirstAction(callbacks.Plugin):
|
||||||
def testactionreply(self, irc, msg, args):
|
def testactionreply(self, irc, msg, args):
|
||||||
irc.reply('foo', action=True)
|
irc.reply('foo', action=True)
|
||||||
|
Loading…
Reference in New Issue
Block a user