[Mod] Allow admins to choose amount of repeats for "deleterepeats" (#2437)

* feat(mod): configurable amount of repeats for "deleterepeats"

resolves #2267

* fix(mod): check user input instead of changing it if it's invalid

* fix(mod): only purge cache when argument is valid

* perf(mod): fetch repeats from config only when guild not in cache
This commit is contained in:
jack1142
2019-04-23 16:01:20 +02:00
committed by Michael H
parent 47723cee33
commit 460b4bb3f2
4 changed files with 90 additions and 25 deletions

View File

@@ -1,4 +1,4 @@
from collections import deque, defaultdict
from collections import defaultdict
from typing import List, Tuple
import discord
@@ -15,14 +15,18 @@ from .settings import ModSettings
_ = T_ = Translator("Mod", __file__)
__version__ = "1.0.0"
@cog_i18n(_)
class Mod(ModSettings, Events, KickBanMixin, MoveToCore, MuteMixin, ModInfo, commands.Cog):
"""Moderation tools."""
default_global_settings = {"version": ""}
default_guild_settings = {
"ban_mention_spam": False,
"delete_repeats": False,
"delete_repeats": -1,
"ignored": False,
"respect_hierarchy": True,
"delete_delay": -1,
@@ -41,21 +45,39 @@ class Mod(ModSettings, Events, KickBanMixin, MoveToCore, MuteMixin, ModInfo, com
self.bot = bot
self.settings = Config.get_conf(self, 4961522000, force_registration=True)
self.settings.register_global(**self.default_global_settings)
self.settings.register_guild(**self.default_guild_settings)
self.settings.register_channel(**self.default_channel_settings)
self.settings.register_member(**self.default_member_settings)
self.settings.register_user(**self.default_user_settings)
self.ban_queue: List[Tuple[int, int]] = []
self.unban_queue: List[Tuple[int, int]] = []
self.cache: dict = defaultdict(lambda: deque(maxlen=3))
self.cache: dict = {}
self.registration_task = self.bot.loop.create_task(self._casetype_registration())
self.tban_expiry_task = self.bot.loop.create_task(self.check_tempban_expirations())
self.last_case: dict = defaultdict(dict)
async def initialize(self):
await self._maybe_update_config()
def __unload(self):
self.registration_task.cancel()
self.tban_expiry_task.cancel()
async def _maybe_update_config(self):
"""Maybe update `delete_delay` value set by Config prior to Mod 1.0.0."""
if await self.settings.version():
return
guild_dict = await self.settings.all_guilds()
for guild_id, info in guild_dict.items():
delete_repeats = info.get("delete_repeats", False)
if delete_repeats:
val = 3
else:
val = -1
await self.settings.guild(discord.Object(id=guild_id)).delete_repeats.set(val)
await self.settings.version.set(__version__)
@staticmethod
async def _casetype_registration():
try: