Skip to content

Permissions

Permission bitfield helpers. Functions on the Lingo module delegate to Lingo.Permissions.

Checking Permissions

has_permission?(bitfield, permission)

Check if a bitfield includes a permission.

elixir
Lingo.has_permission?(member.permissions, :manage_messages)

bitfield can be an integer or a string (Discord sends permissions as strings).

has_all_permissions?(bitfield, permissions)

Check if a bitfield includes all of the listed permissions.

elixir
Lingo.has_all_permissions?(perms, [:manage_messages, :manage_channels])

has_any_permission?(bitfield, permissions)

Check if a bitfield includes at least one of the listed permissions.

permission_list(bitfield)

Convert a bitfield to a list of permission atoms.

elixir
Lingo.permission_list(member.permissions)
# [:send_messages, :view_channel, :read_message_history, ...]

resolve_permissions(permissions)

Convert a list of permission atoms to a bitfield integer.

elixir
Lingo.Permissions.resolve([:send_messages, :embed_links])
# 18432

Computing Effective Permissions

compute_permissions(everyone_perms, role_ids, roles, overwrites \\ [], member_id \\ nil)

Compute a member's effective permissions in a channel.

elixir
guild = Lingo.cached_guild(guild_id)
member = Lingo.cached_member(guild_id, user_id)
channel = Lingo.cached_channel(channel_id)
roles = Lingo.cached_roles(guild_id)

everyone_role = Enum.find(roles, &(&1.id == guild_id))

perms = Lingo.compute_permissions(
  everyone_role.permissions,
  member.roles,
  roles,
  channel.permission_overwrites,
  user_id
)

if Lingo.has_permission?(perms, :send_messages) do
  # can send messages in this channel
end

The computation follows Discord's permission algorithm:

  1. Start with the @everyone role permissions
  2. OR in permissions from the member's roles
  3. If the result includes administrator, return all permissions
  4. Apply channel overwrites: @everyone overwrite, then role overwrites, then member overwrite

All Permissions

PermissionBit
:create_instant_invite0
:kick_members1
:ban_members2
:administrator3
:manage_channels4
:manage_guild5
:add_reactions6
:view_audit_log7
:priority_speaker8
:stream9
:view_channel10
:send_messages11
:send_tts_messages12
:manage_messages13
:embed_links14
:attach_files15
:read_message_history16
:mention_everyone17
:use_external_emojis18
:view_guild_insights19
:connect20
:speak21
:mute_members22
:deafen_members23
:move_members24
:use_vad25
:change_nickname26
:manage_nicknames27
:manage_roles28
:manage_webhooks29
:manage_guild_expressions30
:use_application_commands31
:request_to_speak32
:manage_events33
:manage_threads34
:create_public_threads35
:create_private_threads36
:use_external_stickers37
:send_messages_in_threads38
:use_embedded_activities39
:moderate_members40
:view_creator_monetization_analytics41
:use_soundboard42
:create_guild_expressions43
:create_events44
:use_external_sounds45
:send_voice_messages46
:send_polls49
:use_external_apps50
:pin_messages51
:bypass_slowmode52

Lingo.Permissions.all_permissions() returns the full list of permission atoms.