@@ -8,8 +8,6 @@ namespace Discord.API.Rest | |||||
{ | { | ||||
[JsonProperty("content")] | [JsonProperty("content")] | ||||
public string Content { get; } | public string Content { get; } | ||||
[JsonProperty("wait")] | |||||
public bool ReturnCreatedMessage { get; set; } = true; | |||||
[JsonProperty("nonce")] | [JsonProperty("nonce")] | ||||
public Optional<string> Nonce { get; set; } | public Optional<string> Nonce { get; set; } | ||||
@@ -10,5 +10,7 @@ namespace Discord.API.Rest | |||||
public Optional<string> Name { get; set; } | public Optional<string> Name { get; set; } | ||||
[JsonProperty("avatar")] | [JsonProperty("avatar")] | ||||
public Optional<Image?> Avatar { get; set; } | public Optional<Image?> Avatar { get; set; } | ||||
[JsonProperty("channel_id")] | |||||
public Optional<ulong> ChannelId { get; set; } | |||||
} | } | ||||
} | } |
@@ -1,7 +1,7 @@ | |||||
#pragma warning disable CS1591 | #pragma warning disable CS1591 | ||||
using Discord.Net.Rest; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.IO; | using System.IO; | ||||
using Discord.Net.Rest; | |||||
namespace Discord.API.Rest | namespace Discord.API.Rest | ||||
{ | { | ||||
@@ -15,6 +15,7 @@ namespace Discord.API.Rest | |||||
public Optional<bool> IsTTS { get; set; } | public Optional<bool> IsTTS { get; set; } | ||||
public Optional<string> Username { get; set; } | public Optional<string> Username { get; set; } | ||||
public Optional<string> AvatarUrl { get; set; } | public Optional<string> AvatarUrl { get; set; } | ||||
public Optional<Embed[]> Embeds { get; set; } | |||||
public UploadWebhookFileParams(Stream file) | public UploadWebhookFileParams(Stream file) | ||||
{ | { | ||||
@@ -25,6 +26,7 @@ namespace Discord.API.Rest | |||||
{ | { | ||||
var d = new Dictionary<string, object>(); | var d = new Dictionary<string, object>(); | ||||
d["file"] = new MultipartFile(File, Filename.GetValueOrDefault("unknown.dat")); | d["file"] = new MultipartFile(File, Filename.GetValueOrDefault("unknown.dat")); | ||||
if (Content.IsSpecified) | if (Content.IsSpecified) | ||||
d["content"] = Content.Value; | d["content"] = Content.Value; | ||||
if (IsTTS.IsSpecified) | if (IsTTS.IsSpecified) | ||||
@@ -35,6 +37,8 @@ namespace Discord.API.Rest | |||||
d["username"] = Username.Value; | d["username"] = Username.Value; | ||||
if (AvatarUrl.IsSpecified) | if (AvatarUrl.IsSpecified) | ||||
d["avatar_url"] = AvatarUrl.Value; | d["avatar_url"] = AvatarUrl.Value; | ||||
if (Embeds.IsSpecified) | |||||
d["embeds"] = Embeds.Value; | |||||
return d; | return d; | ||||
} | } | ||||
} | } | ||||
@@ -164,7 +164,7 @@ namespace Discord.Rest | |||||
Task<IVoiceRegion> IDiscordClient.GetVoiceRegionAsync(string id, RequestOptions options) | Task<IVoiceRegion> IDiscordClient.GetVoiceRegionAsync(string id, RequestOptions options) | ||||
=> Task.FromResult<IVoiceRegion>(null); | => Task.FromResult<IVoiceRegion>(null); | ||||
Task<IWebhook> IDiscordClient.GetWebhookAsync(ulong id, string webhookToken, RequestOptions options) | |||||
Task<IWebhook> IDiscordClient.GetWebhookAsync(ulong id, RequestOptions options) | |||||
=> Task.FromResult<IWebhook>(null); | => Task.FromResult<IWebhook>(null); | ||||
Task IDiscordClient.StartAsync() | Task IDiscordClient.StartAsync() | ||||
@@ -144,9 +144,9 @@ namespace Discord.Rest | |||||
return null; | return null; | ||||
} | } | ||||
public static async Task<RestWebhook> GetWebhookAsync(BaseDiscordClient client, ulong id, string webhookToken, RequestOptions options) | |||||
public static async Task<RestWebhook> GetWebhookAsync(BaseDiscordClient client, ulong id, RequestOptions options) | |||||
{ | { | ||||
var model = await client.ApiClient.GetWebhookAsync(id, webhookToken); | |||||
var model = await client.ApiClient.GetWebhookAsync(id); | |||||
if (model != null) | if (model != null) | ||||
return RestWebhook.Create(client, (IGuild)null, model); | return RestWebhook.Create(client, (IGuild)null, model); | ||||
return null; | return null; | ||||
@@ -486,12 +486,8 @@ namespace Discord.API | |||||
if (args.Content.Length > DiscordConfig.MaxMessageSize) | if (args.Content.Length > DiscordConfig.MaxMessageSize) | ||||
throw new ArgumentException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content)); | throw new ArgumentException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content)); | ||||
options = RequestOptions.CreateOrClone(options); | options = RequestOptions.CreateOrClone(options); | ||||
if (args.ReturnCreatedMessage) | |||||
return await SendJsonAsync<Message>("POST", () => $"webhooks/{webhookId}/{AuthToken}", args, new BucketIds(), clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); | |||||
await SendJsonAsync("POST", () => $"webhooks/{webhookId}/{AuthToken}", args, new BucketIds(), clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); | |||||
return null; | |||||
return await SendJsonAsync<Message>("POST", () => $"webhooks/{webhookId}/{AuthToken}?wait=true", args, new BucketIds(), clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); | |||||
} | } | ||||
public async Task<Message> UploadFileAsync(ulong channelId, UploadFileParams args, RequestOptions options = null) | public async Task<Message> UploadFileAsync(ulong channelId, UploadFileParams args, RequestOptions options = null) | ||||
{ | { | ||||
@@ -507,7 +503,7 @@ namespace Discord.API | |||||
var ids = new BucketIds(channelId: channelId); | var ids = new BucketIds(channelId: channelId); | ||||
return await SendMultipartAsync<Message>("POST", () => $"channels/{channelId}/messages", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); | return await SendMultipartAsync<Message>("POST", () => $"channels/{channelId}/messages", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); | ||||
} | } | ||||
public async Task UploadWebhookFileAsync(ulong webhookId, UploadWebhookFileParams args, RequestOptions options = null) | |||||
public async Task<Message> UploadWebhookFileAsync(ulong webhookId, UploadWebhookFileParams args, RequestOptions options = null) | |||||
{ | { | ||||
if (AuthTokenType != TokenType.Webhook) | if (AuthTokenType != TokenType.Webhook) | ||||
throw new InvalidOperationException($"This operation may only be called with a {nameof(TokenType.Webhook)} token."); | throw new InvalidOperationException($"This operation may only be called with a {nameof(TokenType.Webhook)} token."); | ||||
@@ -526,7 +522,7 @@ namespace Discord.API | |||||
throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content)); | throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content)); | ||||
} | } | ||||
await SendMultipartAsync("POST", () => $"webhooks/{webhookId}/{AuthToken}", args.ToDictionary(), new BucketIds(), clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); | |||||
return await SendMultipartAsync<Message>("POST", () => $"webhooks/{webhookId}/{AuthToken}?wait=true", args.ToDictionary(), new BucketIds(), clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); | |||||
} | } | ||||
public async Task DeleteMessageAsync(ulong channelId, ulong messageId, RequestOptions options = null) | public async Task DeleteMessageAsync(ulong channelId, ulong messageId, RequestOptions options = null) | ||||
{ | { | ||||
@@ -92,8 +92,8 @@ namespace Discord.Rest | |||||
public Task<RestVoiceRegion> GetVoiceRegionAsync(string id, RequestOptions options = null) | public Task<RestVoiceRegion> GetVoiceRegionAsync(string id, RequestOptions options = null) | ||||
=> ClientHelper.GetVoiceRegionAsync(this, id, options); | => ClientHelper.GetVoiceRegionAsync(this, id, options); | ||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
public Task<RestWebhook> GetWebhookAsync(ulong id, string webhookToken = null, RequestOptions options = null) | |||||
=> ClientHelper.GetWebhookAsync(this, id, webhookToken, options); | |||||
public Task<RestWebhook> GetWebhookAsync(ulong id, RequestOptions options = null) | |||||
=> ClientHelper.GetWebhookAsync(this, id, options); | |||||
//IDiscordClient | //IDiscordClient | ||||
async Task<IApplication> IDiscordClient.GetApplicationInfoAsync(RequestOptions options) | async Task<IApplication> IDiscordClient.GetApplicationInfoAsync(RequestOptions options) | ||||
@@ -164,7 +164,7 @@ namespace Discord.Rest | |||||
async Task<IVoiceRegion> IDiscordClient.GetVoiceRegionAsync(string id, RequestOptions options) | async Task<IVoiceRegion> IDiscordClient.GetVoiceRegionAsync(string id, RequestOptions options) | ||||
=> await GetVoiceRegionAsync(id, options).ConfigureAwait(false); | => await GetVoiceRegionAsync(id, options).ConfigureAwait(false); | ||||
async Task<IWebhook> IDiscordClient.GetWebhookAsync(ulong id, string webhookToken, RequestOptions options) | |||||
=> await GetWebhookAsync(id, webhookToken, options); | |||||
async Task<IWebhook> IDiscordClient.GetWebhookAsync(ulong id, RequestOptions options) | |||||
=> await GetWebhookAsync(id, options); | |||||
} | } | ||||
} | } |
@@ -10,41 +10,45 @@ namespace Discord.Rest | |||||
{ | { | ||||
internal IGuild Guild { get; private set; } | internal IGuild Guild { get; private set; } | ||||
internal ITextChannel Channel { get; private set; } | internal ITextChannel Channel { get; private set; } | ||||
public string Token { get; private set; } | |||||
public ulong ChannelId { get; } | |||||
public string Token { get; } | |||||
public string Name { get; private set; } | public string Name { get; private set; } | ||||
public string AvatarId { get; private set; } | public string AvatarId { get; private set; } | ||||
public ulong ChannelId { get; private set; } | |||||
public ulong GuildId { get; private set; } | |||||
public ulong? GuildId { get; private set; } | |||||
public IUser Creator { get; private set; } | public IUser Creator { get; private set; } | ||||
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | ||||
internal RestWebhook(BaseDiscordClient discord, IGuild guild, ulong id) | |||||
internal RestWebhook(BaseDiscordClient discord, IGuild guild, ulong id, string token, ulong channelId) | |||||
: base(discord, id) | : base(discord, id) | ||||
{ | { | ||||
Guild = guild; | Guild = guild; | ||||
Token = token; | |||||
ChannelId = channelId; | |||||
} | } | ||||
internal RestWebhook(BaseDiscordClient discord, ITextChannel channel, ulong id) | |||||
: this(discord, channel.Guild, id) | |||||
internal RestWebhook(BaseDiscordClient discord, ITextChannel channel, ulong id, string token, ulong channelId) | |||||
: this(discord, channel.Guild, id, token, channelId) | |||||
{ | { | ||||
Channel = channel; | Channel = channel; | ||||
} | } | ||||
internal static RestWebhook Create(BaseDiscordClient discord, IGuild guild, Model model) | internal static RestWebhook Create(BaseDiscordClient discord, IGuild guild, Model model) | ||||
{ | { | ||||
var entity = new RestWebhook(discord, guild, model.Id); | |||||
var entity = new RestWebhook(discord, guild, model.Id, model.Token, model.ChannelId); | |||||
entity.Update(model); | entity.Update(model); | ||||
return entity; | return entity; | ||||
} | } | ||||
internal static RestWebhook Create(BaseDiscordClient discord, ITextChannel channel, Model model) | internal static RestWebhook Create(BaseDiscordClient discord, ITextChannel channel, Model model) | ||||
{ | { | ||||
var entity = new RestWebhook(discord, channel, model.Id); | |||||
var entity = new RestWebhook(discord, channel, model.Id, model.Token, model.ChannelId); | |||||
entity.Update(model); | entity.Update(model); | ||||
return entity; | return entity; | ||||
} | } | ||||
internal void Update(Model model) | internal void Update(Model model) | ||||
{ | { | ||||
Token = model.Token; | |||||
ChannelId = model.ChannelId; | |||||
if (model.Avatar.IsSpecified) | if (model.Avatar.IsSpecified) | ||||
AvatarId = model.Avatar.Value; | AvatarId = model.Avatar.Value; | ||||
if (model.Creator.IsSpecified) | if (model.Creator.IsSpecified) | ||||
@@ -73,16 +77,8 @@ namespace Discord.Rest | |||||
public Task DeleteAsync(RequestOptions options = null) | public Task DeleteAsync(RequestOptions options = null) | ||||
=> WebhookHelper.DeleteAsync(this, Discord, options); | => WebhookHelper.DeleteAsync(this, Discord, options); | ||||
public async Task<RestTextChannel> GetChannelAsync(RequestOptions options = null) | |||||
{ | |||||
Channel = await ClientHelper.GetChannelAsync(Discord, ChannelId, options) as RestTextChannel; | |||||
Guild = Channel.Guild; | |||||
return Channel as RestTextChannel; | |||||
} | |||||
public override string ToString() => Name; | |||||
private string DebuggerDisplay => $"{Name} ({Id})"; | |||||
public override string ToString() => $"Webhook: {Name}:{Id}"; | |||||
private string DebuggerDisplay => $"Webhook: {Name} ({Id})"; | |||||
//IWebhook | //IWebhook | ||||
IGuild IWebhook.Guild | IGuild IWebhook.Guild | ||||
@@ -1,6 +1,6 @@ | |||||
using Discord.API.Rest; | |||||
using System; | |||||
using System; | |||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using Discord.API.Rest; | |||||
using ImageModel = Discord.API.Image; | using ImageModel = Discord.API.Image; | ||||
using Model = Discord.API.Webhook; | using Model = Discord.API.Webhook; | ||||
@@ -22,6 +22,11 @@ namespace Discord.Rest | |||||
if (!apiArgs.Avatar.IsSpecified && webhook.AvatarId != null) | if (!apiArgs.Avatar.IsSpecified && webhook.AvatarId != null) | ||||
apiArgs.Avatar = new ImageModel(webhook.AvatarId); | apiArgs.Avatar = new ImageModel(webhook.AvatarId); | ||||
if (args.Channel.IsSpecified) | |||||
apiArgs.ChannelId = args.Channel.Value.Id; | |||||
else if (args.ChannelId.IsSpecified) | |||||
apiArgs.ChannelId = args.ChannelId.Value; | |||||
return await client.ApiClient.ModifyWebhookAsync(webhook.Id, apiArgs, options).ConfigureAwait(false); | return await client.ApiClient.ModifyWebhookAsync(webhook.Id, apiArgs, options).ConfigureAwait(false); | ||||
} | } | ||||
public static async Task DeleteAsync(IWebhook webhook, BaseDiscordClient client, RequestOptions options) | public static async Task DeleteAsync(IWebhook webhook, BaseDiscordClient client, RequestOptions options) | ||||