2003-03-12 07:26:59 +01:00
#!/usr/bin/env python
###
# Copyright (c) 2002, Jeremiah Fincher
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
2003-03-25 07:53:51 +01:00
"""
Provides commands for manipulating channel topics .
"""
2003-10-05 14:56:56 +02:00
import plugins
2003-03-12 07:26:59 +01:00
import re
import random
2003-10-11 23:03:02 +02:00
import conf
2003-03-12 07:26:59 +01:00
import debug
2003-06-02 08:41:35 +02:00
import utils
2003-03-12 07:26:59 +01:00
import ircdb
import ircmsgs
import privmsgs
import callbacks
2003-08-27 20:06:26 +02:00
example = utils . wrapLines ( """
2003-10-03 12:13:41 +02:00
- - - Topic for #sourcereview is If you notice *anything* that seems unintuitive about supybot, post it at http://tinyurl.com/nvct (jemfinch) || Supybot 0.72.1 released! (jemfinch) || If anyone is working on the .deb package for supybot please send me or jemfinch a note via the bot (Strike)
- - - Topic for #sourcereview set by supybot at Mon Sep 29 15:56:10
2003-10-19 17:48:44 +02:00
< jemfinch > @list Topic
2003-08-27 20:06:26 +02:00
< supybot > jemfinch : addtopic , changetopic , removetopic , shuffletopic , topic
2003-10-03 12:13:41 +02:00
< jemfinch > @removetopic 2
- - - supybot has changed the topic to : If you notice * anything * that seems unintuitive about supybot , post it at http : / / tinyurl . com / nvct ( jemfinch ) | | If anyone is working on the . deb package for supybot please send me or jemfinch a note via the bot ( Strike )
< jemfinch > @addtopic Tenative release for Supybot 0.73 .0 is set for sunday
- - - supybot has changed the topic to : If you notice * anything * that seems unintuitive about supybot , post it at http : / / tinyurl . com / nvct ( jemfinch ) | | If anyone is working on the . deb package for supybot please send me or jemfinch a note via the bot ( Strike ) | | Tenative release for Supybot 0.73 .0 is set for sunday ( jemfinch )
< jemfinch > @changetopic - 1 s / sun / Sun /
- - - supybot has changed the topic to : If you notice * anything * that seems unintuitive about supybot , post it at http : / / tinyurl . com / nvct ( jemfinch ) | | If anyone is working on the . deb package for supybot please send me or jemfinch a note via the bot ( Strike ) | | Tenative release for Supybot 0.73 .0 is set for Sunday ( jemfinch )
< jemfinch > @gettopic - 2
< supybot > jemfinch : If anyone is working on the . deb package for supybot please send me or jemfinch a note via the bot ( Strike )
2003-08-27 20:06:26 +02:00
< jemfinch > @shuffletopic
2003-10-03 12:13:41 +02:00
- - - supybot has changed the topic to : If anyone is working on the . deb package for supybot please send me or jemfinch a note via the bot ( Strike ) | | If you notice * anything * that seems unintuitive about supybot , post it at http : / / tinyurl . com / nvct ( jemfinch ) | | Tenative release for Supybot 0.73 .0 is set for Sunday ( jemfinch )
2003-08-27 20:06:26 +02:00
""" )
2003-10-19 17:48:44 +02:00
class Topic ( callbacks . Privmsg ) :
2003-03-12 07:26:59 +01:00
topicSeparator = ' || '
topicFormatter = ' %s ( %s ) '
2003-08-29 09:32:14 +02:00
topicUnformatter = re . compile ( ' (.*) \ (( \ S+) \ ) ' )
2003-10-21 06:03:25 +02:00
def add ( self , irc , msg , args , channel ) :
2003-04-16 09:11:28 +02:00
""" [<channel>] <topic>
Adds < topic > to the topics for < channel > . < channel > is only necessary
if the message isn ' t sent in the channel itself.
"""
2003-03-12 07:26:59 +01:00
topic = privmsgs . getArgs ( args )
2003-09-18 00:38:03 +02:00
if self . topicSeparator in topic :
s = ' You can \' t have %s in your topic ' % self . topicSeparator
irc . error ( msg , s )
return
currentTopic = irc . state . getTopic ( channel )
try :
name = ircdb . users . getUser ( msg . prefix ) . name
except KeyError :
name = msg . nick
formattedTopic = self . topicFormatter % ( topic , name )
if currentTopic :
newTopic = self . topicSeparator . join ( ( currentTopic ,
formattedTopic ) )
2003-03-12 07:26:59 +01:00
else :
2003-09-18 00:38:03 +02:00
newTopic = formattedTopic
irc . queueMsg ( ircmsgs . topic ( channel , newTopic ) )
2003-10-21 06:03:25 +02:00
add = privmsgs . checkChannelCapability ( add , ' topic ' )
2003-03-12 07:26:59 +01:00
2003-10-21 06:03:25 +02:00
def shuffle ( self , irc , msg , args , channel ) :
2003-04-16 09:11:28 +02:00
""" [<channel>]
Shuffles the topics in < channel > . < channel > is only necessary if the
message isn ' t sent in the channel itself.
"""
2003-09-18 00:38:03 +02:00
newtopic = irc . state . getTopic ( channel )
topics = newtopic . split ( self . topicSeparator )
random . shuffle ( topics )
newtopic = self . topicSeparator . join ( topics )
while len ( topics ) > 1 and newtopic == irc . state . getTopic ( channel ) :
random . shuffle ( topics )
newtopic = self . topicSeparator . join ( topics )
irc . queueMsg ( ircmsgs . topic ( channel , newtopic ) )
2003-10-21 06:03:25 +02:00
shuffle = privmsgs . checkChannelCapability ( shuffle , ' topic ' )
2003-09-18 00:38:03 +02:00
2003-10-21 06:03:25 +02:00
def get ( self , irc , msg , args , channel ) :
2003-04-16 09:11:28 +02:00
""" [<channel>] <number>
2003-10-03 12:09:49 +02:00
Returns topic number < number > from < channel > . < number > is a one - based
2003-04-16 09:11:28 +02:00
index into the topics . < channel > is only necessary if the message
isn ' t sent in the channel itself.
"""
2003-10-02 07:58:53 +02:00
number = privmsgs . getArgs ( args )
2003-04-16 09:11:28 +02:00
try :
2003-10-02 07:58:53 +02:00
number = int ( number )
if number > = 0 :
number - = 1
2003-04-16 09:11:28 +02:00
except ValueError :
irc . error ( msg , ' The argument must be a valid integer. ' )
return
2003-09-18 00:38:03 +02:00
topics = irc . state . getTopic ( channel ) . split ( self . topicSeparator )
2003-04-16 09:11:28 +02:00
try :
2003-10-02 07:58:53 +02:00
irc . reply ( msg , topics [ number ] )
2003-04-16 09:11:28 +02:00
except IndexError :
2003-10-02 07:58:53 +02:00
irc . error ( msg , ' That \' s not a valid topic. ' )
2003-04-16 09:11:28 +02:00
return
2003-10-21 06:03:25 +02:00
get = privmsgs . channel ( get )
2003-08-20 18:26:23 +02:00
2003-10-21 06:03:25 +02:00
def change ( self , irc , msg , args , channel ) :
2003-04-16 09:11:28 +02:00
""" [<channel>] <number> <regexp>
Changes the topic number < number > on < channel > according to the regular
2003-10-03 12:09:49 +02:00
expression < regexp > . < number > is the one - based index into the topics ;
2003-04-16 09:11:28 +02:00
< regexp > is a regular expression of the form
s / regexp / replacement / flags . < channel > is only necessary if the message
isn ' t sent in the channel itself.
"""
( number , regexp ) = privmsgs . getArgs ( args , needed = 2 )
2003-03-28 18:30:10 +01:00
try :
number = int ( number )
2003-10-02 07:58:53 +02:00
if number > = 0 :
number - = 1
2003-03-28 18:30:10 +01:00
except ValueError :
irc . error ( msg , ' The <number> argument must be a number. ' )
return
2003-04-16 09:11:28 +02:00
try :
replacer = utils . perlReToReplacer ( regexp )
except ValueError , e :
irc . error ( msg , ' The regexp wasn \' t valid: %s ' % e . args [ 0 ] )
2003-09-24 08:16:29 +02:00
return
2003-08-26 19:08:46 +02:00
except re . error , e :
2003-03-28 18:30:10 +01:00
irc . error ( msg , debug . exnToString ( e ) )
return
topics = irc . state . getTopic ( channel ) . split ( self . topicSeparator )
topic = topics . pop ( number )
2003-09-06 07:25:42 +02:00
match = self . topicUnformatter . match ( topic )
if match is None :
name = ' '
else :
( topic , name ) = match . groups ( )
2003-04-16 10:34:44 +02:00
try :
2003-09-12 22:06:58 +02:00
senderName = ircdb . users . getUser ( msg . prefix ) . name
2003-04-16 10:34:44 +02:00
except KeyError :
irc . error ( msg , conf . replyNoUser )
return
2003-09-06 07:25:42 +02:00
if name and name != senderName and \
2003-08-19 03:20:56 +02:00
not ircdb . checkCapabilities ( msg . prefix , ( ' op ' , ' admin ' ) ) :
2003-03-28 18:30:10 +01:00
irc . error ( msg , ' You can only modify your own topics. ' )
return
2003-04-16 09:11:28 +02:00
newTopic = self . topicFormatter % ( replacer ( topic ) , name )
2003-09-16 20:08:33 +02:00
if number < 0 :
number = len ( topics ) + 1 + number
2003-03-28 18:30:10 +01:00
topics . insert ( number , newTopic )
newTopic = self . topicSeparator . join ( topics )
irc . queueMsg ( ircmsgs . topic ( channel , newTopic ) )
2003-10-21 06:03:25 +02:00
change = privmsgs . checkChannelCapability ( change , ' topic ' )
2003-08-20 18:26:23 +02:00
2003-10-21 06:03:25 +02:00
def remove ( self , irc , msg , args , channel ) :
2003-09-06 07:25:42 +02:00
""" [<channel>] <number>
Removes topic < number > from the topic for < channel > Topics are
2003-10-03 12:09:49 +02:00
numbered starting from 1 ; you can also use negative indexes to refer
2003-09-06 07:25:42 +02:00
to topics starting the from the end of the topic . < channel > is only
necessary if the message isn ' t sent in the channel itself.
"""
2003-03-12 07:26:59 +01:00
try :
number = int ( privmsgs . getArgs ( args ) )
2003-10-02 07:58:53 +02:00
if number > = 0 :
number - = 1
2003-03-12 07:26:59 +01:00
except ValueError :
irc . error ( msg , ' The argument must be a number. ' )
return
2003-09-18 00:38:03 +02:00
topics = irc . state . getTopic ( channel ) . split ( self . topicSeparator )
try :
topic = topics . pop ( number )
except IndexError :
irc . error ( msg , ' That \' s not a valid topic number. ' )
return
## debug.printf(topic)
match = self . topicUnformatter . match ( topic )
if match is None :
name = ' '
2003-03-12 07:26:59 +01:00
else :
2003-09-18 00:38:03 +02:00
( topic , name ) = match . groups ( )
try :
username = ircdb . users . getUser ( msg . prefix ) . name
except KeyError :
username = msg . nick
if name and name != username and \
not ircdb . checkCapabilities ( msg . prefix , ( ' op ' , ' admin ' ) ) :
irc . error ( msg , ' You can only remove your own topics. ' )
return
newTopic = self . topicSeparator . join ( topics )
irc . queueMsg ( ircmsgs . topic ( channel , newTopic ) )
2003-10-21 06:03:25 +02:00
remove = privmsgs . checkChannelCapability ( remove , ' topic ' )
2003-03-12 07:26:59 +01:00
2003-10-19 17:48:44 +02:00
Class = Topic
2003-10-18 15:14:57 +02:00
2003-03-24 09:41:19 +01:00
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: