Discord битовый калькулятор разрешений

Я пытаюсь позволить своему инструменту / сценарию определить, имеет ли зарегистрированный пользователь правильное разрешение на использование инструмента. однако 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

Есть ли инструмент или пример сценария, который я могу изучить, чтобы определить, как выполняется этот расчет?

Заранее спасибо!

0

Решение

Представь, что у тебя есть 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 — пользователь может удалять сообщения
2

Другие решения

Чтобы проверить, имеет ли данное значение разрешения выбранное разрешение, вы используете побитовый оператор AND.

Пример этого:

$canKickMembers = ($permissionCode & 0x2) != 0;
2

По вопросам рекламы [email protected]