diff --git a/plugins/Admin/config.py b/plugins/Admin/config.py index 86023660e..0a6f64211 100644 --- a/plugins/Admin/config.py +++ b/plugins/Admin/config.py @@ -41,14 +41,6 @@ def configure(advanced): from supybot.questions import expect, anything, something, yn conf.registerPlugin('Admin', True) - Admin = conf.registerPlugin('Admin') -conf.registerChannelValue(Admin, 'partMsg', - registry.String('$version', _("""Determines what part message should be - used by default. If the part command is called without a part message, - this will be used. If this value is empty, then no part message will - be used (they are optional in the IRC protocol). The standard - substitutions ($version, $nick, etc.) are all handled appropriately."""))) - # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Admin/plugin.py b/plugins/Admin/plugin.py index 634a0ede2..63489d4e2 100644 --- a/plugins/Admin/plugin.py +++ b/plugins/Admin/plugin.py @@ -231,38 +231,6 @@ class Admin(callbacks.Plugin): irc.reply(irc.nick) nick = wrap(nick, [additional('nick'), additional('something')]) - @internationalizeDocstring - def part(self, irc, msg, args, channel, reason): - """[] [] - - Tells the bot to part the list of channels you give it. is - only necessary if you want the bot to part a channel other than the - current channel. If is specified, use it as the part - message. Otherwise, the default part message specified in - supybot.plugins.Admin.partMsg will be used. No part message will be - used if no default is configured. - """ - if channel is None: - if irc.isChannel(msg.args[0]): - channel = msg.args[0] - else: - irc.error(Raise=True) - try: - network = conf.supybot.networks.get(irc.network) - network.channels().remove(channel) - except KeyError: - pass - if channel not in irc.state.channels: - irc.error(_('I\'m not in %s.') % channel, Raise=True) - reason = (reason or self.registryValue("partMsg", channel)) - reason = ircutils.standardSubstitute(irc, msg, reason) - irc.queueMsg(ircmsgs.part(channel, reason)) - if msg.nick in irc.state.channels[channel].users: - irc.noReply() - else: - irc.replySuccess() - part = wrap(part, [optional('validChannel'), additional('text')]) - class capability(callbacks.Commands): @internationalizeDocstring diff --git a/plugins/Admin/test.py b/plugins/Admin/test.py index 5f94faf6f..6c090daef 100644 --- a/plugins/Admin/test.py +++ b/plugins/Admin/test.py @@ -94,27 +94,6 @@ class AdminTestCase(PluginTestCase): self.assertEqual(m.args[0], '#foo') self.assertEqual(m.args[1], 'key') - def testPart(self): - def getAfterJoinMessages(): - m = self.irc.takeMsg() - self.assertEqual(m.command, 'MODE') - m = self.irc.takeMsg() - self.assertEqual(m.command, 'MODE') - m = self.irc.takeMsg() - self.assertEqual(m.command, 'WHO') - self.assertError('part #foo') - self.assertRegexp('part #foo', 'not in') - self.irc.feedMsg(ircmsgs.join('#foo', prefix=self.prefix)) - getAfterJoinMessages() - m = self.getMsg('part #foo') - self.assertEqual(m.command, 'PART') - self.irc.feedMsg(ircmsgs.join('#foo', prefix=self.prefix)) - getAfterJoinMessages() - m = self.getMsg('part #foo reason') - self.assertEqual(m.command, 'PART') - self.assertEqual(m.args[0], '#foo') - self.assertEqual(m.args[1], 'reason') - def testNick(self): original = conf.supybot.nick() try: diff --git a/plugins/Channel/config.py b/plugins/Channel/config.py index 19f7462be..bccdb28f0 100644 --- a/plugins/Channel/config.py +++ b/plugins/Channel/config.py @@ -51,6 +51,11 @@ conf.registerChannelValue(Channel, 'nicksInPrivate', registry.Boolean(True, _("""Determines whether the output of 'nicks' will be sent in private. This prevents mass-highlights of a channel's users, accidental or on purpose."""))) - +conf.registerChannelValue(Channel, 'partMsg', + registry.String('$version', _("""Determines what part message should be + used by default. If the part command is called without a part message, + this will be used. If this value is empty, then no part message will + be used (they are optional in the IRC protocol). The standard + substitutions ($version, $nick, etc.) are all handled appropriately."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Channel/plugin.py b/plugins/Channel/plugin.py index 75834daa2..d4e425013 100644 --- a/plugins/Channel/plugin.py +++ b/plugins/Channel/plugin.py @@ -258,17 +258,22 @@ class Channel(callbacks.Plugin): any('nickInChannel')]) @internationalizeDocstring - def cycle(self, irc, msg, args, channel): + def cycle(self, irc, msg, args, channel, reason): """[] If you have the #channel,op capability, this will cause the bot to "cycle", or PART and then JOIN the channel. is only necessary - if the message isn't sent in the channel itself. + if the message isn't sent in the channel itself. If is not + specified, the default part message specified in + supybot.plugins.Channel.partMsg will be used. No part message will be + used if neither a cycle reason nor a default part message is given. """ - self._sendMsg(irc, ircmsgs.part(channel, msg.nick)) + reason = (reason or self.registryValue("partMsg", channel)) + reason = ircutils.standardSubstitute(irc, msg, reason) + self._sendMsg(irc, ircmsgs.part(channel, reason)) networkGroup = conf.supybot.networks.get(irc.network) self._sendMsg(irc, networkGroup.channels.join(channel)) - cycle = wrap(cycle, ['op']) + cycle = wrap(cycle, ['op', additional('text')]) @internationalizeDocstring def kick(self, irc, msg, args, channel, nicks, reason): @@ -941,6 +946,41 @@ class Channel(callbacks.Plugin): self.alertOps(irc, channel, text, frm=msg.nick) alert = wrap(alert, ['inChannel', 'text']) + @internationalizeDocstring + def part(self, irc, msg, args, channel, reason): + """[] [] + + Tells the bot to part the list of channels you give it. is + only necessary if you want the bot to part a channel other than the + current channel. If is specified, use it as the part + message. Otherwise, the default part message specified in + supybot.plugins.Channel.partMsg will be used. No part message will be + used if no default is configured. + """ + if channel is None: + if irc.isChannel(msg.args[0]): + channel = msg.args[0] + else: + irc.error(Raise=True) + capability = ircdb.makeChannelCapability(channel, 'op') + hostmask = irc.state.nickToHostmask(msg.nick) + if not ircdb.checkCapability(hostmask, capability): + irc.errorNoCapability(capability, Raise=True) + try: + network = conf.supybot.networks.get(irc.network) + network.channels().remove(channel) + except KeyError: + pass + if channel not in irc.state.channels: + irc.error(_('I\'m not in %s.') % channel, Raise=True) + reason = (reason or self.registryValue("partMsg", channel)) + reason = ircutils.standardSubstitute(irc, msg, reason) + irc.queueMsg(ircmsgs.part(channel, reason)) + if msg.nick in irc.state.channels[channel].users: + irc.noReply() + else: + irc.replySuccess() + part = wrap(part, [optional('validChannel'), additional('text')]) Class = Channel diff --git a/plugins/Channel/test.py b/plugins/Channel/test.py index 6a8e4568e..2ac9bc148 100644 --- a/plugins/Channel/test.py +++ b/plugins/Channel/test.py @@ -251,6 +251,27 @@ class ChannelTestCase(ChannelPluginTestCase): def testNicks(self): self.assertResponse('channel nicks', 'bar, foo, and test') self.assertResponse('channel nicks --count', '3') - + + def testPart(self): + def getAfterJoinMessages(): + m = self.irc.takeMsg() + self.assertEqual(m.command, 'MODE') + m = self.irc.takeMsg() + self.assertEqual(m.command, 'MODE') + m = self.irc.takeMsg() + self.assertEqual(m.command, 'WHO') + self.assertError('part #foo') + self.assertRegexp('part #foo', 'not in') + self.irc.feedMsg(ircmsgs.join('#foo', prefix=self.prefix)) + getAfterJoinMessages() + m = self.getMsg('part #foo') + self.assertEqual(m.command, 'PART') + self.irc.feedMsg(ircmsgs.join('#foo', prefix=self.prefix)) + getAfterJoinMessages() + m = self.getMsg('part #foo reason') + self.assertEqual(m.command, 'PART') + self.assertEqual(m.args[0], '#foo') + self.assertEqual(m.args[1], 'reason') + # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: