mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-23 19:19:31 +01:00
antispam: allow individual punishments to fail gracefully when not supported
This commit is contained in:
parent
186b73c72d
commit
b120e2d701
@ -14,10 +14,15 @@ EXEMPT_OPTIONS = ['voice', 'halfop', 'op']
|
||||
DEFAULT_EXEMPT_OPTION = 'halfop'
|
||||
def _punish(irc, target, channel, punishment, reason):
|
||||
"""Punishes the target user. This function returns True if the user was successfully punished."""
|
||||
if irc.is_oper(target, allowAuthed=False):
|
||||
if target not in irc.users:
|
||||
log.warning("(%s) antispam: got target %r that isn't a user?", irc.name, target)
|
||||
return False
|
||||
elif irc.is_oper(target, allowAuthed=False):
|
||||
log.debug("(%s) antispam: refusing to punish oper %s/%s", irc.name, target, irc.get_friendly_name(target))
|
||||
return False
|
||||
|
||||
target_nick = irc.get_friendly_name(target)
|
||||
|
||||
exempt_level = irc.get_service_option('antispam', 'exempt_level', DEFAULT_EXEMPT_OPTION).lower()
|
||||
c = irc.channels[channel]
|
||||
|
||||
@ -65,6 +70,7 @@ def _punish(irc, target, channel, punishment, reason):
|
||||
'userdata': userdata, 'parse_as': 'KILL'}])
|
||||
|
||||
kill = False
|
||||
successful_punishments = 0
|
||||
for action in set(punishment.split('+')):
|
||||
if action not in PUNISH_OPTIONS:
|
||||
log.error('(%s) Antispam punishment %r is not a valid setting; '
|
||||
@ -74,20 +80,46 @@ def _punish(irc, target, channel, punishment, reason):
|
||||
return
|
||||
elif action == 'kill':
|
||||
kill = True # Delay kills so that the user data doesn't disappear.
|
||||
# XXX factorize these blocks
|
||||
elif action == 'kick':
|
||||
_kick()
|
||||
try:
|
||||
_kick()
|
||||
except NotImplementedError:
|
||||
log.warning("(%s) antispam: Kicks are not supported on this network, skipping; "
|
||||
"target was %s/%s", irc.name, target_nick, channel)
|
||||
else:
|
||||
successful_punishments += 1
|
||||
elif action == 'ban':
|
||||
_ban()
|
||||
try:
|
||||
_ban()
|
||||
except (ValueError, NotImplementedError):
|
||||
log.warning("(%s) antispam: Bans are not supported on this network, skipping; "
|
||||
"target was %s/%s", irc.name, target_nick, channel)
|
||||
else:
|
||||
successful_punishments += 1
|
||||
elif action == 'quiet':
|
||||
_quiet()
|
||||
try:
|
||||
_quiet()
|
||||
except (ValueError, NotImplementedError):
|
||||
log.warning("(%s) antispam: Quiet is not supported on this network, skipping; "
|
||||
"target was %s/%s", irc.name, target_nick, channel)
|
||||
else:
|
||||
successful_punishments += 1
|
||||
|
||||
if bans: # Set all bans at once to prevent spam
|
||||
irc.mode(my_uid, channel, bans)
|
||||
irc.call_hooks([my_uid, 'ANTISPAM_BAN',
|
||||
{'target': channel, 'modes': bans, 'parse_as': 'MODE'}])
|
||||
if kill:
|
||||
_kill()
|
||||
return True
|
||||
try:
|
||||
_kill()
|
||||
except NotImplementedError:
|
||||
log.warning("(%s) antispam: Kills are not supported on this network, skipping; "
|
||||
"target was %s/%s", irc.name, target_nick, channel)
|
||||
else:
|
||||
successful_punishments += 1
|
||||
|
||||
return bool(successful_punishments)
|
||||
|
||||
MASSHIGHLIGHT_DEFAULTS = {
|
||||
'min_length': 50,
|
||||
|
Loading…
Reference in New Issue
Block a user