Compare commits

...

74 commits

Author SHA1 Message Date
860eccb52a
Merge pull request 'Aurora Configuration Rewrite' () from aurora-config-rewrite into main
Reviewed-on: https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs/pulls/15
2024-01-16 17:19:07 +00:00
5da523d0c4 Merge branch 'main' into aurora-config-rewrite 2024-01-16 15:51:47 +00:00
b9ca8d32d3
fix(docs): removed some inline html 2024-01-16 15:24:24 +00:00
eb79025d2a
feat(docs): updated configuration docs with all of the new text commands 2024-01-16 15:23:55 +00:00
a7d8a20c57
fix(aurora): fixed incorrect example usage for [p]aurora timedelta 2024-01-16 14:29:57 +00:00
950d4abf6a
fix(aurora): pylint fixes 2024-01-16 14:26:54 +00:00
46a290aad3
feat(aurora): merged all of the changes made in the configuration rewrite into the codebase of the cog itself 2024-01-16 14:23:45 +00:00
3b8506cba8
fix(aurora): pylint fixes 2024-01-16 14:08:57 +00:00
fc86db94da
misc(aurora): moved log_channel to the bottom of the guild view 2024-01-16 14:06:50 +00:00
78a5103b1f
fix(aurora): changed up the guild embed a bit 2024-01-16 14:03:58 +00:00
3d4b6800a5
feat(aurora): added configuration menu for guild 2024-01-16 14:02:10 +00:00
4db7c912cb
misc(aurora): changed some strings in the overrides embed 2024-01-16 13:54:48 +00:00
4d8aa465b1
fix(aurora): changed color of close buttons to gray instead of red 2024-01-16 13:44:19 +00:00
fecde10b1c
feat(aurora): added previous commit's functionality to addrole and fixed some bugs 2024-01-16 13:43:22 +00:00
2037f385d1
feat(aurora): allow setting multiple immune roles at once 2024-01-16 13:39:12 +00:00
a4a0ec924a
fix(aurora): fixed another error in the immune embed generator 2024-01-16 13:13:48 +00:00
630381328b
fix(aurora): fixed an error in the immune embed generator 2024-01-16 13:11:25 +00:00
7476fcaa8d
misc(aurora): changed some strings in the addrole and immunity embeds 2024-01-16 13:10:16 +00:00
464fa9f97a
fix(aurora): fixed some errors 2024-01-16 13:06:50 +00:00
4788f3189c
fix(aurora): fixed the addrole embed generator having an outdated config variable name 2024-01-16 13:04:44 +00:00
d8def3cfc8
fix(aurora): fixed a few errors in addrole/immune 2024-01-16 13:03:51 +00:00
89a3e958b2
fix(aurora): rename configuration value 2024-01-16 13:00:00 +00:00
4226f1a14c
fix(aurora): use views for views instead of embeds 2024-01-16 12:59:15 +00:00
4a262dc6a1
fix(aurora): awaited two coroutines 2024-01-16 12:58:18 +00:00
13e82f8768
feat(aurora): added views for addrole and immunity 2024-01-16 12:57:42 +00:00
a88a3dbf65
fix(aurora): fix embed formatting for addrole/immunity 2024-01-16 11:56:04 +00:00
3cbc8a744c
fix(aurora): fixed guild command 2024-01-16 11:53:22 +00:00
45286ded55
feat(aurora): added aurora settings guild command 2024-01-16 11:50:09 +00:00
f97f010dec
fix(aurora): fixed list formatting for real this time 2024-01-16 11:31:16 +00:00
d83e1bf731
fix(aurora): fixed list formatting in overrides embed 2024-01-16 11:30:51 +00:00
aaf6fcaa37
fix(aurora): fixed formatting in overrides embed 2024-01-16 11:29:58 +00:00
7c6322041d
fix(aurora): fixed overrides embed 2024-01-16 11:28:51 +00:00
0bf6143bf3
fix(aurora): fixing some stuff relating to embed generation 2024-01-16 11:24:39 +00:00
4795fac5ac
fix(aurora): use elif instead of if 2024-01-16 11:20:21 +00:00
d20cb4c3bc
fix(aurora): fixed resetting pagesize 2024-01-16 11:18:05 +00:00
56857554e9
fix(aurora): changed a whole bunch of stuff in the user override config menu 2024-01-16 11:11:38 +00:00
045af7788b
fix(aurora): fixed width error 2024-01-16 11:04:28 +00:00
6d7b551f25
fix(aurora): fixed width error 2024-01-16 11:00:46 +00:00
b53ca9cac4
fix(aurora): fixed incorrect decorator (again) 2024-01-16 10:59:02 +00:00
fe50eddc25
fix(aurora): fixed incorrect decorator 2024-01-16 10:58:33 +00:00
c55cb53a41
feat(aurora): added configuration options for all of the user overrides 2024-01-16 10:57:21 +00:00
c0ab9e89f3
fix(aurora): fix boolean conversion in override menu 2024-01-16 10:42:12 +00:00
219b18e34b
fix(aurora): fixed setting overrides not working 2024-01-16 10:39:00 +00:00
a43f3de8bc
fix(aurora): fixed bad request 2024-01-16 10:36:02 +00:00
98a2c463b9
fix(aurora): fixed override embed erroring 2024-01-16 10:33:25 +00:00
7ae16ea258
feat(aurora): moving to select menus for user overrides 2024-01-16 10:31:11 +00:00
ffcaeec653
fix(aurora): applied previous commit's fix to the other buttons 2024-01-15 15:25:09 +00:00
acf2484cbb
fix(aurora): followup.send instead of response.send_message 2024-01-15 15:24:18 +00:00
1e9a6abe74
fix(aurora): you can no longer change other people's overrides 2024-01-15 15:22:36 +00:00
a7f6cff625
fix(aurora): possibly fixed editing the config menu on settings change 2024-01-15 15:20:47 +00:00
a5b0055256
fix(aurora): hopefully fixed erroring views 2024-01-15 15:09:01 +00:00
900eb16aa9
fix(aurora): fixed circular import 2024-01-15 15:01:20 +00:00
14705efddd
feat(aurora): adding the first parts of menu configs 2024-01-15 14:58:53 +00:00
ebccec54bf
fix(docs): warn --> warning 2024-01-15 14:39:20 +00:00
74a857ca30
feat(docs): updated configuration page 2024-01-15 14:38:38 +00:00
b86a91882f
misc(aurora): added docstrings/modified docstrings for some of the config commands 2024-01-15 14:29:13 +00:00
a7dc1400c4
fix(aurora): fixed UnboundLocalError in configuration.embed._addrole 2024-01-15 14:13:33 +00:00
656823611c
fix(aurora): updated config to have addrole_roles instead of blacklist_roles 2024-01-15 14:13:15 +00:00
fb9ee7381d
fix(aurora): fixed absent abstractmethods in mixin class 2024-01-15 14:11:08 +00:00
e27349a2ab
fix(aurora): fixed incorrect import name 2024-01-15 14:08:29 +00:00
de5f21eb20
Revert "fix(aurora): fixed typeerror"
This reverts commit 8fe8800853.
2024-01-15 14:06:58 +00:00
8fe8800853
fix(aurora): fixed typeerror 2024-01-15 14:06:02 +00:00
a475a51910
fix(aurora): fixed command decorator 2024-01-15 14:04:51 +00:00
e28e32d0c0
feat(aurora): splitting out the role configuration into different commands 2024-01-15 14:03:02 +00:00
606cd76ec4
fix(aurora): pylint fix 2024-01-15 11:51:54 +00:00
166f5bc1ea
fix(aurora): pylint fixes 2024-01-15 11:49:20 +00:00
bb3da8d03b
fix(aurora): fixed embed fields being inline 2024-01-15 07:09:44 +00:00
e394518aad
fix(aurora): aurora settings should not be guild only 2024-01-15 07:08:24 +00:00
a373f63756
fix(aurora): fixed TypeError in embed _overrides function 2024-01-15 07:07:06 +00:00
d99df7f898
fix(aurora): fixed _core function using avatar_url instead of display_avatar.url 2024-01-15 07:00:53 +00:00
ad9675e60e
misc(aurora): renamed configuration commands 2024-01-15 06:46:12 +00:00
e73616774a
fix(aurora): fixed missing return 2024-01-14 06:41:11 +00:00
1a46ca33b0
fix(docs): mark old configuration page as outdated 2024-01-13 15:47:26 +00:00
c42b4eca2d
feat(aurora): starting work on the config rewrite 2024-01-13 15:44:08 +00:00
10 changed files with 622 additions and 496 deletions

