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

--[=[
@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