Factoids: Add supybot.plugins.Factoids.requireVoice. Closes GH-378.

This commit is contained in:
Valentin Lorentz 2013-05-17 17:47:43 +02:00
parent ed62c9efb1
commit 1090c4623f
5 changed files with 22 additions and 5 deletions

View File

@ -54,6 +54,10 @@ conf.registerGlobalValue(Factoids.web, 'enable',
conf.registerChannelValue(Factoids.web, 'channel',
registry.Boolean(False, _("""Determines whether factoids can be displayed
via the web server.""")))
conf.registerChannelValue(Factoids, 'requireVoice',
registry.Boolean(False, _("""Only allows a user with voice or above on a
channel to use the command.""")))
conf.registerChannelValue(Factoids, 'learnSeparator',
registry.String('as', _("""Determines what separator must be used in the
learn command. Defaults to 'as' -- learn <key> as <value>. Users might

View File

@ -270,6 +270,9 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
return (keyresults, factresults,)
def learn(self, irc, msg, args, channel, key, factoid):
if self.registryValue('requireVoice', channel) and \
not irc.state.channels[channel].isVoicePlus(msg.nick):
irc.error(_('You have to be at least voiced to teach factoids.'))
# if neither key nor factoid exist, add them.
# if key exists but factoid doesn't, add factoid, link it to existing key

View File

@ -29,6 +29,7 @@
###
from supybot.test import *
import supybot.conf as conf
try:
import sqlite3
@ -76,6 +77,12 @@ class FactoidsTestCase(ChannelPluginTestCase):
self.assertError('learn foo bar baz') # No 'as'
self.assertError('learn foo bar') # No 'as'
with conf.supybot.plugins.Factoids.requireVoice.context(True):
self.assertError('learn jemfinch as my primary author')
self.irc.feedMsg(ircmsgs.mode(self.channel,
args=('+h', self.nick)))
self.assertNotError('learn jemfinch as my primary author')
def testChangeFactoid(self):
self.assertNotError('learn foo as bar')
self.assertNotError('change foo 1 s/bar/baz/')

View File

@ -330,9 +330,7 @@ def getHaveVoicePlus(irc, msg, args, state, action=_('do that')):
getChannel(irc, msg, args, state)
if state.channel not in irc.state.channels:
state.error(_('I\'m not even in %s.') % state.channel, Raise=True)
if not irc.state.channels[state.channel].isOp(irc.nick) and \
not irc.state.channels[state.channel].isHalfop(irc.nick) and \
not irc.state.channels[state.channel].isVoice(irc.nick):
if not irc.state.channels[state.channel].isVoicePlus(irc.nick):
# isOp includes owners and protected users
state.error(_('I need to be at least voiced to %s.') % action,
Raise=True)
@ -350,8 +348,7 @@ def getHaveHalfopPlus(irc, msg, args, state, action=_('do that')):
getChannel(irc, msg, args, state)
if state.channel not in irc.state.channels:
state.error(_('I\'m not even in %s.') % state.channel, Raise=True)
if not irc.state.channels[state.channel].isOp(irc.nick) and \
not irc.state.channels[state.channel].isHalfop(irc.nick):
if not irc.state.channels[state.channel].isHalfopPlus(irc.nick):
# isOp includes owners and protected users
state.error(_('I need to be at least halfopped to %s.') % action,
Raise=True)

View File

@ -245,10 +245,16 @@ class ChannelState(utils.python.Object):
def isOp(self, nick):
return nick in self.ops
def isOpPlus(self, nick):
return nick in self.ops
def isVoice(self, nick):
return nick in self.voices
def isVoicePlus(self, nick):
return nick in self.voices or nick in self.halfops or nick in self.ops
def isHalfop(self, nick):
return nick in self.halfops
def isHalfopPlus(self, nick):
return nick in self.halfops or nick in self.ops
def addUser(self, user):
"Adds a given user to the ChannelState. Power prefixes are handled."