55from io import BytesIO
66from typing import TYPE_CHECKING , Optional
77
8- from nextcord import User , Message , Member , Guild , NotFound , File
8+ from nextcord import User , Message , Member , Guild , NotFound , File , Interaction
99from nextcord .ext import commands
1010from nextcord .ext .commands import Context
1111from uwuipy import Uwuipy
@@ -43,28 +43,42 @@ async def get_guild_member(guild: Guild, user_id: int) -> Optional[Member]:
4343 return None
4444
4545
46- def is_bot_author (user_id : int ) -> bool :
47- logger .info ("Checking if someone is the author" , extra = {"user_id" : user_id })
48- return user_id == 227473074616795137
46+ async def l4_only (ctx : Context | Interaction ) -> bool :
47+ return await permission_check (ctx , level = 4 )
4948
5049
51- async def l4_only (ctx : Context ) -> bool :
52- logger .info ("Checking if someone is a T3" , extra = user_info (ctx .author ))
53- return is_bot_author (ctx .author .id ) or await permission_check (ctx , level = 4 )
54-
55-
56- async def mod_only (ctx : Context ) -> bool :
57- logger .info ("Checking if someone is a Moderator" , extra = user_info (ctx .author ))
58- return is_bot_author (ctx .author .id ) or await permission_check (ctx , level = 6 )
50+ async def mod_only (ctx : Context | Interaction ) -> bool :
51+ return await permission_check (ctx , level = 6 )
5952
6053
6154@singledispatch
6255async def permission_check (_ctx_or_member , * , level : int ) -> bool : ...
6356
6457
58+ @permission_check .register
59+ async def _permission_check_itr (itr : Interaction , * , level : int ) -> bool :
60+ logger .info (f"Checking if a user (from an Interaction) has permission level { level } " , extra = user_info (itr .user ))
61+ main_guild_id = config .Misc .fetch ("main_guild_id" )
62+ main_guild = await itr .client .fetch_guild (main_guild_id )
63+
64+ if main_guild is None :
65+ raise LookupError (f"Unable to retrieve the guild { main_guild_id } . Is this the guild you meant?" )
66+
67+ if (main_guild_member := await get_guild_member (main_guild , itr .user .id )) is None :
68+ logger .warning (
69+ "Checked permissions for someone but they weren't in the main guild" ,
70+ extra = user_info (itr .user ),
71+ )
72+ return False
73+
74+ return await _permission_check_member (main_guild_member , threshold_level = level )
75+
76+
6577@permission_check .register
6678async def _permission_check_ctx (ctx : Context , * , level : int ) -> bool :
6779
80+ logger .info (f"Checking if a user (from a Context) has permission level { level } " , extra = user_info (ctx .author ))
81+
6882 main_guild_id = config .Misc .fetch ("main_guild_id" )
6983 main_guild = await ctx .bot .fetch_guild (main_guild_id )
7084
@@ -84,6 +98,9 @@ async def _permission_check_ctx(ctx: Context, *, level: int) -> bool:
8498@permission_check .register
8599async def _permission_check_member (member : Member , * , threshold_level : int ) -> bool :
86100 """Checks permissions for a member assuming they are in the main guild."""
101+
102+ logger .info (f"Checking if a user (from a Member) has permission level { threshold_level } " , extra = user_info (member ))
103+
87104 logpayload = user_info (member )
88105 logpayload ["level" ] = threshold_level
89106
@@ -96,8 +113,8 @@ async def _permission_check_member(member: Member, *, threshold_level: int) -> b
96113 extra = logpayload ,
97114 )
98115
99- perm_roles = config .PermissionRoles .fetch_ge_lvl (threshold_level )
100116 user_roles = {role .id for role in member .roles }
117+ perm_roles = config .PermissionRoles .fetch_ge_lvl (threshold_level )
101118 user_roles_above_threshold = {role for role in perm_roles if role .role_id in user_roles }
102119
103120 if user_roles_above_threshold :
0 commit comments