You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
5.4 KiB
Lua

--[=[
@c Permissions
@t ui
@mt mem
@d Wrapper for a bitfield that is more specifically used to represent Discord
permissions. See the `permission` enumeration for acceptable permission values.
]=]
local enums = require('enums')
local Resolver = require('client/Resolver')
local permission = enums.permission
local format = string.format
local band, bor, bnot, bxor = bit.band, bit.bor, bit.bnot, bit.bxor
local sort, insert, concat = table.sort, table.insert, table.concat
local ALL = 0
for _, value in pairs(permission) do
ALL = bor(ALL, value)
end
local Permissions, get = require('class')('Permissions')
function Permissions:__init(value)
self._value = tonumber(value) or 0
end
--[=[
@m __tostring
@r string
@d Defines the behavior of the `tostring` function. Returns a readable list of
permissions stored for convenience of introspection.
]=]
function Permissions:__tostring()
if self._value == 0 then
return 'Permissions: 0 (none)'
else
local a = self:toArray()
sort(a)
return format('Permissions: %i (%s)', self._value, concat(a, ', '))
end
end
--[=[
@m fromMany
@t static
@p ... Permission-Resolvables
@r Permissions
@d Returns a Permissions object with all of the defined permissions.
]=]
function Permissions.fromMany(...)
local ret = Permissions()
ret:enable(...)
return ret
end
--[=[
@m all
@t static
@r Permissions
@d Returns a Permissions object with all permissions.
]=]
function Permissions.all()
return Permissions(ALL)
end
--[=[
@m __eq
@r boolean
@d Defines the behavior of the `==` operator. Allows permissions to be directly
compared according to their value.
]=]
function Permissions:__eq(other)
return self._value == other._value
end
local function getPerm(i, ...)
local v = select(i, ...)
local n = Resolver.permission(v)
if not n then
return error('Invalid permission: ' .. tostring(v), 2)
end
return n
end
--[=[
@m enable
@p ... Permission-Resolvables
@r nil
@d Enables a specific permission or permissions. See the `permission` enumeration
for acceptable permission values.
]=]
function Permissions:enable(...)
local value = self._value
for i = 1, select('#', ...) do
local perm = getPerm(i, ...)
value = bor(value, perm)
end
self._value = value
end
--[=[
@m disable
@p ... Permission-Resolvables
@r nil
@d Disables a specific permission or permissions. See the `permission` enumeration
for acceptable permission values.
]=]
function Permissions:disable(...)
local value = self._value
for i = 1, select('#', ...) do
local perm = getPerm(i, ...)
value = band(value, bnot(perm))
end
self._value = value
end
--[=[
@m has
@p ... Permission-Resolvables
@r boolean
@d Returns whether this set has a specific permission or permissions. See the
`permission` enumeration for acceptable permission values.
]=]
function Permissions:has(...)
local value = self._value
for i = 1, select('#', ...) do
local perm = getPerm(i, ...)
if band(value, perm) == 0 then
return false
end
end
return true
end
--[=[
@m enableAll
@r nil
@d Enables all permissions values.
]=]
function Permissions:enableAll()
self._value = ALL
end
--[=[
@m disableAll
@r nil
@d Disables all permissions values.
]=]
function Permissions:disableAll()
self._value = 0
end
--[=[
@m toHex
@r string
@d Returns the hexadecimal string that represents the permissions value.
]=]
function Permissions:toHex()
return format('0x%08X', self._value)
end
--[=[
@m toTable
@r table
@d Returns a table that represents the permissions value, where the keys are the
permission names and the values are `true` or `false`.
]=]
function Permissions:toTable()
local ret = {}
local value = self._value
for k, v in pairs(permission) do
ret[k] = band(value, v) > 0
end
return ret
end
--[=[
@m toArray
@r table
@d Returns an array of the names of the permissions that this object represents.
]=]
function Permissions:toArray()
local ret = {}
local value = self._value
for k, v in pairs(permission) do
if band(value, v) > 0 then
insert(ret, k)
end
end
return ret
end
--[=[
@m union
@p other Permissions
@r Permissions
@d Returns a new Permissions object that contains the permissions that are in
either `self` or `other` (bitwise OR).
]=]
function Permissions:union(other)
return Permissions(bor(self._value, other._value))
end
--[=[
@m intersection
@p other Permissions
@r Permissions
@d Returns a new Permissions object that contains the permissions that are in
both `self` and `other` (bitwise AND).
]=]
function Permissions:intersection(other) -- in both
return Permissions(band(self._value, other._value))
end
--[=[
@m difference
@p other Permissions
@r Permissions
@d Returns a new Permissions object that contains the permissions that are not
in `self` or `other` (bitwise XOR).
]=]
function Permissions:difference(other) -- not in both
return Permissions(bxor(self._value, other._value))
end
--[=[
@m complement
@p other Permissions
@r Permissions
@d Returns a new Permissions object that contains the permissions that are not
in `self`, but are in `other` (or the set of all permissions if omitted).
]=]
function Permissions:complement(other) -- in other not in self
local value = other and other._value or ALL
return Permissions(band(bnot(self._value), value))
end
--[=[
@m copy
@r Permissions
@d Returns a new copy of the original permissions object.
]=]
function Permissions:copy()
return Permissions(self._value)
end
--[=[@p value number The raw decimal value that represents the permissions value.]=]
function get.value(self)
return self._value
end
return Permissions