Browse Source

Fix #115. Added 2 more methods to upload stickers via filepath or stream

pull/1923/head
quin lynch 3 years ago
parent
commit
e9b807a0dd
9 changed files with 247 additions and 7 deletions
  1. +27
    -0
      src/Discord.Net.Core/Discord.Net.Core.xml
  2. +28
    -0
      src/Discord.Net.Core/Entities/Guilds/IGuild.cs
  3. +4
    -2
      src/Discord.Net.Rest/API/Net/MultipartFile.cs
  4. +11
    -3
      src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs
  5. +45
    -0
      src/Discord.Net.Rest/Discord.Net.Rest.xml
  6. +27
    -0
      src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
  7. +47
    -0
      src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
  8. +11
    -2
      src/Discord.Net.Rest/Net/DefaultRestClient.cs
  9. +47
    -0
      src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs

+ 27
- 0
src/Discord.Net.Core/Discord.Net.Core.xml View File

@@ -3945,6 +3945,33 @@
A task that represents the asynchronous creation operation. The task result contains the created sticker. A task that represents the asynchronous creation operation. The task result contains the created sticker.
</returns> </returns>
</member> </member>
<member name="M:Discord.IGuild.CreateStickerAsync(System.String,System.String,System.Collections.Generic.IEnumerable{System.String},System.String,Discord.RequestOptions)">
<summary>
Creates a new sticker in this guild
</summary>
<param name="name">The name of the sticker.</param>
<param name="description">The description of the sticker.</param>
<param name="tags">The tags of the sticker.</param>
<param name="path">The path of the file to upload.</param>
<param name="options">The options to be used when sending the request.</param>
<returns>
A task that represents the asynchronous creation operation. The task result contains the created sticker.
</returns>
</member>
<member name="M:Discord.IGuild.CreateStickerAsync(System.String,System.String,System.Collections.Generic.IEnumerable{System.String},System.IO.Stream,System.String,Discord.RequestOptions)">
<summary>
Creates a new sticker in this guild
</summary>
<param name="name">The name of the sticker.</param>
<param name="description">The description of the sticker.</param>
<param name="tags">The tags of the sticker.</param>
<param name="stream">The stream containing the file data.</param>
<param name="filename">The name of the file <b>with</b> the extension, ex: image.png</param>
<param name="options">The options to be used when sending the request.</param>
<returns>
A task that represents the asynchronous creation operation. The task result contains the created sticker.
</returns>
</member>
<member name="M:Discord.IGuild.GetStickerAsync(System.UInt64,Discord.CacheMode,Discord.RequestOptions)"> <member name="M:Discord.IGuild.GetStickerAsync(System.UInt64,Discord.CacheMode,Discord.RequestOptions)">
<summary> <summary>
Gets a specific sticker within this guild. Gets a specific sticker within this guild.


+ 28
- 0
src/Discord.Net.Core/Entities/Guilds/IGuild.cs View File

@@ -2,6 +2,7 @@ using Discord.Audio;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;


namespace Discord namespace Discord
@@ -962,6 +963,33 @@ namespace Discord
/// </returns> /// </returns>
Task<ICustomSticker> CreateStickerAsync(string name, string description, IEnumerable<string> tags, Image image, RequestOptions options = null); Task<ICustomSticker> CreateStickerAsync(string name, string description, IEnumerable<string> tags, Image image, RequestOptions options = null);


/// <summary>
/// Creates a new sticker in this guild
/// </summary>
/// <param name="name">The name of the sticker.</param>
/// <param name="description">The description of the sticker.</param>
/// <param name="tags">The tags of the sticker.</param>
/// <param name="path">The path of the file to upload.</param>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous creation operation. The task result contains the created sticker.
/// </returns>
Task<ICustomSticker> CreateStickerAsync(string name, string description, IEnumerable<string> tags, string path, RequestOptions options = null);

/// <summary>
/// Creates a new sticker in this guild
/// </summary>
/// <param name="name">The name of the sticker.</param>
/// <param name="description">The description of the sticker.</param>
/// <param name="tags">The tags of the sticker.</param>
/// <param name="stream">The stream containing the file data.</param>
/// <param name="filename">The name of the file <b>with</b> the extension, ex: image.png</param>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous creation operation. The task result contains the created sticker.
/// </returns>
Task<ICustomSticker> CreateStickerAsync(string name, string description, IEnumerable<string> tags, Stream stream, string filename, RequestOptions options = null);

/// <summary> /// <summary>
/// Gets a specific sticker within this guild. /// Gets a specific sticker within this guild.
/// </summary> /// </summary>


