From 62e2d30fdf76ce87a628fe2d7a062c057bcd3d5f Mon Sep 17 00:00:00 2001 From: "Nyeki.py" <84998222+Nekidev@users.noreply.github.com> Date: Thu, 17 Oct 2024 20:42:58 -0300 Subject: [PATCH] fix(bot): :bug: Fix reply argument conversion. --- payphone/bot.py | 5 ++++- payphone/cogs/mods/cog.py | 20 +++++++------------- payphone/core/converters.py | 37 ++++++++++++++++++++----------------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/payphone/bot.py b/payphone/bot.py index 1c4f7c4..68b0127 100644 --- a/payphone/bot.py +++ b/payphone/bot.py @@ -337,6 +337,9 @@ class Payphone(commands.AutoShardedBot): f"❌ You're going too fast! Wait `{int(exception.retry_after)}` seconds before trying again." ) + elif isinstance(exception, errors.NotOwner): + await context.send("❌ You're not the owner of this bot.") + elif isinstance(exception, errors.CommandNotFound): return @@ -378,7 +381,7 @@ async def is_channel_enabled(ctx: commands.Context) -> Literal[True]: if ctx.guild is None: return True - + if ctx.command.qualified_name in ["config enable", "config disable"]: return True diff --git a/payphone/cogs/mods/cog.py b/payphone/cogs/mods/cog.py index 2254294..4cb428f 100644 --- a/payphone/cogs/mods/cog.py +++ b/payphone/cogs/mods/cog.py @@ -28,7 +28,7 @@ class Mods(base.Cog): async def ban( self, ctx: commands.Context, - user: discord.User | discord.Member | converters.DiscordUser, + user: converters.DiscordUserID, time: converters.Timedelta | None = None, *, reason: str | None = "", @@ -42,13 +42,7 @@ class Mods(base.Cog): - `[]`: The reason of their ban. """ - user_id = None - - if isinstance(user, (discord.User, discord.Member)): - user_id = user.id - - else: - user_id = user + user_id = user profile = await models.Profile.filter(user_id=user_id).limit(1).first() @@ -88,7 +82,7 @@ class Mods(base.Cog): async def unban( self, ctx: commands.Context, - user: discord.User | discord.Member | converters.DiscordUser, + user: converters.DiscordUserID, ) -> None: """ Unbans a user by their ID, pinging them, or replying to their message. The user will be @@ -98,7 +92,7 @@ class Mods(base.Cog): - ``: The user to unban or their ID. """ - user_id = user if isinstance(user, int) else user.id + user_id = user await self.bot.unban(user_id) @@ -121,7 +115,7 @@ class Mods(base.Cog): async def warn( self, ctx: commands.Context, - user: discord.User | discord.Member | converters.DiscordUser, + user: converters.DiscordUserID, *, reason: str, ) -> None: @@ -133,7 +127,7 @@ class Mods(base.Cog): - ``: The reason of the warn. """ - user_id = user if isinstance(user, int) else user.id + user_id = user user = None @@ -316,7 +310,7 @@ class Mods(base.Cog): f"Profiles: {await models.Profile.all().count()}", f"Servers: {await models.Server.all().count()}", f"Shards: {self.bot.shard_count}", - f"Current Shard: {ctx.guild.shard_id + 1}" + f"Current Shard: {ctx.guild.shard_id + 1}", ] await ctx.send(f"```\n{"\n".join(stats)}\n```") diff --git a/payphone/core/converters.py b/payphone/core/converters.py index df71bbd..cf6ba66 100644 --- a/payphone/core/converters.py +++ b/payphone/core/converters.py @@ -3,6 +3,8 @@ from datetime import timedelta from discord.ext import commands from discord.ext.commands import converter +from tortoise import expressions + from payphone.db import models from payphone.core import exceptions @@ -38,10 +40,13 @@ class Timedelta(converter.Converter): ) -class DiscordUser(converter.Converter): +class DiscordUserID(converter.Converter): """Converts a URL, ID, or reply into a Discord User ID.""" - async def converter(self, ctx: commands.Context, argument: str) -> int: + async def convert(self, ctx: commands.Context, argument: str) -> int: + if len(argument) > 17 and argument[:2] == "<@" and argument[-1] == ">": + return int(argument[2:-1]) + if argument.isdecimal() and len(argument) in range(17, 19): return int(argument) @@ -50,27 +55,25 @@ class DiscordUser(converter.Converter): ): return int(argument.split("?", 1)[0].rsplit("/", 1)[1]) - if ctx.message.reference is not None: - ref = ctx.message.reference + if argument.lower() in ["reply", "."]: + if ctx.message.reference is not None: + ref = ctx.message.reference - if ref.cached_message is not None: - msg = ref.cached_message + msg = ref.cached_message or await ctx.channel().fetch_message( + ref.message_id + ) if msg.author.bot: - row = await models.Message.get_or_none(id=msg.id) + row = await models.Message.get_or_none( + expressions.Q(id=msg.id, propagation_id=msg.id, join_type="OR") + ) if row is not None: return row.user_id - raise ValueError() + raise converter.BadArgument() - return msg.author.id + else: + return msg.author.id - row = await models.Message.get_or_none(id=ref.message_id) - - if row is not None: - return row.user_id - - raise ValueError() - - raise ValueError() + raise converter.BadArgument()