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.
203 lines
4.0 KiB
Lua
203 lines
4.0 KiB
Lua
3 years ago
|
local fs = require('fs')
|
||
|
local ffi = require('ffi')
|
||
|
local ssl = require('openssl')
|
||
|
local class = require('class')
|
||
|
local enums = require('enums')
|
||
|
|
||
|
local permission = enums.permission
|
||
|
local actionType = enums.actionType
|
||
|
local messageFlag = enums.messageFlag
|
||
|
local base64 = ssl.base64
|
||
|
local readFileSync = fs.readFileSync
|
||
|
local classes = class.classes
|
||
|
local isInstance = class.isInstance
|
||
|
local isObject = class.isObject
|
||
|
local insert = table.insert
|
||
|
local format = string.format
|
||
|
|
||
|
local Resolver = {}
|
||
|
|
||
|
local istype = ffi.istype
|
||
|
local int64_t = ffi.typeof('int64_t')
|
||
|
local uint64_t = ffi.typeof('uint64_t')
|
||
|
|
||
|
local function int(obj)
|
||
|
local t = type(obj)
|
||
|
if t == 'string' then
|
||
|
if tonumber(obj) then
|
||
|
return obj
|
||
|
end
|
||
|
elseif t == 'cdata' then
|
||
|
if istype(int64_t, obj) or istype(uint64_t, obj) then
|
||
|
return tostring(obj):match('%d*')
|
||
|
end
|
||
|
elseif t == 'number' then
|
||
|
return format('%i', obj)
|
||
|
elseif isInstance(obj, classes.Date) then
|
||
|
return obj:toSnowflake()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function Resolver.userId(obj)
|
||
|
if isObject(obj) then
|
||
|
if isInstance(obj, classes.User) then
|
||
|
return obj.id
|
||
|
elseif isInstance(obj, classes.Member) then
|
||
|
return obj.user.id
|
||
|
elseif isInstance(obj, classes.Message) then
|
||
|
return obj.author.id
|
||
|
elseif isInstance(obj, classes.Guild) then
|
||
|
return obj.ownerId
|
||
|
end
|
||
|
end
|
||
|
return int(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.messageId(obj)
|
||
|
if isInstance(obj, classes.Message) then
|
||
|
return obj.id
|
||
|
end
|
||
|
return int(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.channelId(obj)
|
||
|
if isInstance(obj, classes.Channel) then
|
||
|
return obj.id
|
||
|
end
|
||
|
return int(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.roleId(obj)
|
||
|
if isInstance(obj, classes.Role) then
|
||
|
return obj.id
|
||
|
end
|
||
|
return int(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.emojiId(obj)
|
||
|
if isInstance(obj, classes.Emoji) then
|
||
|
return obj.id
|
||
|
elseif isInstance(obj, classes.Reaction) then
|
||
|
return obj.emojiId
|
||
|
elseif isInstance(obj, classes.Activity) then
|
||
|
return obj.emojiId
|
||
|
end
|
||
|
return int(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.guildId(obj)
|
||
|
if isInstance(obj, classes.Guild) then
|
||
|
return obj.id
|
||
|
end
|
||
|
return int(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.entryId(obj)
|
||
|
if isInstance(obj, classes.AuditLogEntry) then
|
||
|
return obj.id
|
||
|
end
|
||
|
return int(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.messageIds(objs)
|
||
|
local ret = {}
|
||
|
if isInstance(objs, classes.Iterable) then
|
||
|
for obj in objs:iter() do
|
||
|
insert(ret, Resolver.messageId(obj))
|
||
|
end
|
||
|
elseif type(objs) == 'table' then
|
||
|
for _, obj in pairs(objs) do
|
||
|
insert(ret, Resolver.messageId(obj))
|
||
|
end
|
||
|
end
|
||
|
return ret
|
||
|
end
|
||
|
|
||
|
function Resolver.roleIds(objs)
|
||
|
local ret = {}
|
||
|
if isInstance(objs, classes.Iterable) then
|
||
|
for obj in objs:iter() do
|
||
|
insert(ret, Resolver.roleId(obj))
|
||
|
end
|
||
|
elseif type(objs) == 'table' then
|
||
|
for _, obj in pairs(objs) do
|
||
|
insert(ret, Resolver.roleId(obj))
|
||
|
end
|
||
|
end
|
||
|
return ret
|
||
|
end
|
||
|
|
||
|
function Resolver.emoji(obj)
|
||
|
if isInstance(obj, classes.Emoji) then
|
||
|
return obj.hash
|
||
|
elseif isInstance(obj, classes.Reaction) then
|
||
|
return obj.emojiHash
|
||
|
elseif isInstance(obj, classes.Activity) then
|
||
|
return obj.emojiHash
|
||
|
end
|
||
|
return tostring(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.color(obj)
|
||
|
if isInstance(obj, classes.Color) then
|
||
|
return obj.value
|
||
|
end
|
||
|
return tonumber(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.permissions(obj)
|
||
|
if isInstance(obj, classes.Permissions) then
|
||
|
return obj.value
|
||
|
end
|
||
|
return tonumber(obj)
|
||
|
end
|
||
|
|
||
|
function Resolver.permission(obj)
|
||
|
local t = type(obj)
|
||
|
local n = nil
|
||
|
if t == 'string' then
|
||
|
n = permission[obj]
|
||
|
elseif t == 'number' then
|
||
|
n = permission(obj) and obj
|
||
|
end
|
||
|
return n
|
||
|
end
|
||
|
|
||
|
function Resolver.actionType(obj)
|
||
|
local t = type(obj)
|
||
|
local n = nil
|
||
|
if t == 'string' then
|
||
|
n = actionType[obj]
|
||
|
elseif t == 'number' then
|
||
|
n = actionType(obj) and obj
|
||
|
end
|
||
|
return n
|
||
|
end
|
||
|
|
||
|
function Resolver.messageFlag(obj)
|
||
|
local t = type(obj)
|
||
|
local n = nil
|
||
|
if t == 'string' then
|
||
|
n = messageFlag[obj]
|
||
|
elseif t == 'number' then
|
||
|
n = messageFlag(obj) and obj
|
||
|
end
|
||
|
return n
|
||
|
end
|
||
|
|
||
|
function Resolver.base64(obj)
|
||
|
if type(obj) == 'string' then
|
||
|
if obj:find('data:.*;base64,') == 1 then
|
||
|
return obj
|
||
|
end
|
||
|
local data, err = readFileSync(obj)
|
||
|
if not data then
|
||
|
return nil, err
|
||
|
end
|
||
|
return 'data:;base64,' .. base64(data)
|
||
|
end
|
||
|
return nil
|
||
|
end
|
||
|
|
||
|
return Resolver
|