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.
283 lines
6.3 KiB
Lua
283 lines
6.3 KiB
Lua
3 years ago
|
local discordia = require("discordia")
|
||
|
local endpoints = require('./endpoints')
|
||
|
local f = string.format
|
||
|
local Snowflake_m = discordia.class.classes.Snowflake
|
||
|
local AC, ACgetters = discordia.class('ApplicationCommand', Snowflake_m)
|
||
|
|
||
|
local function recursiveOptionsMap(t)
|
||
|
local map = {}
|
||
|
|
||
|
for _, v in ipairs(t) do
|
||
|
local name = string.lower(v.name)
|
||
|
v.name = name
|
||
|
map[name] = v
|
||
|
|
||
|
if v.options then
|
||
|
v.mapoptions = recursiveOptionsMap(v.options)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return map
|
||
|
end
|
||
|
|
||
|
function AC:__init(data, parent)
|
||
|
self._id = data.id
|
||
|
self._parent = parent
|
||
|
self._name = data.name
|
||
|
self._description = data.description
|
||
|
self._default_permission = data.default_permission
|
||
|
self._version = data.version
|
||
|
self._callback = data.callback
|
||
|
self._guild = parent._id and parent
|
||
|
|
||
|
if not self._options then
|
||
|
self._options = data.options or {}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function AC:publish()
|
||
|
if self._id then return self:edit() end
|
||
|
local g = self._guild
|
||
|
|
||
|
if not g then
|
||
|
local res, err = self.client._api:request('POST', f(endpoints.COMMANDS, self.client._slashid), {
|
||
|
name = self._name,
|
||
|
description = self._description,
|
||
|
options = self._options,
|
||
|
default_permission = self._default_permission
|
||
|
})
|
||
|
|
||
|
if not res then
|
||
|
return nil, err
|
||
|
else
|
||
|
self._id = res.id
|
||
|
|
||
|
return self
|
||
|
end
|
||
|
else
|
||
|
local res, err = self.client._api:request('POST', f(endpoints.COMMANDS_GUILD, self.client._slashid, g._id), {
|
||
|
name = self._name,
|
||
|
description = self._description,
|
||
|
options = self._options,
|
||
|
default_permission = self._default_permission
|
||
|
})
|
||
|
|
||
|
if not res then
|
||
|
return nil, err
|
||
|
else
|
||
|
self._id = res.id
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function AC:edit()
|
||
|
local g = self._guild
|
||
|
|
||
|
if not g then
|
||
|
local res, err = self.client._api:request('PATCH', f(endpoints.COMMANDS_MODIFY, self.client._slashid, self._id), {
|
||
|
name = self._name,
|
||
|
description = self._description,
|
||
|
options = self._options,
|
||
|
default_permission = self._default_permission
|
||
|
})
|
||
|
|
||
|
if not res then
|
||
|
return nil, err
|
||
|
else
|
||
|
return true
|
||
|
end
|
||
|
else
|
||
|
local res, err = self.client._api:request('PATCH', f(endpoints.COMMANDS_MODIFY_GUILD, self.client._slashid, g._id, self._id), {
|
||
|
name = self._name,
|
||
|
description = self._description,
|
||
|
options = self._options,
|
||
|
default_permission = self._default_permission
|
||
|
})
|
||
|
|
||
|
if not res then
|
||
|
return nil, err
|
||
|
else
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function AC:setName(name)
|
||
|
self._name = name
|
||
|
end
|
||
|
|
||
|
function AC:setDescription(description)
|
||
|
self._description = description
|
||
|
end
|
||
|
|
||
|
function AC:setOptions(options)
|
||
|
self._options = options
|
||
|
end
|
||
|
|
||
|
function AC:setCallback(callback)
|
||
|
self._callback = callback
|
||
|
end
|
||
|
|
||
|
function AC:delete()
|
||
|
local g = self._guild
|
||
|
|
||
|
if not g then
|
||
|
self.client._api:request('DELETE', f(endpoints.COMMANDS_MODIFY, self.client._slashid, self._id))
|
||
|
self.client._globalCommands:_delete(self._id)
|
||
|
else
|
||
|
self.client._api:request('DELETE', f(endpoints.COMMANDS_MODIFY_GUILD, self.client._slashid, g._id, self._id))
|
||
|
g._slashCommands:_delete(self._id)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function AC:getPermissions(g)
|
||
|
g = self._guild or g
|
||
|
|
||
|
if not g then
|
||
|
error("Guild is required")
|
||
|
end
|
||
|
|
||
|
local stat, err = self.client._api:request('GET', f(endpoints.COMMAND_PERMISSIONS_MODIFY, self.client._slashid, g._id, self._id))
|
||
|
|
||
|
if stat then
|
||
|
return stat.permissions
|
||
|
else
|
||
|
return stat, err
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function AC:addPermission(perm, g)
|
||
|
g = self._guild or g
|
||
|
|
||
|
if not g then
|
||
|
error("Guild is required")
|
||
|
end
|
||
|
|
||
|
if not self._permissions then
|
||
|
self._permissions = self:getPermissions(g) or {}
|
||
|
end
|
||
|
|
||
|
for k, v in ipairs(self._permissions) do
|
||
|
if v.id == perm.id and v.type == perm.type then
|
||
|
if v.permission == perm.permission then return end
|
||
|
self._permissions[k] = perm
|
||
|
goto found
|
||
|
end
|
||
|
end
|
||
|
|
||
|
do
|
||
|
self._permissions[#self._permissions + 1] = perm
|
||
|
end
|
||
|
|
||
|
::found::
|
||
|
|
||
|
return self.client._api:request('PUT', f(endpoints.COMMAND_PERMISSIONS_MODIFY, self.client._slashid, g._id, self._id), {
|
||
|
permissions = self._permissions
|
||
|
})
|
||
|
end
|
||
|
|
||
|
function AC:removePermission(perm, g)
|
||
|
g = self._guild or g
|
||
|
|
||
|
if not g then
|
||
|
error("Guild is required")
|
||
|
end
|
||
|
|
||
|
if not self._permissions then
|
||
|
self._permissions = self:getPermissions(g) or {}
|
||
|
end
|
||
|
|
||
|
for k, v in ipairs(self._permissions) do
|
||
|
if v.id == perm.id and v.type == perm.type then
|
||
|
table.remove(self._permissions, k)
|
||
|
return
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return self.client._api:request('PUT', f(endpoints.COMMAND_PERMISSIONS_MODIFY, self.client._slashid, g._id, self._id), {
|
||
|
permissions = self._permissions
|
||
|
})
|
||
|
end
|
||
|
|
||
|
local function recursiveCompare(a, b, checked)
|
||
|
checked = checked or {}
|
||
|
if checked[a] or checked[b] then return true end
|
||
|
local inner_checked = {}
|
||
|
|
||
|
for k, v in pairs(a) do
|
||
|
if type(v) == "table" and type(b[k]) == "table" then
|
||
|
if not recursiveCompare(v, b[k], checked) then return false end
|
||
|
elseif v ~= b[k] then
|
||
|
print("k: ", k, "a[k]:", v, "b[k]: ", b[k])
|
||
|
|
||
|
return false
|
||
|
else
|
||
|
inner_checked[k] = true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
for k, v in pairs(b) do
|
||
|
if inner_checked[k] then
|
||
|
goto skip
|
||
|
end
|
||
|
|
||
|
if type(v) == "table" and type(a[k]) == "table" then
|
||
|
if not recursiveCompare(v, a[k], checked) then return false end
|
||
|
elseif v ~= a[k] then
|
||
|
print("k: ", k, "a[k]:", a[k], "b[k]: ", v)
|
||
|
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
::skip::
|
||
|
end
|
||
|
|
||
|
checked[a], checked[b] = true, true
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
function AC:_compare(cmd)
|
||
|
if self._name ~= cmd._name or self._description ~= cmd._description or self._default_permission ~= cmd._default_permission then return false end
|
||
|
if not self._options and cmd._options then return false end
|
||
|
if not recursiveCompare(self._options, cmd._options) then return false end
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
function AC:_merge(cmd)
|
||
|
self._name = cmd._name
|
||
|
self._description = cmd._description
|
||
|
self._options = cmd._options
|
||
|
self._callback = cmd._callback
|
||
|
self._default_permission = cmd._default_permission
|
||
|
self:edit()
|
||
|
end
|
||
|
|
||
|
function ACgetters:name()
|
||
|
return self._name
|
||
|
end
|
||
|
|
||
|
function ACgetters:description()
|
||
|
return self._description
|
||
|
end
|
||
|
|
||
|
function ACgetters:options()
|
||
|
return self._options
|
||
|
end
|
||
|
|
||
|
function ACgetters:guild()
|
||
|
return self._guild
|
||
|
end
|
||
|
|
||
|
function ACgetters:callback()
|
||
|
return self._callback
|
||
|
end
|
||
|
|
||
|
function ACgetters:version()
|
||
|
return self._version
|
||
|
end
|
||
|
|
||
|
return AC
|