Added .emojiadd command

This commit is contained in:
Kwoth
2021-11-21 00:07:19 +01:00
parent 27613410dd
commit c050ce2123
6 changed files with 95 additions and 6 deletions

View File

@@ -4,7 +4,13 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog.
## Unreleased ## Unreleased
## [3.0.9] - 21.11.2021
### Added ### Added
- Added `.emojiadd` with 3 overloads
- `.ea :customEmoji:` which copies another server's emoji
- `.ea newName :customEmoji:` which copies emoji under a different name
- `.ea emojiName <imagelink.png>` which creates a new emoji from the specified image
- Patreon Access and Refresh Tokens should now be automatically updated once a month as long as the user has provided the necessary credentials in creds.yml file: - Patreon Access and Refresh Tokens should now be automatically updated once a month as long as the user has provided the necessary credentials in creds.yml file:
- `Patreon.ClientId` - `Patreon.ClientId`
- `Patreon.RefreshToken` (will also get updated once a month but needs an initial value) - `Patreon.RefreshToken` (will also get updated once a month but needs an initial value)

View File

@@ -0,0 +1,17 @@
using System.Threading.Tasks;
using Discord;
using Discord.Commands;
namespace NadekoBot.Common.TypeReaders
{
public sealed class EmoteTypeReader : NadekoTypeReader<Emote>
{
public override Task<TypeReaderResult> ReadAsync(ICommandContext ctx, string input)
{
if (!Emote.TryParse(input, out var emote))
return Task.FromResult(TypeReaderResult.FromError(CommandError.ParseFailed, "Input is not a valid emote"));
return Task.FromResult(TypeReaderResult.FromSuccess(emote));
}
}
}

View File

@@ -9,6 +9,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -25,15 +26,18 @@ namespace NadekoBot.Modules.Utility
private readonly IStatsService _stats; private readonly IStatsService _stats;
private readonly IBotCredentials _creds; private readonly IBotCredentials _creds;
private readonly DownloadTracker _tracker; private readonly DownloadTracker _tracker;
private readonly IHttpClientFactory _httpFactory;
public Utility(DiscordSocketClient client, ICoordinator coord, public Utility(DiscordSocketClient client, ICoordinator coord,
IStatsService stats, IBotCredentials creds, DownloadTracker tracker) IStatsService stats, IBotCredentials creds, DownloadTracker tracker,
IHttpClientFactory httpFactory)
{ {
_client = client; _client = client;
_coord = coord; _coord = coord;
_stats = stats; _stats = stats;
_creds = creds; _creds = creds;
_tracker = tracker; _tracker = tracker;
_httpFactory = httpFactory;
} }
[NadekoCommand, Aliases] [NadekoCommand, Aliases]
@@ -278,6 +282,52 @@ namespace NadekoBot.Modules.Utility
await ctx.Channel.SendMessageAsync(result.TrimTo(2000)).ConfigureAwait(false); await ctx.Channel.SendMessageAsync(result.TrimTo(2000)).ConfigureAwait(false);
} }
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[RequireBotPermission(GuildPermission.ManageEmojis)]
[RequireUserPermission(GuildPermission.ManageEmojis)]
[Priority(0)]
public Task EmojiAdd(string name, Emote emote)
=> EmojiAdd(name, emote.Url);
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[RequireBotPermission(GuildPermission.ManageEmojis)]
[RequireUserPermission(GuildPermission.ManageEmojis)]
public Task EmojiAdd(Emote emote)
=> EmojiAdd(emote.Name, emote.Url);
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[RequireBotPermission(GuildPermission.ManageEmojis)]
[RequireUserPermission(GuildPermission.ManageEmojis)]
public async Task EmojiAdd(string name, string url)
{
name = name.Trim(':');
using var http = _httpFactory.CreateClient();
var res = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
if (!res.IsImage() || res.GetImageSize() is null or > 262_144)
{
await ReplyErrorLocalizedAsync(strs.invalid_emoji_link);
return;
}
await using var imgStream = await res.Content.ReadAsStreamAsync();
Emote em;
try
{
em = await ctx.Guild.CreateEmoteAsync(name, new(imgStream));
}
catch (Exception ex)
{
Log.Warning(ex, "Error adding emoji on server {GuildId}", ctx.Guild.Id);
await ReplyErrorLocalizedAsync(strs.emoji_add_error);
return;
}
await ConfirmLocalizedAsync(strs.emoji_added(em.ToString()));
}
[NadekoCommand, Aliases] [NadekoCommand, Aliases]
[OwnerOnly] [OwnerOnly]
public async Task ListServers(int page = 1) public async Task ListServers(int page = 1)

View File

@@ -720,6 +720,9 @@ removeperm:
showemojis: showemojis:
- showemojis - showemojis
- se - se
emojiadd:
- emojiadd
- ea
deckshuffle: deckshuffle:
- deckshuffle - deckshuffle
- dsh - dsh

View File

@@ -1195,6 +1195,16 @@ showemojis:
desc: "Shows a name and a link to every SPECIAL emoji in the message." desc: "Shows a name and a link to every SPECIAL emoji in the message."
args: args:
- "A message full of SPECIAL emojis" - "A message full of SPECIAL emojis"
emojiadd:
desc: |-
Adds the specified emoji to this server.
You can specify a name before the emoji to add it under a different name.
You can specify a name followed by an image link to add a new emoji from an image.
Image size has to be below 256KB.
args:
- ":someonesCustomEmoji:"
- "MyEmojiName :someonesCustomEmoji:"
- "owoNice https://cdn.discordapp.com/emojis/587930873811173386.png?size=128"
deckshuffle: deckshuffle:
desc: "Reshuffles all cards back into the deck." desc: "Reshuffles all cards back into the deck."
args: args:

View File

@@ -9,6 +9,9 @@
"crr_reset": "Custom reaction with id {0} will no longer add reactions.", "crr_reset": "Custom reaction with id {0} will no longer add reactions.",
"crr_set": "Custom reaction with id {0} will add following reactions to the response message: {1}", "crr_set": "Custom reaction with id {0} will add following reactions to the response message: {1}",
"invalid_emojis": "All emojis you've specified are invalid.", "invalid_emojis": "All emojis you've specified are invalid.",
"invalid_emoji_link": "Specified link is either not an image or exceeds 256KB.",
"emoji_add_error": "Error adding emoji. You either ran out of emoji slots, or image size is inadequate.",
"emoji_added": "Added a new emoji: {0}",
"fw_cleared": "Removed all filtered words and filtered words channel settings.", "fw_cleared": "Removed all filtered words and filtered words channel settings.",
"aliases_cleared": "All {0} aliases on this server have been removed.", "aliases_cleared": "All {0} aliases on this server have been removed.",
"no_results": "No results found.", "no_results": "No results found.",