From 42bf94c00ac450b2145a9141f79b808a1a465a5a Mon Sep 17 00:00:00 2001 From: Dultus Date: Thu, 6 Apr 2023 14:53:28 +0200 Subject: [PATCH] Integrated Controller control. The methods InvokeEventControllerClass and ExecuteController should be used by the user. InvokeEventControllerClassis to be put in the Discord Controllers that use the Discord Ids and the ExecuteController should be put in their own separated classes. --- Discord/Attribute/EventControllerAttribute.cs | 17 +++++ Discord/Class1.cs | 7 -- Discord/Controller/EventController.cs | 71 +++++++++++++++++++ Discord/Converter/InteractionFormatter.cs | 64 +++++++++++++++++ .../MismatchedEnumLengthsException.cs | 15 ++++ 5 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 Discord/Attribute/EventControllerAttribute.cs delete mode 100644 Discord/Class1.cs create mode 100644 Discord/Controller/EventController.cs create mode 100644 Discord/Converter/InteractionFormatter.cs create mode 100644 Discord/Exception/MismatchedEnumLengthsException.cs diff --git a/Discord/Attribute/EventControllerAttribute.cs b/Discord/Attribute/EventControllerAttribute.cs new file mode 100644 index 0000000..5adfa51 --- /dev/null +++ b/Discord/Attribute/EventControllerAttribute.cs @@ -0,0 +1,17 @@ +namespace Discord.Attribute +{ + using Controller; + /// + /// To be placed over dynamic methods that will be executed by the + /// + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + public class EventControllerAttribute : System.Attribute + { + public T Event { get; set; } + public EventControllerAttribute(T Event) + { + this.Event = Event; + } + } +} \ No newline at end of file diff --git a/Discord/Class1.cs b/Discord/Class1.cs deleted file mode 100644 index b9e60b3..0000000 --- a/Discord/Class1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Discord -{ - public class Class1 - { - - } -} \ No newline at end of file diff --git a/Discord/Controller/EventController.cs b/Discord/Controller/EventController.cs new file mode 100644 index 0000000..980fa47 --- /dev/null +++ b/Discord/Controller/EventController.cs @@ -0,0 +1,71 @@ +using Discord.Attribute; +using System.Collections.Generic; +using System.Reflection; +using System.Resources; + +namespace Discord.Controller +{ + public static class EventController + { + /// + /// To be executed by the Discord Events that use Ids. + /// + /// The class that should be looked in by the controller, defined by using + /// The base enum that will get separated and passed to the actual controller + /// Passed Ids by the event e.g e.Interaction.Data.CustomId + /// The passed Event args + public static void InvokeEventControllerClass(string ids, object e) where ENUM : class + { + string[] splittedIds = ids.Split(','); + var category = Converter.InteractionFormatter.GetFirstEnumFromIdAndRemove(ref splittedIds); + InvokeEventController(category, splittedIds, e); + } + /// + /// Invokes the event controller by passing over the given class and enum. This method takes a look at all the created Controllers and picks one that gets executed and invokes the correct method. + /// + /// Passed method from the controller invoker + /// Passed enum from the controller invoker + /// + /// + /// + private static void InvokeEventController(ENUM PassedEnum, string[] ids, object e) + { + var type = typeof(CLASS); + var methods = type.GetMethods(); + EventControllerAttribute? attribute; + foreach (var method in methods) + { + attribute = method.GetCustomAttribute>(); + if (attribute is not null && EqualityComparer.Default.Equals(attribute.Event, PassedEnum)) + method.Invoke(null, new object[] { ids, e }); + } + } + /// + /// Method To be placed in a separate Class that will be passed into the + /// For the EventControllerAttribute you have to pass the enum type e.g. of all categories and pass the enum value for a specific category. Finally you have to execute the controller and use the category's enum for the generic. + /// + /// The enum of the category + /// The given Ids without category enum. + /// The namespace with all the required events. E.g. Project_Sipster.DiscordBarista.Function.Partnership.Events + /// The passed event from the - just needs to be put it as a param and passed over to the controller. + public static void ExecuteController(string[] ids, string nspace, object e) + { + var category = Converter.InteractionFormatter.GetFirstEnumFromId(ref ids); + var q = (from t in Assembly.GetExecutingAssembly().GetTypes() + where t.IsClass && t.Namespace == nspace + select t).ToList(); + List methods = new(); + foreach (var type in q) + { + methods.AddRange(type.GetMethods()); + } + EventControllerAttribute? attribute; + foreach (var method in methods) + { + attribute = method.GetCustomAttribute>(); + if (attribute is not null && EqualityComparer.Default.Equals(attribute.Event, category)) + method.Invoke(null, new object[] { ids, e }); + } + } + } +} diff --git a/Discord/Converter/InteractionFormatter.cs b/Discord/Converter/InteractionFormatter.cs new file mode 100644 index 0000000..dbdb647 --- /dev/null +++ b/Discord/Converter/InteractionFormatter.cs @@ -0,0 +1,64 @@ +using Discord.Exception; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Converter +{ + #region Public Area + + public static class InteractionFormatter + { + public static string TransformEnumsToId(params Enum[] enums) + { + string output = ""; + foreach (var num in enums) + { + output += num.ToString("D") + ","; + } + output = output.Remove(output.Length - 1); + return output; + } + + /// + /// Transforms the given values to the given enums. CAUTION: The length of the given strings and enums must be the same. + /// + /// The list of values separated by comma (e.g. "0,5,3") + /// The list of enums that should be given out (e.g. typeof(Enum), typeof(Enum)"/> + /// A list of converted enums that were passed in. + /// Thrown when the length of enums and values are different. + public static IEnumerable TransformIdToEnums(string value, params Type[] enums) + { + string[] values = value.Split(','); + if (values.Length != enums.Length) + { + throw new MismatchedEnumLengthsException(); + } + for (int i = 0; i < enums.Length; i++) + { + yield return (Enum)Enum.Parse(enums[i], value); + } + } + + public static T GetFirstEnumFromIdAndRemove(ref string[] values) + { + string firstValue = values[0]; + values = values.Skip(1).ToArray(); + return (T)Enum.Parse(typeof(T), firstValue); + } + + public static T GetFirstEnumFromId(ref string[] values) + { + return (T)Enum.Parse(typeof(T), values[0]); + } + + public static T GetEnumFromId(string value) + { + return (T)Enum.Parse(typeof(T), value); + } + } + + #endregion Public Area +} diff --git a/Discord/Exception/MismatchedEnumLengthsException.cs b/Discord/Exception/MismatchedEnumLengthsException.cs new file mode 100644 index 0000000..b726372 --- /dev/null +++ b/Discord/Exception/MismatchedEnumLengthsException.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Exception +{ + public class MismatchedEnumLengthsException : System.Exception + { + public MismatchedEnumLengthsException() : base("Length of values and enums are different. You are required to pass as many values as there are enums.") + { + } + } +}