[Mod] Add two new settings to disable name/nickname tracking (#4799)

* Add default settings for name tracking

* Add configuration command for name tracking

* Check the track names settings before tracking

* *grumble*

* Fix permissions levels

* Update settings.py

* Use clean_prefix in inline, and don't use f-strings in `_()`

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
This commit is contained in:
Flame442 2021-02-16 14:13:37 -05:00 committed by GitHub
parent 62411bc2a5
commit 7b04c04551
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 80 additions and 3 deletions

View File

@ -161,6 +161,9 @@ class Events(MixinMeta):
@commands.Cog.listener() @commands.Cog.listener()
async def on_user_update(self, before: discord.User, after: discord.User): async def on_user_update(self, before: discord.User, after: discord.User):
if before.name != after.name: if before.name != after.name:
track_all_names = await self.config.track_all_names()
if not track_all_names:
return
async with self.config.user(before).past_names() as name_list: async with self.config.user(before).past_names() as name_list:
while None in name_list: # clean out null entries from a bug while None in name_list: # clean out null entries from a bug
name_list.remove(None) name_list.remove(None)
@ -177,6 +180,10 @@ class Events(MixinMeta):
guild = after.guild guild = after.guild
if (not guild) or await self.bot.cog_disabled_in_guild(self, guild): if (not guild) or await self.bot.cog_disabled_in_guild(self, guild):
return return
track_all_names = await self.config.track_all_names()
track_nicknames = await self.config.guild(guild).track_nicknames()
if (not track_all_names) or (not track_nicknames):
return
async with self.config.member(before).past_nicks() as nick_list: async with self.config.member(before).past_nicks() as nick_list:
while None in nick_list: # clean out null entries from a bug while None in nick_list: # clean out null entries from a bug
nick_list.remove(None) nick_list.remove(None)

View File

@ -44,7 +44,10 @@ class Mod(
): ):
"""Moderation tools.""" """Moderation tools."""
default_global_settings = {"version": ""} default_global_settings = {
"version": "",
"track_all_names": True,
}
default_guild_settings = { default_guild_settings = {
"mention_spam": {"ban": None, "kick": None, "warn": None, "strict": False}, "mention_spam": {"ban": None, "kick": None, "warn": None, "strict": False},
@ -57,6 +60,7 @@ class Mod(
"dm_on_kickban": False, "dm_on_kickban": False,
"default_days": 0, "default_days": 0,
"default_tempban_duration": 60 * 60 * 24, "default_tempban_duration": 60 * 60 * 24,
"track_nicknames": True,
} }
default_channel_settings = {"ignored": False} default_channel_settings = {"ignored": False}

View File

@ -18,7 +18,6 @@ class ModSettings(MixinMeta):
""" """
@commands.group() @commands.group()
@commands.guild_only()
@checks.guildowner_or_permissions(administrator=True) @checks.guildowner_or_permissions(administrator=True)
async def modset(self, ctx: commands.Context): async def modset(self, ctx: commands.Context):
"""Manage server administration settings.""" """Manage server administration settings."""
@ -26,8 +25,19 @@ class ModSettings(MixinMeta):
@modset.command(name="showsettings") @modset.command(name="showsettings")
async def modset_showsettings(self, ctx: commands.Context): async def modset_showsettings(self, ctx: commands.Context):
"""Show the current server administration settings.""" """Show the current server administration settings."""
globaldata = await self.config.all()
track_all_names = globaldata["track_all_names"]
msg = ""
msg += _("Track name changes: {yes_or_no}\n").format(
yes_or_no=_("Yes") if track_all_names else _("No")
)
guild = ctx.guild guild = ctx.guild
if not guild:
await ctx.send(box(msg))
return
data = await self.config.guild(guild).all() data = await self.config.guild(guild).all()
track_nicknames = data["track_nicknames"]
delete_repeats = data["delete_repeats"] delete_repeats = data["delete_repeats"]
warn_mention_spam = data["mention_spam"]["warn"] warn_mention_spam = data["mention_spam"]["warn"]
kick_mention_spam = data["mention_spam"]["kick"] kick_mention_spam = data["mention_spam"]["kick"]
@ -39,7 +49,11 @@ class ModSettings(MixinMeta):
dm_on_kickban = data["dm_on_kickban"] dm_on_kickban = data["dm_on_kickban"]
default_days = data["default_days"] default_days = data["default_days"]
default_tempban_duration = data["default_tempban_duration"] default_tempban_duration = data["default_tempban_duration"]
msg = "" if not track_all_names and track_nicknames:
yes_or_no = _("Overridden by another setting")
else:
yes_or_no = _("Yes") if track_nicknames else _("No")
msg += _("Track nickname changes: {yes_or_no}\n").format(yes_or_no=yes_or_no)
msg += _("Delete repeats: {num_repeats}\n").format( msg += _("Delete repeats: {num_repeats}\n").format(
num_repeats=_("after {num} repeats").format(num=delete_repeats) num_repeats=_("after {num} repeats").format(num=delete_repeats)
if delete_repeats != -1 if delete_repeats != -1
@ -401,6 +415,58 @@ class ModSettings(MixinMeta):
) )
) )
@modset.command()
@commands.guild_only()
async def tracknicknames(self, ctx: commands.Context, enabled: bool = None):
"""
Toggle whether nickname changes should be tracked.
This setting will be overridden if trackallnames is disabled.
"""
guild = ctx.guild
if enabled is None:
state = await self.config.guild(guild).track_nicknames()
if state:
msg = _("Nickname changes are currently being tracked.")
else:
msg = _("Nickname changes are not currently being tracked.")
await ctx.send(msg)
return
if enabled:
msg = _("Nickname changes will now be tracked.")
else:
msg = _("Nickname changes will no longer be tracked.")
await self.config.guild(guild).track_nicknames.set(enabled)
await ctx.send(msg)
@modset.command()
@commands.is_owner()
async def trackallnames(self, ctx: commands.Context, enabled: bool = None):
"""
Toggle whether all name changes should be tracked.
Toggling this off also overrides the tracknicknames setting.
"""
if enabled is None:
state = await self.config.track_all_names()
if state:
msg = _("Name changes are currently being tracked.")
else:
msg = _("All name changes are currently not being tracked.")
await ctx.send(msg)
return
if enabled:
msg = _("Name changes will now be tracked.")
else:
msg = _(
"All name changes will no longer be tracked.\n"
"To delete existing name data, use {command}."
).format(command=f"`{ctx.clean_prefix}modset deletenames`")
await self.config.track_all_names.set(enabled)
await ctx.send(msg)
@modset.command() @modset.command()
@commands.max_concurrency(1, commands.BucketType.default) @commands.max_concurrency(1, commands.BucketType.default)
@commands.is_owner() @commands.is_owner()