100 lines
3.9 KiB
Nim
100 lines
3.9 KiB
Nim
import json, discordobject, nimcordutils, asyncdispatch
|
|
|
|
type
|
|
PermissionType* = enum
|
|
permTypeRole,
|
|
permTypeMember
|
|
|
|
Permission* = enum
|
|
permCreateInstantInvite = 0x00000001,
|
|
permKickMembers = 0x00000002,
|
|
permBanMembers = 0x00000004,
|
|
permAdministrator = 0x00000008,
|
|
permManageChannels = 0x00000010,
|
|
permManageGuilds = 0x00000020,
|
|
permAddReactions = 0x00000040,
|
|
permViewAuditLog = 0x00000080,
|
|
permPrioritySpeaker = 0x00000100,
|
|
permStream = 0x00000200,
|
|
permReadMessages = 0x00000400,
|
|
permSendMessages = 0x00000800,
|
|
permSendTTSMessages = 0x00001000,
|
|
permManageMessages = 0x00002000,
|
|
permEmbedLinks = 0x00004000,
|
|
permAttachFiles = 0x00008000,
|
|
permReadMessageHistory = 0x00010000,
|
|
permMentionEveryoneHereAllRoles = 0x00020000,
|
|
permUseExternalEmojis = 0x00040000,
|
|
permConnect = 0x00100000,
|
|
permSpeak = 0x00200000,
|
|
permMuteMembers = 0x00400000,
|
|
permDeafenMembers = 0x00800000,
|
|
permMoveMembers = 0x01000000,
|
|
permUseVAD = 0x02000000,
|
|
permChangeNickname = 0x04000000,
|
|
permManageNicknames = 0x08000000,
|
|
permManageRoles = 0x10000000,
|
|
permManageWebhooks = 0x20000000,
|
|
permManageEmojis = 0x40000000
|
|
|
|
Permissions* = ref object
|
|
## This type referes to a user's permissions given by the role or per user.
|
|
roleUserID*: snowflake
|
|
allowPerms*: uint
|
|
denyPerms*: uint
|
|
permissionType*: PermissionType
|
|
|
|
proc newPermissions*(id: snowflake, `type`: PermissionType, byteSet: uint): Permissions =
|
|
## Create a new `Permissions` using an id, type, and byte set.
|
|
result = Permissions(roleUserID: id, permissionType: `type`, allowPerms: byteSet)
|
|
|
|
proc newPermissions*(json: JsonNode): Permissions =
|
|
## Parses a `Permissions` from json.
|
|
result = Permissions(
|
|
roleUserID: getIDFromJson(json["id"].getStr()),
|
|
allowPerms: uint(json["allow"].getInt()),
|
|
denyPerms: uint(json["deny"].getInt())
|
|
)
|
|
|
|
if (json["type"].getStr() == "role"):
|
|
result.permissionType = PermissionType.permTypeRole
|
|
else:
|
|
result.permissionType = PermissionType.permTypeMember
|
|
|
|
proc hasPermission*(perms: Permissions, perm: Permission): bool =
|
|
## Check if Permissions has a specific permission.
|
|
## This also checks if it is not a part of the denyPerms.
|
|
return (perms.allowPerms and uint(perm)) == uint(perm) and (perms.denyPerms and uint(perm)) != uint(perm)
|
|
|
|
proc addAllowPermission*(perms: Permissions, perm: Permission): Future[Permissions] {.async.} =
|
|
## Add a `Permission` to the `Permissions` allow values.
|
|
## If it finds the permission in denyPerms, it will remove it from that also.
|
|
|
|
# Check if the permission is in deny, and remove it.
|
|
if ((perms.denyPerms and uint(perm)) == uint(perm)):
|
|
perms.denyPerms = perms.denyPerms and (not uint(perm))
|
|
|
|
perms.allowPerms = perms.allowPerms or uint(perm)
|
|
|
|
proc addDenyPermission*(perms: Permissions, perm: Permission): Future[Permissions] {.async.} =
|
|
## Add a `Permission` to the `Permissions` deny values.
|
|
## If it finds the permission in allowPerms, it will remove it from that also.
|
|
|
|
# Check if the permission is in allowed, and remove it.
|
|
if ((perms.allowPerms and uint(perm)) == uint(perm)):
|
|
perms.allowPerms = perms.allowPerms and (not uint(perm))
|
|
|
|
perms.denyPerms = perms.denyPerms or uint(perm)
|
|
|
|
proc permissionsToJson*(perms: Permissions): JsonNode =
|
|
## Convert `Permissions` to json.
|
|
let json = %* {
|
|
"id": perms.roleUserID,
|
|
"allow": perms.allowPerms,
|
|
"deny": perms.denyPerms
|
|
}
|
|
|
|
if (perms.permissionType == PermissionType.permTypeMember):
|
|
json.add("type", %"member")
|
|
else:
|
|
json.add("type", %"role") |