View file

@ -1,204 +1,88 @@
# Configuration # Configuration
## auroraset /// admonition | Work in progress
- Usage: `[p]auroraset` type: warning
- Aliases: `moderationset, modset, moderationsettings, aurorasettings, and auroraconfig` This page is still a work in progress.
///
Manage moderation commands. ## aurora
### auroraset ignorebots - Usage: `[p]aurora`
- Usage: `[p]auroraset ignorebots` - Aliases: `moderation and mod`
- Restricted to: `ADMIN`
Toggle if the cog should ignore other bots' moderations. Settings and miscellaneous commands for Aurora.
### auroraset user ### aurora import
- Usage: `[p]auroraset user`
Manage configurations for user configuration options. - Usage: `[p]aurora import`
- Restricted to: `ADMIN`
- Checks: `server_only`
#### auroraset user history Import moderation history from other bots.
- Usage: `[p]auroraset user history`
Manage configuration for the /history command. #### aurora import aurora
##### auroraset user history inline - Usage: `[p]aurora import aurora`
- Usage: `[p]auroraset user history inline` - Restricted to: `ADMIN`
Manage configuration for the /history command's inline argument. Import moderation history from another bot using Aurora.
###### auroraset user history inline toggle #### aurora import galacticbot
- Usage: `[p]auroraset user history inline toggle <enabled>`
Enable the /history command's inline argument by default. - Usage: `[p]aurora import galacticbot`
- Restricted to: `ADMIN`
##### auroraset user history inline pagesize Import moderation history from GalacticBot.
- Usage: `[p]auroraset user history inline pagesize <pagesize>`
Set the amount of cases to display per page. ### aurora settings
#### auroraset user history pagesize - Usage: `[p]aurora settings`
- Usage: `[p]auroraset user history pagesize <pagesize>` - Aliases: `config, options, and set`
Set the amount of cases to display per page. Configure Aurora's settings.
#### auroraset user history ephemeral #### aurora settings server
- Usage: `[p]auroraset user history ephemeral <enabled>`
- Aliases: `hidden and hide`
Toggle if the /history command should be ephemeral. - Usage: `[p]aurora settings server`
- Restricted to: `ADMIN`
- Aliases: `server`
- Checks: `server_only`
### auroraset user autoevidence Manage Aurora's server settings.
- Usage: `[p]auroraset user autoevidence <enabled>`
Toggle if the evidenceformat codeblock should be sent automatically. #### aurora settings overrides
## auroraset server - Usage: `[p]aurora settings overrides`
- Usage: `[p]auroraset server` - Aliases: `override and user`
- Restricted to: `ADMIN`
Manage default configurations for user configuration options, per server. Manage Aurora's user overriddable settings.
### auroraset server history #### aurora settings addrole
- Usage: `[p]auroraset server history`
- Restricted to: `ADMIN`
Manage configuration for the /history command. - Usage: `[p]aurora settings addrole`
- Restricted to: `ADMIN`
- Aliases: `removerole`
- Checks: `server_only`
#### auroraset server history inline Manage the addrole whitelist.
- Usage: `[p]auroraset server history inline` Roles added to this list are also applied to `/removerole`.
- Restricted to: `ADMIN`
Manage configuration for the /history command's inline argument. #### aurora settings immunity
##### auroraset server history inline pagesize - Usage: `[p]aurora settings immunity`
- Usage: `[p]auroraset server history inline pagesize <pagesize>` - Restricted to: `ADMIN`
- Restricted to: `ADMIN` - Checks: `server_only`
Set the amount of cases to display per page. Manage the immunity whitelist.
##### auroraset server history inline toggle ### aurora timedelta
- Usage: `[p]auroraset server history inline toggle <enabled>`
- Restricted to: `ADMIN`
Enable the /history command's inline argument by default. - Usage: `[p]aurora timedelta <duration>`
- Aliases: `tdc, td, and timedeltaconvert`
#### auroraset server history ephemeral This command converts a duration to a [`timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta) Python object.
- Usage: `[p]auroraset server history ephemeral <enabled>`
- Restricted to: `ADMIN`
- Aliases: `hidden and hide`
Toggle if the /history command should be ephemeral. **Example usage**
`[p]timedelta 1 day 15hr 82 minutes 52s`
#### auroraset server history pagesize **Output**
- Usage: `[p]auroraset server history pagesize <pagesize>` `1 day, 16:22:52`
- Restricted to: `ADMIN`
Set the amount of cases to display per page.
### auroraset server autoevidence
- Usage: `[p]auroraset server autoevidence <enabled>`
Toggle if the evidenceformat codeblock should be sent automatically.
## auroraset showmoderator
- Usage: `[p]auroraset showmoderator`
- Restricted to: `ADMIN`
Toggle if the cog should show the moderator in the case embed when dming a user.
## auroraset immunity
- Usage: `[p]auroraset immunity`
- Restricted to: `ADMIN`
Manage configuration for immune roles.
### auroraset immunity add
- Usage: `[p]auroraset immunity add <role>`
- Restricted to: `ADMIN`
Add a role to the immune roles list.
### auroraset immunity remove
- Usage: `[p]auroraset immunity remove <role>`
- Restricted to: `ADMIN`
Remove a role from the immune roles list.
### auroraset immunity list
- Usage: `[p]auroraset immunity list`
- Restricted to: `ADMIN`
List all immune roles.
## auroraset permissions
- Usage: `[p]auroraset permissions`
- Restricted to: `ADMIN`
Toggle whether the bot will check for discord permissions.
## auroraset logchannel
- Usage: `[p]auroraset logchannel [channel=None]`
- Restricted to: `ADMIN`
Set a channel to log infractions to.
## auroraset import
- Usage: `[p]auroraset import`
- Restricted to: `ADMIN`
Import moderations from other bots.
### auroraset import galacticbot
- Usage: `[p]auroraset import galacticbot`
- Restricted to: `ADMIN`
Import moderations from GalacticBot.
### auroraset import aurora
- Usage: `[p]auroraset import aurora`
- Restricted to: `ADMIN`
Import moderations from another bot using Aurora.
## auroraset dm
- Usage: `[p]auroraset dm`
- Restricted to: `ADMIN`
Toggle automatically messaging moderated users.<br/><br/>This option can be overridden by specifying the `silent` argument in any moderation command.
## auroraset list
- Usage: `[p]auroraset list`
- Aliases: `view and show`
List all moderation settings.
## auroraset blacklist
- Usage: `[p]auroraset blacklist`
- Restricted to: `ADMIN`
Manage configuration for the /blacklist command.
### auroraset blacklist list
- Usage: `[p]auroraset blacklist list`
- Restricted to: `ADMIN`
List all blacklist types.
### auroraset blacklist remove
- Usage: `[p]auroraset blacklist remove <role>`
- Restricted to: `ADMIN`
Remove a role's blacklist type.
### auroraset blacklist add
- Usage: `[p]auroraset blacklist add <role> <duration>`
- Restricted to: `ADMIN`
Add a role to the blacklist.
# timedeltaconvert
- Usage: `[p]timedeltaconvert <duration>`
- Aliases: `tdc`
This command converts a duration to a [`timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta) Python object.<br/><br/>**Example usage**<br/>`[p]timedeltaconvert 1 day 15hr 82 minutes 52s`<br/>**Output**<br/>`1 day, 16:22:52`

View file

@ -16,17 +16,22 @@ import discord
import humanize import humanize
from discord.ext import tasks from discord.ext import tasks
from pytimeparse2 import disable_dateutil, parse from pytimeparse2 import disable_dateutil, parse
from redbot.core import app_commands, checks, commands, data_manager from redbot.core import app_commands, commands, data_manager
from redbot.core.app_commands import Choice from redbot.core.app_commands import Choice
from redbot.core.bot import Red
from redbot.core.utils.chat_formatting import box, error, warning from redbot.core.utils.chat_formatting import box, error, warning
from .importers.galacticbot import ImportGalacticBotView from aurora.importers.aurora import ImportAuroraView
from .importers.aurora import ImportAuroraView from aurora.importers.galacticbot import ImportGalacticBotView
from .utilities.config import config, register_config from aurora.menus.addrole import Addrole
from .utilities.database import connect, create_guild_table, fetch_case, mysql_log from aurora.menus.guild import Guild
from .utilities.factory import case_factory, changes_factory, evidenceformat_factory, message_factory from aurora.menus.immune import Immune
from .utilities.logger import logger from aurora.menus.overrides import Overrides
from .utilities.utils import convert_timedelta_to_str, check_moddable, check_permissions, fetch_channel_dict, fetch_user_dict, generate_dict, log, send_evidenceformat from aurora.utilities.config import config, register_config
from aurora.utilities.database import connect, create_guild_table, fetch_case, mysql_log
from aurora.utilities.factory import case_factory, changes_factory, evidenceformat_factory, message_factory, overrides_embed, immune_embed, guild_embed, addrole_embed
from aurora.utilities.logger import logger
from aurora.utilities.utils import convert_timedelta_to_str, check_moddable, check_permissions, fetch_channel_dict, fetch_user_dict, generate_dict, log, send_evidenceformat
class Aurora(commands.Cog): class Aurora(commands.Cog):
@ -65,7 +70,8 @@ class Aurora(commands.Cog):
else: else:
logger.warning("Invalid requester passed to red_delete_data_for_user: %s", requester) logger.warning("Invalid requester passed to red_delete_data_for_user: %s", requester)
def __init__(self, bot): def __init__(self, bot: Red):
super().__init__()
self.bot = bot self.bot = bot
register_config(config) register_config(config)
disable_dateutil() disable_dateutil()
@ -745,6 +751,7 @@ class Aurora(commands.Cog):
if case_dict['moderation_type'] in ['UNMUTE', 'UNBAN']: if case_dict['moderation_type'] in ['UNMUTE', 'UNBAN']:
await interaction.response.send_message(content=error("You cannot resolve this type of moderation!"), ephemeral=True) await interaction.response.send_message(content=error("You cannot resolve this type of moderation!"), ephemeral=True)
return
if case_dict['moderation_type'] in ['MUTE', 'TEMPBAN', 'BAN']: if case_dict['moderation_type'] in ['MUTE', 'TEMPBAN', 'BAN']:
if case_dict['moderation_type'] == 'MUTE': if case_dict['moderation_type'] == 'MUTE':
@ -1016,336 +1023,96 @@ class Aurora(commands.Cog):
completion_time = (time.time() - current_time) * 1000 completion_time = (time.time() - current_time) * 1000
logger.debug("Completed expiry loop in %sms with %s users unbanned", f"{completion_time:.6f}", global_num) logger.debug("Completed expiry loop in %sms with %s users unbanned", f"{completion_time:.6f}", global_num)
####################################################################################################################### ########################################################################################################################
### CONFIGURATION COMMANDS ### Configuration Commands #
####################################################################################################################### ########################################################################################################################
@commands.group(autohelp=True, aliases=['moderationset', 'modset', 'moderationsettings', 'aurorasettings', 'auroraconfig']) @commands.group(autohelp=True, aliases=["moderation", "mod"])
async def auroraset(self, ctx: commands.Context): async def aurora(self, ctx: commands.Context):
"""Manage moderation commands.""" """Settings and miscellaneous commands for Aurora."""
@auroraset.command(name='list', aliases=['view', 'show']) @aurora.group(autohelp=True, name="settings", aliases=["config", "options", "set"])
async def auroraset_list(self, ctx: commands.Context): async def aurora_settings(self, ctx: commands.Context):
"""List all moderation settings.""" """Configure Aurora's settings."""
if ctx.guild:
guild_settings = await config.guild(ctx.guild).all()
guild_settings_string = "" @aurora_settings.command(name="overrides", aliases=["override", "user"])
for setting in guild_settings: async def aurora_settings_overrides(self, ctx: commands.Context):
if 'roles' in setting: """Manage Aurora's user overriddable settings."""
continue await ctx.send(embed=await overrides_embed(ctx), view=Overrides(ctx))
if setting == 'log_channel':
channel = ctx.guild.get_channel(guild_settings[setting])
guild_settings_string += f"**{setting}**: {channel.mention}\n" if channel else f"**{setting}**: {guild_settings[setting]}\n"
else:
guild_settings_string += f"**{setting}**: {guild_settings[setting]}\n"
user_settings = await config.user(ctx.author).all() @aurora_settings.command(name="guild", aliases=["server"])
user_settings_string = "" @commands.admin_or_permissions(manage_guild=True)
for setting in user_settings: @commands.guild_only()
user_settings_string += f"**{setting}**: {user_settings[setting]}\n" async def aurora_settings_guild(self, ctx: commands.Context):
"""Manage Aurora's guild settings."""
await ctx.send(embed=await guild_embed(ctx), view=Guild(ctx))
embed = discord.Embed(color=await self.bot.get_embed_color(ctx.channel)) @aurora_settings.command(name="addrole", aliases=["removerole"])
embed.set_author(icon_url=ctx.guild.icon.url, name=f"{ctx.guild.name} Moderation Settings") @commands.admin_or_permissions(manage_guild=True)
if ctx.guild: @commands.guild_only()
embed.add_field(name="Guild Settings", value=guild_settings_string) async def aurora_settings_addrole(self, ctx: commands.Context):
embed.add_field(name="User Settings", value=user_settings_string) """Manage the addrole whitelist.
await ctx.send(embed=embed) Roles added to this list are also applied to `/removerole`."""
await ctx.send(embed=await addrole_embed(ctx), view=Addrole(ctx))
@auroraset.group(autohelp=True, name='user') @aurora_settings.command(name="immunity")
async def auroraset_user(self, ctx: commands.Context): @commands.admin_or_permissions(manage_guild=True)
"""Manage configurations for user configuration options.""" @commands.guild_only()
async def aurora_settings_immunity(self, ctx: commands.Context):
"""Manage the immunity whitelist."""
await ctx.send(embed=await immune_embed(ctx), view=Immune(ctx))
@auroraset_user.command(name='autoevidence') @aurora.group(autohelp=True, name="import")
async def auroraset_user_autoevidence(self, ctx: commands.Context, enabled: bool): @commands.admin()
"""Toggle if the evidenceformat codeblock should be sent automatically.""" @commands.guild_only()
await config.user(ctx.author).auto_evidenceformat.set(enabled) async def aurora_import(self, ctx: commands.Context):
await ctx.send(f"Auto evidenceformat setting set to {enabled}") """Import moderation history from other bots."""
@auroraset_user.group(autohelp=True, name='history') @aurora_import.command(name="aurora")
async def auroraset_user_history(self, ctx: commands.Context): @commands.admin()
"""Manage configuration for the /history command.""" async def aurora_import_aurora(self, ctx: commands.Context):
"""Import moderation history from another bot using Aurora."""
@auroraset_user_history.command(name='ephemeral', aliases=['hidden', 'hide']) if (
async def auroraset_user_history_ephemeral(self, ctx: commands.Context, enabled: bool): ctx.message.attachments
"""Toggle if the /history command should be ephemeral.""" and ctx.message.attachments[0].content_type
await config.user(ctx.author).history_ephemeral.set(enabled) == "application/json; charset=utf-8"
await ctx.send(f"Ephemeral setting set to {enabled}") ):
message = await ctx.send(
@auroraset_user_history.command(name='pagesize') warning(
async def auroraset_user_history_pagesize(self, ctx: commands.Context, pagesize: int): "Are you sure you want to import moderations from another bot?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*"
"""Set the amount of cases to display per page.""" )
if pagesize > 20:
await ctx.send("Pagesize cannot be greater than 20!")
return
if pagesize < 1:
await ctx.send("Pagesize cannot be less than 1!")
return
await config.user(ctx.author).history_pagesize.set(pagesize)
await ctx.send(f"Pagesize set to {await config.user(ctx.author).history_pagesize()}")
@auroraset_user_history.group(name='inline')
async def auroraset_user_history_inline(self, ctx: commands.Context):
"""Manage configuration for the /history command's inline argument."""
@auroraset_user_history_inline.command(name='toggle')
async def auroraset_user_history_inline_toggle(self, ctx: commands.Context, enabled: bool):
"""Enable the /history command's inline argument by default."""
await config.user(ctx.author).history_inline.set(enabled)
await ctx.send(f"Inline setting set to {enabled}")
@auroraset_user_history_inline.command(name='pagesize')
async def auroraset_user_history_inline_pagesize(self, ctx: commands.Context, pagesize: int):
"""Set the amount of cases to display per page."""
if pagesize > 20:
await ctx.send(error("Pagesize cannot be greater than 20!"))
return
if pagesize < 1:
await ctx.send(error("Pagesize cannot be less than 1!"))
return
await config.user(ctx.author).history_inline_pagesize.set(pagesize)
await ctx.send(f"Inline pagesize set to {await config.user(ctx.author).history_inline_pagesize()}")
@auroraset.group(autohelp=True, name='guild')
@checks.admin()
async def auroraset_guild(self, ctx: commands.Context):
"""Manage default configurations for user configuration options, per guild."""
@auroraset_guild.command(name='autoevidence')
async def auroraset_guild_autoevidence(self, ctx: commands.Context, enabled: bool):
"""Toggle if the evidenceformat codeblock should be sent automatically."""
await config.guild(ctx.guild).auto_evidenceformat.set(enabled)
await ctx.send(f"Auto evidenceformat setting set to {enabled}")
@auroraset_guild.group(autohelp=True, name='history')
@checks.admin()
async def auroraset_guild_history(self, ctx: commands.Context):
"""Manage configuration for the /history command."""
@auroraset_guild_history.command(name='ephemeral', aliases=['hidden', 'hide'])
@checks.admin()
async def auroraset_guild_history_ephemeral(self, ctx: commands.Context, enabled: bool):
"""Toggle if the /history command should be ephemeral."""
await config.guild(ctx.guild).history_ephemeral.set(enabled)
await ctx.send(f"Ephemeral setting set to {enabled}")
@auroraset_guild_history.command(name='pagesize')
@checks.admin()
async def auroraset_guild_history_pagesize(self, ctx: commands.Context, pagesize: int):
"""Set the amount of cases to display per page."""
if pagesize > 20:
await ctx.send("Pagesize cannot be greater than 20!")
return
if pagesize < 1:
await ctx.send("Pagesize cannot be less than 1!")
return
await config.guild(ctx.guild).history_pagesize.set(pagesize)
await ctx.send(f"Pagesize set to {await config.guild(ctx.guild).history_pagesize()}")
@auroraset_guild_history.group(name='inline')
@checks.admin()
async def auroraset_guild_history_inline(self, ctx: commands.Context):
"""Manage configuration for the /history command's inline argument."""
@auroraset_guild_history_inline.command(name='toggle')
@checks.admin()
async def auroraset_guild_history_inline_toggle(self, ctx: commands.Context, enabled: bool):
"""Enable the /history command's inline argument by default."""
await config.guild(ctx.guild).history_inline.set(enabled)
await ctx.send(f"Inline setting set to {enabled}")
@auroraset_guild_history_inline.command(name='pagesize')
@checks.admin()
async def auroraset_guild_history_inline_pagesize(self, ctx: commands.Context, pagesize: int):
"""Set the amount of cases to display per page."""
if pagesize > 20:
await ctx.send("Pagesize cannot be greater than 20!")
return
if pagesize < 1:
await ctx.send("Pagesize cannot be less than 1!")
return
await config.guild(ctx.guild).history_inline_pagesize.set(pagesize)
await ctx.send(f"Inline pagesize set to {await config.guild(ctx.guild).history_inline_pagesize()}")
@auroraset.group(autohelp=True, name='immunity')
@checks.admin()
async def auroraset_immunity(self, ctx: commands.Context):
"""Manage configuration for immune roles."""
@auroraset_immunity.command(name='add')
@checks.admin()
async def auroraset_immunity_add(self, ctx: commands.Context, role: discord.Role):
"""Add a role to the immune roles list."""
immune_roles: list = await config.guild(ctx.guild).immune_roles()
if role.id in immune_roles:
await ctx.send(error("Role is already immune!"))
return
immune_roles.append(role.id)
await config.guild(ctx.guild).immune_roles.set(immune_roles)
await ctx.send(f"Role {role.name} added to immune roles.")
@auroraset_immunity.command(name='remove')
@checks.admin()
async def auroraset_immunity_remove(self, ctx: commands.Context, role: discord.Role):
"""Remove a role from the immune roles list."""
immune_roles: list = await config.guild(ctx.guild).immune_roles()
if role.id not in immune_roles:
await ctx.send(error("Role is not immune!"))
return
immune_roles.remove(role.id)
await config.guild(ctx.guild).immune_roles.set(immune_roles)
await ctx.send(f"Role {role.name} removed from immune roles.")
@auroraset_immunity.command(name='list')
@checks.admin()
async def auroraset_immunity_list(self, ctx: commands.Context):
"""List all immune roles."""
immune_roles: list = await config.guild(ctx.guild).immune_roles()
if not immune_roles:
await ctx.send("No immune roles set!")
return
role_list = ""
for role_id in immune_roles:
role = ctx.guild.get_role(role_id)
if role:
role_list += f"{role.mention}\n"
if role_list:
embed = discord.Embed(title="Immune Roles", description=role_list, color=await self.bot.get_embed_color(ctx.channel))
await ctx.send(embed=embed)
@auroraset.group(autohelp=True, name='blacklist')
@checks.admin()
async def auroraset_blacklist(self, ctx: commands.Context):
"""Manage configuration for the /blacklist command."""
@auroraset_blacklist.command(name='add')
@checks.admin()
async def auroraset_blacklist_add(self, ctx: commands.Context, role: discord.Role, duration: str):
"""Add a role to the blacklist."""
blacklist_roles: list = await config.guild(ctx.guild).blacklist_roles()
for blacklist_role in blacklist_roles:
if role.id == blacklist_role['role']:
await ctx.send(error("Role already has an associated blacklist type!"))
return
try:
parsed_time = parse(sval=duration, as_timedelta=True, raise_exception=True)
except ValueError:
await ctx.send(error("Please provide a valid duration!"))
return
blacklist_roles.append(
{
'role': role.id,
'duration': str(parsed_time)
}
) )
await config.guild(ctx.guild).blacklist_roles.set(blacklist_roles)
await ctx.send(f"Role {role.mention} added as a blacklist type.", allowed_mentions=discord.AllowedMentions.none())
@auroraset_blacklist.command(name='remove')
@checks.admin()
async def auroraset_blacklist_remove(self, ctx: commands.Context, role: discord.Role):
"""Remove a role's blacklist type."""
blacklist_roles: list = await config.guild(ctx.guild).blacklist_roles()
for blacklist_role in blacklist_roles:
if role.id == blacklist_role['role']:
blacklist_roles.remove(blacklist_role)
await config.guild(ctx.guild).blacklist_roles.set(blacklist_roles)
await ctx.send(f"Role {role.mention} removed from blacklist types.", allowed_mentions=discord.AllowedMentions.none())
return
await ctx.send(error("Role does not have an associated blacklist type!"))
@auroraset_blacklist.command(name='list')
@checks.admin()
async def auroraset_blacklist_list(self, ctx: commands.Context):
"""List all blacklist types."""
blacklist_roles: list = await config.guild(ctx.guild).blacklist_roles()
if not blacklist_roles:
await ctx.send("No blacklist types set!")
return
blacklist_list = ""
for blacklist_role in blacklist_roles:
role = ctx.guild.get_role(blacklist_role['role'])
if role:
blacklist_list += f"{role.mention} - {blacklist_role['duration']}\n"
if blacklist_list:
embed = discord.Embed(title="Blacklist Types", description=blacklist_list, color=await self.bot.get_embed_color(ctx.channel))
await ctx.send(embed=embed)
@auroraset.command(name="ignorebots")
@checks.admin()
async def auroraset_ignorebots(self, ctx: commands.Context):
"""Toggle if the cog should ignore other bots' moderations."""
await config.guild(ctx.guild).ignore_other_bots.set(not await config.guild(ctx.guild).ignore_other_bots())
await ctx.send(f"Ignore bots setting set to {await config.guild(ctx.guild).ignore_other_bots()}")
@auroraset.command(name="dm")
@checks.admin()
async def auroraset_dm(self, ctx: commands.Context):
"""Toggle automatically messaging moderated users.
This option can be overridden by specifying the `silent` argument in any moderation command."""
await config.guild(ctx.guild).dm_users.set(not await config.guild(ctx.guild).dm_users())
await ctx.send(f"DM users setting set to {await config.guild(ctx.guild).dm_users()}")
@auroraset.command(name="permissions")
@checks.admin()
async def auroraset_permissions(self, ctx: commands.Context):
"""Toggle whether the bot will check for discord permissions."""
await config.guild(ctx.guild).use_discord_permissions.set(not await config.guild(ctx.guild).use_discord_permissions())
await ctx.send(f"Use Discord Permissions setting set to {await config.guild(ctx.guild).use_discord_permissions()}")
@auroraset.command(name="logchannel")
@checks.admin()
async def auroraset_logchannel(self, ctx: commands.Context, channel: discord.TextChannel = None):
"""Set a channel to log infractions to."""
if channel:
await config.guild(ctx.guild).log_channel.set(channel.id)
await ctx.send(f"Logging channel set to {channel.mention}.")
else:
await config.guild(ctx.guild).log_channel.set(" ")
await ctx.send(warning("Logging channel disabled."))
@auroraset.command(name="showmoderator")
@checks.admin()
async def auroraset_showmoderator(self, ctx: commands.Context):
"""Toggle if the cog should show the moderator in the case embed when dming a user."""
await config.guild(ctx.guild).show_moderator.set(not await config.guild(ctx.guild).show_moderator())
await ctx.send(f"Show moderator setting set to {await config.guild(ctx.guild).show_moderator()}")
@auroraset.group(autohelp=True, name='import')
@checks.admin()
async def auroraset_import(self, ctx: commands.Context):
"""Import moderations from other bots."""
@auroraset_import.command(name="aurora")
@checks.admin()
async def auroraset_import_aurora(self, ctx: commands.Context):
"""Import moderations from another bot using Aurora."""
if ctx.message.attachments and ctx.message.attachments[0].content_type == 'application/json; charset=utf-8':
message = await ctx.send(warning("Are you sure you want to import moderations from another bot?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*"))
await message.edit(view=ImportAuroraView(60, ctx, message)) await message.edit(view=ImportAuroraView(60, ctx, message))
else: else:
await ctx.send(error("Please provide a valid Aurora export file.")) await ctx.send(error("Please provide a valid Aurora export file."))
@auroraset_import.command(name="galacticbot") @aurora_import.command(name="galacticbot")
@checks.admin() @commands.admin()
async def auroraset_import_galacticbot(self, ctx: commands.Context): async def aurora_import_galacticbot(self, ctx: commands.Context):
"""Import moderations from GalacticBot.""" """Import moderation history from GalacticBot."""
if ctx.message.attachments and ctx.message.attachments[0].content_type == 'application/json; charset=utf-8': if (
message = await ctx.send(warning("Are you sure you want to import GalacticBot moderations?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*")) ctx.message.attachments
and ctx.message.attachments[0].content_type
== "application/json; charset=utf-8"
):
message = await ctx.send(
warning(
"Are you sure you want to import GalacticBot moderations?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*"
)
)
await message.edit(view=ImportGalacticBotView(60, ctx, message)) await message.edit(view=ImportGalacticBotView(60, ctx, message))
else: else:
await ctx.send(error("Please provide a valid GalacticBot moderation export file.")) await ctx.send(
error("Please provide a valid GalacticBot moderation export file.")
)
@commands.command(aliases=["tdc"]) @aurora.command(aliases=["tdc", 'td', 'timedeltaconvert'])
async def timedeltaconvert(self, ctx: commands.Context, *, duration: str): async def timedelta(self, ctx: commands.Context, *, duration: str):
"""This command converts a duration to a [`timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta) Python object. """This command converts a duration to a [`timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta) Python object.
**Example usage** **Example usage**
`[p]timedeltaconvert 1 day 15hr 82 minutes 52s` `[p]aurora timedelta 1 day 15hr 82 minutes 52s`
**Output** **Output**
`1 day, 16:22:52`""" `1 day, 16:22:52`"""
try: try:

0
aurora/menus/__init__.py Normal file
View file

41
aurora/menus/addrole.py Normal file
View file

@ -0,0 +1,41 @@
from discord import ButtonStyle, ui, Interaction
from redbot.core import commands
from redbot.core.utils.chat_formatting import error
from aurora.utilities.factory import addrole_embed
from aurora.utilities.config import config
class Addrole(ui.View):
def __init__(self, ctx: commands.Context):
super().__init__()
self.ctx = ctx
@ui.select(cls=ui.RoleSelect, placeholder="Select a role", min_values=0, max_values=25)
async def addrole_select(self, interaction: Interaction, select: ui.RoleSelect):
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message(error("You must have the manage guild permission to add roles to the addrole whitelist."), ephemeral=True)
return
await interaction.response.defer()
addrole_whitelist: list = await config.guild(self.ctx.guild).addrole_whitelist()
if select.values[0].id in addrole_whitelist:
addrole_whitelist.remove(select.values[0].id)
else:
addrole_whitelist.append(select.values[0].id)
await config.guild(self.ctx.guild).addrole_whitelist.set(addrole_whitelist)
await interaction.message.edit(embed=await addrole_embed(self.ctx))
@ui.button(label="Clear", style=ButtonStyle.red, row=1)
async def clear(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message(error("You must have the manage guild permission to clear the guild's addrole whitelist."), ephemeral=True)
return
await interaction.response.defer()
await config.guild(self.ctx.guild).addrole_whitelist.clear()
await interaction.message.edit(embed=await addrole_embed(self.ctx))
@ui.button(label="Close", style=ButtonStyle.gray)
async def close(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message(error("You can't do that!"), ephemeral=True)
return
await interaction.message.delete()

124
aurora/menus/guild.py Normal file
View file

@ -0,0 +1,124 @@
from discord import ui, ButtonStyle, Interaction
from redbot.core import commands
from aurora.utilities.factory import guild_embed
from aurora.utilities.utils import create_pagesize_options
from aurora.utilities.config import config
class Guild(ui.View):
def __init__(self, ctx: commands.Context):
super().__init__()
self.ctx = ctx
@ui.button(label="Show Moderator", style=ButtonStyle.green, row=0)
async def show_moderator(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.guild(interaction.guild).show_moderator
await config.guild(interaction.guild).show_moderator.set(not current_setting)
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.button(label="Use Discord Permissions", style=ButtonStyle.green, row=0)
async def use_discord_permissions(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.guild(interaction.guild).use_discord_permissions()
await config.guild(interaction.guild).use_discord_permissions.set(not current_setting)
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.button(label="Ignore Modlog", style=ButtonStyle.green, row=0)
async def ignore_modlog(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.guild(interaction.guild).ignore_modlog()
await config.guild(interaction.guild).ignore_modlog.set(not current_setting)
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.button(label="Ignore Other Bots", style=ButtonStyle.green, row=0)
async def ignore_other_bots(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.guild(interaction.guild).ignore_other_bots()
await config.guild(interaction.guild).ignore_other_bots.set(not current_setting)
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.button(label="DM Users", style=ButtonStyle.green, row=1)
async def dm_users(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.guild(interaction.guild).dm_users()
await config.guild(interaction.guild).dm_users.set(not current_setting)
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.button(label="Auto Evidence Format", style=ButtonStyle.green, row=1)
async def auto_evidenceformat(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.guild(interaction.guild).auto_evidenceformat()
await config.guild(interaction.guild).auto_evidenceformat.set(not current_setting)
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.button(label="Ephemeral", style=ButtonStyle.green, row=1)
async def ephemeral(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.guild(interaction.guild).history_ephemeral()
await config.guild(interaction.guild).history_ephemeral.set(not current_setting)
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.button(label="History Inline", style=ButtonStyle.green, row=1)
async def inline(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.guild(interaction.guild).history_inline()
await config.guild(interaction.guild).history_inline.set(not current_setting)
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.select(placeholder="History Pagesize", options=create_pagesize_options(), row=2)
async def pagesize(self, interaction: Interaction, select: ui.Select,):
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
if select.values[0] == "default":
await config.guild(interaction.guild).history_pagesize.clear()
else:
await config.guild(interaction.guild).history_pagesize.set(int(select.values[0]))
await interaction.response.defer()
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.select(placeholder="History Inline Pagesize", options=create_pagesize_options(), row=3)
async def inline_pagesize(self, interaction: Interaction, select: ui.Select,):
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
if select.values[0] == "default":
await config.guild(interaction.guild).history_inline_pagesize.clear()
else:
await config.guild(interaction.guild).history_inline_pagesize.set(int(select.values[0]))
await interaction.response.defer()
await interaction.message.edit(embed=await guild_embed(self.ctx))
@ui.select(placeholder="Log Channel", cls=ui.ChannelSelect, row=4)
async def log_channel(self, interaction: Interaction, select: ui.ChannelSelect):
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
return
await interaction.response.defer()
await config.guild(interaction.guild).log_channel.set(select.values[0].id)
await interaction.message.edit(embed=await guild_embed(self.ctx))

42
aurora/menus/immune.py Normal file
View file

@ -0,0 +1,42 @@
from discord import ButtonStyle, ui, Interaction
from redbot.core import commands
from redbot.core.utils.chat_formatting import error
from aurora.utilities.factory import immune_embed
from aurora.utilities.config import config
class Immune(ui.View):
def __init__(self, ctx: commands.Context):
super().__init__()
self.ctx = ctx
@ui.select(cls=ui.RoleSelect, placeholder="Select a role", min_values=0, max_values=25)
async def immune_select(self, interaction: Interaction, select: ui.RoleSelect):
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message(error("You must have the manage guild permission to add immune roles."), ephemeral=True)
return
await interaction.response.defer()
immune_roles: list = await config.guild(self.ctx.guild).immune_roles()
for role in select.values:
if role.id in immune_roles:
immune_roles.remove(role.id)
else:
immune_roles.append(role.id)
await config.guild(self.ctx.guild).immune_roles.set(immune_roles)
await interaction.message.edit(embed=await immune_embed(self.ctx))
@ui.button(label="Clear", style=ButtonStyle.red, row=1)
async def clear(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message(error("You must have the manage guild permission to clear the guild's immune roles."), ephemeral=True)
return
await interaction.response.defer()
await config.guild(self.ctx.guild).immune_roles.clear()
await interaction.message.edit(embed=await immune_embed(self.ctx))
@ui.button(label="Close", style=ButtonStyle.gray)
async def close(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
await interaction.response.send_message(error("You can't do that!"), ephemeral=True)
return
await interaction.message.delete()

80
aurora/menus/overrides.py Normal file
View file

@ -0,0 +1,80 @@
from discord import ui, ButtonStyle, Interaction
from redbot.core import commands
from aurora.utilities.factory import overrides_embed
from aurora.utilities.utils import create_pagesize_options
from aurora.utilities.config import config
class Overrides(ui.View):
def __init__(self, ctx: commands.Context):
super().__init__()
self.ctx = ctx
@ui.button(label="Auto Evidence Format", style=ButtonStyle.green, row=0)
async def auto_evidenceformat(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if self.ctx.author != interaction.user:
await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.user(self.ctx.author).auto_evidenceformat()
if current_setting is False:
await config.user(self.ctx.author).auto_evidenceformat.clear()
elif current_setting is None:
await config.user(self.ctx.author).auto_evidenceformat.set(True)
else:
await config.user(self.ctx.author).auto_evidenceformat.set(False)
await interaction.message.edit(embed=await overrides_embed(self.ctx))
@ui.button(label="Ephemeral", style=ButtonStyle.green, row=0)
async def ephemeral(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if self.ctx.author != interaction.user:
await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.user(self.ctx.author).history_ephemeral()
if current_setting is False:
await config.user(self.ctx.author).history_ephemeral.clear()
elif current_setting is None:
await config.user(self.ctx.author).history_ephemeral.set(True)
else:
await config.user(self.ctx.author).history_ephemeral.set(False)
await interaction.message.edit(embed=await overrides_embed(self.ctx))
@ui.button(label="Inline", style=ButtonStyle.green, row=0)
async def inline(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument
if self.ctx.author != interaction.user:
await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True)
return
await interaction.response.defer()
current_setting = await config.user(self.ctx.author).history_inline()
if current_setting is False:
await config.user(self.ctx.author).history_inline.clear()
elif current_setting is None:
await config.user(self.ctx.author).history_inline.set(True)
else:
await config.user(self.ctx.author).history_inline.set(False)
await interaction.message.edit(embed=await overrides_embed(self.ctx))
@ui.select(placeholder="Inline Pagesize", options=create_pagesize_options(), row=1)
async def inline_pagesize(self, interaction: Interaction, select: ui.Select,):
if self.ctx.author != interaction.user:
await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True)
return
await interaction.response.defer()
if select.values[0] == "default":
await config.user(self.ctx.author).history_inline_pagesize.clear()
else:
await config.user(self.ctx.author).history_inline_pagesize.set(int(select.values[0]))
await interaction.message.edit(embed=await overrides_embed(self.ctx))
@ui.select(placeholder="Pagesize", options=create_pagesize_options(), row=2)
async def pagesize(self, interaction: Interaction, select: ui.Select,):
if self.ctx.author != interaction.user:
await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True)
return
await interaction.response.defer()
if select.values[0] == "default":
await config.user(self.ctx.author).history_pagesize.clear()
else:
await config.user(self.ctx.author).history_pagesize.set(int(select.values[0]))
await interaction.message.edit(embed=await overrides_embed(self.ctx))

View file

@ -16,7 +16,7 @@ def register_config(config_obj: Config):
history_pagesize = 5, history_pagesize = 5,
history_inline_pagesize = 6, history_inline_pagesize = 6,
auto_evidenceformat = False, auto_evidenceformat = False,
blacklist_roles = [] addrole_whitelist = []
) )
config_obj.register_user( config_obj.register_user(
history_ephemeral = None, history_ephemeral = None,

View file

@ -5,10 +5,11 @@ from datetime import datetime, timedelta
import humanize import humanize
from discord import Color, Embed, Guild, Interaction, InteractionMessage, User, Member from discord import Color, Embed, Guild, Interaction, InteractionMessage, User, Member
from redbot.core.utils.chat_formatting import box from redbot.core import commands
from redbot.core.utils.chat_formatting import box, bold, error, warning
from .config import config from aurora.utilities.config import config
from .utils import fetch_channel_dict, fetch_user_dict, get_next_case_number from aurora.utilities.utils import fetch_channel_dict, fetch_user_dict, get_next_case_number, get_bool_emoji, get_pagesize_str
async def message_factory(color: Color, guild: Guild, reason: str, moderation_type: str, moderator: Union[Member, User] = None, duration: timedelta = None, response: InteractionMessage = None) -> Embed: async def message_factory(color: Color, guild: Guild, reason: str, moderation_type: str, moderator: Union[Member, User] = None, duration: timedelta = None, response: InteractionMessage = None) -> Embed:
@ -223,3 +224,156 @@ async def evidenceformat_factory(interaction: Interaction, case_dict: dict) -> s
content += f"\nReason: {case_dict['reason']}" content += f"\nReason: {case_dict['reason']}"
return box(content, 'prolog') return box(content, 'prolog')
########################################################################################################################
### Configuration Embeds #
########################################################################################################################
async def _config(ctx: commands.Context) -> Embed:
"""Generates the core embed for configuration menus to use."""
e = Embed(
title="Aurora Configuration Menu",
color=await ctx.embed_color()
)
e.set_thumbnail(url=ctx.bot.user.display_avatar.url)
return e
async def overrides_embed(ctx: commands.Context) -> Embed:
"""Generates a configuration menu embed for a user's overrides."""
override_settings = {
"ephemeral": await config.user(ctx.author).history_ephemeral(),
"inline": await config.user(ctx.author).history_inline(),
"inline_pagesize": await config.user(ctx.author).history_inline_pagesize(),
"pagesize": await config.user(ctx.author).history_pagesize(),
"auto_evidenceformat": await config.user(ctx.author).auto_evidenceformat()
}
override_str = [
'- ' + bold("Auto Evidence Format: ") + get_bool_emoji(override_settings['auto_evidenceformat']),
'- ' + bold("Ephemeral: ") + get_bool_emoji(override_settings['ephemeral']),
'- ' + bold("History Inline: ") + get_bool_emoji(override_settings['inline']),
'- ' + bold("History Inline Pagesize: ") + get_pagesize_str(override_settings['inline_pagesize']),
'- ' + bold("History Pagesize: ") + get_pagesize_str(override_settings['pagesize']),
]
override_str = '\n'.join(override_str)
e = await _config(ctx)
e.title += ": User Overrides"
e.description = """
Use the buttons below to manage your user overrides.
These settings will override the relevant guild settings.\n
""" + override_str
return e
async def guild_embed(ctx: commands.Context) -> Embed:
"""Generates a configuration menu field value for a guild's settings."""
guild_settings = {
"show_moderator": await config.guild(ctx.guild).show_moderator(),
"use_discord_permissions": await config.guild(ctx.guild).use_discord_permissions(),
"ignore_modlog": await config.guild(ctx.guild).ignore_modlog(),
"ignore_other_bots": await config.guild(ctx.guild).ignore_other_bots(),
"dm_users": await config.guild(ctx.guild).dm_users(),
"log_channel": await config.guild(ctx.guild).log_channel(),
"history_ephemeral": await config.guild(ctx.guild).history_ephemeral(),
"history_inline": await config.guild(ctx.guild).history_inline(),
"history_pagesize": await config.guild(ctx.guild).history_pagesize(),
"history_inline_pagesize": await config.guild(ctx.guild).history_inline_pagesize(),
"auto_evidenceformat": await config.guild(ctx.guild).auto_evidenceformat(),
}
channel = ctx.guild.get_channel(guild_settings['log_channel'])
if channel is None:
channel = warning("Not Set")
else:
channel = channel.mention
guild_str = [
'- '+ bold("Show Moderator: ") + get_bool_emoji(guild_settings['show_moderator']),
'- '+ bold("Use Discord Permissions: ") + get_bool_emoji(guild_settings['use_discord_permissions']),
'- '+ bold("Ignore Modlog: ") + get_bool_emoji(guild_settings['ignore_modlog']),
'- '+ bold("Ignore Other Bots: ") + get_bool_emoji(guild_settings['ignore_other_bots']),
'- '+ bold("DM Users: ") + get_bool_emoji(guild_settings['dm_users']),
'- '+ bold("Auto Evidence Format: ") + get_bool_emoji(guild_settings['auto_evidenceformat']),
'- '+ bold("Ephemeral: ") + get_bool_emoji(guild_settings['history_ephemeral']),
'- '+ bold("History Inline: ") + get_bool_emoji(guild_settings['history_inline']),
'- '+ bold("History Pagesize: ") + get_pagesize_str(guild_settings['history_pagesize']),
'- '+ bold("History Inline Pagesize: ") + get_pagesize_str(guild_settings['history_inline_pagesize']),
'- '+ bold("Log Channel: ") + channel
]
guild_str = '\n'.join(guild_str)
e = await _config(ctx)
e.title += ": Server Configuration"
e.description = """
Use the buttons below to manage Aurora's server configuration.\n
""" + guild_str
return e
async def addrole_embed(ctx: commands.Context) -> Embed:
"""Generates a configuration menu field value for a guild's addrole whitelist."""
whitelist = await config.guild(ctx.guild).addrole_whitelist()
if whitelist:
whitelist = [ctx.guild.get_role(role).mention or error(f"`{role}` (Not Found)") for role in whitelist]
whitelist = '\n'.join(whitelist)
else:
whitelist = warning("No roles are on the addrole whitelist!")
e = await _config(ctx)
e.title += ": Addrole Whitelist"
e.description = "Use the select menu below to manage this guild's addrole whitelist."
if len(whitelist) > 4000 and len(whitelist) < 5000:
lines = whitelist.split('\n')
chunks = []
chunk = ""
for line in lines:
if len(chunk) + len(line) > 1024:
chunks.append(chunk)
chunk = line
else:
chunk += '\n' + line if chunk else line
chunks.append(chunk)
for chunk in chunks:
e.add_field(name="", value=chunk)
else:
e.description += '\n\n' + whitelist
return e
async def immune_embed(ctx: commands.Context) -> Embed:
"""Generates a configuration menu field value for a guild's immune roles."""
immune_roles = await config.guild(ctx.guild).immune_roles()
if immune_roles:
immune_str = [ctx.guild.get_role(role).mention or error(f"`{role}` (Not Found)") for role in immune_roles]
immune_str = '\n'.join(immune_str)
else:
immune_str = warning("No roles are set as immune roles!")
e = await _config(ctx)
e.title += ": Immune Roles"
e.description = "Use the select menu below to manage this guild's immune roles."
if len(immune_str) > 4000 and len(immune_str) < 5000:
lines = immune_str.split('\n')
chunks = []
chunk = ""
for line in lines:
if len(chunk) + len(line) > 1024:
chunks.append(chunk)
chunk = line
else:
chunk += '\n' + line if chunk else line
chunks.append(chunk)
for chunk in chunks:
e.add_field(name="", value=chunk)
else:
e.description += '\n\n' + immune_str
return e

