From 7a40ca2cea0433311f3067659eeb32421fdaaa3c Mon Sep 17 00:00:00 2001 From: Conatum Date: Sun, 27 Aug 2023 08:23:36 +0300 Subject: [PATCH] fix (timers): Correct permissions for stop. --- src/modules/pomodoro/timer.py | 2 ++ src/modules/pomodoro/ui/status.py | 47 +++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/modules/pomodoro/timer.py b/src/modules/pomodoro/timer.py index ef43af0d..4878d2a4 100644 --- a/src/modules/pomodoro/timer.py +++ b/src/modules/pomodoro/timer.py @@ -305,6 +305,8 @@ class Timer: role = TimerRole.ADMIN elif member.id == self.data.ownerid: role = TimerRole.OWNER + elif self.channel and self.channel.permissions_for(member).manage_channels: + role = TimerRole.MANAGER elif (roleid := self.data.manager_roleid) and roleid in (r.id for r in member.roles): role = TimerRole.MANAGER else: diff --git a/src/modules/pomodoro/ui/status.py b/src/modules/pomodoro/ui/status.py index 7a7dfc73..c9cd7d74 100644 --- a/src/modules/pomodoro/ui/status.py +++ b/src/modules/pomodoro/ui/status.py @@ -78,7 +78,8 @@ class TimerStatusUI(LeoUI): t = self.bot.translator.t error_msg = t(_p( 'ui:timer_status|button:edit|error:no_permissions', - "Configuring this timer requires guild admin permissions or the configured manager role!" + "Configuring this timer requires `MANAGE_CHANNEL` permissions on " + "the timer channel, or the configured manager role!" )) embed = discord.Embed( colour=discord.Colour.brand_red(), @@ -114,9 +115,25 @@ class TimerStatusUI(LeoUI): ephemeral=True ) else: - # Start the timer - await press.response.defer() - await self.timer.start() + role = self.timer.get_member_role(press.user) + if role >= TimerRole.MANAGER or self.timer.auto_restart: + # Start the timer + await press.response.defer() + await self.timer.start() + else: + embed = discord.Embed( + colour=discord.Colour.brand_red(), + title=t(_p( + 'ui:timer_status|button:start|error:not_manager|title', + "Insufficient permissions!" + )), + description=t(_p( + 'ui:timer_status|button:start|error:not_manager|desc', + "Starting this timer requires `MANAGE_CHANNEL` permissions on " + "the timer channel, or the configured `manager_role`!" + )) + ) + await press.response.send_message(embed=embed, ephemeral=True) async def refresh_start_button(self): t = self.bot.translator.t @@ -132,8 +149,26 @@ class TimerStatusUI(LeoUI): Note that unlike starting, stopping is allowed to be idempotent. """ - await press.response.defer() - await self.timer.stop() + t = self.bot.translator.t + role = self.timer.get_member_role(press.user) + if role >= TimerRole.MANAGER: + # Stop the timer + await press.response.defer() + await self.timer.stop() + else: + embed = discord.Embed( + colour=discord.Colour.brand_red(), + title=t(_p( + 'ui:timer_status|button:stop|error:not_manager|title', + "Insufficient permissions!" + )), + description=t(_p( + 'ui:timer_status|button:stop|error:not_manager|desc', + "Stopping this timer requires `MANAGE_CHANNEL` permissions on " + "the timer channel, or the configured `manager_role`!" + )) + ) + await press.response.send_message(embed=embed, ephemeral=True) async def refresh_stop_button(self): t = self.bot.translator.t