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

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