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.
169 lines
4.0 KiB
Lua
169 lines
4.0 KiB
Lua
--[=[
|
|
@c Emoji x Snowflake
|
|
@d Represents a custom emoji object usable in message content and reactions.
|
|
Standard unicode emojis do not have a class; they are just strings.
|
|
]=]
|
|
|
|
local Snowflake = require('containers/abstract/Snowflake')
|
|
local Resolver = require('client/Resolver')
|
|
local ArrayIterable = require('iterables/ArrayIterable')
|
|
local json = require('json')
|
|
|
|
local format = string.format
|
|
|
|
local Emoji, get = require('class')('Emoji', Snowflake)
|
|
|
|
function Emoji:__init(data, parent)
|
|
Snowflake.__init(self, data, parent)
|
|
self.client._emoji_map[self._id] = parent
|
|
return self:_loadMore(data)
|
|
end
|
|
|
|
function Emoji:_load(data)
|
|
Snowflake._load(self, data)
|
|
return self:_loadMore(data)
|
|
end
|
|
|
|
function Emoji:_loadMore(data)
|
|
if data.roles then
|
|
local roles = #data.roles > 0 and data.roles or nil
|
|
if self._roles then
|
|
self._roles._array = roles
|
|
else
|
|
self._roles_raw = roles
|
|
end
|
|
end
|
|
end
|
|
|
|
function Emoji:_modify(payload)
|
|
local data, err = self.client._api:modifyGuildEmoji(self._parent._id, self._id, payload)
|
|
if data then
|
|
self:_load(data)
|
|
return true
|
|
else
|
|
return false, err
|
|
end
|
|
end
|
|
|
|
--[=[
|
|
@m setName
|
|
@t http
|
|
@p name string
|
|
@r boolean
|
|
@d Sets the emoji's name. The name must be between 2 and 32 characters in length.
|
|
]=]
|
|
function Emoji:setName(name)
|
|
return self:_modify({name = name or json.null})
|
|
end
|
|
|
|
--[=[
|
|
@m setRoles
|
|
@t http
|
|
@p roles Role-ID-Resolvables
|
|
@r boolean
|
|
@d Sets the roles that can use the emoji.
|
|
]=]
|
|
function Emoji:setRoles(roles)
|
|
roles = Resolver.roleIds(roles)
|
|
return self:_modify({roles = roles or json.null})
|
|
end
|
|
|
|
--[=[
|
|
@m delete
|
|
@t http
|
|
@r boolean
|
|
@d Permanently deletes the emoji. This cannot be undone!
|
|
]=]
|
|
function Emoji:delete()
|
|
local data, err = self.client._api:deleteGuildEmoji(self._parent._id, self._id)
|
|
if data then
|
|
local cache = self._parent._emojis
|
|
if cache then
|
|
cache:_delete(self._id)
|
|
end
|
|
return true
|
|
else
|
|
return false, err
|
|
end
|
|
end
|
|
|
|
--[=[
|
|
@m hasRole
|
|
@t mem
|
|
@p id Role-ID-Resolvable
|
|
@r boolean
|
|
@d Returns whether or not the provided role is allowed to use the emoji.
|
|
]=]
|
|
function Emoji:hasRole(id)
|
|
id = Resolver.roleId(id)
|
|
local roles = self._roles and self._roles._array or self._roles_raw
|
|
if roles then
|
|
for _, v in ipairs(roles) do
|
|
if v == id then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--[=[@p name string The name of the emoji.]=]
|
|
function get.name(self)
|
|
return self._name
|
|
end
|
|
|
|
--[=[@p guild Guild The guild in which the emoji exists.]=]
|
|
function get.guild(self)
|
|
return self._parent
|
|
end
|
|
|
|
--[=[@p mentionString string A string that, when included in a message content, may resolve as an emoji image
|
|
in the official Discord client.]=]
|
|
function get.mentionString(self)
|
|
local fmt = self._animated and '<a:%s>' or '<:%s>'
|
|
return format(fmt, self.hash)
|
|
end
|
|
|
|
--[=[@p url string The URL that can be used to view a full version of the emoji.]=]
|
|
function get.url(self)
|
|
local ext = self._animated and 'gif' or 'png'
|
|
return format('https://cdn.discordapp.com/emojis/%s.%s', self._id, ext)
|
|
end
|
|
|
|
--[=[@p managed boolean Whether this emoji is managed by an integration such as Twitch or YouTube.]=]
|
|
function get.managed(self)
|
|
return self._managed
|
|
end
|
|
|
|
--[=[@p requireColons boolean Whether this emoji requires colons to be used in the official Discord client.]=]
|
|
function get.requireColons(self)
|
|
return self._require_colons
|
|
end
|
|
|
|
--[=[@p hash string String with the format `name:id`, used in HTTP requests.
|
|
This is different from `Emoji:__hash`, which returns only the Snowflake ID.
|
|
]=]
|
|
function get.hash(self)
|
|
return self._name .. ':' .. self._id
|
|
end
|
|
|
|
--[=[@p animated boolean Whether this emoji is animated.]=]
|
|
function get.animated(self)
|
|
return self._animated
|
|
end
|
|
|
|
--[=[@p roles ArrayIterable An iterable array of roles that may be required to use this emoji, generally
|
|
related to integration-managed emojis. Object order is not guaranteed.]=]
|
|
function get.roles(self)
|
|
if not self._roles then
|
|
local roles = self._parent._roles
|
|
self._roles = ArrayIterable(self._roles_raw, function(id)
|
|
return roles:get(id)
|
|
end)
|
|
self._roles_raw = nil
|
|
end
|
|
return self._roles
|
|
end
|
|
|
|
return Emoji
|