diff --git a/payphone/cogs/admin/cog.py b/payphone/cogs/admin/cog.py index f307fb3..dbb644f 100644 --- a/payphone/cogs/admin/cog.py +++ b/payphone/cogs/admin/cog.py @@ -159,7 +159,7 @@ class Admin(base.Cog): - Bot Moderator """ - report = await models.Report.filter(resolved=False).first() + report = await models.Report.filter(resolved=False).select_related("reported_by").first() if report is None: return await ctx.send("✅ No reports left, have this cookie 🍪 !!") diff --git a/payphone/cogs/admin/views.py b/payphone/cogs/admin/views.py index f24ca40..61a34e5 100644 --- a/payphone/cogs/admin/views.py +++ b/payphone/cogs/admin/views.py @@ -57,7 +57,11 @@ class ReportView(discord.ui.View): self.report.resolved = True await self.report.save() - report = await models.Report.filter(resolved=False).first() + report = ( + await models.Report.filter(resolved=False) + .select_related("reported_by") + .first() + ) if report is None: self.stop() @@ -108,6 +112,16 @@ class ReportView(discord.ui.View): except discord.Forbidden: pass + try: + await ( + await self.bot.get_or_fetch_user(self.report.reported_by.id) + ).send( + f"🔔 You've helped us warn `{(await self.bot.get_or_fetch_user(self.report.user_id)).display_name}` with your report. Thank you so much!" + ) + + except discord.Forbidden: + pass + elif select.values[0] == "approve": embed = discord.Embed( color=constants.APPROVE_COLOR, @@ -198,6 +212,16 @@ class ReportView(discord.ui.View): except discord.Forbidden: pass + try: + await ( + await self.bot.get_or_fetch_user(self.report.reported_by.id) + ).send( + f"🔔 You've helped us ban `{(await self.bot.get_or_fetch_user(self.report.user_id)).display_name}` with your report. Thank you so much!" + ) + + except discord.Forbidden: + pass + @discord.ui.button(label="Skip", style=discord.ButtonStyle.gray) async def skip_callback( self, _button: discord.ui.Button, interaction: discord.Interaction diff --git a/payphone/cogs/calls/cog.py b/payphone/cogs/calls/cog.py index 0019afe..ee72a1e 100644 --- a/payphone/cogs/calls/cog.py +++ b/payphone/cogs/calls/cog.py @@ -216,7 +216,7 @@ class Calls(base.Cog): if message.author.bot or ctx.valid or message.author.system: return - if message.type in [discord.MessageType.default, discord.MessageType.reply]: + if message.type not in [discord.MessageType.default, discord.MessageType.reply]: return if await self.bot.is_banned(message.author.id): @@ -630,6 +630,7 @@ class Calls(base.Cog): "reply_user_avatar_url": ( replying_to.author.display_avatar.url if replying_to else None ), + "reported_by_id": ctx.author.id, }, ) diff --git a/payphone/db/migrations/models/14_20250319193241_update.py b/payphone/db/migrations/models/14_20250319193241_update.py new file mode 100644 index 0000000..066b691 --- /dev/null +++ b/payphone/db/migrations/models/14_20250319193241_update.py @@ -0,0 +1,13 @@ +from tortoise import BaseDBAsyncClient + + +async def upgrade(db: BaseDBAsyncClient) -> str: + return """ + ALTER TABLE "report" ADD "reported_by_id" BIGINT; + ALTER TABLE "report" ADD CONSTRAINT "fk_report_user_3a7d2f49" FOREIGN KEY ("reported_by_id") REFERENCES "user" ("id") ON DELETE CASCADE;""" + + +async def downgrade(db: BaseDBAsyncClient) -> str: + return """ + ALTER TABLE "report" DROP CONSTRAINT IF EXISTS "fk_report_user_3a7d2f49"; + ALTER TABLE "report" DROP COLUMN "reported_by_id";""" diff --git a/payphone/db/models.py b/payphone/db/models.py index f00876c..8247032 100644 --- a/payphone/db/models.py +++ b/payphone/db/models.py @@ -28,8 +28,13 @@ class Report(models.Model): reply_user_avatar_url = fields.TextField(null=True, default=None) created_at = fields.DatetimeField(auto_now_add=True) resolved = fields.BooleanField(default=False, index=True) + reported_by = fields.ForeignKeyField( + "models.User", related_name="reports", null=True + ) resolved_at = fields.DatetimeField(null=True) - resolved_by = fields.ForeignKeyField("models.User", null=True) + resolved_by = fields.ForeignKeyField( + "models.User", related_name="resolved_reports", null=True + ) class UserFlag(enum.IntFlag): @@ -150,7 +155,9 @@ class Ban(models.Model): created_at = fields.DatetimeField(auto_now_add=True) expires_at = fields.DatetimeField(null=True) created_by = fields.ForeignKeyField("models.User", related_name="created_bans") - expired_by = fields.ForeignKeyField("models.User", related_name="expired_bans", null=True) + expired_by = fields.ForeignKeyField( + "models.User", related_name="expired_bans", null=True + ) @property def is_expired(self) -> bool: @@ -158,7 +165,9 @@ class Ban(models.Model): Whether the ban is expired. """ - return self.expires_at is not None and self.expires_at < datetime.now(timezone.utc) + return self.expires_at is not None and self.expires_at < datetime.now( + timezone.utc + ) class Meta: """ diff --git a/uv.lock b/uv.lock index 7354e6d..d7bf8b2 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,4 @@ version = 1 -revision = 1 requires-python = ">=3.12" [[package]] @@ -128,7 +127,7 @@ version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/b5/e1e5fdf1c1bb7e6e614987c120a98d9324bf8edfaa5f5cd16a6235c9d91b/asyncclick-8.1.8.tar.gz", hash = "sha256:0f0eb0f280e04919d67cf71b9fcdfb4db2d9ff7203669c40284485c149578e4c", size = 232900 } wheels = [ @@ -198,7 +197,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -414,7 +413,7 @@ wheels = [ [[package]] name = "payphone" -version = "0.60.0" +version = "0.61.0" source = { virtual = "." } dependencies = [ { name = "aerich" },