View file

@ -4,7 +4,7 @@ import json
from datetime import timedelta as td from datetime import timedelta as td
from typing import Union from typing import Union
from discord import Guild, Interaction, Member, User from discord import Guild, Interaction, Member, User, SelectOption
from discord.errors import Forbidden, NotFound from discord.errors import Forbidden, NotFound
from redbot.core import commands from redbot.core import commands
from redbot.core.utils.chat_formatting import error from redbot.core.utils.chat_formatting import error
@ -228,3 +228,37 @@ def convert_timedelta_to_str(timedelta: td) -> str:
minutes = (total_seconds % 3600) // 60 minutes = (total_seconds % 3600) // 60
seconds = total_seconds % 60 seconds = total_seconds % 60
return f"{hours}:{minutes}:{seconds}" return f"{hours}:{minutes}:{seconds}"
def get_bool_emoji(value: bool) -> str:
"""Returns a unicode emoji based on a boolean value."""
if value is True:
return "\N{WHITE HEAVY CHECK MARK}"
if value is False:
return "\N{NO ENTRY SIGN}"
return "\N{BLACK QUESTION MARK ORNAMENT}\N{VARIATION SELECTOR-16}"
def get_pagesize_str(value: Union[int, None]) -> str:
"""Returns a string based on a pagesize value."""
if value is None:
return "\N{BLACK QUESTION MARK ORNAMENT}\N{VARIATION SELECTOR-16}"
return str(value) + " cases per page"
def create_pagesize_options() -> list[SelectOption]:
"""Returns a list of SelectOptions for pagesize configuration."""
options = []
options.append(
SelectOption(
label="Default",
value="default",
description="Reset the pagesize to the default value.",
)
)
for i in range(1, 21):
options.append(
SelectOption(
label=str(i),
value=str(i),
description=f"Set the pagesize to {i}.",
)
)
return options