1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-02 18:23:12 +00:00

Optimize code and imports

This commit is contained in:
wlinator 2024-08-22 14:42:11 +02:00
parent 994959618e
commit da7e142309
29 changed files with 276 additions and 275 deletions

View file

@ -23,6 +23,7 @@ expand the bot's functionality. Please follow these guidelines when contributing
poetry install
poetry shell
poetry pre-commit install
poetry run pre-commit run --all-files
```
## Making Changes

View file

@ -77,7 +77,7 @@ class ReactionListener(Cog):
:param message: The message to process.
"""
if not message.author.bot and not BlacklistUserService.is_user_blacklisted(
message.author.id,
message.author.id,
):
await ReactionHandler(self.client, message).run_checks()

View file

@ -103,9 +103,9 @@ class XPHandler:
if role := self.guild.get_role(role_id):
with contextlib.suppress(
discord.Forbidden,
discord.NotFound,
discord.HTTPException,
discord.Forbidden,
discord.NotFound,
discord.HTTPException,
):
if isinstance(self.author, discord.Member):
await self.author.add_roles(role, reason=reason)
@ -114,16 +114,16 @@ class XPHandler:
if replace and isinstance(self.author, discord.Member):
if role := self.guild.get_role(previous or role_id):
with contextlib.suppress(
discord.Forbidden,
discord.NotFound,
discord.HTTPException,
discord.Forbidden,
discord.NotFound,
discord.HTTPException,
):
await self.author.remove_roles(role, reason=reason)
async def get_level_channel(
self,
message: discord.Message,
guild_config: GuildConfig,
self,
message: discord.Message,
guild_config: GuildConfig,
) -> Optional[discord.TextChannel]:
"""
Retrieves the level up notification channel for the guild.
@ -147,9 +147,9 @@ class XPHandler:
@staticmethod
async def get_level_message(
guild_config: GuildConfig,
level_config: XpService,
author: discord.Member,
guild_config: GuildConfig,
level_config: XpService,
author: discord.Member,
) -> Optional[str]:
"""
Retrieves the level up message for the user.

View file

@ -8,22 +8,22 @@ from lib.constants import CONST
class EmbedBuilder:
@staticmethod
def create_embed(
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
color=None,
footer_text=None,
footer_icon_url=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
color=None,
footer_text=None,
footer_icon_url=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
):
if not hide_author:
if not author_text:
@ -63,20 +63,20 @@ class EmbedBuilder:
@staticmethod
def create_error_embed(
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
footer_text=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
footer_text=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
):
return EmbedBuilder.create_embed(
ctx,
@ -99,20 +99,20 @@ class EmbedBuilder:
@staticmethod
def create_success_embed(
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
footer_text=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
footer_text=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
):
return EmbedBuilder.create_embed(
ctx,
@ -135,20 +135,20 @@ class EmbedBuilder:
@staticmethod
def create_info_embed(
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
footer_text=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
footer_text=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
):
return EmbedBuilder.create_embed(
ctx,
@ -171,20 +171,20 @@ class EmbedBuilder:
@staticmethod
def create_warning_embed(
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
footer_text=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
ctx,
title=None,
author_text=None,
author_icon_url=None,
author_url=None,
description=None,
footer_text=None,
show_name=True,
image_url=None,
thumbnail_url=None,
timestamp=None,
hide_author=False,
hide_author_icon=False,
hide_timestamp=False,
):
return EmbedBuilder.create_embed(
ctx,

View file

@ -51,9 +51,9 @@ class IntroductionFinishButtons(View):
@discord.ui.button(label="Post it!", style=discord.ButtonStyle.green)
async def short_button_callback(
self,
button: discord.ui.Button,
interaction: discord.Interaction,
self,
button: discord.ui.Button,
interaction: discord.Interaction,
) -> None:
await interaction.response.edit_message(view=None)
self.clickedConfirm = True
@ -61,9 +61,9 @@ class IntroductionFinishButtons(View):
@discord.ui.button(label="Stop", style=discord.ButtonStyle.red)
async def extended_button_callback(
self,
button: discord.ui.Button,
interaction: discord.Interaction,
self,
button: discord.ui.Button,
interaction: discord.Interaction,
) -> None:
await interaction.response.edit_message(view=None)
self.stop()

View file

@ -30,7 +30,7 @@ class ReactionHandler:
content = message.content.lower()
if (
content.startswith("Lumi ") or content.startswith("Lumi, ")
content.startswith("Lumi ") or content.startswith("Lumi, ")
) and content.endswith("?"):
response = random.choice(self.eightball)
await message.reply(content=response)

View file

@ -8,9 +8,9 @@ from services.blacklist_service import BlacklistUserService
async def blacklist_user(
ctx,
user: discord.User,
reason: Optional[str] = None,
ctx,
user: discord.User,
reason: Optional[str] = None,
) -> None:
blacklist_service = BlacklistUserService(user.id)
blacklist_service.add_to_blacklist(reason)

View file

@ -39,11 +39,11 @@ class Config(commands.Cog):
@guild_only()
@commands.has_permissions(manage_roles=True)
async def xp_reward_command_add(
self,
ctx,
level: int,
role: discord.Role,
persistent: bool = False,
self,
ctx,
level: int,
role: discord.Role,
persistent: bool = False,
):
await xp_reward.add_reward(ctx, level, role.id, persistent)

View file

@ -104,9 +104,9 @@ async def set_boost_image(ctx, image_url: str | None):
async def create_boost_embed(
member: discord.Member,
template: str | None = None,
image_url: str | None = None,
member: discord.Member,
template: str | None = None,
image_url: str | None = None,
):
embed = discord.Embed(
color=discord.Color.nitro_pink(),

View file

@ -77,8 +77,8 @@ async def set_welcome_template(ctx, text: str) -> None:
def create_greet_embed(
member: discord.Member,
template: Optional[str] = None,
member: discord.Member,
template: Optional[str] = None,
) -> discord.Embed:
embed: discord.Embed = discord.Embed(
color=discord.Color.embed_background(),

View file

@ -14,7 +14,7 @@ class Economy(commands.Cog):
aliases=["bal", "$"],
description="Shows your current Lumi balance.",
help="Shows your current Lumi balance. The economy system is global, meaning your balance will be synced in "
"all servers.",
"all servers.",
contexts={discord.InteractionContextType.guild},
)
@guild_only()

View file

@ -178,12 +178,12 @@ async def cmd(ctx, bet: int):
def blackjack_show(
ctx,
bet,
player_hand,
dealer_hand,
player_hand_value,
dealer_hand_value,
ctx,
bet,
player_hand,
dealer_hand,
player_hand_value,
dealer_hand_value,
):
current_time = datetime.now(est).strftime("%I:%M %p")
embed = discord.Embed(

View file

@ -132,8 +132,8 @@ class LeaderboardCommandView(discord.ui.View):
embed.set_author(name=CONST.STRINGS["xp_lb_author"], icon_url=icon)
for rank, (user_id, xp, level, xp_needed_for_next_level) in enumerate(
xp_lb[:5],
start=1,
xp_lb[:5],
start=1,
):
try:
member = await self.ctx.guild.fetch_member(user_id)

View file

@ -99,7 +99,7 @@ class Misc(commands.Cog):
aliases=["intro", "introduce"],
description="This command can only be used in DMs.",
help="Introduce yourself. For now this command "
"can only be done in ONE server and only in Lumi's DMs.",
"can only be done in ONE server and only in Lumi's DMs.",
contexts={discord.InteractionContextType.bot_dm},
)
@commands.dm_only()

View file

@ -35,8 +35,8 @@ async def cmd(self, ctx: bridge.Context) -> None:
)
if not channel or isinstance(
channel,
(discord.ForumChannel, discord.CategoryChannel),
channel,
(discord.ForumChannel, discord.CategoryChannel),
):
await ctx.respond(
embed=EmbedBuilder.create_error_embed(

View file

@ -10,9 +10,9 @@ _xkcd = Client()
async def print_comic(
ctx: bridge.Context,
latest: bool = False,
number: Optional[int] = None,
ctx: bridge.Context,
latest: bool = False,
number: Optional[int] = None,
) -> None:
try:
if latest:

View file

@ -20,11 +20,11 @@ class Moderation(commands.Cog):
@commands.bot_has_permissions(ban_members=True)
@guild_only()
async def ban_command(
self,
ctx,
target: discord.User,
*,
reason: str | None = None,
self,
ctx,
target: discord.User,
*,
reason: str | None = None,
):
await ban.ban_user(self, ctx, target, reason)
@ -75,11 +75,11 @@ class Moderation(commands.Cog):
@commands.bot_has_permissions(kick_members=True)
@guild_only()
async def kick_command(
self,
ctx,
target: discord.Member,
*,
reason: str | None = None,
self,
ctx,
target: discord.Member,
*,
reason: str | None = None,
):
await kick.kick_user(self, ctx, target, reason)
@ -106,11 +106,11 @@ class Moderation(commands.Cog):
@commands.bot_has_permissions(ban_members=True)
@guild_only()
async def softban_command(
self,
ctx,
target: discord.Member,
*,
reason: str | None = None,
self,
ctx,
target: discord.Member,
*,
reason: str | None = None,
):
await softban.softban_user(ctx, target, reason)
@ -125,12 +125,12 @@ class Moderation(commands.Cog):
@commands.bot_has_permissions(moderate_members=True)
@guild_only()
async def timeout_command(
self,
ctx,
target: discord.Member,
duration: str,
*,
reason: str | None = None,
self,
ctx,
target: discord.Member,
duration: str,
*,
reason: str | None = None,
):
await timeout.timeout_user(self, ctx, target, duration, reason)
@ -145,11 +145,11 @@ class Moderation(commands.Cog):
@commands.bot_has_permissions(ban_members=True)
@guild_only()
async def unban_command(
self,
ctx,
target: discord.User,
*,
reason: str | None = None,
self,
ctx,
target: discord.User,
*,
reason: str | None = None,
):
await ban.unban_user(ctx, target, reason)
@ -164,11 +164,11 @@ class Moderation(commands.Cog):
@commands.bot_has_permissions(moderate_members=True)
@guild_only()
async def untimeout_command(
self,
ctx,
target: discord.Member,
*,
reason: str | None = None,
self,
ctx,
target: discord.Member,
*,
reason: str | None = None,
):
await timeout.untimeout_user(ctx, target, reason)
@ -182,11 +182,11 @@ class Moderation(commands.Cog):
@bridge.has_permissions(kick_members=True)
@guild_only()
async def warn_command(
self,
ctx,
target: discord.Member,
*,
reason: str | None = None,
self,
ctx,
target: discord.Member,
*,
reason: str | None = None,
):
await warn.warn_user(ctx, target, reason)

View file

@ -54,7 +54,7 @@ async def view_all_cases_in_guild(ctx, guild_id: int):
pages_list = []
for i in range(0, len(cases), 10):
chunk = cases[i: i + 10]
chunk = cases[i : i + 10]
embed = create_case_list_embed(
ctx,
chunk,
@ -79,7 +79,7 @@ async def view_all_cases_by_mod(ctx, guild_id: int, moderator: discord.Member):
pages_list = []
for i in range(0, len(cases), 10):
chunk = cases[i: i + 10]
chunk = cases[i : i + 10]
embed = create_case_list_embed(
ctx,
chunk,

View file

@ -14,11 +14,11 @@ from modules.moderation.utils.case_handler import create_case
async def timeout_user(
cog,
ctx,
target: discord.Member,
duration: str,
reason: Optional[str] = None,
cog,
ctx,
target: discord.Member,
duration: str,
reason: Optional[str] = None,
):
bot_member = await MemberConverter().convert(ctx, str(ctx.bot.user.id))
await async_actionable(target, ctx.author, bot_member)

View file

@ -5,9 +5,9 @@ from lib.exceptions.LumiExceptions import LumiException
async def async_actionable(
target: discord.Member,
invoker: discord.Member,
bot_user: discord.Member,
target: discord.Member,
invoker: discord.Member,
bot_user: discord.Member,
) -> None:
"""
Checks if the invoker and client have a higher role than the target user.

View file

@ -10,13 +10,13 @@ from lib.formatter import format_seconds_to_duration_string
def create_case_embed(
ctx,
target: discord.User,
case_number: int,
action_type: str,
reason: Optional[str],
timestamp: Optional[datetime.datetime] = None,
duration: Optional[int] = None,
ctx,
target: discord.User,
case_number: int,
action_type: str,
reason: Optional[str],
timestamp: Optional[datetime.datetime] = None,
duration: Optional[int] = None,
) -> discord.Embed:
embed = EmbedBuilder.create_warning_embed(
ctx,

View file

@ -13,12 +13,12 @@ modlog_service = ModLogService()
async def create_case(
ctx,
target: discord.User,
action_type: str,
reason: Optional[str] = None,
duration: Optional[int] = None,
expires_at: Optional[str] = None,
ctx,
target: discord.User,
action_type: str,
reason: Optional[str] = None,
duration: Optional[int] = None,
expires_at: Optional[str] = None,
):
"""
Creates a new moderation case and logs it to the modlog channel if configured.
@ -90,10 +90,10 @@ async def create_case(
async def edit_case_modlog(
ctx,
guild_id: int,
case_number: int,
new_reason: str,
ctx,
guild_id: int,
case_number: int,
new_reason: str,
) -> bool:
"""
Edits the reason for an existing case and updates the modlog message if it exists.

View file

@ -28,11 +28,11 @@ class Triggers(commands.Cog):
)
@guild_only()
async def add_text_reaction_command(
self,
ctx,
trigger_text: str,
response: str,
is_full_match: bool,
self,
ctx,
trigger_text: str,
response: str,
is_full_match: bool,
):
await add_reaction(ctx, trigger_text, response, None, False, is_full_match)
@ -43,11 +43,11 @@ class Triggers(commands.Cog):
)
@guild_only()
async def add_emoji_reaction_command(
self,
ctx,
trigger_text: str,
emoji: discord.Emoji,
is_full_match: bool,
self,
ctx,
trigger_text: str,
emoji: discord.Emoji,
is_full_match: bool,
):
await add_reaction(ctx, trigger_text, None, emoji.id, True, is_full_match)
@ -58,9 +58,9 @@ class Triggers(commands.Cog):
)
@guild_only()
async def delete_reaction_command(
self,
ctx,
reaction_id: int,
self,
ctx,
reaction_id: int,
):
await delete_reaction(ctx, reaction_id)
@ -71,8 +71,8 @@ class Triggers(commands.Cog):
)
@guild_only()
async def list_reactions_command(
self,
ctx,
self,
ctx,
):
await list_reactions(ctx)

View file

@ -10,12 +10,12 @@ from services.reactions_service import CustomReactionsService
async def add_reaction(
ctx: bridge.Context,
trigger_text: str,
response: Optional[str],
emoji_id: Optional[int],
is_emoji: bool,
is_full_match: bool,
ctx: bridge.Context,
trigger_text: str,
response: Optional[str],
emoji_id: Optional[int],
is_emoji: bool,
is_full_match: bool,
) -> None:
if ctx.guild is None:
return
@ -25,15 +25,15 @@ async def add_reaction(
creator_id: int = ctx.author.id
if not await check_reaction_limit(
reaction_service,
guild_id,
reaction_service,
guild_id,
):
return
if not await check_existing_trigger(
reaction_service,
guild_id,
trigger_text,
reaction_service,
guild_id,
trigger_text,
):
return
@ -83,8 +83,8 @@ async def add_reaction(
async def check_reaction_limit(
reaction_service: CustomReactionsService,
guild_id: int,
reaction_service: CustomReactionsService,
guild_id: int,
) -> bool:
limit_reached = await reaction_service.count_custom_reactions(guild_id) >= 100
@ -95,9 +95,9 @@ async def check_reaction_limit(
async def check_existing_trigger(
reaction_service: CustomReactionsService,
guild_id: int,
trigger_text: str,
reaction_service: CustomReactionsService,
guild_id: int,
trigger_text: str,
) -> bool:
existing_trigger = await reaction_service.find_trigger(guild_id, trigger_text)

View file

@ -69,14 +69,14 @@ class Dailies:
"""
check_1: bool = (
self.claimed_at.date() == (self.time_now - timedelta(days=1)).date()
self.claimed_at.date() == (self.time_now - timedelta(days=1)).date()
)
check_2: bool = (
self.claimed_at.date() == (self.time_now - timedelta(days=2)).date()
self.claimed_at.date() == (self.time_now - timedelta(days=2)).date()
)
check_3: bool = (
self.claimed_at.date() == self.time_now.date()
and self.claimed_at < self.reset_time
self.claimed_at.date() == self.time_now.date()
and self.claimed_at < self.reset_time
)
return check_1 or check_2 or check_3

View file

@ -8,15 +8,15 @@ class CaseService:
pass
def create_case(
self,
guild_id: int,
target_id: int,
moderator_id: int,
action_type: str,
reason: Optional[str] = None,
duration: Optional[int] = None,
expires_at: Optional[str] = None,
modlog_message_id: Optional[int] = None,
self,
guild_id: int,
target_id: int,
moderator_id: int,
action_type: str,
reason: Optional[str] = None,
duration: Optional[int] = None,
expires_at: Optional[str] = None,
modlog_message_id: Optional[int] = None,
) -> int:
# Get the next case number for the guild
query: str = """
@ -63,10 +63,10 @@ class CaseService:
execute_query(query, (guild_id, case_number))
def edit_case_reason(
self,
guild_id: int,
case_number: int,
new_reason: Optional[str] = None,
self,
guild_id: int,
case_number: int,
new_reason: Optional[str] = None,
) -> bool:
query = """
UPDATE cases
@ -103,9 +103,9 @@ class CaseService:
return result[0] if result else None
def fetch_case_by_guild_and_number(
self,
guild_id: int,
case_number: int,
self,
guild_id: int,
case_number: int,
) -> Optional[Dict[str, Any]]:
query: str = """
SELECT * FROM cases
@ -126,9 +126,9 @@ class CaseService:
return results
def fetch_cases_by_target(
self,
guild_id: int,
target_id: int,
self,
guild_id: int,
target_id: int,
) -> List[Dict[str, Any]]:
query: str = """
SELECT * FROM cases
@ -139,9 +139,9 @@ class CaseService:
return results
def fetch_cases_by_moderator(
self,
guild_id: int,
moderator_id: int,
self,
guild_id: int,
moderator_id: int,
) -> List[Dict[str, Any]]:
query: str = """
SELECT * FROM cases
@ -155,9 +155,9 @@ class CaseService:
return results
def fetch_cases_by_action_type(
self,
guild_id: int,
action_type: str,
self,
guild_id: int,
action_type: str,
) -> List[Dict[str, Any]]:
query: str = """
SELECT * FROM cases

View file

@ -9,9 +9,9 @@ class CustomReactionsService:
pass
async def find_trigger(
self,
guild_id: int,
message_content: str,
self,
guild_id: int,
message_content: str,
) -> Optional[Dict[str, Any]]:
message_content = message_content.lower()
query = """
@ -24,8 +24,8 @@ class CustomReactionsService:
LIMIT 1
"""
if result := database.select_query(
query,
(guild_id, message_content, message_content, guild_id),
query,
(guild_id, message_content, message_content, guild_id),
):
reaction = result[0] # Get the first result from the list
return {
@ -96,15 +96,15 @@ class CustomReactionsService:
]
async def create_custom_reaction(
self,
guild_id: int,
creator_id: int,
trigger_text: str,
response: Optional[str] = None,
emoji_id: Optional[int] = None,
is_emoji: bool = False,
is_full_match: bool = False,
is_global: bool = True,
self,
guild_id: int,
creator_id: int,
trigger_text: str,
response: Optional[str] = None,
emoji_id: Optional[int] = None,
is_emoji: bool = False,
is_full_match: bool = False,
is_global: bool = True,
) -> bool:
if await self.count_custom_reactions(guild_id) >= 100:
return False
@ -130,13 +130,13 @@ class CustomReactionsService:
return True
async def edit_custom_reaction(
self,
reaction_id: int,
new_response: Optional[str] = None,
new_emoji_id: Optional[int] = None,
is_emoji: Optional[bool] = None,
is_full_match: Optional[bool] = None,
is_global: Optional[bool] = None,
self,
reaction_id: int,
new_response: Optional[str] = None,
new_emoji_id: Optional[int] = None,
is_emoji: Optional[bool] = None,
is_full_match: Optional[bool] = None,
is_global: Optional[bool] = None,
) -> bool:
query = """
UPDATE custom_reactions

View file

@ -30,11 +30,11 @@ class Comic:
"""
def __init__(
self,
xkcd_dict: dict[str, Any],
raw_image: bytes | None = None,
comic_url: str | None = None,
explanation_url: str | None = None,
self,
xkcd_dict: dict[str, Any],
raw_image: bytes | None = None,
comic_url: str | None = None,
explanation_url: str | None = None,
) -> None:
self.id: int | None = xkcd_dict.get("num")
self.date: datetime.date | None = self._determine_date(xkcd_dict)
@ -104,9 +104,9 @@ class Comic:
class Client:
def __init__(
self,
api_url: str = "https://xkcd.com",
explanation_wiki_url: str = "https://www.explainxkcd.com/wiki/index.php/",
self,
api_url: str = "https://xkcd.com",
explanation_wiki_url: str = "https://www.explainxkcd.com/wiki/index.php/",
) -> None:
self._api_url = api_url
self._explanation_wiki_url = explanation_wiki_url

View file

@ -132,9 +132,9 @@ class XpService:
@staticmethod
def generate_progress_bar(
current_value: int,
target_value: int,
bar_length: int = 10,
current_value: int,
target_value: int,
bar_length: int = 10,
) -> str:
"""
Generates an XP progress bar based on the current level and XP.