/// <summary> /// Gets a paginated list of users who reacted to the specified message with the specified emoji. /// </summary> /// <param name="baseUserId">The user ID to start at when retrieving reactions.</param> /// <param name="limit">The maximum number of reactions to return or null to use the default.</param> /// <param name="getStrategy">The pagination strategy to use based on <paramref name="baseUserId"/>.</param> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="DiscordHttpApiException"></exception> public async Task <IReadOnlyList <DiscordUser> > GetReactions(Snowflake channelId, Snowflake messageId, DiscordReactionEmoji emoji, Snowflake?baseUserId = null, int?limit = null, ReactionGetStrategy getStrategy = ReactionGetStrategy.Before) { if (emoji == null) { throw new ArgumentNullException(nameof(emoji)); } UrlParametersBuilder builder = new UrlParametersBuilder(); if (baseUserId.HasValue) { builder.Add(getStrategy.ToString().ToLower(), baseUserId.Value.ToString()); } if (limit.HasValue) { builder.Add("limit", limit.Value.ToString()); } DiscordApiData data = await rest.Get( $"channels/{channelId}/messages/{messageId}/reactions/{emoji}{builder.ToQueryString()}", $"channels/{channelId}/messages/message/reactions/emoji").ConfigureAwait(false); DiscordUser[] users = new DiscordUser[data.Values.Count]; for (int i = 0; i < users.Length; i++) { users[i] = new DiscordUser(false, data.Values[i]); } return(users); }
internal MessageReactionEventArgs(Shard shard, Snowflake messageId, Snowflake channelId, Snowflake userId, DiscordReactionEmoji emoji) : base(shard) { MessageId = messageId; ChannelId = channelId; UserId = userId; Emoji = emoji; }
/// <summary> /// Adds a reaction to a message. /// <para>Requires <see cref="DiscordPermission.ReadMessageHistory"/>.</para> /// <para>Requires <see cref="DiscordPermission.AddReactions"/> if nobody else has reacted to the message prior.</para> /// </summary> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="DiscordHttpApiException"></exception> public async Task CreateReaction(Snowflake channelId, Snowflake messageId, DiscordReactionEmoji emoji) { if (emoji == null) { throw new ArgumentNullException(nameof(emoji)); } await rest.Put($"channels/{channelId}/messages/{messageId}/reactions/{emoji}/@me", $"channels/{channelId}/messages/message/reactions/emoji/@me").ConfigureAwait(false); }
void HandleMessageReactionRemoveEvent(DiscordApiData data) { Snowflake userId = data.GetSnowflake("user_id").Value; Snowflake channelId = data.GetSnowflake("channel_id").Value; Snowflake messageId = data.GetSnowflake("message_id").Value; DiscordApiData emojiData = data.Get("emoji"); DiscordReactionEmoji emoji = new DiscordReactionEmoji(emojiData); OnMessageReactionRemoved?.Invoke(this, new MessageReactionEventArgs(shard, messageId, channelId, userId, emoji)); }
internal DiscordReaction(DiscordApiData data) { Count = data.GetInteger("count").Value; Me = data.GetBoolean("me").Value; DiscordApiData emojiData = data.Get("emoji"); if (emojiData != null) { Emoji = new DiscordReactionEmoji(emojiData); } }
/// <summary> /// Deletes a reaction posted by any user. /// <para>Requires <see cref="DiscordPermission.ManageMessages"/>.</para> /// </summary> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="DiscordHttpApiException"></exception> public async Task DeleteUserReaction(Snowflake channelId, Snowflake messageId, Snowflake userId, DiscordReactionEmoji emoji) { if (emoji == null) { throw new ArgumentNullException(nameof(emoji)); } await rest.Delete($"channels/{channelId}/messages/{messageId}/reactions/{emoji}/{userId}", $"channels/{channelId}/messages/message/reactions/emoji/user").ConfigureAwait(false); }