+ 4
- 2
src/Discord.Net.Rest/API/Net/MultipartFile.cs View File

@@ -1,4 +1,4 @@
using System.IO;
using System.IO;


namespace Discord.Net.Rest namespace Discord.Net.Rest
{ {
@@ -6,11 +6,13 @@ namespace Discord.Net.Rest
{ {
public Stream Stream { get; } public Stream Stream { get; }
public string Filename { get; } public string Filename { get; }
public string ContentType { get; }


public MultipartFile(Stream stream, string filename)
public MultipartFile(Stream stream, string filename, string contentType = null)
{ {
Stream = stream; Stream = stream;
Filename = filename; Filename = filename;
this.ContentType = contentType;
} }
} }
} }

+ 11
- 3
src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs View File

@@ -15,17 +15,25 @@ namespace Discord.API.Rest
public string Name { get; set; } public string Name { get; set; }
public string Description { get; set; } public string Description { get; set; }
public string Tags { get; set; } public string Tags { get; set; }
public string FileName { get; set; }


public IReadOnlyDictionary<string, object> ToDictionary() public IReadOnlyDictionary<string, object> ToDictionary()
{ {
var d = new Dictionary<string, object>(); var d = new Dictionary<string, object>();


d["file"] = new MultipartFile(File, Name + ".dat");

d["name"] = Name;
d["name"] = $"{Name}";
d["description"] = Description; d["description"] = Description;
d["tags"] = Tags; d["tags"] = Tags;


string contentType = "image/png";

if (File is FileStream fileStream)
contentType = $"image/{Path.GetExtension(fileStream.Name)}";
else if(FileName != null)
contentType = $"image/{Path.GetExtension(FileName)}";

d["file"] = new MultipartFile(File, FileName ?? "image", contentType.Replace(".", ""));

return d; return d;
} }
} }


+ 45
- 0
src/Discord.Net.Rest/Discord.Net.Rest.xml View File

@@ -3540,6 +3540,33 @@
A task that represents the asynchronous creation operation. The task result contains the created sticker. A task that represents the asynchronous creation operation. The task result contains the created sticker.
</returns> </returns>
</member> </member>
<member name="M:Discord.Rest.RestGuild.CreateStickerAsync(System.String,System.String,System.Collections.Generic.IEnumerable{System.String},System.String,Discord.RequestOptions)">
<summary>
Creates a new sticker in this guild
</summary>
<param name="name">The name of the sticker.</param>
<param name="description">The description of the sticker.</param>
<param name="tags">The tags of the sticker.</param>
<param name="path">The path of the file to upload.</param>
<param name="options">The options to be used when sending the request.</param>
<returns>
A task that represents the asynchronous creation operation. The task result contains the created sticker.
</returns>
</member>
<member name="M:Discord.Rest.RestGuild.CreateStickerAsync(System.String,System.String,System.Collections.Generic.IEnumerable{System.String},System.IO.Stream,System.String,Discord.RequestOptions)">
<summary>
Creates a new sticker in this guild
</summary>
<param name="name">The name of the sticker.</param>
<param name="description">The description of the sticker.</param>
<param name="tags">The tags of the sticker.</param>
<param name="stream">The stream containing the file data.</param>
<param name="filename">The name of the file <b>with</b> the extension, ex: image.png</param>
<param name="options">The options to be used when sending the request.</param>
<returns>
A task that represents the asynchronous creation operation. The task result contains the created sticker.
</returns>
</member>
<member name="M:Discord.Rest.RestGuild.GetStickerAsync(System.UInt64,Discord.RequestOptions)"> <member name="M:Discord.Rest.RestGuild.GetStickerAsync(System.UInt64,Discord.RequestOptions)">
<summary> <summary>
Gets a specific sticker within this guild. Gets a specific sticker within this guild.
@@ -3707,6 +3734,24 @@
<member name="M:Discord.Rest.RestGuild.Discord#IGuild#GetApplicationCommandsAsync(Discord.RequestOptions)"> <member name="M:Discord.Rest.RestGuild.Discord#IGuild#GetApplicationCommandsAsync(Discord.RequestOptions)">
<inheritdoc /> <inheritdoc />
</member> </member>
<member name="M:Discord.Rest.RestGuild.Discord#IGuild#CreateStickerAsync(System.String,System.String,System.Collections.Generic.IEnumerable{System.String},Discord.Image,Discord.RequestOptions)">
<inheritdoc />
</member>
<member name="M:Discord.Rest.RestGuild.Discord#IGuild#CreateStickerAsync(System.String,System.String,System.Collections.Generic.IEnumerable{System.String},System.IO.Stream,System.String,Discord.RequestOptions)">
<inheritdoc />
</member>
<member name="M:Discord.Rest.RestGuild.Discord#IGuild#CreateStickerAsync(System.String,System.String,System.Collections.Generic.IEnumerable{System.String},System.String,Discord.RequestOptions)">
<inheritdoc />
</member>
<member name="M:Discord.Rest.RestGuild.Discord#IGuild#GetStickerAsync(System.UInt64,Discord.CacheMode,Discord.RequestOptions)">
<inheritdoc />
</member>
<member name="M:Discord.Rest.RestGuild.Discord#IGuild#GetStickersAsync(Discord.CacheMode,Discord.RequestOptions)">
<inheritdoc />
</member>
<member name="M:Discord.Rest.RestGuild.Discord#IGuild#DeleteStickerAsync(Discord.ICustomSticker,Discord.RequestOptions)">
<inheritdoc />
</member>
<member name="P:Discord.Rest.RestGuildIntegration.Name"> <member name="P:Discord.Rest.RestGuildIntegration.Name">
<inheritdoc /> <inheritdoc />
</member> </member>


