Fixed handling of channel capabilities

This commit is contained in:
Jeremy Fincher 2003-04-02 11:08:34 +00:00
parent 2b2f9356e0
commit c49bd6f88f
3 changed files with 53 additions and 40 deletions

View File

@ -64,7 +64,10 @@ class Topic(callbacks.Privmsg):
irc.error(msg, s)
return
currentTopic = irc.state.getTopic(channel)
try:
name = ircdb.users.getUserName(msg.prefix)
except KeyError:
name = msg.nick
formattedTopic = self.topicFormatter % (topic, name)
if currentTopic:
newTopic = self.topicSeparator.join((currentTopic,
@ -126,7 +129,11 @@ class Topic(callbacks.Privmsg):
topic = topics.pop(number)
debug.printf(topic)
(topic, name) = self.topicUnformatter.match(topic).groups()
if name != ircdb.users.getUserName(msg.prefix) and \
try:
username = ircdb.users.getUserName(msg.prefix)
except KeyError:
username = msg.nick
if name != username and \
not ircdb.checkCapabilities(msg.prefix, ('op', 'admin')):
irc.error('You can only remove your own topics.')
return

View File

@ -301,44 +301,36 @@ class ChannelCommands(callbacks.Privmsg):
capability = ircdb.makeChannelCapability(channel, 'op')
if ircdb.checkCapability(msg.prefix, capability):
c = ircdb.channels.getChannel(channel)
if v == 'True' or v == 'False':
v = v.capitalize()
if v == 'True':
c.setDefaultCapability(True)
elif v == 'False':
c.setDefaultCapability(False)
ircdb.channels.setChannel(channel, c)
irc.reply(msg, conf.replySuccess)
else:
s = 'The default value must be either True or False.'
irc.error(msg, s)
return
ircdb.channels.setChannel(channel, c)
irc.reply(msg, conf.replySuccess)
else:
irc.error(msg, conf.replyNoCapability % capability)
def setchancapability(self, irc, msg, args):
"""[<channel>] <capability> <True|False>
"""[<channel>] <capability>
The <channel> argument is only necessary if the message isn't being
sent in the channel itself. If you have the #channel.op capability,
this will set the channel capability <capability> for all users in the
this will add the channel capability <capability> for all users in the
channel.
"""
channel = privmsgs.getChannel(msg, args)
neededcapability = ircdb.makeChannelCapability(channel, 'op')
if ircdb.checkCapability(msg.prefix, neededcapability):
(capability, value) = privmsgs.getArgs(args, 2)
value = value.capitalize()
if value == 'True' or value == 'False':
if value == 'True':
value = True
elif value == 'False':
value = False
capability = privmsgs.getArgs(args)
c = ircdb.channels.getChannel(channel)
c.addCapability(capability, value)
c.addCapability(capability)
ircdb.channels.setChannel(channel, c)
irc.reply(msg, conf.replySuccess)
else:
s = 'Value of the capability must be True or False'
irc.error(msg, s)
else:
irc.error(msg, conf.replyNoCapability % neededcapability)
@ -362,6 +354,17 @@ class ChannelCommands(callbacks.Privmsg):
else:
irc.error(msg, conf.replyNoCapability % neededcapability)
def chancapabilities(self, irc, msg, args):
"""[<channel>]
The <channel> argument is only necessary if the message isn't being
sent in the channel itself. Returns the capabilities present on the
<channel>.
"""
channel = privmsgs.getChannel(msg, args)
c = ircdb.channels.getChannel(channel)
irc.reply(msg, ', '.join(c.capabilities))
Class = ChannelCommands

View File

@ -158,7 +158,7 @@ class IrcUser(object):
class IrcChannel(object):
"""This class holds the capabilities, bans, and ignores of a channel.
"""
defaultOff = ['op', 'halfop', 'voice', 'protected']
defaultOff = ('op', 'halfop', 'voice', 'protected')
def __init__(self, bans=None, ignores=None, capabilities=None,
lobotomized=False, defaultAllow=True):
self.defaultAllow = defaultAllow
@ -171,13 +171,13 @@ class IrcChannel(object):
else:
self.ignores = ignores
if capabilities is None:
self.capabilities = {}
self.capabilities = set()
else:
self.capabilities = capabilities
for capability in self.defaultOff:
if capability not in self.capabilities:
self.capabilities[capability] = False
self.capabilities.add(makeAntiCapability(capability))
self.lobotomized = lobotomized
def __repr__(self):
@ -205,19 +205,20 @@ class IrcChannel(object):
def removeIgnore(self, hostmask):
self.ignores = [s for s in self.ignores if s != hostmask]
def addCapability(self, capability, value):
self.capabilities[capability] = value
def addCapability(self, capability):
self.capabilities.add(capability)
def removeCapability(self, capability):
del self.capabilities[capability]
self.capabilities.remove(capability)
def setDefaultCapability(self, v):
self.defaultAllow = v
def setDefaultCapability(self, b):
self.defaultAllow = b
def checkCapability(self, capability):
if capability in self.capabilities:
return self.capabilities[capability]
elif isAntiCapability(capability):
return True
else:
if isAntiCapability(capability):
return not self.defaultAllow
else:
return self.defaultAllow
@ -424,6 +425,7 @@ def checkCapability(hostmask, capability, users=users, channels=channels):
try:
(channel, capability) = fromChannelCapability(capability)
except ValueError: # unpack list of wrong size
debug.printf('Invalid channel capability in checkCapability')
return False # stupid, invalid capability.
# Now, go fetch the channel and check to see what it thinks about
# said capability.
@ -447,13 +449,14 @@ def checkCapability(hostmask, capability, users=users, channels=channels):
if isChannelCapability(capability):
# First check to see if the user has the capability already; if so,
# it can be returned without checking the channel.
try:
return u.checkCapability(capability)
except KeyError:
if u.checkCapability(capability):
return True
else:
# User doesn't have the capability. Check the channel.
try:
(channel, capability) = fromChannelCapability(capability)
except ValueError:
debug.printf('Invalid channel capability in checkCapability')
return False # stupid, invalid capability.
c = channels.getChannel(channel)
# And return the channel's opinion.