diff --git a/src/NadekoBot/Common/SmartText/SmartEmbedText.cs b/src/NadekoBot/Common/SmartText/SmartEmbedText.cs index bde21fe8b..dd9f1f71e 100644 --- a/src/NadekoBot/Common/SmartText/SmartEmbedText.cs +++ b/src/NadekoBot/Common/SmartText/SmartEmbedText.cs @@ -5,7 +5,7 @@ using NadekoBot.Services; namespace NadekoBot { - public sealed class SmartEmbedText : SmartText + public sealed record SmartEmbedText : SmartText { public string PlainText { get; set; } public string Title { get; set; } diff --git a/src/NadekoBot/Common/SmartText/SmartPlainText.cs b/src/NadekoBot/Common/SmartText/SmartPlainText.cs index b110874f3..2e87389d4 100644 --- a/src/NadekoBot/Common/SmartText/SmartPlainText.cs +++ b/src/NadekoBot/Common/SmartText/SmartPlainText.cs @@ -1,8 +1,8 @@ namespace NadekoBot { - public sealed class SmartPlainText : SmartText + public sealed record SmartPlainText : SmartText { - public string Text { get; set; } + public string Text { get; init; } public SmartPlainText(string text) { diff --git a/src/NadekoBot/Common/SmartText/SmartText.cs b/src/NadekoBot/Common/SmartText/SmartText.cs index 4a747d40f..2eaea3bbd 100644 --- a/src/NadekoBot/Common/SmartText/SmartText.cs +++ b/src/NadekoBot/Common/SmartText/SmartText.cs @@ -1,14 +1,28 @@ -using Newtonsoft.Json; +using System; +using Newtonsoft.Json; namespace NadekoBot { - public abstract class SmartText + public abstract record SmartText { public bool IsEmbed => this is SmartEmbedText; public bool IsPlainText => this is SmartPlainText; - public static implicit operator SmartText(string input) - => new SmartPlainText(input); + public static SmartText operator +(SmartText text, string input) + => text switch + { + SmartEmbedText set => set with { PlainText = set.PlainText + input }, + SmartPlainText spt => new SmartPlainText(spt.Text + input), + _ => throw new ArgumentOutOfRangeException(nameof(text)) + }; + + public static SmartText operator +(string input, SmartText text) + => text switch + { + SmartEmbedText set => set with { PlainText = input + set.PlainText }, + SmartPlainText spt => new SmartPlainText(input + spt.Text), + _ => throw new ArgumentOutOfRangeException(nameof(text)) + }; public static SmartText CreateFrom(string input) { diff --git a/src/NadekoBot/Modules/Administration/SelfCommands.cs b/src/NadekoBot/Modules/Administration/SelfCommands.cs index 9b6839fb3..c6f5cf49e 100644 --- a/src/NadekoBot/Modules/Administration/SelfCommands.cs +++ b/src/NadekoBot/Modules/Administration/SelfCommands.cs @@ -22,14 +22,12 @@ namespace NadekoBot.Modules.Administration public class SelfCommands : NadekoSubmodule { private readonly DiscordSocketClient _client; - private readonly Bot _bot; private readonly IBotStrings _strings; private readonly ICoordinator _coord; - public SelfCommands(DiscordSocketClient client, Bot bot, IBotStrings strings, ICoordinator coord) + public SelfCommands(DiscordSocketClient client, IBotStrings strings, ICoordinator coord) { _client = client; - _bot = bot; _strings = strings; _coord = coord; } @@ -447,14 +445,12 @@ namespace NadekoBot.Modules.Administration [NadekoCommand, Aliases] [OwnerOnly] - public async Task Send(string where, [Leftover] string msg = null) + public async Task Send(string where, [Leftover] SmartText text = null) { - if (string.IsNullOrWhiteSpace(msg)) - return; - var ids = where.Split('|'); if (ids.Length != 2) return; + var sid = ulong.Parse(ids[0]); var server = _client.Guilds.FirstOrDefault(s => s.Id == sid); @@ -470,45 +466,28 @@ namespace NadekoBot.Modules.Administration var cid = ulong.Parse(ids[1].Substring(2)); var ch = server.TextChannels.FirstOrDefault(c => c.Id == cid); if (ch is null) - { return; - } - if (CREmbed.TryParse(msg, out var crembed)) - { - rep.Replace(crembed); - await ch.EmbedAsync(crembed, _eb).ConfigureAwait(false); - await ReplyConfirmLocalizedAsync("message_sent").ConfigureAwait(false); - return; - } - await ch.SendMessageAsync(rep.Replace(msg).SanitizeMentions()).ConfigureAwait(false); + text = rep.Replace(text); + await ch.SendAsync(_eb, text, sanitizeAll: false); } else if (ids[1].ToUpperInvariant().StartsWith("U:", StringComparison.InvariantCulture)) { var uid = ulong.Parse(ids[1].Substring(2)); var user = server.Users.FirstOrDefault(u => u.Id == uid); if (user is null) - { return; - } - if (CREmbed.TryParse(msg, out var crembed)) - { - rep.Replace(crembed); - await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)) - .EmbedAsync(crembed, _eb) - .ConfigureAwait(false); - await ReplyConfirmLocalizedAsync("message_sent").ConfigureAwait(false); - return; - } - - await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendMessageAsync(rep.Replace(msg).SanitizeMentions()).ConfigureAwait(false); + var ch = await user.GetOrCreateDMChannelAsync(); + text = rep.Replace(text); + await ch.SendAsync(_eb, text); } else { await ReplyErrorLocalizedAsync("invalid_format").ConfigureAwait(false); return; } + await ReplyConfirmLocalizedAsync("message_sent").ConfigureAwait(false); } diff --git a/src/NadekoBot/Modules/Utility/QuoteCommands.cs b/src/NadekoBot/Modules/Utility/QuoteCommands.cs index 56c0a1cd4..f27e37ded 100644 --- a/src/NadekoBot/Modules/Utility/QuoteCommands.cs +++ b/src/NadekoBot/Modules/Utility/QuoteCommands.cs @@ -174,18 +174,10 @@ namespace NadekoBot.Modules.Utility var infoText = $"`#{quote.Id} added by {quote.AuthorName.SanitizeAllMentions()}` 🗯️ " + quote.Keyword.ToLowerInvariant().SanitizeAllMentions() + ":\n"; - if (CREmbed.TryParse(quote.Text, out var crembed)) - { - rep.Replace(crembed); - - await ctx.Channel.EmbedAsync(crembed.ToEmbed(_eb), infoText + crembed.PlainText?.SanitizeAllMentions()) - .ConfigureAwait(false); - } - else - { - await ctx.Channel.SendMessageAsync(infoText + rep.Replace(quote.Text)?.SanitizeAllMentions()) - .ConfigureAwait(false); - } + + var text = SmartText.CreateFrom(quote.Text); + text = rep.Replace(text); + await ctx.Channel.SendAsync(_eb, infoText + text, true); } [NadekoCommand, Aliases] diff --git a/src/NadekoBot/Modules/Utility/Utility.cs b/src/NadekoBot/Modules/Utility/Utility.cs index c797a2021..6102a74ba 100644 --- a/src/NadekoBot/Modules/Utility/Utility.cs +++ b/src/NadekoBot/Modules/Utility/Utility.cs @@ -35,7 +35,6 @@ namespace NadekoBot.Modules.Utility _creds = creds; _tracker = tracker; } - [NadekoCommand, Aliases] [RequireContext(ContextType.Guild)] @@ -47,7 +46,7 @@ namespace NadekoBot.Modules.Utility .WithDefault(ctx.User, channel, (SocketGuild)ctx.Guild, (DiscordSocketClient)ctx.Client) .Build(); - rep.Replace(message); + message = rep.Replace(message); await channel.SendAsync(_eb, message, !((IGuildUser)Context.User).GuildPermissions.MentionEveryone); } @@ -56,7 +55,7 @@ namespace NadekoBot.Modules.Utility [RequireContext(ContextType.Guild)] [UserPerm(GuildPerm.ManageMessages)] [Priority(0)] - public Task Say([Leftover] string message) + public Task Say([Leftover] SmartText message) => Say((ITextChannel)ctx.Channel, message); [NadekoCommand, Aliases]