+ 27
- 0
src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs View File

@@ -8,6 +8,7 @@ using WidgetModel = Discord.API.GuildWidget;
using Model = Discord.API.Guild; using Model = Discord.API.Guild;
using RoleModel = Discord.API.Role; using RoleModel = Discord.API.Role;
using ImageModel = Discord.API.Image; using ImageModel = Discord.API.Image;
using System.IO;


namespace Discord.Rest namespace Discord.Rest
{ {
@@ -559,6 +560,32 @@ namespace Discord.Rest
return await client.ApiClient.CreateGuildStickerAsync(apiArgs, guild.Id, options).ConfigureAwait(false); return await client.ApiClient.CreateGuildStickerAsync(apiArgs, guild.Id, options).ConfigureAwait(false);
} }


public static async Task<API.Sticker> CreateStickerAsync(BaseDiscordClient client, IGuild guild, string name, string description, IEnumerable<string> tags,
Stream file, string filename, RequestOptions options = null)
{
Preconditions.NotNull(name, nameof(name));
Preconditions.NotNull(description, nameof(description));
Preconditions.NotNull(file, nameof(file));
Preconditions.NotNull(filename, nameof(filename));

Preconditions.AtLeast(name.Length, 2, nameof(name));
Preconditions.AtLeast(description.Length, 2, nameof(description));

Preconditions.AtMost(name.Length, 30, nameof(name));
Preconditions.AtMost(description.Length, 100, nameof(name));

var apiArgs = new CreateStickerParams()
{
Name = name,
Description = description,
File = file,
Tags = string.Join(", ", tags),
FileName = filename
};

return await client.ApiClient.CreateGuildStickerAsync(apiArgs, guild.Id, options).ConfigureAwait(false);
}

