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
255 lines
5.4 KiB
Lua
3 years ago
|
--[=[
|
||
|
@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
|