Compare commits
4 commits
1a23a2778a
...
ebf739b563
Author | SHA1 | Date | |
---|---|---|---|
ebf739b563 | |||
f6b827c64f | |||
b8a4d247f8 | |||
a7fcbc4dab |
1 changed files with 175 additions and 12 deletions
187
aurora/aurora.py
187
aurora/aurora.py
|
@ -18,7 +18,8 @@ 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.bot import Red
|
||||||
from redbot.core.commands.converter import parse_relativedelta, parse_timedelta
|
from redbot.core.commands.converter import parse_relativedelta, parse_timedelta
|
||||||
from redbot.core.utils.chat_formatting import box, error, humanize_list, humanize_timedelta, warning
|
from redbot.core.utils.chat_formatting import (box, error, humanize_list,
|
||||||
|
humanize_timedelta, warning)
|
||||||
|
|
||||||
from aurora.importers.aurora import ImportAuroraView
|
from aurora.importers.aurora import ImportAuroraView
|
||||||
from aurora.importers.galacticbot import ImportGalacticBotView
|
from aurora.importers.galacticbot import ImportGalacticBotView
|
||||||
|
@ -27,10 +28,18 @@ from aurora.menus.guild import Guild
|
||||||
from aurora.menus.immune import Immune
|
from aurora.menus.immune import Immune
|
||||||
from aurora.menus.overrides import Overrides
|
from aurora.menus.overrides import Overrides
|
||||||
from aurora.utilities.config import config, register_config
|
from aurora.utilities.config import config, register_config
|
||||||
from aurora.utilities.database import connect, create_guild_table, fetch_case, mysql_log
|
from aurora.utilities.database import (connect, create_guild_table, fetch_case,
|
||||||
from aurora.utilities.factory import addrole_embed, case_factory, changes_factory, evidenceformat_factory, guild_embed, immune_embed, message_factory, overrides_embed
|
mysql_log)
|
||||||
|
from aurora.utilities.factory import (addrole_embed, case_factory,
|
||||||
|
changes_factory, evidenceformat_factory,
|
||||||
|
guild_embed, immune_embed,
|
||||||
|
message_factory, overrides_embed)
|
||||||
from aurora.utilities.logger import logger
|
from aurora.utilities.logger import logger
|
||||||
from aurora.utilities.utils import check_moddable, check_permissions, convert_timedelta_to_str, fetch_channel_dict, fetch_user_dict, generate_dict, log, send_evidenceformat, timedelta_from_relativedelta
|
from aurora.utilities.utils import (check_moddable, check_permissions,
|
||||||
|
convert_timedelta_to_str,
|
||||||
|
fetch_channel_dict, fetch_user_dict,
|
||||||
|
generate_dict, log, send_evidenceformat,
|
||||||
|
timedelta_from_relativedelta)
|
||||||
|
|
||||||
|
|
||||||
class Aurora(commands.Cog):
|
class Aurora(commands.Cog):
|
||||||
|
@ -113,6 +122,20 @@ class Aurora(commands.Cog):
|
||||||
except ConnectionRefusedError:
|
except ConnectionRefusedError:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@commands.Cog.listener("on_member_join")
|
||||||
|
async def addrole_on_member_join(self, member: discord.Member):
|
||||||
|
"""This method automatically adds roles to users when they join the server."""
|
||||||
|
if not await self.bot.cog_disabled_in_guild(self, member.guild):
|
||||||
|
query = f"""SELECT moderation_id, role_id, reason FROM moderation_{member.guild.id} WHERE target_id = ? AND action = 'ADDROLE' AND expired = 0 AND resolved = 0;"""
|
||||||
|
database = connect()
|
||||||
|
cursor = database.cursor()
|
||||||
|
cursor.execute(query, (member.id,))
|
||||||
|
results = cursor.fetchall()
|
||||||
|
for result in results:
|
||||||
|
role = member.guild.get_role(result[1])
|
||||||
|
reason = result[2]
|
||||||
|
await member.add_roles(role, reason=f"Role automatically added on member rejoin for: {reason} (Case #{result[0]:,})")
|
||||||
|
|
||||||
@commands.Cog.listener("on_audit_log_entry_create")
|
@commands.Cog.listener("on_audit_log_entry_create")
|
||||||
async def autologger(self, entry: discord.AuditLogEntry):
|
async def autologger(self, entry: discord.AuditLogEntry):
|
||||||
"""This method automatically logs moderations done by users manually ("right clicks")."""
|
"""This method automatically logs moderations done by users manually ("right clicks")."""
|
||||||
|
@ -396,6 +419,112 @@ class Aurora(commands.Cog):
|
||||||
case = await fetch_case(moderation_id, interaction.guild.id)
|
case = await fetch_case(moderation_id, interaction.guild.id)
|
||||||
await send_evidenceformat(interaction, case)
|
await send_evidenceformat(interaction, case)
|
||||||
|
|
||||||
|
@app_commands.command(name="removerole")
|
||||||
|
async def removerole(
|
||||||
|
self,
|
||||||
|
interaction: discord.Interaction,
|
||||||
|
target: discord.Member,
|
||||||
|
role: discord.Role,
|
||||||
|
reason: str,
|
||||||
|
duration: str = None,
|
||||||
|
silent: bool = None,
|
||||||
|
):
|
||||||
|
"""Add a role to a user.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
-----------
|
||||||
|
target: discord.Member
|
||||||
|
Who are you removing a role from?
|
||||||
|
role: discord.Role
|
||||||
|
What role are you removing from the target?
|
||||||
|
reason: str
|
||||||
|
Why are you removing a role from this user?
|
||||||
|
duration: str
|
||||||
|
How long are you removing this role for?
|
||||||
|
silent: bool
|
||||||
|
Should the user be messaged?"""
|
||||||
|
addrole_whitelist = await config.guild(interaction.guild).addrole_whitelist()
|
||||||
|
|
||||||
|
if not addrole_whitelist:
|
||||||
|
await interaction.response.send_message(
|
||||||
|
content=error("There are no whitelisted roles set for this server!"),
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
if duration is not None:
|
||||||
|
parsed_time = parse_timedelta(duration)
|
||||||
|
if parsed_time is None:
|
||||||
|
await interaction.response.send_message(
|
||||||
|
content=error("Please provide a valid duration!"), ephemeral=True
|
||||||
|
)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
parsed_time = "NULL"
|
||||||
|
|
||||||
|
if role.id not in addrole_whitelist:
|
||||||
|
await interaction.response.send_message(
|
||||||
|
content=error("That role isn't whitelisted!"), ephemeral=True
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
if not await check_moddable(
|
||||||
|
target, interaction, ["moderate_members", "manage_roles"]
|
||||||
|
):
|
||||||
|
return
|
||||||
|
|
||||||
|
if role.id not in [user_role.id for user_role in target.roles]:
|
||||||
|
await interaction.response.send_message(
|
||||||
|
content=error(f"{target.mention} does not have this role!"),
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
await interaction.response.defer()
|
||||||
|
if silent is None:
|
||||||
|
silent = not await config.guild(interaction.guild).dm_users()
|
||||||
|
if silent is False:
|
||||||
|
try:
|
||||||
|
embed = await message_factory(
|
||||||
|
await self.bot.get_embed_color(interaction.channel),
|
||||||
|
guild=interaction.guild,
|
||||||
|
moderator=interaction.user,
|
||||||
|
reason=reason,
|
||||||
|
moderation_type="addrole",
|
||||||
|
response=await interaction.original_response(),
|
||||||
|
duration=parsed_time,
|
||||||
|
role=role,
|
||||||
|
)
|
||||||
|
await target.send(embed=embed)
|
||||||
|
except discord.errors.HTTPException:
|
||||||
|
pass
|
||||||
|
|
||||||
|
await target.add_roles(
|
||||||
|
role,
|
||||||
|
reason=f"Role removed by {interaction.user.id}{(' for ' + {humanize_timedelta(timedelta=parsed_time)} if parsed_time != 'NULL' else '')} for: {reason}",
|
||||||
|
)
|
||||||
|
response: discord.WebhookMessage = await interaction.followup.send(
|
||||||
|
content=f"{target.mention} has had the {role.mention} role removed{(' for ' + {humanize_timedelta(timedelta=parsed_time)} if parsed_time != 'NULL' else '')}!\n**Reason** - `{reason}`"
|
||||||
|
)
|
||||||
|
|
||||||
|
moderation_id = await mysql_log(
|
||||||
|
interaction.guild.id,
|
||||||
|
interaction.user.id,
|
||||||
|
"REMOVEROLE",
|
||||||
|
"USER",
|
||||||
|
target.id,
|
||||||
|
role.id,
|
||||||
|
parsed_time,
|
||||||
|
reason,
|
||||||
|
)
|
||||||
|
await response.edit(
|
||||||
|
content=f"{target.mention} has had the {role.mention} role removed{(' for ' + {humanize_timedelta(timedelta=parsed_time)} if parsed_time != 'NULL' else '')}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`",
|
||||||
|
)
|
||||||
|
await log(interaction, moderation_id)
|
||||||
|
|
||||||
|
case = await fetch_case(moderation_id, interaction.guild.id)
|
||||||
|
await send_evidenceformat(interaction, case)
|
||||||
|
|
||||||
@app_commands.command(name="mute")
|
@app_commands.command(name="mute")
|
||||||
async def mute(
|
async def mute(
|
||||||
self,
|
self,
|
||||||
|
@ -1306,7 +1435,7 @@ class Aurora(commands.Cog):
|
||||||
os.remove(filename)
|
os.remove(filename)
|
||||||
return
|
return
|
||||||
await interaction.response.send_message(
|
await interaction.response.send_message(
|
||||||
content=box({json.dumps(case_dict, indent=2)}),
|
content=box(json.dumps(case_dict, indent=2), 'json'),
|
||||||
ephemeral=ephemeral,
|
ephemeral=ephemeral,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@ -1555,12 +1684,9 @@ class Aurora(commands.Cog):
|
||||||
e,
|
e,
|
||||||
)
|
)
|
||||||
|
|
||||||
expiry_query = f"UPDATE `moderation_{guild.id}` SET expired = 1 WHERE (end_timestamp != 0 AND end_timestamp <= ? AND expired = 0 AND moderation_type != 'BLACKLIST') OR (expired = 0 AND resolved = 1 AND moderation_type != 'BLACKLIST')"
|
addrole_query = f"SELECT target_id, moderation_id, role_id FROM moderation_{guild.id} WHERE end_timestamp != 0 AND end_timestamp <= ? AND moderation_type = 'ADDROLE' AND expired = 0"
|
||||||
cursor.execute(expiry_query, (time.time(),))
|
|
||||||
|
|
||||||
blacklist_query = f"SELECT target_id, moderation_id, role_id FROM moderation_{guild.id} WHERE end_timestamp != 0 AND end_timestamp <= ? AND moderation_type = 'BLACKLIST' AND expired = 0"
|
|
||||||
try:
|
try:
|
||||||
cursor.execute(blacklist_query, (time.time(),))
|
cursor.execute(addrole_query, (time.time(),))
|
||||||
result = cursor.fetchall()
|
result = cursor.fetchall()
|
||||||
except sqlite3.OperationalError:
|
except sqlite3.OperationalError:
|
||||||
continue
|
continue
|
||||||
|
@ -1572,11 +1698,15 @@ class Aurora(commands.Cog):
|
||||||
target_ids, moderation_ids, role_ids
|
target_ids, moderation_ids, role_ids
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
# member: discord.Member = await guild.fetch_member(target_id)
|
member = await guild.fetch_member(target_id)
|
||||||
|
|
||||||
role: discord.Role = guild.get_role(role_id)
|
role = guild.get_role(role_id)
|
||||||
if role is None:
|
if role is None:
|
||||||
raise discord.errors.NotFound
|
raise discord.errors.NotFound
|
||||||
|
|
||||||
|
await member.remove_roles(
|
||||||
|
role, reason=f"Automatic role removal from case #{moderation_id}"
|
||||||
|
)
|
||||||
except (
|
except (
|
||||||
discord.errors.NotFound,
|
discord.errors.NotFound,
|
||||||
discord.errors.Forbidden,
|
discord.errors.Forbidden,
|
||||||
|
@ -1584,6 +1714,39 @@ class Aurora(commands.Cog):
|
||||||
):
|
):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
removerole_query = f"SELECT target_id, moderation_id, role_id FROM moderation_{guild.id} WHERE end_timestamp != 0 AND end_timestamp <= ? AND moderation_type = 'REMOVEROLE' AND expired = 0"
|
||||||
|
try:
|
||||||
|
cursor.execute(removerole_query, (time.time(),))
|
||||||
|
result = cursor.fetchall()
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
continue
|
||||||
|
target_ids = [row[0] for row in result]
|
||||||
|
moderation_ids = [row[1] for row in result]
|
||||||
|
role_ids = [row[2] for row in result]
|
||||||
|
|
||||||
|
for target_id, moderation_id, role_id in zip(
|
||||||
|
target_ids, moderation_ids, role_ids
|
||||||
|
):
|
||||||
|
try:
|
||||||
|
member = await guild.fetch_member(target_id)
|
||||||
|
|
||||||
|
role = guild.get_role(role_id)
|
||||||
|
if role is None:
|
||||||
|
raise discord.errors.NotFound
|
||||||
|
|
||||||
|
await member.add_roles(
|
||||||
|
role, reason=f"Automatic role addition from case #{moderation_id}"
|
||||||
|
)
|
||||||
|
except (
|
||||||
|
discord.errors.NotFound,
|
||||||
|
discord.errors.Forbidden,
|
||||||
|
discord.errors.HTTPException,
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
|
||||||
|
expiry_query = f"UPDATE `moderation_{guild.id}` SET expired = 1 WHERE (end_timestamp != 0 AND end_timestamp <= ? AND expired = 0) OR (expired = 0 AND resolved = 1"
|
||||||
|
cursor.execute(expiry_query, (time.time(),))
|
||||||
|
|
||||||
per_guild_completion_time = (time.time() - time_per_guild) * 1000
|
per_guild_completion_time = (time.time() - time_per_guild) * 1000
|
||||||
logger.debug(
|
logger.debug(
|
||||||
"Completed expiry loop for %s (%s) in %sms with %s users unbanned",
|
"Completed expiry loop for %s (%s) in %sms with %s users unbanned",
|
||||||
|
|
Loading…
Add table
Reference in a new issue