public static async Task<API.Sticker> ModifyStickerAsync(BaseDiscordClient client, ulong guildId, ISticker sticker, Action<StickerProperties> func, public static async Task<API.Sticker> ModifyStickerAsync(BaseDiscordClient client, ulong guildId, ISticker sticker, Action<StickerProperties> func,
RequestOptions options = null) RequestOptions options = null)
{ {


+ 47
- 0
src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs View File

@@ -8,6 +8,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using WidgetModel = Discord.API.GuildWidget; using WidgetModel = Discord.API.GuildWidget;
using Model = Discord.API.Guild; using Model = Discord.API.Guild;
using System.IO;


namespace Discord.Rest namespace Discord.Rest
{ {
@@ -946,6 +947,42 @@ namespace Discord.Rest
return CustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null); return CustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null);
} }
/// <summary> /// <summary>
/// Creates a new sticker in this guild
/// </summary>
/// <param name="name">The name of the sticker.</param>
/// <param name="description">The description of the sticker.</param>
/// <param name="tags">The tags of the sticker.</param>
/// <param name="path">The path of the file to upload.</param>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous creation operation. The task result contains the created sticker.
/// </returns>
public Task<CustomSticker> CreateStickerAsync(string name, string description, IEnumerable<string> tags, string path,
RequestOptions options = null)
{
var fs = File.OpenRead(path);
return CreateStickerAsync(name, description, tags, fs, Path.GetFileName(fs.Name), options);
}
/// <summary>
/// Creates a new sticker in this guild
/// </summary>
/// <param name="name">The name of the sticker.</param>
/// <param name="description">The description of the sticker.</param>
/// <param name="tags">The tags of the sticker.</param>
/// <param name="stream">The stream containing the file data.</param>
/// <param name="filename">The name of the file <b>with</b> the extension, ex: image.png</param>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous creation operation. The task result contains the created sticker.
/// </returns>
public async Task<CustomSticker> CreateStickerAsync(string name, string description, IEnumerable<string> tags, Stream stream,
string filename, RequestOptions options = null)
{
var model = await GuildHelper.CreateStickerAsync(Discord, this, name, description, tags, stream, filename, options).ConfigureAwait(false);

return CustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null);
}
/// <summary>
/// Gets a specific sticker within this guild. /// Gets a specific sticker within this guild.
/// </summary> /// </summary>
/// <param name="id">The id of the sticker to get.</param> /// <param name="id">The id of the sticker to get.</param>
@@ -1262,8 +1299,16 @@ namespace Discord.Rest
/// <inheritdoc /> /// <inheritdoc />
async Task<IReadOnlyCollection<IApplicationCommand>> IGuild.GetApplicationCommandsAsync (RequestOptions options) async Task<IReadOnlyCollection<IApplicationCommand>> IGuild.GetApplicationCommandsAsync (RequestOptions options)
=> await GetApplicationCommandsAsync(options).ConfigureAwait(false); => await GetApplicationCommandsAsync(options).ConfigureAwait(false);
/// <inheritdoc />
async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, Image image, RequestOptions options) async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, Image image, RequestOptions options)
=> await CreateStickerAsync(name, description, tags, image, options); => await CreateStickerAsync(name, description, tags, image, options);
/// <inheritdoc />
async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, Stream stream, string filename, RequestOptions options)
=> await CreateStickerAsync(name, description, tags, stream, filename, options);
/// <inheritdoc />
async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, string path, RequestOptions options)
=> await CreateStickerAsync(name, description, tags, path, options);
/// <inheritdoc />
async Task<ICustomSticker> IGuild.GetStickerAsync(ulong id, CacheMode mode, RequestOptions options) async Task<ICustomSticker> IGuild.GetStickerAsync(ulong id, CacheMode mode, RequestOptions options)
{ {
if (mode != CacheMode.AllowDownload) if (mode != CacheMode.AllowDownload)
@@ -1271,6 +1316,7 @@ namespace Discord.Rest


return await GetStickerAsync(id, options); return await GetStickerAsync(id, options);
} }
/// <inheritdoc />
async Task<IReadOnlyCollection<ICustomSticker>> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options) async Task<IReadOnlyCollection<ICustomSticker>> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options)
{ {
if (mode != CacheMode.AllowDownload) if (mode != CacheMode.AllowDownload)
@@ -1278,6 +1324,7 @@ namespace Discord.Rest


return await GetStickersAsync(options); return await GetStickersAsync(options);
} }
/// <inheritdoc />
Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options) Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options)
=> sticker.DeleteAsync(); => sticker.DeleteAsync();
} }


+ 11
- 2
src/Discord.Net.Rest/Net/DefaultRestClient.cs View File

@@ -7,6 +7,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Net.Http.Headers;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -101,7 +102,7 @@ namespace Discord.Net.Rest
switch (p.Value) switch (p.Value)
{ {
#pragma warning disable IDISP004 #pragma warning disable IDISP004
case string stringValue: { content.Add(new StringContent(stringValue), p.Key); continue; }
case string stringValue: { content.Add(new StringContent(stringValue, Encoding.UTF8, "text/plain"), p.Key); continue; }
case byte[] byteArrayValue: { content.Add(new ByteArrayContent(byteArrayValue), p.Key); continue; } case byte[] byteArrayValue: { content.Add(new ByteArrayContent(byteArrayValue), p.Key); continue; }
case Stream streamValue: { content.Add(new StreamContent(streamValue), p.Key); continue; } case Stream streamValue: { content.Add(new StreamContent(streamValue), p.Key); continue; }
case MultipartFile fileValue: case MultipartFile fileValue:
@@ -116,8 +117,16 @@ namespace Discord.Net.Rest
stream = memoryStream; stream = memoryStream;
#pragma warning restore IDISP001 #pragma warning restore IDISP001
} }
content.Add(new StreamContent(stream), p.Key, fileValue.Filename);

var streamContent = new StreamContent(stream);
var extension = fileValue.Filename.Split('.').Last();

if(fileValue.ContentType != null)
streamContent.Headers.ContentType = new MediaTypeHeaderValue(fileValue.ContentType);

