Add API model for Reaction, implement REST methods for reactions
This commit is contained in:
20
src/Discord.Net.Core/API/Common/Reaction.cs
Normal file
20
src/Discord.Net.Core/API/Common/Reaction.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Discord.API.Common
|
||||||
|
{
|
||||||
|
public class Reaction
|
||||||
|
{
|
||||||
|
[JsonProperty("user_id")]
|
||||||
|
public ulong UserId { get; set; }
|
||||||
|
[JsonProperty("message_id")]
|
||||||
|
public ulong MessageId { get; set; }
|
||||||
|
[JsonProperty("emoji")]
|
||||||
|
public Emoji Emoji { get; set; }
|
||||||
|
[JsonProperty("channel_id")]
|
||||||
|
public ulong ChannelId { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -512,6 +512,48 @@ namespace Discord.API
|
|||||||
var ids = new BucketIds(channelId: channelId);
|
var ids = new BucketIds(channelId: channelId);
|
||||||
return await SendJsonAsync<Message>("PATCH", () => $"channels/{channelId}/messages/{messageId}", args, ids, clientBucketId: ClientBucket.SendEditId, options: options).ConfigureAwait(false);
|
return await SendJsonAsync<Message>("PATCH", () => $"channels/{channelId}/messages/{messageId}", args, ids, clientBucketId: ClientBucket.SendEditId, options: options).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
public async Task AddReactionAsync(ulong channelId, ulong messageId, string emoji, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
|
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
||||||
|
Preconditions.NotNullOrWhitespace(emoji, nameof(emoji));
|
||||||
|
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
var ids = new BucketIds(channelId: channelId);
|
||||||
|
|
||||||
|
await SendAsync("PUT", () => $"channels/{channelId}/messages/{messageId}/reactions/{emoji}/@me", ids, options: options).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
public async Task RemoveReactionAsync(ulong channelId, ulong messageId, ulong userId, string emoji, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
|
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
||||||
|
Preconditions.NotNullOrWhitespace(emoji, nameof(emoji));
|
||||||
|
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
var ids = new BucketIds(channelId: channelId);
|
||||||
|
|
||||||
|
await SendAsync("DELETE", () => $"channels/{channelId}/messages/{messageId}/reactions/{emoji}/{userId}", ids, options: options).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
public async Task<IReadOnlyCollection<User>> GetReactionUsersAsync(ulong channelId, ulong messageId, string emoji, GetReactionUsersParams args, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
|
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
||||||
|
Preconditions.NotNullOrWhitespace(emoji, nameof(emoji));
|
||||||
|
Preconditions.NotNull(args, nameof(args));
|
||||||
|
Preconditions.GreaterThan(args.Limit, 0, nameof(args.Limit));
|
||||||
|
Preconditions.AtMost(args.Limit, DiscordConfig.MaxUsersPerBatch, nameof(args.Limit));
|
||||||
|
Preconditions.GreaterThan(args.AfterUserId, 0, nameof(args.AfterUserId));
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
int limit = args.Limit.GetValueOrDefault(int.MaxValue);
|
||||||
|
ulong afterUserId = args.AfterUserId.GetValueOrDefault(0);
|
||||||
|
|
||||||
|
var ids = new BucketIds(channelId: channelId);
|
||||||
|
Expression<Func<string>> endpoint = () => $"channels/{channelId}/messages/{messageId}/reactions/{emoji}";
|
||||||
|
return await SendAsync<IReadOnlyCollection<User>>("GET", endpoint, ids, options: options).ConfigureAwait(false);
|
||||||
|
}
|
||||||
public async Task AckMessageAsync(ulong channelId, ulong messageId, RequestOptions options = null)
|
public async Task AckMessageAsync(ulong channelId, ulong messageId, RequestOptions options = null)
|
||||||
{
|
{
|
||||||
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
|
|||||||
8
src/Discord.Net.Core/API/Rest/GetReactionUsersParams.cs
Normal file
8
src/Discord.Net.Core/API/Rest/GetReactionUsersParams.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
namespace Discord.API.Rest
|
||||||
|
{
|
||||||
|
public class GetReactionUsersParams
|
||||||
|
{
|
||||||
|
public Optional<int> Limit { get; set; }
|
||||||
|
public Optional<ulong> AfterUserId { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using Discord.API.Rest;
|
using Discord.API.Rest;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord
|
namespace Discord
|
||||||
@@ -12,7 +13,17 @@ namespace Discord
|
|||||||
Task PinAsync(RequestOptions options = null);
|
Task PinAsync(RequestOptions options = null);
|
||||||
/// <summary> Removes this message from its channel's pinned messages. </summary>
|
/// <summary> Removes this message from its channel's pinned messages. </summary>
|
||||||
Task UnpinAsync(RequestOptions options = null);
|
Task UnpinAsync(RequestOptions options = null);
|
||||||
|
|
||||||
|
/// <summary> Adds a reaction to this message. </summary>
|
||||||
|
Task AddReactionAsync(Emoji emoji, RequestOptions options = null);
|
||||||
|
/// <summary> Adds a reaction to this message. </summary>
|
||||||
|
Task AddReactionAsync(string emoji, RequestOptions options = null);
|
||||||
|
/// <summary> Removes a reaction from message. </summary>
|
||||||
|
Task RemoveReactionAsync(Emoji emoji, IUser user, RequestOptions options = null);
|
||||||
|
/// <summary> Removes a reaction from this message. </summary>
|
||||||
|
Task RemoveReactionAsync(string emoji, IUser user, RequestOptions options = null);
|
||||||
|
Task<IReadOnlyCollection<IUser>> GetReactionUsersAsync(string emoji, Action<GetReactionUsersParams> func, RequestOptions options = null);
|
||||||
|
|
||||||
/// <summary> Transforms this message's text into a human readable form by resolving its tags. </summary>
|
/// <summary> Transforms this message's text into a human readable form by resolving its tags. </summary>
|
||||||
string Resolve(
|
string Resolve(
|
||||||
TagHandling userHandling = TagHandling.Name,
|
TagHandling userHandling = TagHandling.Name,
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ namespace Discord
|
|||||||
throw new ArgumentException("Argument cannot be blank.", name);
|
throw new ArgumentException("Argument cannot be blank.", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Numerics
|
//Numerics
|
||||||
public static void NotEqual(sbyte obj, sbyte value, string name) { if (obj == value) throw new ArgumentOutOfRangeException(name); }
|
public static void NotEqual(sbyte obj, sbyte value, string name) { if (obj == value) throw new ArgumentOutOfRangeException(name); }
|
||||||
|
|||||||
@@ -23,6 +23,29 @@ namespace Discord.Rest
|
|||||||
await client.ApiClient.DeleteMessageAsync(msg.Channel.Id, msg.Id, options).ConfigureAwait(false);
|
await client.ApiClient.DeleteMessageAsync(msg.Channel.Id, msg.Id, options).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task AddReactionAsync(IMessage msg, Emoji emoji, BaseDiscordClient client, RequestOptions options)
|
||||||
|
=> await AddReactionAsync(msg, $"{emoji.Name}:{emoji.Id}", client, options).ConfigureAwait(false);
|
||||||
|
public static async Task AddReactionAsync(IMessage msg, string emoji, BaseDiscordClient client, RequestOptions options)
|
||||||
|
{
|
||||||
|
await client.ApiClient.AddReactionAsync(msg.Channel.Id, msg.Id, emoji, options).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task RemoveReactionAsync(IMessage msg, IUser user, Emoji emoji, BaseDiscordClient client, RequestOptions options)
|
||||||
|
=> await RemoveReactionAsync(msg, user, $"{emoji.Name}:{emoji.Id}", client, options).ConfigureAwait(false);
|
||||||
|
public static async Task RemoveReactionAsync(IMessage msg, IUser user, string emoji, BaseDiscordClient client,
|
||||||
|
RequestOptions options)
|
||||||
|
{
|
||||||
|
await client.ApiClient.RemoveReactionAsync(msg.Channel.Id, msg.Id, user.Id, emoji, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<IReadOnlyCollection<IUser>> GetReactionUsersAsync(IMessage msg, string emoji,
|
||||||
|
Action<GetReactionUsersParams> func, BaseDiscordClient client, RequestOptions options)
|
||||||
|
{
|
||||||
|
var args = new GetReactionUsersParams();
|
||||||
|
func(args);
|
||||||
|
return (await client.ApiClient.GetReactionUsersAsync(msg.Channel.Id, msg.Id, emoji, args, options).ConfigureAwait(false)).Select(u => u as IUser).Where(u => u != null).ToImmutableArray();
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task PinAsync(IMessage msg, BaseDiscordClient client,
|
public static async Task PinAsync(IMessage msg, BaseDiscordClient client,
|
||||||
RequestOptions options)
|
RequestOptions options)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -117,6 +117,20 @@ namespace Discord.Rest
|
|||||||
Update(model);
|
Update(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task AddReactionAsync(Emoji emoji, RequestOptions options)
|
||||||
|
=> MessageHelper.AddReactionAsync(this, emoji, Discord, options);
|
||||||
|
public Task AddReactionAsync(string emoji, RequestOptions options)
|
||||||
|
=> MessageHelper.AddReactionAsync(this, emoji, Discord, options);
|
||||||
|
|
||||||
|
public Task RemoveReactionAsync(Emoji emoji, IUser user, RequestOptions options)
|
||||||
|
=> MessageHelper.RemoveReactionAsync(this, user, emoji, Discord, options);
|
||||||
|
public Task RemoveReactionAsync(string emoji, IUser user, RequestOptions options)
|
||||||
|
=> MessageHelper.RemoveReactionAsync(this, user, emoji, Discord, options);
|
||||||
|
|
||||||
|
public Task<IReadOnlyCollection<IUser>> GetReactionUsersAsync(string emoji, Action<GetReactionUsersParams> func, RequestOptions options)
|
||||||
|
=> MessageHelper.GetReactionUsersAsync(this, emoji, func, Discord, options);
|
||||||
|
|
||||||
|
|
||||||
public Task PinAsync(RequestOptions options)
|
public Task PinAsync(RequestOptions options)
|
||||||
=> MessageHelper.PinAsync(this, Discord, options);
|
=> MessageHelper.PinAsync(this, Discord, options);
|
||||||
public Task UnpinAsync(RequestOptions options)
|
public Task UnpinAsync(RequestOptions options)
|
||||||
|
|||||||
@@ -101,6 +101,19 @@ namespace Discord.Rpc
|
|||||||
public Task ModifyAsync(Action<ModifyMessageParams> func, RequestOptions options)
|
public Task ModifyAsync(Action<ModifyMessageParams> func, RequestOptions options)
|
||||||
=> MessageHelper.ModifyAsync(this, Discord, func, options);
|
=> MessageHelper.ModifyAsync(this, Discord, func, options);
|
||||||
|
|
||||||
|
public Task AddReactionAsync(Emoji emoji, RequestOptions options)
|
||||||
|
=> MessageHelper.AddReactionAsync(this, emoji, Discord, options);
|
||||||
|
public Task AddReactionAsync(string emoji, RequestOptions options)
|
||||||
|
=> MessageHelper.AddReactionAsync(this, emoji, Discord, options);
|
||||||
|
|
||||||
|
public Task RemoveReactionAsync(Emoji emoji, IUser user, RequestOptions options)
|
||||||
|
=> MessageHelper.RemoveReactionAsync(this, user, emoji, Discord, options);
|
||||||
|
public Task RemoveReactionAsync(string emoji, IUser user, RequestOptions options)
|
||||||
|
=> MessageHelper.RemoveReactionAsync(this, user, emoji, Discord, options);
|
||||||
|
|
||||||
|
public Task<IReadOnlyCollection<IUser>> GetReactionUsersAsync(string emoji, Action<GetReactionUsersParams> func, RequestOptions options)
|
||||||
|
=> MessageHelper.GetReactionUsersAsync(this, emoji, func, Discord, options);
|
||||||
|
|
||||||
public Task PinAsync(RequestOptions options)
|
public Task PinAsync(RequestOptions options)
|
||||||
=> MessageHelper.PinAsync(this, Discord, options);
|
=> MessageHelper.PinAsync(this, Discord, options);
|
||||||
public Task UnpinAsync(RequestOptions options)
|
public Task UnpinAsync(RequestOptions options)
|
||||||
|
|||||||
@@ -113,6 +113,19 @@ namespace Discord.WebSocket
|
|||||||
public Task ModifyAsync(Action<ModifyMessageParams> func, RequestOptions options = null)
|
public Task ModifyAsync(Action<ModifyMessageParams> func, RequestOptions options = null)
|
||||||
=> MessageHelper.ModifyAsync(this, Discord, func, options);
|
=> MessageHelper.ModifyAsync(this, Discord, func, options);
|
||||||
|
|
||||||
|
public Task AddReactionAsync(Emoji emoji, RequestOptions options)
|
||||||
|
=> MessageHelper.AddReactionAsync(this, emoji, Discord, options);
|
||||||
|
public Task AddReactionAsync(string emoji, RequestOptions options)
|
||||||
|
=> MessageHelper.AddReactionAsync(this, emoji, Discord, options);
|
||||||
|
|
||||||
|
public Task RemoveReactionAsync(Emoji emoji, IUser user, RequestOptions options)
|
||||||
|
=> MessageHelper.RemoveReactionAsync(this, user, emoji, Discord, options);
|
||||||
|
public Task RemoveReactionAsync(string emoji, IUser user, RequestOptions options)
|
||||||
|
=> MessageHelper.RemoveReactionAsync(this, user, emoji, Discord, options);
|
||||||
|
|
||||||
|
public Task<IReadOnlyCollection<IUser>> GetReactionUsersAsync(string emoji, Action<GetReactionUsersParams> func, RequestOptions options)
|
||||||
|
=> MessageHelper.GetReactionUsersAsync(this, emoji, func, Discord, options);
|
||||||
|
|
||||||
public Task PinAsync(RequestOptions options = null)
|
public Task PinAsync(RequestOptions options = null)
|
||||||
=> MessageHelper.PinAsync(this, Discord, options);
|
=> MessageHelper.PinAsync(this, Discord, options);
|
||||||
public Task UnpinAsync(RequestOptions options = null)
|
public Task UnpinAsync(RequestOptions options = null)
|
||||||
|
|||||||
Reference in New Issue
Block a user