mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-11-26 20:59:27 +01:00
Topic.undo.
This commit is contained in:
parent
ad578a3d0b
commit
151d3b7571
@ -73,10 +73,15 @@ conf.registerChannelValue(conf.supybot.plugins.Topic, 'recognizeTopiclen',
|
||||
TOPICLEN value sent to it by the server and thus refuse to send TOPICs
|
||||
longer than the TOPICLEN. These topics are likely to be truncated by the
|
||||
server anyway, so this defaults to True."""))
|
||||
conf.registerGroup(conf.supybot.plugins.Topic, 'undo')
|
||||
conf.registerChannelValue(conf.supybot.plugins.Topic.undo, 'max',
|
||||
registry.NonNegativeInteger(10, """Determines the number of previous
|
||||
topics to keep around in case the undo command is called."""))
|
||||
|
||||
class Topic(callbacks.Privmsg):
|
||||
def __init__(self):
|
||||
callbacks.Privmsg.__init__(self)
|
||||
self.undos = ircutils.IrcDict()
|
||||
self.lastTopics = ircutils.IrcDict()
|
||||
|
||||
def _splitTopic(self, topic, channel):
|
||||
@ -92,6 +97,23 @@ class Topic(callbacks.Privmsg):
|
||||
env = {'topic': topic}
|
||||
return plugins.standardSubstitute(irc, msg, formatter, env)
|
||||
|
||||
def _addUndo(self, channel, topics):
|
||||
try:
|
||||
stack = self.undos[channel]
|
||||
except KeyError:
|
||||
stack = []
|
||||
self.undos[channel] = stack
|
||||
stack.append(topics)
|
||||
maxLen = self.registryValue('undo.max', channel)
|
||||
while len(stack) > maxLen:
|
||||
del stack[0]
|
||||
|
||||
def _getUndo(self, channel):
|
||||
try:
|
||||
return self.undos[channel].pop()
|
||||
except (KeyError, IndexError):
|
||||
return None
|
||||
|
||||
def _sendTopics(self, irc, channel, topics):
|
||||
topics = [s for s in topics if s and not s.isspace()]
|
||||
self.lastTopics[channel] = topics
|
||||
@ -104,6 +126,7 @@ class Topic(callbacks.Privmsg):
|
||||
'(maximum length: %s).' % maxLen, Raise=True)
|
||||
except KeyError:
|
||||
pass
|
||||
self._addUndo(channel, topics)
|
||||
irc.queueMsg(ircmsgs.topic(channel, newTopic))
|
||||
|
||||
def _canChangeTopic(self, irc, channel):
|
||||
@ -343,6 +366,20 @@ class Topic(callbacks.Privmsg):
|
||||
self._sendTopics(irc, channel, topics)
|
||||
restore = privmsgs.channel(restore)
|
||||
|
||||
def undo(self, irc, msg, args, channel):
|
||||
"""[<channel>]
|
||||
|
||||
Restores the topic to the one previous to the last topic command that
|
||||
set it.
|
||||
"""
|
||||
topics = self._getUndo(channel) # This is the last topic sent.
|
||||
topics = self._getUndo(channel) # This is the topic list we want.
|
||||
if topics is not None:
|
||||
self._sendTopics(irc, channel, topics)
|
||||
else:
|
||||
irc.error('There are no more undos for %s.' % channel)
|
||||
undo = privmsgs.channel(undo)
|
||||
|
||||
Class = Topic
|
||||
|
||||
|
||||
|
@ -77,13 +77,13 @@ class TopicTestCase(ChannelPluginTestCase, PluginDocumentation):
|
||||
|
||||
def testConfig(self):
|
||||
try:
|
||||
original = conf.supybot.plugins.Topic.separator()
|
||||
conf.supybot.plugins.Topic.separator.setValue(' <==> ')
|
||||
_ = self.getMsg('topic add foo')
|
||||
m = self.getMsg('topic add bar')
|
||||
self.failUnless('<==>' in m.args[1])
|
||||
finally:
|
||||
default = conf.supybot.plugins.Topic.separator.default()
|
||||
conf.supybot.plugins.Topic.separator.setValue(default)
|
||||
conf.supybot.plugins.Topic.separator.setValue(original)
|
||||
|
||||
def testReorder(self):
|
||||
_ = self.getMsg('topic add foo')
|
||||
@ -116,6 +116,24 @@ class TopicTestCase(ChannelPluginTestCase, PluginDocumentation):
|
||||
self.assertRegexp('topic set -1 bar', 'bar')
|
||||
self.assertNotRegexp('topic set -1 baz', 'bar')
|
||||
|
||||
def testTopic(self):
|
||||
self.assertResponse('topic foo bar baz', 'foo bar baz')
|
||||
|
||||
def testUndo(self):
|
||||
try:
|
||||
original = conf.supybot.plugins.Topic.format()
|
||||
conf.supybot.plugins.Topic.format.setValue('$topic')
|
||||
self.assertResponse('topic ""', '')
|
||||
self.assertResponse('topic add foo', 'foo')
|
||||
self.assertResponse('topic add bar', 'foo || bar')
|
||||
self.assertResponse('topic add baz', 'foo || bar || baz')
|
||||
self.assertResponse('topic undo', 'foo || bar')
|
||||
self.assertResponse('topic undo', 'foo')
|
||||
self.assertResponse('topic undo', '')
|
||||
finally:
|
||||
conf.supybot.plugins.Topic.format.setValue(original)
|
||||
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user