uh yes pls (#2963)
This commit is contained in:
@@ -0,0 +1,12 @@
|
|||||||
|
namespace Discord;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the properties for an application emote.
|
||||||
|
/// </summary>
|
||||||
|
public class ApplicationEmoteProperties
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the name of the emote.
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
@@ -12,8 +12,10 @@ namespace Discord
|
|||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public ulong Id { get; }
|
public ulong Id { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets whether this emote is animated.
|
/// Gets whether this emote is animated.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -21,8 +23,10 @@ namespace Discord
|
|||||||
/// A boolean that determines whether or not this emote is an animated one.
|
/// A boolean that determines whether or not this emote is an animated one.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
public bool Animated { get; }
|
public bool Animated { get; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id);
|
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the image URL of this emote.
|
/// Gets the image URL of this emote.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -31,6 +35,11 @@ namespace Discord
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
public string Url => CDN.GetEmojiUrl(Id, Animated);
|
public string Url => CDN.GetEmojiUrl(Id, Animated);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user who created this emote. <see langword="null" /> if not available.
|
||||||
|
/// </summary>
|
||||||
|
public IUser User { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new instance of <see cref="Emote" />.
|
/// Creates a new instance of <see cref="Emote" />.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -41,6 +50,14 @@ namespace Discord
|
|||||||
Animated = animated;
|
Animated = animated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal Emote(ulong id, string name, bool animated = false, IUser user = null)
|
||||||
|
{
|
||||||
|
Id = id;
|
||||||
|
Name = name;
|
||||||
|
Animated = animated;
|
||||||
|
User = user;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines whether the specified emote is equal to the current emote.
|
/// Determines whether the specified emote is equal to the current emote.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -356,5 +356,30 @@ namespace Discord
|
|||||||
/// <param name="entitlementId">The id of the entitlement.</param>
|
/// <param name="entitlementId">The id of the entitlement.</param>
|
||||||
/// <param name="options">The options to be used when sending the request.</param>
|
/// <param name="options">The options to be used when sending the request.</param>
|
||||||
Task ConsumeEntitlementAsync(ulong entitlementId, RequestOptions options = null);
|
Task ConsumeEntitlementAsync(ulong entitlementId, RequestOptions options = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets an emote for the current application.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Emote> GetApplicationEmoteAsync(ulong emoteId, RequestOptions options = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets all emotes for the current application.
|
||||||
|
/// </summary>
|
||||||
|
public Task<IReadOnlyCollection<Emote>> GetApplicationEmotesAsync(RequestOptions options = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Modifies an emote for the current application.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Emote> ModifyApplicationEmoteAsync(ulong emoteId, Action<ApplicationEmoteProperties> args, RequestOptions options = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates an emote for the current application.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Emote> CreateApplicationEmoteAsync(string name, Image image, RequestOptions options = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deletes an emote for the current application.
|
||||||
|
/// </summary>
|
||||||
|
public Task DeleteApplicationEmoteAsync(ulong emoteId, RequestOptions options = null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,16 +11,16 @@ internal class Emoji
|
|||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
[JsonProperty("animated")]
|
[JsonProperty("animated")]
|
||||||
public bool? Animated { get; set; }
|
public Optional<bool> Animated { get; set; }
|
||||||
|
|
||||||
[JsonProperty("roles")]
|
[JsonProperty("roles")]
|
||||||
public ulong[] Roles { get; set; }
|
public Optional<ulong[]> Roles { get; set; }
|
||||||
|
|
||||||
[JsonProperty("require_colons")]
|
[JsonProperty("require_colons")]
|
||||||
public bool RequireColons { get; set; }
|
public Optional<bool> RequireColons { get; set; }
|
||||||
|
|
||||||
[JsonProperty("managed")]
|
[JsonProperty("managed")]
|
||||||
public bool Managed { get; set; }
|
public Optional<bool> Managed { get; set; }
|
||||||
|
|
||||||
[JsonProperty("user")]
|
[JsonProperty("user")]
|
||||||
public Optional<User> User { get; set; }
|
public Optional<User> User { get; set; }
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Discord.API;
|
||||||
|
|
||||||
|
internal class ListApplicationEmojisResponse
|
||||||
|
{
|
||||||
|
[JsonProperty("items")]
|
||||||
|
public Emoji[] Items { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Discord.API.Rest;
|
||||||
|
|
||||||
|
internal class CreateApplicationEmoteParams
|
||||||
|
{
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("image")]
|
||||||
|
public Image Image { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Discord.API.Rest;
|
||||||
|
|
||||||
|
internal class ModifyApplicationEmoteParams
|
||||||
|
{
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public Optional<string> Name { get; set; }
|
||||||
|
}
|
||||||
@@ -299,6 +299,22 @@ namespace Discord.Rest
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
Task IDiscordClient.ConsumeEntitlementAsync(ulong entitlementId, RequestOptions options) => Task.CompletedTask;
|
Task IDiscordClient.ConsumeEntitlementAsync(ulong entitlementId, RequestOptions options) => Task.CompletedTask;
|
||||||
|
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
Task<Emote> IDiscordClient.GetApplicationEmoteAsync(ulong emoteId, RequestOptions options) => Task.FromResult<Emote>(null);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
Task<IReadOnlyCollection<Emote>> IDiscordClient.GetApplicationEmotesAsync(RequestOptions options) => Task.FromResult<IReadOnlyCollection<Emote>>(ImmutableArray.Create<Emote>());
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
Task<Emote> IDiscordClient.ModifyApplicationEmoteAsync(ulong emoteId, Action<ApplicationEmoteProperties> args, RequestOptions options) => Task.FromResult<Emote>(null);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
Task<Emote> IDiscordClient.CreateApplicationEmoteAsync(string name, Image image, RequestOptions options) => Task.FromResult<Emote>(null);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
Task IDiscordClient.DeleteApplicationEmoteAsync(ulong emoteId, RequestOptions options) => Task.CompletedTask;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -450,5 +450,48 @@ namespace Discord.Rest
|
|||||||
=> client.ApiClient.ConsumeEntitlementAsync(entitlementId, options);
|
=> client.ApiClient.ConsumeEntitlementAsync(entitlementId, options);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Application Emojis
|
||||||
|
|
||||||
|
public static async Task<IReadOnlyCollection<Emote>> GetApplicationEmojisAsync(BaseDiscordClient client, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
var model = await client.ApiClient.GetApplicationEmotesAsync(options).ConfigureAwait(false);
|
||||||
|
return model.Items.Select(x => x.ToEmote(client)).ToImmutableArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<Emote> GetApplicationEmojiAsync(BaseDiscordClient client, ulong emojiId, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
var model = await client.ApiClient.GetApplicationEmoteAsync(emojiId, options).ConfigureAwait(false);
|
||||||
|
return model.ToEmote(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<Emote> CreateApplicationEmojiAsync(BaseDiscordClient client, string name, Image image, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
var model = await client.ApiClient.CreateApplicationEmoteAsync(new CreateApplicationEmoteParams
|
||||||
|
{
|
||||||
|
Name = name,
|
||||||
|
Image = image.ToModel()
|
||||||
|
}, options).ConfigureAwait(false);
|
||||||
|
|
||||||
|
return model.ToEmote(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<Emote> ModifyApplicationEmojiAsync(BaseDiscordClient client, ulong emojiId, Action<ApplicationEmoteProperties> func, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
var args = new ApplicationEmoteProperties();
|
||||||
|
func(args);
|
||||||
|
|
||||||
|
var model = await client.ApiClient.ModifyApplicationEmoteAsync(emojiId, new ModifyApplicationEmoteParams
|
||||||
|
{
|
||||||
|
Name = args.Name,
|
||||||
|
}, options).ConfigureAwait(false);
|
||||||
|
|
||||||
|
return model.ToEmote(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Task DeleteApplicationEmojiAsync(BaseDiscordClient client, ulong emojiId, RequestOptions options = null)
|
||||||
|
=> client.ApiClient.DeleteApplicationEmoteAsync(emojiId, options);
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2093,7 +2093,7 @@ namespace Discord.API
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Guild emoji
|
#region Guild Emoji
|
||||||
public Task<IReadOnlyCollection<Emoji>> GetGuildEmotesAsync(ulong guildId, RequestOptions options = null)
|
public Task<IReadOnlyCollection<Emoji>> GetGuildEmotesAsync(ulong guildId, RequestOptions options = null)
|
||||||
{
|
{
|
||||||
Preconditions.NotEqual(guildId, 0, nameof(guildId));
|
Preconditions.NotEqual(guildId, 0, nameof(guildId));
|
||||||
@@ -2845,5 +2845,56 @@ namespace Discord.API
|
|||||||
=> SendAsync<Message>("POST", () => $"channels/{channelId}/polls/{messageId}/expire", new BucketIds(channelId: channelId), options: options);
|
=> SendAsync<Message>("POST", () => $"channels/{channelId}/polls/{messageId}/expire", new BucketIds(channelId: channelId), options: options);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region App Emojis
|
||||||
|
|
||||||
|
public Task<Emoji> CreateApplicationEmoteAsync(CreateApplicationEmoteParams args, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
Preconditions.NotNull(args, nameof(args));
|
||||||
|
Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name));
|
||||||
|
Preconditions.NotNull(args.Image.Stream, nameof(args.Image));
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
var ids = new BucketIds();
|
||||||
|
return SendJsonAsync<Emoji>("POST", () => $"applications/{CurrentApplicationId}/emojis", args, ids, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<Emoji> ModifyApplicationEmoteAsync(ulong emoteId, ModifyApplicationEmoteParams args, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
Preconditions.NotEqual(emoteId, 0, nameof(emoteId));
|
||||||
|
Preconditions.NotNull(args, nameof(args));
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
var ids = new BucketIds();
|
||||||
|
return SendJsonAsync<Emoji>("PATCH", () => $"applications/{CurrentApplicationId}/emojis/{emoteId}", args, ids, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task DeleteApplicationEmoteAsync(ulong emoteId, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
Preconditions.NotEqual(emoteId, 0, nameof(emoteId));
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
var ids = new BucketIds();
|
||||||
|
return SendAsync("DELETE", () => $"applications/{CurrentApplicationId}/emojis/{emoteId}", ids, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<Emoji> GetApplicationEmoteAsync(ulong emoteId, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
Preconditions.NotEqual(emoteId, 0, nameof(emoteId));
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
var ids = new BucketIds();
|
||||||
|
return SendAsync<Emoji>("GET", () => $"applications/{CurrentApplicationId}/emojis/{emoteId}", ids, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<ListApplicationEmojisResponse> GetApplicationEmotesAsync(RequestOptions options = null)
|
||||||
|
{
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
var ids = new BucketIds();
|
||||||
|
return SendAsync<ListApplicationEmojisResponse>("GET", () => $"applications/{CurrentApplicationId}/emojis", ids, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -300,6 +300,26 @@ namespace Discord.Rest
|
|||||||
public Task ConsumeEntitlementAsync(ulong entitlementId, RequestOptions options = null)
|
public Task ConsumeEntitlementAsync(ulong entitlementId, RequestOptions options = null)
|
||||||
=> ClientHelper.ConsumeEntitlementAsync(this, entitlementId, options);
|
=> ClientHelper.ConsumeEntitlementAsync(this, entitlementId, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task<Emote> GetApplicationEmoteAsync(ulong emoteId, RequestOptions options = null)
|
||||||
|
=> ClientHelper.GetApplicationEmojiAsync(this, emoteId, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task<IReadOnlyCollection<Emote>> GetApplicationEmotesAsync(RequestOptions options = null)
|
||||||
|
=> ClientHelper.GetApplicationEmojisAsync(this, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task<Emote> ModifyApplicationEmoteAsync(ulong emoteId, Action<ApplicationEmoteProperties> args, RequestOptions options = null)
|
||||||
|
=> ClientHelper.ModifyApplicationEmojiAsync(this, emoteId, args, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task<Emote> CreateApplicationEmoteAsync(string name, Image image, RequestOptions options = null)
|
||||||
|
=> ClientHelper.CreateApplicationEmojiAsync(this, name, image, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task DeleteApplicationEmoteAsync(ulong emoteId, RequestOptions options = null)
|
||||||
|
=> ClientHelper.DeleteApplicationEmojiAsync(this, emoteId, options);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IDiscordClient
|
#region IDiscordClient
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class RestGuildOnboardingPromptOption : RestEntity<ulong>, IGuildOnboardi
|
|||||||
|
|
||||||
if (model.Emoji.Id.HasValue)
|
if (model.Emoji.Id.HasValue)
|
||||||
{
|
{
|
||||||
Emoji = new Emote(model.Emoji.Id.Value, model.Emoji.Name, model.Emoji.Animated ?? false);
|
Emoji = new Emote(model.Emoji.Id.Value, model.Emoji.Name, model.Emoji.Animated.GetValueOrDefault(false));
|
||||||
}
|
}
|
||||||
else if (!string.IsNullOrWhiteSpace(model.Emoji.Name))
|
else if (!string.IsNullOrWhiteSpace(model.Emoji.Name))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -13,13 +14,21 @@ namespace Discord.Rest
|
|||||||
return new Emoji(model.Name);
|
return new Emoji(model.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Emote ToEmote(this API.Emoji model, BaseDiscordClient discord = null)
|
||||||
|
=> new(model.Id.GetValueOrDefault(),
|
||||||
|
model.Name,
|
||||||
|
model.Animated.GetValueOrDefault(false),
|
||||||
|
model.User.IsSpecified ?
|
||||||
|
RestUser.Create(discord, model.User.Value)
|
||||||
|
: null);
|
||||||
|
|
||||||
public static GuildEmote ToEntity(this API.Emoji model)
|
public static GuildEmote ToEntity(this API.Emoji model)
|
||||||
=> new GuildEmote(model.Id.Value,
|
=> new GuildEmote(model.Id.Value,
|
||||||
model.Name,
|
model.Name,
|
||||||
model.Animated.GetValueOrDefault(),
|
model.Animated.GetValueOrDefault(false),
|
||||||
model.Managed,
|
model.Managed.GetValueOrDefault(false),
|
||||||
model.RequireColons,
|
model.RequireColons.GetValueOrDefault(false),
|
||||||
ImmutableArray.Create(model.Roles),
|
model.Roles.GetValueOrDefault([]).ToImmutableArray(),
|
||||||
model.User.IsSpecified ? model.User.Value.Id : null,
|
model.User.IsSpecified ? model.User.Value.Id : null,
|
||||||
model.IsAvailable.ToNullable());
|
model.IsAvailable.ToNullable());
|
||||||
|
|
||||||
|
|||||||
@@ -451,6 +451,26 @@ namespace Discord.WebSocket
|
|||||||
public Task ConsumeEntitlementAsync(ulong entitlementId, RequestOptions options = null)
|
public Task ConsumeEntitlementAsync(ulong entitlementId, RequestOptions options = null)
|
||||||
=> ClientHelper.ConsumeEntitlementAsync(this, entitlementId, options);
|
=> ClientHelper.ConsumeEntitlementAsync(this, entitlementId, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task<Emote> GetApplicationEmoteAsync(ulong emoteId, RequestOptions options = null)
|
||||||
|
=> ClientHelper.GetApplicationEmojiAsync(this, emoteId, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task<IReadOnlyCollection<Emote>> GetApplicationEmotesAsync(RequestOptions options = null)
|
||||||
|
=> ClientHelper.GetApplicationEmojisAsync(this, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task<Emote> ModifyApplicationEmoteAsync(ulong emoteId, Action<ApplicationEmoteProperties> args, RequestOptions options = null)
|
||||||
|
=> ClientHelper.ModifyApplicationEmojiAsync(this, emoteId, args, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task<Emote> CreateApplicationEmoteAsync(string name, Image image, RequestOptions options = null)
|
||||||
|
=> ClientHelper.CreateApplicationEmojiAsync(this, name, image, options);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public Task DeleteApplicationEmoteAsync(ulong emoteId, RequestOptions options = null)
|
||||||
|
=> ClientHelper.DeleteApplicationEmojiAsync(this, emoteId, options);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets entitlements from cache.
|
/// Gets entitlements from cache.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class SocketGuildOnboardingPromptOption : SocketEntity<ulong>, IGuildOnbo
|
|||||||
|
|
||||||
if (model.Emoji.Id.HasValue)
|
if (model.Emoji.Id.HasValue)
|
||||||
{
|
{
|
||||||
Emoji = new Emote(model.Emoji.Id.Value, model.Emoji.Name, model.Emoji.Animated ?? false);
|
Emoji = new Emote(model.Emoji.Id.Value, model.Emoji.Name, model.Emoji.Animated.GetValueOrDefault(false));
|
||||||
}
|
}
|
||||||
else if (!string.IsNullOrWhiteSpace(model.Emoji.Name))
|
else if (!string.IsNullOrWhiteSpace(model.Emoji.Name))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user