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-03-12 07:26:59 +01:00
from baseplugin import *
import re
import random
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 ( """
- - - Topic for #sourcereview is Welcome to #sourcereview, home of cool people. (jemfinch) || supybot now has an IMDB module! (jemfinch) || jemfinch, make lasturl show more information about the url in quesiton. (jemfinch) || jemfinch, think about how you're going to have threads notify the main loop that data is ready. (jemfinch)
- - - Topic for #sourcereview set by supybot at Tue Aug 26 15:38:35
< jemfinch > @list Topic
< supybot > jemfinch : addtopic , changetopic , removetopic , shuffletopic , topic
< jemfinch > @shuffletopic
- - - supybot has changed the topic to : supybot now has an IMDB module ! ( jemfinch ) | | jemfinch , make lasturl show more information about the url in quesiton . ( jemfinch ) | | Welcome to #sourcereview, home of cool people. (jemfinch) || jemfinch, think about how you're going to have threads notify the main loop that data is ready. (jemfinch)
< jemfinch > @removetopic 0
- - - supybot has changed the topic to : jemfinch , make lasturl show more information about the url in quesiton . ( jemfinch ) | | Welcome to #sourcereview, home of cool people. (jemfinch) || jemfinch, think about how you're going to have threads notify the main loop that data is ready. (jemfinch)
< jemfinch > @changetopic 0 s / make / MAKE /
- - - supybot has changed the topic to : jemfinch , MAKE lasturl show more information about the url in quesiton . ( jemfinch ) | | Welcome to #sourcereview, home of cool people. (jemfinch) || jemfinch, think about how you're going to have threads notify the main loop that data is ready. (jemfinch)
< jemfinch > @removetopic - 1
- - - supybot has changed the topic to : jemfinch , MAKE lasturl show more information about the url in quesiton . ( jemfinch ) | | Welcome to #sourcereview, home of cool people. (jemfinch)
< jemfinch > @addtopic supybot will make a beta release soon !
- - - supybot has changed the topic to : jemfinch , MAKE lasturl show more information about the url in quesiton . ( jemfinch ) | | Welcome to #sourcereview, home of cool people. (jemfinch) || supybot will make a beta release soon! (jemfinch)
< jemfinch > @topic - 1
< supybot > jemfinch : supybot will make a beta release soon ! ( jemfinch )
""" )
2003-03-12 07:26:59 +01:00
class Topic ( callbacks . Privmsg ) :
topicSeparator = ' || '
topicFormatter = ' %s ( %s ) '
2003-08-29 09:32:14 +02:00
topicUnformatter = re . compile ( ' (.*) \ (( \ S+) \ ) ' )
2003-03-12 07:26:59 +01:00
def addtopic ( self , irc , msg , args ) :
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
channel = privmsgs . getChannel ( msg , args )
2003-03-28 08:38:16 +01:00
capability = ircdb . makeChannelCapability ( channel , ' topic ' )
2003-03-12 07:26:59 +01:00
topic = privmsgs . getArgs ( args )
2003-03-28 08:38:16 +01:00
if ircdb . checkCapability ( msg . prefix , capability ) :
2003-08-11 19:16:03 +02:00
if self . topicSeparator in topic :
2003-03-12 07:26:59 +01:00
s = ' You can \' t have %s in your topic ' % self . topicSeparator
irc . error ( msg , s )
return
currentTopic = irc . state . getTopic ( channel )
2003-04-02 13:08:34 +02:00
try :
2003-09-12 22:06:58 +02:00
name = ircdb . users . getUser ( msg . prefix ) . name
2003-04-02 13:08:34 +02:00
except KeyError :
name = msg . nick
2003-03-12 07:26:59 +01:00
formattedTopic = self . topicFormatter % ( topic , name )
if currentTopic :
newTopic = self . topicSeparator . join ( ( currentTopic ,
formattedTopic ) )
else :
newTopic = formattedTopic
irc . queueMsg ( ircmsgs . topic ( channel , newTopic ) )
else :
2003-03-28 08:38:16 +01:00
irc . error ( msg , conf . replyNoCapability % capability )
2003-03-12 07:26:59 +01:00
def shuffletopic ( self , irc , msg , args ) :
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-03-12 07:26:59 +01:00
channel = privmsgs . getChannel ( msg , args )
2003-03-28 08:38:16 +01:00
capability = ircdb . makeChannelCapability ( channel , ' topic ' )
if ircdb . checkCapability ( msg . prefix , capability ) :
2003-08-29 09:32:14 +02:00
newtopic = irc . state . getTopic ( channel )
2003-08-29 10:16:29 +02:00
while newtopic == irc . state . getTopic ( channel ) :
2003-08-29 09:32:14 +02:00
topics = irc . state . getTopic ( channel ) . split ( self . topicSeparator )
random . shuffle ( topics )
newtopic = self . topicSeparator . join ( topics )
2003-03-12 07:26:59 +01:00
irc . queueMsg ( ircmsgs . topic ( channel , newtopic ) )
else :
2003-03-28 08:38:16 +01:00
irc . error ( msg , conf . replyNoCapability % capability )
2003-03-12 07:26:59 +01:00
2003-04-16 09:11:28 +02:00
def topic ( self , irc , msg , args ) :
""" [<channel>] <number>
Returns topic number < number > from < channel > . < number > is a zero - based
index into the topics . < channel > is only necessary if the message
isn ' t sent in the channel itself.
"""
i = privmsgs . getArgs ( args )
try :
i = int ( i )
except ValueError :
irc . error ( msg , ' The argument must be a valid integer. ' )
return
2003-06-02 07:42:57 +02:00
topics = irc . state . getTopic ( msg . args [ 0 ] ) . split ( self . topicSeparator )
2003-04-16 09:11:28 +02:00
try :
irc . reply ( msg , topics [ i ] )
except IndexError :
irc . error ( msg , ' That \' s not a valid index. ' )
return
2003-08-20 18:26:23 +02:00
2003-03-28 18:30:10 +01:00
def changetopic ( self , irc , msg , args ) :
2003-04-16 09:11:28 +02:00
""" [<channel>] <number> <regexp>
Changes the topic number < number > on < channel > according to the regular
expression < regexp > . < number > is the zero - based index into the topics ;
< 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.
"""
2003-03-28 18:30:10 +01:00
channel = privmsgs . getChannel ( msg , args )
2003-04-16 09:11:28 +02:00
( number , regexp ) = privmsgs . getArgs ( args , needed = 2 )
2003-03-28 18:30:10 +01:00
try :
number = int ( number )
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-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-03-28 18:30:10 +01:00
topics . insert ( number , newTopic )
newTopic = self . topicSeparator . join ( topics )
irc . queueMsg ( ircmsgs . topic ( channel , newTopic ) )
2003-08-20 18:26:23 +02:00
2003-03-12 07:26:59 +01:00
def removetopic ( self , irc , msg , args ) :
2003-09-06 07:25:42 +02:00
""" [<channel>] <number>
Removes topic < number > from the topic for < channel > Topics are
numbered starting from 0 ; you can also use negative indexes to refer
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
channel = privmsgs . getChannel ( msg , args )
2003-03-28 08:38:16 +01:00
capability = ircdb . makeChannelCapability ( channel , ' topic ' )
2003-03-12 07:26:59 +01:00
try :
number = int ( privmsgs . getArgs ( args ) )
except ValueError :
irc . error ( msg , ' The argument must be a number. ' )
return
2003-03-28 08:38:16 +01:00
if ircdb . checkCapability ( msg . prefix , capability ) :
2003-03-12 07:26:59 +01:00
topics = irc . state . getTopic ( channel ) . split ( self . topicSeparator )
2003-09-06 07:25:42 +02:00
try :
topic = topics . pop ( number )
except IndexError :
irc . error ( msg , ' That \' s not a valid topic number. ' )
return
2003-08-12 20:45:23 +02:00
## debug.printf(topic)
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-02 13:08:34 +02:00
try :
2003-09-12 22:06:58 +02:00
username = ircdb . users . getUser ( msg . prefix ) . name
2003-04-02 13:08:34 +02:00
except KeyError :
username = msg . nick
2003-09-06 07:25:42 +02:00
if name and name != username and \
2003-03-12 07:26:59 +01:00
not ircdb . checkCapabilities ( msg . prefix , ( ' op ' , ' admin ' ) ) :
2003-04-17 12:07:06 +02:00
irc . error ( msg , ' You can only remove your own topics. ' )
2003-03-12 07:26:59 +01:00
return
newTopic = self . topicSeparator . join ( topics )
irc . queueMsg ( ircmsgs . topic ( channel , newTopic ) )
else :
2003-03-28 08:38:16 +01:00
irc . error ( msg , conf . replyNoCapability % capability )
2003-03-12 07:26:59 +01:00
Class = Topic
2003-03-24 09:41:19 +01:00
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: