From e5f986191fcf90c0b2f54aa31e77130841c739c3 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 29 Mar 2025 15:45:52 +0000 Subject: [PATCH 1/3] =?UTF-8?q?chore:=20=F0=9F=94=96=20Bump=20version.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 35c3e93..c444e89 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "payphone" -version = "0.66.0" +version = "0.67.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 3e6d837..28f8bf4 100644 --- a/uv.lock +++ b/uv.lock @@ -414,7 +414,7 @@ wheels = [ [[package]] name = "payphone" -version = "0.65.0" +version = "0.66.0" source = { virtual = "." } dependencies = [ { name = "aerich" }, From d0f8962654847634ecaa9aedf20ba41f76571795 Mon Sep 17 00:00:00 2001 From: Rafael Bradley Date: Sun, 30 Mar 2025 23:53:27 -0300 Subject: [PATCH 2/3] feat(shard): :sparkles: Ban people with over 3 warns, even if the moderator specifies a warn. --- payphone/cogs/admin/cog.py | 9 ++++++++- payphone/cogs/admin/views.py | 11 +++++++++-- payphone/core/calls.py | 4 +++- .../models/15_20250330150313_update.py | 19 +++++++++++++++++++ payphone/db/models.py | 10 ++++++++++ uv.lock | 2 +- 6 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 payphone/db/migrations/models/15_20250330150313_update.py diff --git a/payphone/cogs/admin/cog.py b/payphone/cogs/admin/cog.py index f90f04c..76c8587 100644 --- a/payphone/cogs/admin/cog.py +++ b/payphone/cogs/admin/cog.py @@ -115,6 +115,9 @@ class Admin(base.Cog): except discord.Forbidden: pass + user: models.User = await models.User.get(id=user.id) + user.set_cache(self.bot.redis) + @commands.command(aliases=["sup"]) @commands.is_owner() async def supporter( @@ -159,7 +162,11 @@ class Admin(base.Cog): - Bot Moderator """ - report = await models.Report.filter(resolved=False).select_related("reported_by").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 aba48b8..7b51ec5 100644 --- a/payphone/cogs/admin/views.py +++ b/payphone/cogs/admin/views.py @@ -79,7 +79,7 @@ class ReportView(discord.ui.View): user = await models.User.get_cache_or_db(self.bot.redis, self.report.user_id) - if select.values[0] == "warn": + if select.values[0] == "warn" and user.warns_count < 3: user.warns_count += 1 await user.save(force_update=True) await user.set_cache(self.bot.redis) @@ -104,6 +104,13 @@ class ReportView(discord.ui.View): ), ) + warn = models.Warn( + user_id=self.report.user_id, + report=self.report, + created_by_id=interaction.user.id, + ) + await warn.save() + try: await (await self.bot.get_or_fetch_user(self.report.user_id)).send( embed=embed @@ -156,7 +163,7 @@ class ReportView(discord.ui.View): expires_at = None - if select.values[0] == "ban": + if select.values[0] in ["ban", "warn"]: expiry_times = { 1: datetime.now(timezone.utc) + timedelta(days=1), 2: datetime.now(timezone.utc) + timedelta(days=7), diff --git a/payphone/core/calls.py b/payphone/core/calls.py index f3bbc8e..31b472d 100644 --- a/payphone/core/calls.py +++ b/payphone/core/calls.py @@ -2,6 +2,8 @@ from dataclasses import dataclass import orjson +import discord + from payphone.db import models from payphone.bot import Payphone from payphone.core import masks @@ -551,7 +553,7 @@ class CallHandler: return for webhook in await channel.webhooks(): - if webhook.name == "Payphone" and webhook.token is not None: + if webhook.user == self.bot.user and webhook.token is not None: await self.bot.redis.hset( "calls:channels:webhooks", channel_id, webhook.url ) diff --git a/payphone/db/migrations/models/15_20250330150313_update.py b/payphone/db/migrations/models/15_20250330150313_update.py new file mode 100644 index 0000000..ab19f5f --- /dev/null +++ b/payphone/db/migrations/models/15_20250330150313_update.py @@ -0,0 +1,19 @@ +from tortoise import BaseDBAsyncClient + + +async def upgrade(db: BaseDBAsyncClient) -> str: + return """ + CREATE TABLE IF NOT EXISTS "warn" ( + "id" SERIAL NOT NULL PRIMARY KEY, + "user_id" BIGINT NOT NULL, + "reason" TEXT, + "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + "created_by_id" BIGINT NOT NULL REFERENCES "user" ("id") ON DELETE CASCADE, + "report_id" BIGINT REFERENCES "report" ("id") ON DELETE CASCADE +); +COMMENT ON TABLE "warn" IS 'A warn.';""" + + +async def downgrade(db: BaseDBAsyncClient) -> str: + return """ + DROP TABLE IF EXISTS "warn";""" diff --git a/payphone/db/models.py b/payphone/db/models.py index 8247032..d631327 100644 --- a/payphone/db/models.py +++ b/payphone/db/models.py @@ -144,6 +144,16 @@ class User(models.Model): ) +class Warn(models.Model): + """A warn.""" + + user_id = fields.BigIntField() + report = fields.ForeignKeyField("models.Report", null=True) + reason = fields.TextField(null=True, default=None) + created_at = fields.DatetimeField(auto_now_add=True) + created_by = fields.ForeignKeyField("models.User", related_name="created_warns") + + class Ban(models.Model): """ A ban. diff --git a/uv.lock b/uv.lock index 10f8ff4..3e6d837 100644 --- a/uv.lock +++ b/uv.lock @@ -414,7 +414,7 @@ wheels = [ [[package]] name = "payphone" -version = "0.64.0" +version = "0.65.0" source = { virtual = "." } dependencies = [ { name = "aerich" }, From 688d28140f80f2a9cf4ab38b88c3eac72783fd39 Mon Sep 17 00:00:00 2001 From: Rafael Bradley Date: Mon, 31 Mar 2025 11:37:36 -0300 Subject: [PATCH 3/3] feat(shard): :sparkles: Prevent non-participants from hanging up or skipping calls. --- payphone/cogs/admin/cog.py | 2 +- payphone/cogs/calls/cog.py | 18 ++++++++++++++++++ uv.lock | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/payphone/cogs/admin/cog.py b/payphone/cogs/admin/cog.py index 76c8587..a9a740e 100644 --- a/payphone/cogs/admin/cog.py +++ b/payphone/cogs/admin/cog.py @@ -116,7 +116,7 @@ class Admin(base.Cog): pass user: models.User = await models.User.get(id=user.id) - user.set_cache(self.bot.redis) + await user.set_cache(self.bot.redis) @commands.command(aliases=["sup"]) @commands.is_owner() diff --git a/payphone/cogs/calls/cog.py b/payphone/cogs/calls/cog.py index a32a42f..9752ed1 100644 --- a/payphone/cogs/calls/cog.py +++ b/payphone/cogs/calls/cog.py @@ -73,6 +73,15 @@ class Calls(base.Cog): f"☎️ You're not on a call! Use `{ctx.clean_prefix}call` to start one." ) + call = await self.bot.call_handler.get_call_by_channel_id(ctx.channel.id) + + participant = await call.get_participant(ctx.author.id) + + if participant is None: + return await ctx.send( + "❌ You cannot skip a call you have not participated in." + ) + channels = await self.bot.call_handler.skip(ctx.channel.id) for channel in channels: @@ -104,6 +113,15 @@ class Calls(base.Cog): f"☎️ You're not on a call! Use `{ctx.clean_prefix}call` to start one." ) + call = await self.bot.call_handler.get_call_by_channel_id(ctx.channel.id) + + participant = await call.get_participant(ctx.author.id) + + if participant is None: + return await ctx.send( + "❌ You cannot hang up a call you have not participated in." + ) + channels = await self.bot.call_handler.hangup(ctx.channel.id) other_channel = channels[0] if channels[0] != ctx.channel.id else channels[1] diff --git a/uv.lock b/uv.lock index 28f8bf4..9e1e936 100644 --- a/uv.lock +++ b/uv.lock @@ -414,7 +414,7 @@ wheels = [ [[package]] name = "payphone" -version = "0.66.0" +version = "0.67.0" source = { virtual = "." } dependencies = [ { name = "aerich" },