content.Add(streamContent, p.Key, fileValue.Filename);
#pragma warning restore IDISP004 #pragma warning restore IDISP004
continue; continue;
} }
default: throw new InvalidOperationException($"Unsupported param type \"{p.Value.GetType().Name}\"."); default: throw new InvalidOperationException($"Unsupported param type \"{p.Value.GetType().Name}\".");


+ 47
- 0
src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs View File

@@ -20,6 +20,7 @@ using RoleModel = Discord.API.Role;
using UserModel = Discord.API.User; using UserModel = Discord.API.User;
using VoiceStateModel = Discord.API.VoiceState; using VoiceStateModel = Discord.API.VoiceState;
using StickerModel = Discord.API.Sticker; using StickerModel = Discord.API.Sticker;
using System.IO;


namespace Discord.WebSocket namespace Discord.WebSocket
{ {
@@ -1248,6 +1249,42 @@ namespace Discord.WebSocket
return AddOrUpdateSticker(model); return AddOrUpdateSticker(model);
} }
/// <summary> /// <summary>
/// Creates a new sticker in this guild
/// </summary>
/// <param name="name">The name of the sticker.</param>
/// <param name="description">The description of the sticker.</param>
/// <param name="tags">The tags of the sticker.</param>
/// <param name="path">The path of the file to upload.</param>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous creation operation. The task result contains the created sticker.
/// </returns>
public Task<SocketCustomSticker> CreateStickerAsync(string name, string description, IEnumerable<string> tags, string path,
RequestOptions options = null)
{
var fs = File.OpenRead(path);
return CreateStickerAsync(name, description, tags, fs, Path.GetFileName(fs.Name), options);
}
/// <summary>
/// Creates a new sticker in this guild
/// </summary>
/// <param name="name">The name of the sticker.</param>
/// <param name="description">The description of the sticker.</param>
/// <param name="tags">The tags of the sticker.</param>
/// <param name="stream">The stream containing the file data.</param>
/// <param name="filename">The name of the file <b>with</b> the extension, ex: image.png</param>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous creation operation. The task result contains the created sticker.
/// </returns>
public async Task<SocketCustomSticker> CreateStickerAsync(string name, string description, IEnumerable<string> tags, Stream stream,
string filename, RequestOptions options = null)
{
var model = await GuildHelper.CreateStickerAsync(Discord, this, name, description, tags, stream, filename, options).ConfigureAwait(false);

return AddOrUpdateSticker(model);
}
/// <summary>
/// Deletes a sticker within this guild. /// Deletes a sticker within this guild.
/// </summary> /// </summary>
/// <param name="sticker">The sticker to delete.</param> /// <param name="sticker">The sticker to delete.</param>
@@ -1632,12 +1669,22 @@ namespace Discord.WebSocket
/// <inheritdoc /> /// <inheritdoc />
async Task<IReadOnlyCollection<IApplicationCommand>> IGuild.GetApplicationCommandsAsync (RequestOptions options) async Task<IReadOnlyCollection<IApplicationCommand>> IGuild.GetApplicationCommandsAsync (RequestOptions options)
=> await GetApplicationCommandsAsync(options).ConfigureAwait(false); => await GetApplicationCommandsAsync(options).ConfigureAwait(false);
/// <inheritdoc />
async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, Image image, RequestOptions options) async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, Image image, RequestOptions options)
=> await CreateStickerAsync(name, description, tags, image, options); => await CreateStickerAsync(name, description, tags, image, options);
/// <inheritdoc />
async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, Stream stream, string filename, RequestOptions options)
=> await CreateStickerAsync(name, description, tags, stream, filename, options);
/// <inheritdoc />
async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, string path, RequestOptions options)
=> await CreateStickerAsync(name, description, tags, path, options);
/// <inheritdoc />
async Task<ICustomSticker> IGuild.GetStickerAsync(ulong id, CacheMode mode, RequestOptions options) async Task<ICustomSticker> IGuild.GetStickerAsync(ulong id, CacheMode mode, RequestOptions options)
=> await GetStickerAsync(id, mode, options); => await GetStickerAsync(id, mode, options);
/// <inheritdoc />
async Task<IReadOnlyCollection<ICustomSticker>> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options) async Task<IReadOnlyCollection<ICustomSticker>> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options)
=> await GetStickersAsync(mode, options); => await GetStickersAsync(mode, options);
/// <inheritdoc />
Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options) Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options)
=> DeleteStickerAsync(_stickers[sticker.Id], options); => DeleteStickerAsync(_stickers[sticker.Id], options);




Loading…
Cancel
Save