- .say now uses new SmartText instead of CREmbed

- Added IMessageChannel extensions for sending smarttext
- Added implicit operator from string to smarttext (which just creates smartplaintext instance)
This commit is contained in:
Kwoth
2021-07-11 23:37:19 +02:00
parent 236c286278
commit 0064df8ae4
5 changed files with 87 additions and 21 deletions

View File

@@ -34,6 +34,58 @@ namespace NadekoBot.Common.Replacements
return input;
}
public SmartText Replace(SmartText data)
=> data switch
{
SmartEmbedText embedData => Replace(embedData),
SmartPlainText plain => Replace(plain),
_ => throw new ArgumentOutOfRangeException(nameof(data), "Unsupported argument type")
};
public SmartPlainText Replace(SmartPlainText plainText)
=> Replace(plainText.Text);
public SmartEmbedText Replace(SmartEmbedText embedData)
{
var newEmbedData = new SmartEmbedText();
newEmbedData.PlainText = Replace(embedData.PlainText);
newEmbedData.Description = Replace(embedData.Description);
newEmbedData.Title = Replace(embedData.Title);
newEmbedData.Thumbnail = Replace(embedData.Thumbnail);
newEmbedData.Image = Replace(embedData.Image);
if (embedData.Author != null)
{
newEmbedData.Author = new SmartTextEmbedAuthor();
newEmbedData.Author.Name = Replace(embedData.Author.Name);
newEmbedData.Author.IconUrl = Replace(embedData.Author.IconUrl);
}
if (embedData.Fields != null)
{
var fields = new List<SmartTextEmbedField>();
foreach (var f in embedData.Fields)
{
var newF = new SmartTextEmbedField();
newF.Name = Replace(f.Name);
newF.Value = Replace(f.Value);
fields.Add(newF);
}
newEmbedData.Fields = fields.ToArray();
}
if (embedData.Footer != null)
{
newEmbedData.Footer = new SmartTextEmbedFooter();
newEmbedData.Footer.Text = Replace(embedData.Footer.Text);
newEmbedData.Footer.IconUrl = Replace(embedData.Footer.IconUrl);
}
newEmbedData.Color = embedData.Color;
return newEmbedData;
}
public CREmbed Replace(CREmbed embedData)
{
embedData.PlainText = Replace(embedData.PlainText);

View File

@@ -2,15 +2,17 @@
namespace NadekoBot
{
// todo 3.3 check if saving embeds in db has IsEmbed field, to prevent rechecking and generating exceptions on every use
public abstract class 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 CreateFrom(string input)
{
if (string.IsNullOrWhiteSpace(input) || !input.Trim().StartsWith("{"))
if (string.IsNullOrWhiteSpace(input) || !input.TrimStart().StartsWith("{"))
{
return new SmartPlainText(input);
}

View File

@@ -13,4 +13,12 @@ namespace NadekoBot.Common.TypeReaders
return Task.FromResult(TypeReaderResult.FromError(CommandError.ParseFailed, "Input is not a valid kwum"));
}
}
public sealed class SmartTextTypeReader : NadekoTypeReader<SmartText>
{
public override Task<TypeReaderResult> ReadAsync(ICommandContext ctx, string input)
{
return Task.FromResult(TypeReaderResult.FromSuccess(SmartText.CreateFrom(input)));
}
}
}