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.
150 lines
4.3 KiB
Lua
150 lines
4.3 KiB
Lua
3 years ago
|
--[=[
|
||
|
@c Reaction x Container
|
||
|
@d Represents an emoji that has been used to react to a Discord text message. Both
|
||
|
standard and custom emojis can be used.
|
||
|
]=]
|
||
|
|
||
|
local json = require('json')
|
||
|
local Container = require('containers/abstract/Container')
|
||
|
local SecondaryCache = require('iterables/SecondaryCache')
|
||
|
local Resolver = require('client/Resolver')
|
||
|
|
||
|
local null = json.null
|
||
|
local format = string.format
|
||
|
|
||
|
local Reaction, get = require('class')('Reaction', Container)
|
||
|
|
||
|
function Reaction:__init(data, parent)
|
||
|
Container.__init(self, data, parent)
|
||
|
local emoji = data.emoji
|
||
|
self._emoji_id = emoji.id ~= null and emoji.id or nil
|
||
|
self._emoji_name = emoji.name
|
||
|
if emoji.animated ~= null and emoji.animated ~= nil then -- not always present
|
||
|
self._emoji_animated = emoji.animated
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m __hash
|
||
|
@r string
|
||
|
@d Returns `Reaction.emojiId or Reaction.emojiName`
|
||
|
]=]
|
||
|
function Reaction:__hash()
|
||
|
return self._emoji_id or self._emoji_name
|
||
|
end
|
||
|
|
||
|
local function getUsers(self, query)
|
||
|
local emoji = Resolver.emoji(self)
|
||
|
local message = self._parent
|
||
|
local channel = message._parent
|
||
|
local data, err = self.client._api:getReactions(channel._id, message._id, emoji, query)
|
||
|
if data then
|
||
|
return SecondaryCache(data, self.client._users)
|
||
|
else
|
||
|
return nil, err
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m getUsers
|
||
|
@t http
|
||
|
@op limit number
|
||
|
@r SecondaryCache
|
||
|
@d Returns a newly constructed cache of all users that have used this reaction in
|
||
|
its parent message. The cache is not automatically updated via gateway events,
|
||
|
but the internally referenced user objects may be updated. You must call this
|
||
|
method again to guarantee that the objects are update to date.
|
||
|
]=]
|
||
|
function Reaction:getUsers(limit)
|
||
|
return getUsers(self, limit and {limit = limit})
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m getUsersBefore
|
||
|
@t http
|
||
|
@p id User-ID-Resolvable
|
||
|
@op limit number
|
||
|
@r SecondaryCache
|
||
|
@d Returns a newly constructed cache of all users that have used this reaction before the specified id in
|
||
|
its parent message. The cache is not automatically updated via gateway events,
|
||
|
but the internally referenced user objects may be updated. You must call this
|
||
|
method again to guarantee that the objects are update to date.
|
||
|
]=]
|
||
|
function Reaction:getUsersBefore(id, limit)
|
||
|
id = Resolver.userId(id)
|
||
|
return getUsers(self, {before = id, limit = limit})
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m getUsersAfter
|
||
|
@t http
|
||
|
@p id User-ID-Resolvable
|
||
|
@op limit number
|
||
|
@r SecondaryCache
|
||
|
@d Returns a newly constructed cache of all users that have used this reaction
|
||
|
after the specified id in its parent message. The cache is not automatically
|
||
|
updated via gateway events, but the internally referenced user objects may be
|
||
|
updated. You must call this method again to guarantee that the objects are update to date.
|
||
|
]=]
|
||
|
function Reaction:getUsersAfter(id, limit)
|
||
|
id = Resolver.userId(id)
|
||
|
return getUsers(self, {after = id, limit = limit})
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m delete
|
||
|
@t http
|
||
|
@op id User-ID-Resolvable
|
||
|
@r boolean
|
||
|
@d Equivalent to `Reaction.message:removeReaction(Reaction)`
|
||
|
]=]
|
||
|
function Reaction:delete(id)
|
||
|
return self._parent:removeReaction(self, id)
|
||
|
end
|
||
|
|
||
|
--[=[@p emojiId string/nil The ID of the emoji used in this reaction if it is a custom emoji.]=]
|
||
|
function get.emojiId(self)
|
||
|
return self._emoji_id
|
||
|
end
|
||
|
|
||
|
--[=[@p emojiName string The name of the emoji used in this reaction.
|
||
|
This will be the raw string for a standard emoji.]=]
|
||
|
function get.emojiName(self)
|
||
|
return self._emoji_name
|
||
|
end
|
||
|
|
||
|
--[=[@p emojiHash string The discord hash for the emoji used in this reaction.
|
||
|
This will be the raw string for a standard emoji.]=]
|
||
|
function get.emojiHash(self)
|
||
|
if self._emoji_id then
|
||
|
return self._emoji_name .. ':' .. self._emoji_id
|
||
|
else
|
||
|
return self._emoji_name
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--[=[@p emojiURL string/nil string The URL that can be used to view a full
|
||
|
version of the emoji used in this reaction if it is a custom emoji.]=]
|
||
|
function get.emojiURL(self)
|
||
|
local id = self._emoji_id
|
||
|
local ext = self._emoji_animated and 'gif' or 'png'
|
||
|
return id and format('https://cdn.discordapp.com/emojis/%s.%s', id, ext) or nil
|
||
|
end
|
||
|
|
||
|
--[=[@p me boolean Whether the current user has used this reaction.]=]
|
||
|
function get.me(self)
|
||
|
return self._me
|
||
|
end
|
||
|
|
||
|
--[=[@p count number The total number of users that have used this reaction.]=]
|
||
|
function get.count(self)
|
||
|
return self._count
|
||
|
end
|
||
|
|
||
|
--[=[@p message Message The message on which this reaction exists.]=]
|
||
|
function get.message(self)
|
||
|
return self._parent
|
||
|
end
|
||
|
|
||
|
return Reaction
|