mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-11-23 02:49:27 +01:00
Refactoring, added set, topic, and insert.
This commit is contained in:
parent
07757282f2
commit
18dce894a5
164
plugins/Topic.py
164
plugins/Topic.py
@ -87,7 +87,7 @@ class Topic(callbacks.Privmsg):
|
||||
env = {'topic': topic}
|
||||
return plugins.standardSubstitute(irc, msg, formatter, env)
|
||||
|
||||
def _sendTopic(self, irc, channel, topics):
|
||||
def _sendTopics(self, irc, channel, topics):
|
||||
topics = [s for s in topics if s and not s.isspace()]
|
||||
self.lastTopics[channel] = topics
|
||||
newTopic = self._joinTopic(channel, topics)
|
||||
@ -101,7 +101,29 @@ class Topic(callbacks.Privmsg):
|
||||
else:
|
||||
return True
|
||||
|
||||
def add(self, irc, msg, args, channel):
|
||||
def _topicNumber(self, irc, n, topics=None):
|
||||
try:
|
||||
n = int(n)
|
||||
if not n:
|
||||
raise ValueError
|
||||
if n > 0:
|
||||
n -= 1
|
||||
if topics is not None:
|
||||
topics[n]
|
||||
return n
|
||||
except (ValueError, IndexError):
|
||||
irc.error('That\'s not a valid topic number.', Raise=True)
|
||||
|
||||
def topic(self, irc, msg, args, channel):
|
||||
"""[<channel>] <topic>
|
||||
|
||||
Sets the topic of <channel> to <topic>.
|
||||
"""
|
||||
topic = privmsgs.getArgs(args)
|
||||
irc.queueMsg(ircmsgs.topic(channel, topic))
|
||||
topic = privmsgs.channel(topic)
|
||||
|
||||
def add(self, irc, msg, args, channel, insert=False):
|
||||
"""[<channel>] <topic>
|
||||
|
||||
Adds <topic> to the topics for <channel>. <channel> is only necessary
|
||||
@ -114,12 +136,24 @@ class Topic(callbacks.Privmsg):
|
||||
s = 'You can\'t have %s in your topic' % separator
|
||||
irc.error(s)
|
||||
return
|
||||
currentTopic = irc.state.getTopic(channel)
|
||||
topics = self._splitTopic(irc.state.getTopic(channel), channel)
|
||||
formattedTopic = self._formatTopic(irc, msg, channel, topic)
|
||||
# Empties are removed by _sendTopic.
|
||||
self._sendTopic(irc, channel, [currentTopic, formattedTopic])
|
||||
if insert:
|
||||
topics.insert(0, formattedTopic)
|
||||
else:
|
||||
topics.append(formattedTopic)
|
||||
self._sendTopics(irc, channel, topics)
|
||||
add = privmsgs.channel(add)
|
||||
|
||||
def insert(self, irc, msg, args):
|
||||
"""[<channel>] <topic>
|
||||
|
||||
Adds <topic> to the topics for <channel> at the beginning of the topics
|
||||
currently on <channel>. <channel> is only necessary if the message
|
||||
isn't sent in the channel itself.
|
||||
"""
|
||||
self.add(irc, msg, args, insert=True)
|
||||
|
||||
def shuffle(self, irc, msg, args, channel):
|
||||
"""[<channel>]
|
||||
|
||||
@ -138,7 +172,7 @@ class Topic(callbacks.Privmsg):
|
||||
original = topics[:]
|
||||
while topics == original:
|
||||
random.shuffle(topics)
|
||||
self._sendTopic(irc, channel, topics)
|
||||
self._sendTopics(irc, channel, topics)
|
||||
shuffle = privmsgs.channel(shuffle)
|
||||
|
||||
def reorder(self, irc, msg, args, channel):
|
||||
@ -159,30 +193,15 @@ class Topic(callbacks.Privmsg):
|
||||
irc.error('All topic numbers must be specified.')
|
||||
return
|
||||
order = privmsgs.getArgs(args, required=num)
|
||||
if topics:
|
||||
for i,p in enumerate(order):
|
||||
try:
|
||||
p = int(p)
|
||||
if p > 0:
|
||||
order[i] = p - 1
|
||||
elif p == 0:
|
||||
irc.error('0 is not a valid topic number.')
|
||||
return
|
||||
else:
|
||||
order[i] = num + p
|
||||
except ValueError:
|
||||
irc.error('The positions must be valid integers.')
|
||||
return
|
||||
if sorted(order) != range(num):
|
||||
irc.error('Duplicate topic numbers cannot be specified.')
|
||||
return
|
||||
try:
|
||||
newtopics = [topics[i] for i in order]
|
||||
self._sendTopic(irc, channel, newtopics)
|
||||
except IndexError:
|
||||
irc.error('An invalid topic number was specified.')
|
||||
else:
|
||||
irc.error('There are no topics to reorder.')
|
||||
for i,p in enumerate(order):
|
||||
order[i] = self._topicNumber(irc, p, topics=topics)
|
||||
if order[i] < 0:
|
||||
order[i] += num
|
||||
if sorted(order) != range(num):
|
||||
irc.error('Duplicate topic numbers cannot be specified.')
|
||||
return
|
||||
newtopics = [topics[i] for i in order]
|
||||
self._sendTopics(irc, channel, newtopics)
|
||||
reorder = privmsgs.channel(reorder)
|
||||
|
||||
def list(self, irc, msg, args, channel):
|
||||
@ -208,22 +227,10 @@ class Topic(callbacks.Privmsg):
|
||||
isn't sent in the channel itself.
|
||||
"""
|
||||
number = privmsgs.getArgs(args)
|
||||
try:
|
||||
number = int(number)
|
||||
if number > 0:
|
||||
number -= 1
|
||||
elif number == 0:
|
||||
irc.error('That\'s not a valid topic number.')
|
||||
return
|
||||
except ValueError:
|
||||
irc.error('The argument must be a valid integer.')
|
||||
return
|
||||
topics = self._splitTopic(irc.state.getTopic(channel), channel)
|
||||
if topics:
|
||||
try:
|
||||
irc.reply(topics[number])
|
||||
except IndexError:
|
||||
irc.error('That\'s not a valid topic.')
|
||||
number = self._topicNumber(irc, number, topics=topics)
|
||||
irc.reply(topics[number])
|
||||
else:
|
||||
irc.error('There are no topics to get.')
|
||||
get = privmsgs.channel(get)
|
||||
@ -239,36 +246,35 @@ class Topic(callbacks.Privmsg):
|
||||
"""
|
||||
self._canChangeTopic(irc, channel)
|
||||
(number, regexp) = privmsgs.getArgs(args, required=2)
|
||||
try:
|
||||
number = int(number)
|
||||
if number > 0:
|
||||
number -= 1
|
||||
elif number == 0:
|
||||
irc.error('That\'s not a valid topic number.')
|
||||
return
|
||||
except ValueError:
|
||||
irc.error('The <number> argument must be a number.')
|
||||
return
|
||||
try:
|
||||
replacer = utils.perlReToReplacer(regexp)
|
||||
except ValueError, e:
|
||||
irc.error('The regexp wasn\'t valid: %s' % e.args[0])
|
||||
return
|
||||
except re.error, e:
|
||||
irc.error(utils.exnToString(e))
|
||||
return
|
||||
topics = self._splitTopic(irc.state.getTopic(channel), channel)
|
||||
if not topics:
|
||||
irc.error('There are no topics to change.')
|
||||
return
|
||||
topic = topics.pop(number)
|
||||
newTopic = replacer(topic)
|
||||
if number < 0:
|
||||
number = len(topics)+1+number
|
||||
topics.insert(number, newTopic)
|
||||
self._sendTopic(irc, channel, topics)
|
||||
number = self._topicNumber(irc, number, topics=topics)
|
||||
try:
|
||||
replacer = utils.perlReToReplacer(regexp)
|
||||
except ValueError, e:
|
||||
irc.error('The regexp wasn\'t valid: %s' % e)
|
||||
return
|
||||
topics[number] = replacer(topics[number])
|
||||
self._sendTopics(irc, channel, topics)
|
||||
change = privmsgs.channel(change)
|
||||
|
||||
def set(self, irc, msg, args, channel):
|
||||
"""[<channel>] <number> <topic>
|
||||
|
||||
Sets the topic <number> to be <text>. <channel> is only necessary if
|
||||
the message isn't sent in the channel itself.
|
||||
"""
|
||||
self._canChangeTopic(irc, channel)
|
||||
(i, topic) = privmsgs.getArgs(args, required=2)
|
||||
topics = self._splitTopic(irc.state.getTopic(channel), channel)
|
||||
i = self._topicNumber(irc, i, topics=topics)
|
||||
topic = self._formatTopic(irc, msg, channel, topic)
|
||||
topics[i] = topic
|
||||
self._sendTopics(irc, channel, topics)
|
||||
set = privmsgs.channel(set)
|
||||
|
||||
def remove(self, irc, msg, args, channel):
|
||||
"""[<channel>] <number>
|
||||
|
||||
@ -278,23 +284,11 @@ class Topic(callbacks.Privmsg):
|
||||
necessary if the message isn't sent in the channel itself.
|
||||
"""
|
||||
self._canChangeTopic(irc, channel)
|
||||
try:
|
||||
number = int(privmsgs.getArgs(args))
|
||||
if number > 0:
|
||||
number -= 1
|
||||
elif number == 0:
|
||||
irc.error('That\'s not a valid topic number.')
|
||||
return
|
||||
except ValueError:
|
||||
irc.error('The argument must be a number.')
|
||||
return
|
||||
i = privmsgs.getArgs(args)
|
||||
topics = self._splitTopic(irc.state.getTopic(channel), channel)
|
||||
try:
|
||||
topic = topics.pop(number)
|
||||
except IndexError:
|
||||
irc.error('That\'s not a valid topic number.')
|
||||
return
|
||||
self._sendTopic(irc, channel, topics)
|
||||
i = self._topicNumber(irc, i, topics=topics)
|
||||
topic = topics.pop(i)
|
||||
self._sendTopics(irc, channel, topics)
|
||||
remove = privmsgs.channel(remove)
|
||||
|
||||
def lock(self, irc, msg, args, channel):
|
||||
@ -333,7 +327,7 @@ class Topic(callbacks.Privmsg):
|
||||
except KeyError:
|
||||
irc.error('I haven\'t yet set the topic in %s.' % channel)
|
||||
return
|
||||
self._sendTopic(irc, channel, topics)
|
||||
self._sendTopics(irc, channel, topics)
|
||||
restore = privmsgs.channel(restore)
|
||||
|
||||
Class = Topic
|
||||
|
@ -111,6 +111,11 @@ class TopicTestCase(ChannelPluginTestCase, PluginDocumentation):
|
||||
_ = self.getMsg('topic add baz')
|
||||
self.assertRegexp('topic list', '1: foo .* 2: bar .* and 3: baz')
|
||||
|
||||
def testSet(self):
|
||||
_ = self.getMsg('topic add foo')
|
||||
self.assertRegexp('topic set -1 bar', 'bar')
|
||||
self.assertNotRegexp('topic set -1 baz', 'bar')
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user