From 8080c3373bf1cb1133e4945edf59f074a83a9b0f Mon Sep 17 00:00:00 2001 From: thomkaptein Date: Tue, 1 Oct 2024 22:25:06 +0200 Subject: [PATCH] work on templates --- .../Attributes/EmbedOptionAcceptsAttribute.cs | 15 + .../Attributes/EmbedOptionAttribute.cs | 13 + src/FMBot.Bot/Builders/TemplateBuilders.cs | 5 +- .../Models/TemplateOptions/TemplateOption.cs | 285 ++++++++++++------ .../Models/TemplateOptions/VariableType.cs | 10 + .../Resources/InteractionConstants.cs | 1 + src/FMBot.Bot/Services/TemplateService.cs | 64 ++-- .../SlashCommands/TemplateSlashCommands.cs | 37 ++- 8 files changed, 307 insertions(+), 123 deletions(-) create mode 100644 src/FMBot.Bot/Attributes/EmbedOptionAcceptsAttribute.cs create mode 100644 src/FMBot.Bot/Attributes/EmbedOptionAttribute.cs create mode 100644 src/FMBot.Bot/Models/TemplateOptions/VariableType.cs diff --git a/src/FMBot.Bot/Attributes/EmbedOptionAcceptsAttribute.cs b/src/FMBot.Bot/Attributes/EmbedOptionAcceptsAttribute.cs new file mode 100644 index 000000000..847d9f6c0 --- /dev/null +++ b/src/FMBot.Bot/Attributes/EmbedOptionAcceptsAttribute.cs @@ -0,0 +1,15 @@ +using System; +using FMBot.Bot.Models.TemplateOptions; + +namespace FMBot.Bot.Attributes; + +public class EmbedOptionAcceptsAttribute : Attribute +{ + public VariableType[] VariableTypes { get; } + + public EmbedOptionAcceptsAttribute(params VariableType[] variableTypes) + { + this.VariableTypes = variableTypes; + } +} + diff --git a/src/FMBot.Bot/Attributes/EmbedOptionAttribute.cs b/src/FMBot.Bot/Attributes/EmbedOptionAttribute.cs new file mode 100644 index 000000000..d4a9c6d75 --- /dev/null +++ b/src/FMBot.Bot/Attributes/EmbedOptionAttribute.cs @@ -0,0 +1,13 @@ +using System; + +namespace FMBot.Bot.Attributes; + +public class EmbedOptionAttribute : Attribute +{ + public string ScriptName { get; private set; } + + public EmbedOptionAttribute(string scriptName) + { + this.ScriptName = scriptName; + } +} diff --git a/src/FMBot.Bot/Builders/TemplateBuilders.cs b/src/FMBot.Bot/Builders/TemplateBuilders.cs index 681ae641b..4516f8e8a 100644 --- a/src/FMBot.Bot/Builders/TemplateBuilders.cs +++ b/src/FMBot.Bot/Builders/TemplateBuilders.cs @@ -129,11 +129,12 @@ public async Task TemplatePicker( .WithSelectMenu(templateOptionPicker) .WithButton("Rename", $"{InteractionConstants.Template.Rename}-{template.Id}", ButtonStyle.Secondary) .WithButton("Copy", $"{InteractionConstants.Template.Copy}-{template.Id}", ButtonStyle.Secondary) - .WithButton("Delete", $"{InteractionConstants.Template.Delete}-{template.Id}", ButtonStyle.Secondary) .WithButton("Script", $"{InteractionConstants.Template.ViewScript}-{template.Id}", ButtonStyle.Secondary) - .WithButton("Variables", $"{InteractionConstants.Template.ViewVariables}", ButtonStyle.Secondary); + .WithButton("Variables", $"{InteractionConstants.Template.ViewVariables}", ButtonStyle.Secondary) + .WithButton("Delete", $"{InteractionConstants.Template.Delete}-{template.Id}", ButtonStyle.Danger); response.Embed.WithAuthor($"Editing template '{template.Name}'"); + response.Embed.WithDescription($"Sharecode: `{template.ShareCode}`"); response.Embed.WithColor(DiscordConstants.InformationColorBlue); var extraResponse = new ResponseModel diff --git a/src/FMBot.Bot/Models/TemplateOptions/TemplateOption.cs b/src/FMBot.Bot/Models/TemplateOptions/TemplateOption.cs index 7f11ab61c..9fb44274b 100644 --- a/src/FMBot.Bot/Models/TemplateOptions/TemplateOption.cs +++ b/src/FMBot.Bot/Models/TemplateOptions/TemplateOption.cs @@ -4,11 +4,13 @@ using System.Linq; using System.Threading.Tasks; using Discord; +using FMBot.Bot.Attributes; using FMBot.Bot.Extensions; using FMBot.Bot.Services; using FMBot.Bot.Services.WhoKnows; using FMBot.Domain.Attributes; using FMBot.Domain.Enums; +using FMBot.Domain.Extensions; using FMBot.Domain.Models; using FMBot.Persistence.Domain.Models; using FMBot.Persistence.Repositories; @@ -16,7 +18,7 @@ namespace FMBot.Bot.Models.TemplateOptions; -public record FmResult(string Content); +public record VariableResult(string Content, string Result = null); public abstract class TemplateOption { @@ -33,12 +35,12 @@ public abstract class TemplateOption public sealed class SqlTemplateOption : TemplateOption { public string SqlQuery { get; set; } - public Func> ResultProcessor { get; set; } + public Func> ResultProcessor { get; set; } public Func> ParametersFactory { get; set; } public bool ProcessMultipleRows { get; set; } = false; - public Task ExecuteAsync(TemplateContext context, DbDataReader reader) + public Task ExecuteAsync(TemplateContext context, DbDataReader reader) { return this.ResultProcessor(context, reader); } @@ -58,9 +60,9 @@ public NpgsqlBatchCommand CreateBatchCommand(TemplateContext context) public sealed class ComplexTemplateOption : TemplateOption { - public Func> ExecutionLogic { get; set; } + public Func> ExecutionLogic { get; set; } - public Task ExecuteAsync(TemplateContext context, DbDataReader reader) + public Task ExecuteAsync(TemplateContext context, DbDataReader reader) { return this.ExecutionLogic(context); } @@ -96,36 +98,47 @@ public enum EmbedOption { [Option("Author")] [EmbedOption("author")] + [EmbedOptionAccepts(VariableType.Text)] Author = 10, [Option("Author icon url")] [EmbedOption("author-icon-url")] + [EmbedOptionAccepts(VariableType.ImageUrl)] AuthorIconUrl = 11, [Option("Author url")] [EmbedOption("author-url")] + [EmbedOptionAccepts(VariableType.ResourceUrl)] AuthorUrl = 12, [Option("Title")] [EmbedOption("title")] + [EmbedOptionAccepts(VariableType.Text)] Title = 20, + [Option("Url")] - [EmbedOption("url")] Url = 21, + [EmbedOption("url")] + [EmbedOptionAccepts(VariableType.ResourceUrl, VariableType.ImageUrl)] + Url = 21, [Option("Description")] [EmbedOption("description")] + [EmbedOptionAccepts(VariableType.Text, VariableType.ResourceUrl, VariableType.ImageUrl)] Description = 22, [Option("Thumbnail image url")] [EmbedOption("thumbnail-image-url")] + [EmbedOptionAccepts(VariableType.ImageUrl)] ThumbnailImageUrl = 23, [Option("Large image url")] [EmbedOption("large-image-url")] + [EmbedOptionAccepts(VariableType.ImageUrl)] LargeImageUrl = 24, [Option("Color (hex code)")] [EmbedOption("embed-color-hex")] + [EmbedOptionAccepts(VariableType.HexColor)] ColorHex = 25, [Option("Add field")] @@ -133,39 +146,23 @@ public enum EmbedOption [Option("Footer")] [EmbedOption("footer")] + [EmbedOptionAccepts(VariableType.Text)] Footer = 40, [Option("Footer icon url")] [EmbedOption("footer-icon-url")] + [EmbedOptionAccepts(VariableType.ImageUrl)] FooterIconUrl = 41, [Option("Footer timestamp")] [EmbedOption("footer-timestamp")] + [EmbedOptionAccepts(VariableType.Timestamp)] FooterTimestamp = 42, [Option("Add button")] AddButton = 50, } -public enum VariableType -{ - Text, - ResourceUrl, - ImageUrl, - HexColor, - Timestamp -} - -public class EmbedOptionAttribute : Attribute -{ - public string ScriptName { get; private set; } - - public EmbedOptionAttribute(string scriptName) - { - this.ScriptName = scriptName; - } -} - public static class ExampleTemplates { public static readonly List