Я пытаюсь позволить своему инструменту / сценарию определить, имеет ли зарегистрированный пользователь правильное разрешение на использование инструмента. однако Discord отвечает разрешением int.
Кажется, что я должен проверить разрешение, используя побитовый оператор, но из всего, что я гуглил или искал почти все, что я нахожу, кажется совершенно неактуальным.
Пример разрешения: 2146958591
Справки о разрешениях;
// General
generalCreateInstantInvite: 0x1,
generalKickMembers: 0x2,
generalBanMembers: 0x4,
generalAdministrator: 0x8,
generalManageChannels: 0x10,
generalManageServer: 0x20,
generalChangeNickname: 0x4000000,
generalManageNicknames: 0x8000000,
generalManageRoles: 0x10000000,
generalManageWebhooks: 0x20000000,
generalManageEmojis: 0x40000000,
generalViewAuditLog: 0x80,
// Text
textAddReactions: 0x40,
textReadMessages: 0x400,
textSendMessages: 0x800,
textSendTTSMessages: 0x1000,
textManageMessages: 0x2000,
textEmbedLinks: 0x4000,
textAttachFiles: 0x8000,
textReadMessageHistory: 0x10000,
textMentionEveryone: 0x20000,
textUseExternalEmojis: 0x40000,
// Voice
voiceViewChannel: 0x400,
voiceConnect: 0x100000,
voiceSpeak: 0x200000,
voiceMuteMembers: 0x400000,
voiceDeafenMembers: 0x800000,
voiceMoveMembers: 0x1000000,
voiceUseVAD: 0x2000000
Есть ли инструмент или пример сценария, который я могу изучить, чтобы определить, как выполняется этот расчет?
Заранее спасибо!
Представь, что у тебя есть 4
различные действия, которые вы хотите разрешить или запретить для каждого пользователя:
Давайте создадим 4-символьную строку 1
а также 0
, Первый символ в строке будет представлять пользователю возможность create post
действие. Второй персонаж — update post
, в третьих — read post
и четвертый — delete post
, Например, если у пользователя есть разрешения 1001
чем он может создавать сообщения и удалять сообщения, но не может обновлять и читать.
Какой самый эффективный способ хранения этих разрешений? У нас есть только 0
а также 1
в каждой позиции нашей строки, поэтому мы можем хранить эти данные не внутри строки, а внутри двоичного представления числа. Таким образом, разрешение пользователя будет некоторым десятичным числом, и каждый бит этого числа будет представлять разрешение для конкретного действия.
Например, наша строка разрешения 1001
будет просто десятичное число 9
(= 1*2^0 + 0*2^1 + 0*2^2 + 1*2^3
).
Мы можем представить каждое разрешение в двоичном виде:
1000
0100
0010
0001
Но как мы можем проверить, что у пользователя есть определенное разрешение или группа разрешений? Это просто, давайте использовать побитовый оператор &
:
Если разрешение пользователя равно 9
знак равно 1001
б, тогда:
1001 & 1000 = 1000
, 1000 > 0
— пользователь может создавать сообщения1001 & 0100 = 0000
, 0000 == 0
— пользователь не может обновлять сообщения1001 & 0010 = 0000
, 0000 == 0
— пользователь не может читать сообщения1001 & 0001 = 0001
, 0001 > 0
— пользователь может удалять сообщенияЧтобы проверить, имеет ли данное значение разрешения выбранное разрешение, вы используете побитовый оператор AND.
Пример этого:
$canKickMembers = ($permissionCode & 0x2) != 0;