module Discord.Internal.Types.RolePermissions
( PermissionFlag (..),
hasRolePermissions,
hasRolePermission,
newRolePermissions,
newRolePermission,
setRolePermissions,
setRolePermission,
clearRolePermissions,
clearRolePermission,
hasGuildMemberPermission,
)
where
import Data.Bits (Bits (complement, shift, (.&.), (.|.)))
import Discord.Internal.Types.Guild
( Guild,
Role (rolePerms),
roleIdToRole,
)
import Discord.Internal.Types.Prelude (RolePermissions)
import Discord.Internal.Types.User (GuildMember (memberRoles))
data PermissionFlag
= CREATE_INSTANT_INVITE
| KICK_MEMBERS
| BAN_MEMBERS
| ADMINISTRATOR
| MANAGE_CHANNELS
| MANAGE_GUILD
| ADD_REACTIONS
| VIEW_AUDIT_LOG
| PRIORITY_SPEAKER
| STREAM
| VIEW_CHANNEL
| SEND_MESSAGES
| SEND_TTS_MESSAGES
| MANAGE_MESSAGES
| EMBED_LINKS
| ATTACH_FILES
| READ_MESSAGE_HISTORY
| MENTION_EVERYONE
| USE_EXTERNAL_EMOJIS
| VIEW_GUILD_INSIGHT
| CONNECT
| SPEAK
| MUTE_MEMBERS
| DEAFEN_MEMBERS
| MOVE_MEMBERS
| USE_VAD
| CHANGE_NICKNAME
| MANAGE_NICKNAMES
| MANAGE_ROLES
| MANAGE_WEBHOOKS
| MANAGE_EMOJIS_AND_STICKERS
| USE_APPLICATION_COMMANDS
| REQUEST_TO_SPEAK
| MANAGE_EVENTS
| MANAGE_THREADS
| CREATE_PUBLIC_THREADS
| CREATE_PRIVATE_THREADS
| USE_EXTERNAL_STICKERS
| SEND_MESSAGES_IN_THREADS
| USE_EMBEDDED_ACTIVITIES
| MODERATE_MEMBERS
deriving (PermissionFlag -> PermissionFlag -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PermissionFlag -> PermissionFlag -> Bool
$c/= :: PermissionFlag -> PermissionFlag -> Bool
== :: PermissionFlag -> PermissionFlag -> Bool
$c== :: PermissionFlag -> PermissionFlag -> Bool
Eq, Eq PermissionFlag
PermissionFlag -> PermissionFlag -> Bool
PermissionFlag -> PermissionFlag -> Ordering
PermissionFlag -> PermissionFlag -> PermissionFlag
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PermissionFlag -> PermissionFlag -> PermissionFlag
$cmin :: PermissionFlag -> PermissionFlag -> PermissionFlag
max :: PermissionFlag -> PermissionFlag -> PermissionFlag
$cmax :: PermissionFlag -> PermissionFlag -> PermissionFlag
>= :: PermissionFlag -> PermissionFlag -> Bool
$c>= :: PermissionFlag -> PermissionFlag -> Bool
> :: PermissionFlag -> PermissionFlag -> Bool
$c> :: PermissionFlag -> PermissionFlag -> Bool
<= :: PermissionFlag -> PermissionFlag -> Bool
$c<= :: PermissionFlag -> PermissionFlag -> Bool
< :: PermissionFlag -> PermissionFlag -> Bool
$c< :: PermissionFlag -> PermissionFlag -> Bool
compare :: PermissionFlag -> PermissionFlag -> Ordering
$ccompare :: PermissionFlag -> PermissionFlag -> Ordering
Ord, Int -> PermissionFlag
PermissionFlag -> Int
PermissionFlag -> [PermissionFlag]
PermissionFlag -> PermissionFlag
PermissionFlag -> PermissionFlag -> [PermissionFlag]
PermissionFlag
-> PermissionFlag -> PermissionFlag -> [PermissionFlag]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: PermissionFlag
-> PermissionFlag -> PermissionFlag -> [PermissionFlag]
$cenumFromThenTo :: PermissionFlag
-> PermissionFlag -> PermissionFlag -> [PermissionFlag]
enumFromTo :: PermissionFlag -> PermissionFlag -> [PermissionFlag]
$cenumFromTo :: PermissionFlag -> PermissionFlag -> [PermissionFlag]
enumFromThen :: PermissionFlag -> PermissionFlag -> [PermissionFlag]
$cenumFromThen :: PermissionFlag -> PermissionFlag -> [PermissionFlag]
enumFrom :: PermissionFlag -> [PermissionFlag]
$cenumFrom :: PermissionFlag -> [PermissionFlag]
fromEnum :: PermissionFlag -> Int
$cfromEnum :: PermissionFlag -> Int
toEnum :: Int -> PermissionFlag
$ctoEnum :: Int -> PermissionFlag
pred :: PermissionFlag -> PermissionFlag
$cpred :: PermissionFlag -> PermissionFlag
succ :: PermissionFlag -> PermissionFlag
$csucc :: PermissionFlag -> PermissionFlag
Enum, Int -> PermissionFlag -> ShowS
[PermissionFlag] -> ShowS
PermissionFlag -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PermissionFlag] -> ShowS
$cshowList :: [PermissionFlag] -> ShowS
show :: PermissionFlag -> String
$cshow :: PermissionFlag -> String
showsPrec :: Int -> PermissionFlag -> ShowS
$cshowsPrec :: Int -> PermissionFlag -> ShowS
Show)
permissionBits :: PermissionFlag -> RolePermissions
permissionBits :: PermissionFlag -> RolePermissions
permissionBits PermissionFlag
p = forall a. Bits a => a -> Int -> a
shift RolePermissions
1 (forall a. Enum a => a -> Int
fromEnum PermissionFlag
p)
hasRolePermissions :: [PermissionFlag] -> RolePermissions -> Bool
hasRolePermissions :: [PermissionFlag] -> RolePermissions -> Bool
hasRolePermissions [PermissionFlag]
permissions RolePermissions
rolePermissions = forall a. Bits a => a -> a -> a
(.&.) RolePermissions
combinedPermissions RolePermissions
rolePermissions forall a. Eq a => a -> a -> Bool
== RolePermissions
combinedPermissions
where
combinedPermissions :: RolePermissions
combinedPermissions = [PermissionFlag] -> RolePermissions
combinePermissions [PermissionFlag]
permissions
hasRolePermission :: PermissionFlag -> RolePermissions -> Bool
hasRolePermission :: PermissionFlag -> RolePermissions -> Bool
hasRolePermission PermissionFlag
p RolePermissions
r = forall a. Bits a => a -> a -> a
(.&.) (PermissionFlag -> RolePermissions
permissionBits PermissionFlag
p) RolePermissions
r forall a. Ord a => a -> a -> Bool
> RolePermissions
0
newRolePermissions :: [PermissionFlag] -> RolePermissions
newRolePermissions :: [PermissionFlag] -> RolePermissions
newRolePermissions = [PermissionFlag] -> RolePermissions
combinePermissions
newRolePermission :: PermissionFlag -> RolePermissions
newRolePermission :: PermissionFlag -> RolePermissions
newRolePermission = PermissionFlag -> RolePermissions
permissionBits
setRolePermissions :: [PermissionFlag] -> RolePermissions -> RolePermissions
setRolePermissions :: [PermissionFlag] -> RolePermissions -> RolePermissions
setRolePermissions [PermissionFlag]
p RolePermissions
r = [PermissionFlag] -> RolePermissions
combinePermissions [PermissionFlag]
p forall a. Bits a => a -> a -> a
.|. RolePermissions
r
clearRolePermissions :: [PermissionFlag] -> RolePermissions -> RolePermissions
clearRolePermissions :: [PermissionFlag] -> RolePermissions -> RolePermissions
clearRolePermissions [PermissionFlag]
p RolePermissions
r = (forall a. Bits a => a -> a
complement forall b c a. (b -> c) -> (a -> b) -> a -> c
. [PermissionFlag] -> RolePermissions
combinePermissions) [PermissionFlag]
p forall a. Bits a => a -> a -> a
.&. RolePermissions
r
setRolePermission :: PermissionFlag -> RolePermissions -> RolePermissions
setRolePermission :: PermissionFlag -> RolePermissions -> RolePermissions
setRolePermission PermissionFlag
p = forall a. Bits a => a -> a -> a
(.|.) (PermissionFlag -> RolePermissions
permissionBits PermissionFlag
p)
clearRolePermission :: PermissionFlag -> RolePermissions -> RolePermissions
clearRolePermission :: PermissionFlag -> RolePermissions -> RolePermissions
clearRolePermission PermissionFlag
p = forall a. Bits a => a -> a -> a
(.&.) (forall a. Bits a => a -> a
complement forall b c a. (b -> c) -> (a -> b) -> a -> c
. PermissionFlag -> RolePermissions
permissionBits forall a b. (a -> b) -> a -> b
$ PermissionFlag
p)
combinePermissions :: [PermissionFlag] -> RolePermissions
combinePermissions :: [PermissionFlag] -> RolePermissions
combinePermissions = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (forall a. Bits a => a -> a -> a
(.|.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. PermissionFlag -> RolePermissions
permissionBits) RolePermissions
0
hasGuildMemberPermission :: Guild -> GuildMember -> PermissionFlag -> Bool
hasGuildMemberPermission :: Guild -> GuildMember -> PermissionFlag -> Bool
hasGuildMemberPermission Guild
g GuildMember
gm PermissionFlag
p = [RoleId] -> Bool
go (GuildMember -> [RoleId]
memberRoles GuildMember
gm)
where
go :: [RoleId] -> Bool
go [] = Bool
False
go (RoleId
x : [RoleId]
xs) = case Guild -> RoleId -> Maybe Role
roleIdToRole Guild
g RoleId
x of
Maybe Role
Nothing -> [RoleId] -> Bool
go [RoleId]
xs
Just Role
a -> PermissionFlag
p PermissionFlag -> RolePermissions -> Bool
`hasRolePermission` Role -> RolePermissions
rolePerms Role
a Bool -> Bool -> Bool
|| [RoleId] -> Bool
go [RoleId]
xs