diff --git a/.idea/misc.xml b/.idea/misc.xml index 24286a0a..383fb10c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,9 @@ + + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 26b7ca2f..e552fdec 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -8,3 +8,4 @@ distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +org.gradle.java.home=C\:\\Program Files\\Java\\jdk1.8.0_144org.gradle.java.home=C\:\\Program Files\\Java\\jdk1.8.0_144 \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 1ef3a813..f1162c05 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,4 +3,3 @@ */ rootProject.name = "FlamesPlus" - diff --git a/src/main/java/com/severalcircles/flames/FLogger.java b/src/main/java/com/severalcircles/flames/FLogger.java index 0b2e4adf..e6dc5298 100644 --- a/src/main/java/com/severalcircles/flames/FLogger.java +++ b/src/main/java/com/severalcircles/flames/FLogger.java @@ -4,6 +4,8 @@ package com.severalcircles.flames; +import com.severalcircles.flames.system.exception.ExceptionID; + import java.util.logging.Level; /** @@ -13,6 +15,7 @@ * @version 8 * @since Flames 8 */ +@ExceptionID(value = "502") @SuppressWarnings("SameReturnValue") public class FLogger { public static final String ANSI_RESET = "\u001B[0m"; diff --git a/src/main/java/com/severalcircles/flames/Flames.java b/src/main/java/com/severalcircles/flames/Flames.java index 5d809b59..01240a52 100644 --- a/src/main/java/com/severalcircles/flames/Flames.java +++ b/src/main/java/com/severalcircles/flames/Flames.java @@ -4,10 +4,10 @@ package com.severalcircles.flames; -import com.severalcircles.flames.data.SystemDataManager; -import com.severalcircles.flames.data.user.UserDataManager; -import com.severalcircles.flames.events.EventManager; -import com.severalcircles.flames.interactions.FlamesInteractionManager; +import com.severalcircles.flames.system.manager.*; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.java.FlamesConnectException; +import com.severalcircles.flames.system.exception.MessageCodes; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.requests.GatewayIntent; @@ -23,6 +23,7 @@ * @version 8 * @since Flames Flames 2 */ +@ExceptionID("501") public class Flames { private static JDA api; private static final FLogger flogger = new FLogger(); @@ -39,6 +40,7 @@ public class Flames { */ public static void main(String[] args) { flogger.finest("Secret message for the devs: I'm a flamingo."); +// flogger.severe(MessageCodes.generateCodeError(new FlamesException("Based"))); try { InputStream is = Flames.class.getClassLoader().getResourceAsStream("version.properties"); versionProp.load(is); @@ -65,6 +67,9 @@ public static void main(String[] args) { } catch (IllegalArgumentException e) { getFlogger().severe("FlamesToken environment variable not found. Please set the FlamesToken environment variable to your bot's token."); System.exit(1); + } catch (Exception e) { + Flames.getFlogger().severe(e.getMessage() + " [" + MessageCodes.generateCodeError(new FlamesConnectException(e.getMessage())) + "]"); + System.exit(1); } flogger.fine("Flames is now online!"); flogger.resetLastClass(); @@ -89,6 +94,7 @@ public static void main(String[] args) { }); flogger.info("Starting secondary managers"); managers2.add(new UserDataManager()); + managers2.add(new FlamesReportManager()); // managers2.add(TodayManager.newDay()); managers2.forEach(manager -> { try { diff --git a/src/main/java/com/severalcircles/flames/data/user/FlamesUser.java b/src/main/java/com/severalcircles/flames/data/user/FlamesUser.java index 423303a1..d129c973 100644 --- a/src/main/java/com/severalcircles/flames/data/user/FlamesUser.java +++ b/src/main/java/com/severalcircles/flames/data/user/FlamesUser.java @@ -4,7 +4,7 @@ package com.severalcircles.flames.data.user; -import com.severalcircles.flames.system.exception.AlreadyCollectedException; +import com.severalcircles.flames.system.exception.flames.AlreadyCollectedException; import net.dv8tion.jda.api.entities.User; import java.time.Instant; diff --git a/src/main/java/com/severalcircles/flames/events/InteractionEvents.java b/src/main/java/com/severalcircles/flames/events/InteractionEvents.java index 4cb4d4ae..28d316d2 100644 --- a/src/main/java/com/severalcircles/flames/events/InteractionEvents.java +++ b/src/main/java/com/severalcircles/flames/events/InteractionEvents.java @@ -5,26 +5,36 @@ package com.severalcircles.flames.events; import com.severalcircles.flames.Flames; -import com.severalcircles.flames.data.user.ConsentManager; -import com.severalcircles.flames.data.user.UserDataManager; -import com.severalcircles.flames.interactions.FlamesInteractionManager; -import com.severalcircles.flames.system.exception.ConsentException; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.FlamesExceptionHandler; +import com.severalcircles.flames.system.exception.flames.FlamesException; +import com.severalcircles.flames.system.exception.runtime.FlamesRuntimeException; +import com.severalcircles.flames.system.manager.ConsentManager; +import com.severalcircles.flames.system.manager.UserDataManager; +import com.severalcircles.flames.system.manager.FlamesInteractionManager; +import com.severalcircles.flames.system.exception.flames.ConsentException; +import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.jetbrains.annotations.NotNull; import java.io.IOException; - +@ExceptionID("601") public class InteractionEvents extends ListenerAdapter { @Override public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { super.onSlashCommandInteraction(event); Flames.getFlogger().fine("Received slash command interaction " + event.getName()); try { - FlamesInteractionManager.getCommandInteraction(event.getName()).execute(event, new UserDataManager().loadUser(event.getUser())); - } catch (IOException | ConsentException e) { - throw new RuntimeException(e); + Flames.getFlogger().finest("try"); + FlamesInteractionManager.getCommandInteraction(event.getName()).execute(event, UserDataManager.flames()); +// } catch (IOException | ConsentException e) { +// Flames.getFlogger().finest("catch"); +// event.getInteraction().replyEmbeds(new FlamesExceptionHandler(new FlamesException(e.getMessage())).handle()).complete(); + } finally { + Flames.getFlogger().finest("finally"); +// event.getInteraction().deferReply().complete(); } } diff --git a/src/main/java/com/severalcircles/flames/events/MessageEvent.java b/src/main/java/com/severalcircles/flames/events/MessageEvent.java index 8bd45423..48298967 100644 --- a/src/main/java/com/severalcircles/flames/events/MessageEvent.java +++ b/src/main/java/com/severalcircles/flames/events/MessageEvent.java @@ -5,17 +5,18 @@ package com.severalcircles.flames.events; import com.severalcircles.flames.Flames; -import com.severalcircles.flames.conversations.ConversationManager; -import com.severalcircles.flames.data.user.ConsentManager; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.manager.ConversationManager; +import com.severalcircles.flames.system.manager.ConsentManager; import com.severalcircles.flames.data.user.FlamesUser; -import com.severalcircles.flames.data.user.UserDataManager; -import com.severalcircles.flames.system.exception.ConsentException; +import com.severalcircles.flames.system.manager.UserDataManager; +import com.severalcircles.flames.system.exception.flames.ConsentException; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.jetbrains.annotations.NotNull; import java.io.IOException; - +@ExceptionID("602") public class MessageEvent extends ListenerAdapter { @Override public void onMessageReceived(@NotNull MessageReceivedEvent event) { diff --git a/src/main/java/com/severalcircles/flames/events/StatusChange.java b/src/main/java/com/severalcircles/flames/events/StatusChange.java index fb6944a9..4138d4ee 100644 --- a/src/main/java/com/severalcircles/flames/events/StatusChange.java +++ b/src/main/java/com/severalcircles/flames/events/StatusChange.java @@ -5,9 +5,10 @@ package com.severalcircles.flames.events; import com.severalcircles.flames.Flames; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.jetbrains.annotations.NotNull; - +@ExceptionID("603") public class StatusChange extends ListenerAdapter { @Override public void onStatusChange(@NotNull net.dv8tion.jda.api.events.StatusChangeEvent event) { diff --git a/src/main/java/com/severalcircles/flames/frontend/ConsentEmbed.java b/src/main/java/com/severalcircles/flames/frontend/ConsentEmbed.java index 7299ee0c..fa0da7c4 100644 --- a/src/main/java/com/severalcircles/flames/frontend/ConsentEmbed.java +++ b/src/main/java/com/severalcircles/flames/frontend/ConsentEmbed.java @@ -4,6 +4,7 @@ package com.severalcircles.flames.frontend; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.MessageEmbed; @@ -15,6 +16,7 @@ * @version 8 * @since Flames 8 */ +@ExceptionID("701") @Embed(name = "Consent") public class ConsentEmbed extends FlamesEmbed { @@ -25,7 +27,7 @@ public ConsentEmbed(Locale locale) { @Override public MessageEmbed get() { return new EmbedBuilder() - .setTitle(local.getString("title"), "https://flames.severalcircles.com/privacy-policy") + .setTitle(local.getString("title.user"), "https://flames.severalcircles.com/privacy-policy") .setDescription(local.getString("description")) .addField(local.getString("helpful1title"), local.getString("helpful1text"), false) .addField(local.getString("helpful2title"), local.getString("helpful2text"), true) diff --git a/src/main/java/com/severalcircles/flames/frontend/DayPart.java b/src/main/java/com/severalcircles/flames/frontend/DayPart.java index 5b58dda3..2159711c 100644 --- a/src/main/java/com/severalcircles/flames/frontend/DayPart.java +++ b/src/main/java/com/severalcircles/flames/frontend/DayPart.java @@ -4,6 +4,9 @@ package com.severalcircles.flames.frontend; +import com.severalcircles.flames.system.exception.ExceptionID; + +@ExceptionID("702") public enum DayPart { EARLY_MORNING(4, 6), MORNING(7, 11), AFTERNOON(12, 5), EVENING(6, 9), NIGHT(10, 12), MIDNIGHT(1, 3); private final double hourStart; diff --git a/src/main/java/com/severalcircles/flames/frontend/FlamesEmbed.java b/src/main/java/com/severalcircles/flames/frontend/FlamesEmbed.java index 3dc6a306..009e9900 100644 --- a/src/main/java/com/severalcircles/flames/frontend/FlamesEmbed.java +++ b/src/main/java/com/severalcircles/flames/frontend/FlamesEmbed.java @@ -4,6 +4,8 @@ package com.severalcircles.flames.frontend; +import com.severalcircles.flames.system.exception.ExceptionID; + import net.dv8tion.jda.api.entities.MessageEmbed; import java.util.Locale; @@ -12,9 +14,10 @@ * Abstract class for embeds that are used in the bot. Embeds are used to display information in a more visually appealing way than text. * big chungus, big chungus, big chungus, big big chungus * @author Several Circles - * @version 83333 + * @version 8 * @since Flames 8 */ +@ExceptionID("700") public abstract class FlamesEmbed { ResourceBundle local; public FlamesEmbed(Locale locale) { diff --git a/src/main/java/com/severalcircles/flames/frontend/FlamesExceptionEmbed.java b/src/main/java/com/severalcircles/flames/frontend/FlamesExceptionEmbed.java new file mode 100644 index 00000000..b343819e --- /dev/null +++ b/src/main/java/com/severalcircles/flames/frontend/FlamesExceptionEmbed.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.frontend; + +import com.severalcircles.flames.Flames; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.MessageCodes; +import com.severalcircles.flames.system.exception.flames.FlamesException; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.MessageEmbed; + +import java.awt.*; +import java.time.Instant; +import java.util.Locale; + +@ExceptionID("703") +@Embed(name="FlamesException") +public class FlamesExceptionEmbed extends FlamesEmbed{ + FlamesException e; + String code; + public FlamesExceptionEmbed(Locale locale, FlamesException e) { + super(locale); + this.e = e; + code = MessageCodes.generateCodeError(e); + } + + @Override + public MessageEmbed get() { + String title = local.getString("title." + e.getClass().getSimpleName()); + String description; + try { + description = local.getString("description." + e.getClass().getSimpleName()); + } catch (NullPointerException ignored) { + description = e.getMessage(); + } + String helpfultitle = local.getString("helpful.title." + e.getClass().getSimpleName()); + try { + helpfultitle = local.getString("helpful.title." + e.getClass().getSimpleName()); + } catch(NullPointerException ignored) { + helpfultitle = local.getString("helpful.title.default"); + }String helpfuldesc = local.getString("helpful.description." + e.getClass().getSimpleName()); + try { + helpfultitle = local.getString("helpful.description." + e.getClass().getSimpleName()); + } catch(NullPointerException ignored) { + helpfultitle = local.getString("helpful.description.default"); + } + + return new EmbedBuilder() + .setAuthor(String.format(local.getString("author"), code), null, Flames.getApi().getSelfUser().getAvatarUrl()) + .setTitle(title) + .setDescription(description) + .addField(helpfultitle, helpfuldesc, false) + .setTimestamp(Instant.now()) + .setColor(Color.RED) + .build(); + } +} diff --git a/src/main/java/com/severalcircles/flames/frontend/WelcomeBackEmbed.java b/src/main/java/com/severalcircles/flames/frontend/WelcomeBackEmbed.java index 0719ba89..54e2222a 100644 --- a/src/main/java/com/severalcircles/flames/frontend/WelcomeBackEmbed.java +++ b/src/main/java/com/severalcircles/flames/frontend/WelcomeBackEmbed.java @@ -4,10 +4,11 @@ package com.severalcircles.flames.frontend; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.entities.MessageEmbed; import java.util.Locale; - +@ExceptionID("704") @Embed(name = "WelcomeBack") public class WelcomeBackEmbed extends FlamesEmbed { diff --git a/src/main/java/com/severalcircles/flames/frontend/package-info.java b/src/main/java/com/severalcircles/flames/frontend/package-info.java index 38b214c0..55b87714 100644 --- a/src/main/java/com/severalcircles/flames/frontend/package-info.java +++ b/src/main/java/com/severalcircles/flames/frontend/package-info.java @@ -7,4 +7,7 @@ * @version 8 * @since Flames 5 */ -package com.severalcircles.flames.frontend; \ No newline at end of file +@ExceptionID("400") +package com.severalcircles.flames.frontend; + +import com.severalcircles.flames.system.exception.ExceptionID; \ No newline at end of file diff --git a/src/main/java/com/severalcircles/flames/interactions/FlamesInteraction.java b/src/main/java/com/severalcircles/flames/interactions/FlamesInteraction.java index 668fb904..65f10cbf 100644 --- a/src/main/java/com/severalcircles/flames/interactions/FlamesInteraction.java +++ b/src/main/java/com/severalcircles/flames/interactions/FlamesInteraction.java @@ -5,8 +5,9 @@ package com.severalcircles.flames.interactions; import com.severalcircles.flames.data.user.FlamesUser; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.interactions.Interaction; - +@ExceptionID("800") public abstract class FlamesInteraction { private Interaction interaction; private FlamesUser user; diff --git a/src/main/java/com/severalcircles/flames/interactions/button/AnswerQuestionButton.java b/src/main/java/com/severalcircles/flames/interactions/button/AnswerQuestionButton.java index 26bd7c49..f464d5f9 100644 --- a/src/main/java/com/severalcircles/flames/interactions/button/AnswerQuestionButton.java +++ b/src/main/java/com/severalcircles/flames/interactions/button/AnswerQuestionButton.java @@ -6,6 +6,7 @@ import com.severalcircles.flames.data.user.FlamesUser; import com.severalcircles.flames.frontend.DayPart; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.interactions.components.ActionRow; import net.dv8tion.jda.api.interactions.components.buttons.ButtonInteraction; import net.dv8tion.jda.api.interactions.components.text.TextInput; @@ -13,7 +14,7 @@ import net.dv8tion.jda.api.interactions.modals.Modal; import java.util.ResourceBundle; - +@ExceptionID("820") public class AnswerQuestionButton extends FlamesButtonInteraction { private DayPart dayPart; public AnswerQuestionButton(DayPart dayPart) { diff --git a/src/main/java/com/severalcircles/flames/interactions/button/ConsentButtons.java b/src/main/java/com/severalcircles/flames/interactions/button/ConsentButtons.java index 100a4bab..357cd6f1 100644 --- a/src/main/java/com/severalcircles/flames/interactions/button/ConsentButtons.java +++ b/src/main/java/com/severalcircles/flames/interactions/button/ConsentButtons.java @@ -5,11 +5,12 @@ package com.severalcircles.flames.interactions.button; import com.severalcircles.flames.data.user.FlamesUser; -import com.severalcircles.flames.data.user.UserDataManager; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.manager.UserDataManager; import net.dv8tion.jda.api.interactions.components.buttons.ButtonInteraction; import java.io.IOException; - +@ExceptionID("820") public class ConsentButtons extends FlamesButtonInteraction { @Override public void execute(ButtonInteraction interaction, FlamesUser user) { diff --git a/src/main/java/com/severalcircles/flames/interactions/button/FlamesButtonInteraction.java b/src/main/java/com/severalcircles/flames/interactions/button/FlamesButtonInteraction.java index 709b84ca..13893bca 100644 --- a/src/main/java/com/severalcircles/flames/interactions/button/FlamesButtonInteraction.java +++ b/src/main/java/com/severalcircles/flames/interactions/button/FlamesButtonInteraction.java @@ -6,8 +6,9 @@ import com.severalcircles.flames.data.user.FlamesUser; import com.severalcircles.flames.interactions.FlamesInteraction; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.interactions.components.buttons.ButtonInteraction; - +@ExceptionID("820") public abstract class FlamesButtonInteraction extends FlamesInteraction { public abstract void execute(ButtonInteraction interaction, FlamesUser user); } diff --git a/src/main/java/com/severalcircles/flames/interactions/slash/BasedCommand.java b/src/main/java/com/severalcircles/flames/interactions/slash/BasedCommand.java index 655ebbbf..0d149dd6 100644 --- a/src/main/java/com/severalcircles/flames/interactions/slash/BasedCommand.java +++ b/src/main/java/com/severalcircles/flames/interactions/slash/BasedCommand.java @@ -5,7 +5,9 @@ package com.severalcircles.flames.interactions.slash; import com.severalcircles.flames.data.user.FlamesUser; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; +@ExceptionID("810") @FlamesCommand(name = "based", description = "Based") public class BasedCommand extends FlamesSlashCommand { diff --git a/src/main/java/com/severalcircles/flames/interactions/slash/CaptionThisCommand.java b/src/main/java/com/severalcircles/flames/interactions/slash/CaptionThisCommand.java index 8bcccabe..b89c1133 100644 --- a/src/main/java/com/severalcircles/flames/interactions/slash/CaptionThisCommand.java +++ b/src/main/java/com/severalcircles/flames/interactions/slash/CaptionThisCommand.java @@ -6,7 +6,8 @@ import com.severalcircles.flames.Flames; import com.severalcircles.flames.conversations.Conversation; -import com.severalcircles.flames.conversations.ConversationManager; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.manager.ConversationManager; import com.severalcircles.flames.conversations.external.Tenor; import com.severalcircles.flames.data.user.FlamesUser; import net.dv8tion.jda.api.EmbedBuilder; @@ -17,7 +18,7 @@ import java.util.Objects; import java.util.Random; import java.util.concurrent.atomic.AtomicReference; - +@ExceptionID("810") @FlamesCommand(name = "captionthis", description = "Captions this conversation") public class CaptionThisCommand extends FlamesSlashCommand { @Override diff --git a/src/main/java/com/severalcircles/flames/interactions/slash/FlamesCommand.java b/src/main/java/com/severalcircles/flames/interactions/slash/FlamesCommand.java index 4fadd023..d7c5f88f 100644 --- a/src/main/java/com/severalcircles/flames/interactions/slash/FlamesCommand.java +++ b/src/main/java/com/severalcircles/flames/interactions/slash/FlamesCommand.java @@ -4,11 +4,16 @@ package com.severalcircles.flames.interactions.slash; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.List; +import java.util.Map; @Retention(RetentionPolicy.RUNTIME) public @interface FlamesCommand { String name(); String description(); + FlamesCommandOption[] options() default {}; } diff --git a/src/main/java/com/severalcircles/flames/interactions/slash/FlamesCommandOption.java b/src/main/java/com/severalcircles/flames/interactions/slash/FlamesCommandOption.java new file mode 100644 index 00000000..39e38436 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/interactions/slash/FlamesCommandOption.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.interactions.slash; + +import net.dv8tion.jda.api.interactions.commands.Command; +import net.dv8tion.jda.api.interactions.commands.Command.Option; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; + +public @interface FlamesCommandOption { + String name(); + String description(); + OptionType type(); + boolean required() default false; +} diff --git a/src/main/java/com/severalcircles/flames/interactions/slash/FlamesSlashCommand.java b/src/main/java/com/severalcircles/flames/interactions/slash/FlamesSlashCommand.java index 4c2e11e9..8955d047 100644 --- a/src/main/java/com/severalcircles/flames/interactions/slash/FlamesSlashCommand.java +++ b/src/main/java/com/severalcircles/flames/interactions/slash/FlamesSlashCommand.java @@ -6,8 +6,9 @@ import com.severalcircles.flames.data.user.FlamesUser; import com.severalcircles.flames.interactions.FlamesInteraction; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; - +@ExceptionID("810") public abstract class FlamesSlashCommand extends FlamesInteraction { private SlashCommandInteraction interaction; diff --git a/src/main/java/com/severalcircles/flames/interactions/slash/HiCommand.java b/src/main/java/com/severalcircles/flames/interactions/slash/HiCommand.java index 16c16896..01126492 100644 --- a/src/main/java/com/severalcircles/flames/interactions/slash/HiCommand.java +++ b/src/main/java/com/severalcircles/flames/interactions/slash/HiCommand.java @@ -5,8 +5,9 @@ package com.severalcircles.flames.interactions.slash; import com.severalcircles.flames.data.user.FlamesUser; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; - +@ExceptionID("810") public class HiCommand extends FlamesSlashCommand { @Override public void execute(SlashCommandInteraction interaction, FlamesUser user) { diff --git a/src/main/java/com/severalcircles/flames/interactions/slash/TestCommand.java b/src/main/java/com/severalcircles/flames/interactions/slash/TestCommand.java new file mode 100644 index 00000000..7d811c63 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/interactions/slash/TestCommand.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.interactions.slash; + +import com.severalcircles.flames.data.user.FlamesUser; +import com.severalcircles.flames.system.exception.FlamesExceptionHandler; +import com.severalcircles.flames.system.exception.flames.FlamesException; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; +@FlamesCommand(name = "test", description = "Run a test by ID.", options = { + @FlamesCommandOption(name = "id", description = "The ID of the test to run.", type = OptionType.STRING, required = true) +}) +public class TestCommand extends FlamesSlashCommand{ + @Override + public void execute(SlashCommandInteraction interaction, FlamesUser user) { + switch (interaction.getOption("id").getAsString()) { + case "1": + interaction.replyEmbeds(new FlamesExceptionHandler(new FlamesException("Test exception")).getEmbed().get()).complete(); + default: + interaction.reply("No command with that ID.").queue(); + } + interaction.reply("Test command executed.").queue(); + } +} diff --git a/src/main/java/com/severalcircles/flames/package-info.java b/src/main/java/com/severalcircles/flames/package-info.java index 21da287a..fdd0aabe 100644 --- a/src/main/java/com/severalcircles/flames/package-info.java +++ b/src/main/java/com/severalcircles/flames/package-info.java @@ -7,4 +7,7 @@ * @version 8 * @since Flames 2 */ -package com.severalcircles.flames; \ No newline at end of file +@ExceptionID("000") +package com.severalcircles.flames; + +import com.severalcircles.flames.system.exception.ExceptionID; \ No newline at end of file diff --git a/src/main/java/com/severalcircles/flames/system/exception/ExceptionID.java b/src/main/java/com/severalcircles/flames/system/exception/ExceptionID.java new file mode 100644 index 00000000..4c418e5f --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/exception/ExceptionID.java @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.exception; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface ExceptionID { + String value(); +} diff --git a/src/main/java/com/severalcircles/flames/system/exception/FlamesExceptionHandler.java b/src/main/java/com/severalcircles/flames/system/exception/FlamesExceptionHandler.java new file mode 100644 index 00000000..4336587a --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/exception/FlamesExceptionHandler.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.exception; + +import com.severalcircles.flames.Flames; +import com.severalcircles.flames.frontend.FlamesEmbed; +import com.severalcircles.flames.frontend.FlamesExceptionEmbed; +import com.severalcircles.flames.system.exception.flames.FlamesException; +import net.dv8tion.jda.api.entities.MessageEmbed; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class FlamesExceptionHandler { + public static final Map, Integer> exceptionCounts = new HashMap<>(); + FlamesException e; + public FlamesExceptionHandler(FlamesException e) { + this.e = e; + countException(); + Flames.getFlogger().severe( "[" + MessageCodes.generateCodeError(e) + "] " + e.getMessage()); + } + public FlamesEmbed getEmbed() { + return new FlamesExceptionEmbed(Locale.ROOT, e); + } + private void countException() { + if(exceptionCounts.containsKey(e.getClass())) { + exceptionCounts.put((Class) e.getClass(), exceptionCounts.get(e.getClass()) + 1); + } else { + exceptionCounts.put((Class) e.getClass(), 1); + } + } + public MessageEmbed handle() { + return new FlamesExceptionEmbed(Locale.ROOT, e).get(); + } +} diff --git a/src/main/java/com/severalcircles/flames/system/exception/FlamesUserException.java b/src/main/java/com/severalcircles/flames/system/exception/FlamesUserException.java new file mode 100644 index 00000000..5e6833fe --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/exception/FlamesUserException.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.exception; + +import com.severalcircles.flames.system.exception.flames.FlamesException; + +/** + * A FlamesUserException is an exception caused by a user. It is thrown when a user does something that is not allowed. Naughty user. + * @since Flames 8 + * @author Several Circles + */ +@ExceptionID("020") +public class FlamesUserException extends FlamesException { + /** + * Creates a new FlamesException with the specified message. + * What's a FlamesException? I don't know. I'm just a microwave. + * Maybe, just maybe, it's a microwave that's on fire. Or, as I like to call it, a "flame-crowave." + * Why do they call it a microwave? It's not like it's a micro-waive. or a mic or a wave. It's a microwave. Or, as I like to call it, a "wave-cro." + * The more likely scenario is this is an exception that's on fire. Or, as I like to call it, a "flame-ception." + * Even more likely, it's an exception created by Flames that only applies to Flames. I have to make it look like I got something done today. I'll put down on my timesheet that I "documented" this class. + * + * @param message The message to be displayed. + * @since Flames 8 + */ + public FlamesUserException(String message) { + super(message); + } +} diff --git a/src/main/java/com/severalcircles/flames/system/exception/MessageCodes.java b/src/main/java/com/severalcircles/flames/system/exception/MessageCodes.java new file mode 100644 index 00000000..8c4b9995 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/exception/MessageCodes.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.exception; + +import com.severalcircles.flames.Flames; +import com.severalcircles.flames.system.exception.flames.FlamesException; + +public class MessageCodes { + static final String PREFIX = "FL-"; + public static String generateCodeError(FlamesException e) { + String code = ""; + code += PREFIX; + for (StackTraceElement stackTraceElement : e.getStackTrace()) { + Flames.getFlogger().severe(e.getClass().getSimpleName()); + } + try { + Flames.getFlogger().finest(Class.forName(e.getStackTrace()[0].getClassName()).getName()); + } catch (ClassNotFoundException ex) { + throw new RuntimeException(ex); + } + try { + code += Class.forName(e.getStackTrace()[0].getClassName()).getAnnotation(ExceptionID.class).value(); + } catch (ClassNotFoundException ex) { + throw new RuntimeException(ex); + } + code += "-"; + code += e.getClass().getAnnotation(ExceptionID.class).value(); + return code; + } +} diff --git a/src/main/java/com/severalcircles/flames/system/exception/NoCommandException.java b/src/main/java/com/severalcircles/flames/system/exception/NoCommandException.java deleted file mode 100644 index 9c0c8f95..00000000 --- a/src/main/java/com/severalcircles/flames/system/exception/NoCommandException.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2023 Several Circles - */ - -package com.severalcircles.flames.system.exception; - -public class NoCommandException extends FlamesRuntimeException { - public NoCommandException(String message) { - super(message); - } -} diff --git a/src/main/java/com/severalcircles/flames/system/exception/AlreadyCollectedException.java b/src/main/java/com/severalcircles/flames/system/exception/flames/AlreadyCollectedException.java similarity index 60% rename from src/main/java/com/severalcircles/flames/system/exception/AlreadyCollectedException.java rename to src/main/java/com/severalcircles/flames/system/exception/flames/AlreadyCollectedException.java index 7634077a..223f5e10 100644 --- a/src/main/java/com/severalcircles/flames/system/exception/AlreadyCollectedException.java +++ b/src/main/java/com/severalcircles/flames/system/exception/flames/AlreadyCollectedException.java @@ -2,9 +2,12 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.system.exception; +package com.severalcircles.flames.system.exception.flames; -public class AlreadyCollectedException extends FlamesException{ +import com.severalcircles.flames.system.exception.ExceptionID; + +@ExceptionID("070") +public class AlreadyCollectedException extends FlamesException { /** * Constructs a new AlreadyCollectedException with the specified detail message. * diff --git a/src/main/java/com/severalcircles/flames/system/exception/ConsentException.java b/src/main/java/com/severalcircles/flames/system/exception/flames/ConsentException.java similarity index 88% rename from src/main/java/com/severalcircles/flames/system/exception/ConsentException.java rename to src/main/java/com/severalcircles/flames/system/exception/flames/ConsentException.java index a918dcef..640ef308 100644 --- a/src/main/java/com/severalcircles/flames/system/exception/ConsentException.java +++ b/src/main/java/com/severalcircles/flames/system/exception/flames/ConsentException.java @@ -2,9 +2,10 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.system.exception; +package com.severalcircles.flames.system.exception.flames; import com.severalcircles.flames.Flames; +import com.severalcircles.flames.system.exception.ExceptionID; /** * Exception thrown when big big chungus, big chungus, big chungus, big big chungus @@ -12,6 +13,7 @@ * @author Several Circles * @version 8 */ +@ExceptionID("060") public class ConsentException extends FlamesException { double consent; public ConsentException(double cnst) { diff --git a/src/main/java/com/severalcircles/flames/system/exception/FlamesConfigurationException.java b/src/main/java/com/severalcircles/flames/system/exception/flames/FlamesConfigurationException.java similarity index 89% rename from src/main/java/com/severalcircles/flames/system/exception/FlamesConfigurationException.java rename to src/main/java/com/severalcircles/flames/system/exception/flames/FlamesConfigurationException.java index fed993b1..3fa68095 100644 --- a/src/main/java/com/severalcircles/flames/system/exception/FlamesConfigurationException.java +++ b/src/main/java/com/severalcircles/flames/system/exception/flames/FlamesConfigurationException.java @@ -2,9 +2,12 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.system.exception; +package com.severalcircles.flames.system.exception.flames; -public class FlamesConfigurationException extends FlamesException{ +import com.severalcircles.flames.system.exception.ExceptionID; + +@ExceptionID("050") +public class FlamesConfigurationException extends FlamesException { /** * Now listen up, here's the story about a little FlamesConfigurationException that lives in a world of exceptions. It's not a very big exception, but it's a very special exception. It's the only exception that can throw exceptions. It's a FlamesConfigurationException, and it lives in a world of exceptions. * @param message The message to be displayed. Or, a tale of a little exception that lives in a world of exceptions. It's not a very big exception, but it's a very special exception. It's the only exception that can throw exceptions. It's a FlamesConfigurationException, and it lives in a world of exceptions. diff --git a/src/main/java/com/severalcircles/flames/system/exception/FlamesException.java b/src/main/java/com/severalcircles/flames/system/exception/flames/FlamesException.java similarity index 75% rename from src/main/java/com/severalcircles/flames/system/exception/FlamesException.java rename to src/main/java/com/severalcircles/flames/system/exception/flames/FlamesException.java index 0422e212..f9e36ed3 100644 --- a/src/main/java/com/severalcircles/flames/system/exception/FlamesException.java +++ b/src/main/java/com/severalcircles/flames/system/exception/flames/FlamesException.java @@ -2,8 +2,12 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.system.exception; +package com.severalcircles.flames.system.exception.flames; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.FlamesExceptionHandler; + +@ExceptionID("040") public class FlamesException extends Exception { /** * Creates a new FlamesException with the specified message. @@ -18,4 +22,7 @@ public class FlamesException extends Exception { public FlamesException(String message) { super(message); } + public FlamesExceptionHandler getHandler() { + return new FlamesExceptionHandler(this); + } } diff --git a/src/main/java/com/severalcircles/flames/system/exception/java/FlamesConnectException.java b/src/main/java/com/severalcircles/flames/system/exception/java/FlamesConnectException.java new file mode 100644 index 00000000..75d0a63c --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/exception/java/FlamesConnectException.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.exception.java; + +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.flames.FlamesException; + +import java.net.ConnectException; + +@ExceptionID("551") +public class FlamesConnectException extends FlamesException { + /** + * Creates a new FlamesException with the specified message. + * What's a FlamesException? I don't know. I'm just a microwave. + * Maybe, just maybe, it's a microwave that's on fire. Or, as I like to call it, a "flame-crowave." + * Why do they call it a microwave? It's not like it's a micro-waive. or a mic or a wave. It's a microwave. Or, as I like to call it, a "wave-cro." + * The more likely scenario is this is an exception that's on fire. Or, as I like to call it, a "flame-ception." + * Even more likely, it's an exception created by Flames that only applies to Flames. I have to make it look like I got something done today. I'll put down on my timesheet that I "documented" this class. + * + * @param message The message to be displayed. + * @since Flames 8 + */ + public FlamesConnectException(String message) { + super(message); + } +} diff --git a/src/main/java/com/severalcircles/flames/system/exception/java/FlamesDataException.java b/src/main/java/com/severalcircles/flames/system/exception/java/FlamesDataException.java new file mode 100644 index 00000000..2d8266a3 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/exception/java/FlamesDataException.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.exception.java; + +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.flames.FlamesException; +@ExceptionID("552") +public class FlamesDataException extends FlamesException { + /** + * Creates a new FlamesException with the specified message. + * What's a FlamesException? I don't know. I'm just a microwave. + * Maybe, just maybe, it's a microwave that's on fire. Or, as I like to call it, a "flame-crowave." + * Why do they call it a microwave? It's not like it's a micro-waive. or a mic or a wave. It's a microwave. Or, as I like to call it, a "wave-cro." + * The more likely scenario is this is an exception that's on fire. Or, as I like to call it, a "flame-ception." + * Even more likely, it's an exception created by Flames that only applies to Flames. I have to make it look like I got something done today. I'll put down on my timesheet that I "documented" this class. + * + * @param message The message to be displayed. + * @since Flames 8 + */ + public FlamesDataException(String message) { + super(message); + } +} diff --git a/src/main/java/com/severalcircles/flames/system/exception/package-info.java b/src/main/java/com/severalcircles/flames/system/exception/package-info.java index b2b14215..94248994 100644 --- a/src/main/java/com/severalcircles/flames/system/exception/package-info.java +++ b/src/main/java/com/severalcircles/flames/system/exception/package-info.java @@ -6,6 +6,6 @@ * @author Several Circles * @version 8 * @since Flames 8 - * @see com.severalcircles.flames.system.exception.FlamesException + * @see com.severalcircles.flames.system.exception.flames.FlamesException */ package com.severalcircles.flames.system.exception; \ No newline at end of file diff --git a/src/main/java/com/severalcircles/flames/system/exception/FlamesRuntimeException.java b/src/main/java/com/severalcircles/flames/system/exception/runtime/FlamesRuntimeException.java similarity index 81% rename from src/main/java/com/severalcircles/flames/system/exception/FlamesRuntimeException.java rename to src/main/java/com/severalcircles/flames/system/exception/runtime/FlamesRuntimeException.java index 48debb52..03321344 100644 --- a/src/main/java/com/severalcircles/flames/system/exception/FlamesRuntimeException.java +++ b/src/main/java/com/severalcircles/flames/system/exception/runtime/FlamesRuntimeException.java @@ -2,8 +2,11 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.system.exception; +package com.severalcircles.flames.system.exception.runtime; +import com.severalcircles.flames.system.exception.ExceptionID; + +@ExceptionID("030") public class FlamesRuntimeException extends RuntimeException { /** * You've heard of a FlamesException. Now, get ready for the FlamesRuntimeException. It's like a FlamesException, but it's a runtime exception. It's a FlamesRuntimeException, and it lives in a world of piss and vinegar. diff --git a/src/main/java/com/severalcircles/flames/system/exception/runtime/NoCommandException.java b/src/main/java/com/severalcircles/flames/system/exception/runtime/NoCommandException.java new file mode 100644 index 00000000..9bb12923 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/exception/runtime/NoCommandException.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.exception.runtime; + +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.runtime.FlamesRuntimeException; + +@ExceptionID("010") +public class NoCommandException extends FlamesRuntimeException { + public NoCommandException(String message) { + super(message); + } +} diff --git a/src/main/java/com/severalcircles/flames/data/user/ConsentManager.java b/src/main/java/com/severalcircles/flames/system/manager/ConsentManager.java similarity index 89% rename from src/main/java/com/severalcircles/flames/data/user/ConsentManager.java rename to src/main/java/com/severalcircles/flames/system/manager/ConsentManager.java index 1a05c29c..a6bc4f52 100644 --- a/src/main/java/com/severalcircles/flames/data/user/ConsentManager.java +++ b/src/main/java/com/severalcircles/flames/system/manager/ConsentManager.java @@ -2,19 +2,20 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.data.user; +package com.severalcircles.flames.system.manager; import com.severalcircles.flames.Flames; -import com.severalcircles.flames.FlamesManager; +import com.severalcircles.flames.data.user.FlamesUser; +import com.severalcircles.flames.system.exception.ExceptionID; import com.severalcircles.flames.frontend.ConsentEmbed; -import com.severalcircles.flames.system.exception.ConsentException; +import com.severalcircles.flames.system.exception.flames.ConsentException; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.interactions.components.buttons.Button; import java.awt.*; import java.util.Locale; - +@ExceptionID("913") public class ConsentManager extends FlamesManager { @Override public void prepare() { diff --git a/src/main/java/com/severalcircles/flames/conversations/ConversationManager.java b/src/main/java/com/severalcircles/flames/system/manager/ConversationManager.java similarity index 90% rename from src/main/java/com/severalcircles/flames/conversations/ConversationManager.java rename to src/main/java/com/severalcircles/flames/system/manager/ConversationManager.java index 7d5d7333..cac78d67 100644 --- a/src/main/java/com/severalcircles/flames/conversations/ConversationManager.java +++ b/src/main/java/com/severalcircles/flames/system/manager/ConversationManager.java @@ -2,13 +2,16 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.conversations; +package com.severalcircles.flames.system.manager; import com.severalcircles.flames.Flames; -import com.severalcircles.flames.FlamesManager; +import com.severalcircles.flames.conversations.Analysis; +import com.severalcircles.flames.conversations.AnalysisScore; +import com.severalcircles.flames.conversations.Conversation; +import com.severalcircles.flames.conversations.ConversationEntity; import com.severalcircles.flames.data.user.FlamesQuote; import com.severalcircles.flames.data.user.FlamesUser; -import com.severalcircles.flames.data.user.UserDataManager; +import com.severalcircles.flames.system.exception.ExceptionID; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion; @@ -17,7 +20,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Timer; - +@ExceptionID("940") public class ConversationManager extends FlamesManager { // Map of channel ID to conversation public static Map conversations = new HashMap<>(); diff --git a/src/main/java/com/severalcircles/flames/events/EventManager.java b/src/main/java/com/severalcircles/flames/system/manager/EventManager.java similarity index 58% rename from src/main/java/com/severalcircles/flames/events/EventManager.java rename to src/main/java/com/severalcircles/flames/system/manager/EventManager.java index a53e0a6c..2a233c99 100644 --- a/src/main/java/com/severalcircles/flames/events/EventManager.java +++ b/src/main/java/com/severalcircles/flames/system/manager/EventManager.java @@ -2,11 +2,16 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.events; +package com.severalcircles.flames.system.manager; import com.severalcircles.flames.Flames; -import com.severalcircles.flames.FlamesManager; +import com.severalcircles.flames.events.InteractionEvents; +import com.severalcircles.flames.events.MessageEvent; +import com.severalcircles.flames.events.StatusChange; +import com.severalcircles.flames.system.manager.FlamesManager; +import com.severalcircles.flames.system.exception.ExceptionID; +@ExceptionID("920") public class EventManager extends FlamesManager { @Override public void prepare() { diff --git a/src/main/java/com/severalcircles/flames/interactions/FlamesInteractionManager.java b/src/main/java/com/severalcircles/flames/system/manager/FlamesInteractionManager.java similarity index 65% rename from src/main/java/com/severalcircles/flames/interactions/FlamesInteractionManager.java rename to src/main/java/com/severalcircles/flames/system/manager/FlamesInteractionManager.java index 034dd941..fe37f570 100644 --- a/src/main/java/com/severalcircles/flames/interactions/FlamesInteractionManager.java +++ b/src/main/java/com/severalcircles/flames/system/manager/FlamesInteractionManager.java @@ -2,14 +2,16 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.interactions; +package com.severalcircles.flames.system.manager; +import com.severalcircles.flames.FLogger; import com.severalcircles.flames.Flames; -import com.severalcircles.flames.FlamesManager; import com.severalcircles.flames.interactions.button.ConsentButtons; import com.severalcircles.flames.interactions.button.FlamesButtonInteraction; import com.severalcircles.flames.interactions.slash.*; -import com.severalcircles.flames.system.exception.NoCommandException; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.runtime.NoCommandException; +import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; @@ -17,7 +19,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - +@ExceptionID("930") public class FlamesInteractionManager extends FlamesManager { private static final List commandInteractionList = new ArrayList<>(); private static final List commandDataList = new ArrayList<>(); @@ -26,8 +28,13 @@ public class FlamesInteractionManager extends FlamesManager { public void prepare() { commandInteractionList.add(new BasedCommand()); commandInteractionList.add(new CaptionThisCommand()); + commandInteractionList.add(new TestCommand()); commandInteractionList.forEach(command -> { - commandDataList.add(Commands.slash(command.getClass().getAnnotation(FlamesCommand.class).name(), command.getClass().getAnnotation(FlamesCommand.class).description())); + SlashCommandData data = Commands.slash(command.getClass().getAnnotation(FlamesCommand.class).name(), command.getClass().getAnnotation(FlamesCommand.class).description()); + for (FlamesCommandOption option : command.getClass().getAnnotation(FlamesCommand.class).options()) { + data.addOption(option.type(), option.name(), option.description(), option.required()); + } + commandDataList.add(data); Flames.getFlogger().fine("Added command " + command.getClass().getAnnotation(FlamesCommand.class).name() + " to command list"); }); Flames.getApi().updateCommands().addCommands(commandDataList).queue(); @@ -37,6 +44,8 @@ public void prepare() { } public static FlamesSlashCommand getCommandInteraction(String name) { for (FlamesSlashCommand command : commandInteractionList) { + Flames.getFlogger().fine("Checking command " + command.getClass().getAnnotation(FlamesCommand.class).name() + " for name " + name); + Flames.getFlogger().fine("" + command.getClass().getAnnotation(FlamesCommand.class).name().equals(name)); if (command.getClass().getAnnotation(FlamesCommand.class).name().equals(name)) return command; } throw new NoCommandException("No command with name " + name + " found."); diff --git a/src/main/java/com/severalcircles/flames/FlamesManager.java b/src/main/java/com/severalcircles/flames/system/manager/FlamesManager.java similarity index 80% rename from src/main/java/com/severalcircles/flames/FlamesManager.java rename to src/main/java/com/severalcircles/flames/system/manager/FlamesManager.java index 2d7985dc..ca0b91b0 100644 --- a/src/main/java/com/severalcircles/flames/FlamesManager.java +++ b/src/main/java/com/severalcircles/flames/system/manager/FlamesManager.java @@ -2,7 +2,9 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames; +package com.severalcircles.flames.system.manager; + +import com.severalcircles.flames.system.exception.ExceptionID; import java.io.IOException; @@ -12,6 +14,7 @@ * @version 8 * @since Flames 8 */ +@ExceptionID("900") public abstract class FlamesManager { /** * Prepares the manager for use. diff --git a/src/main/java/com/severalcircles/flames/system/manager/FlamesReportManager.java b/src/main/java/com/severalcircles/flames/system/manager/FlamesReportManager.java new file mode 100644 index 00000000..d4474645 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/manager/FlamesReportManager.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.manager; + +import com.severalcircles.flames.Flames; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.java.FlamesDataException; +import com.severalcircles.flames.system.reports.ExceptionReport; +import com.severalcircles.flames.system.reports.FlamesReport; +import com.severalcircles.flames.system.reports.RecurringReport; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.time.Instant; +import java.time.temporal.ChronoField; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import java.util.Timer; +@ExceptionID("950") +public class FlamesReportManager extends FlamesManager { + public static final File reportDir = new File(SystemDataManager.getFlamesDirectory().getAbsolutePath() + "/reports"); + static final List recurringReports = new LinkedList<>(); + public FlamesReportManager() { + + } + + @Override + public void prepare() throws IOException { + if (reportDir.mkdir()) { + Flames.getFlogger().fine("Created report directory."); + } + recurringReports.add(new ExceptionReport()); + recurringReports.forEach(report -> { + if (report.getClass().isAnnotationPresent(RecurringReport.class)) { + RecurringReport recurringReportAnnotation = report.getClass().getAnnotation(RecurringReport.class); + if (recurringReportAnnotation.interval() > 0) { + Flames.getFlogger().fine("Scheduled report " + report.getClass().getSimpleName() + " to run every " + recurringReportAnnotation.interval() + " milliseconds."); + new Timer().scheduleAtFixedRate(report, 0, recurringReportAnnotation.interval()); + } + } + }); + } + public static void saveReport(FlamesReport report) throws FlamesDataException { + Properties properties = new Properties(); + properties.putAll(report.getReport()); + File file = new File(reportDir.getAbsolutePath() + "/" + report.getClass().getAnnotation(RecurringReport.class).name() + " " + Instant.now().get(ChronoField.NANO_OF_SECOND) + ".flr"); + try { + if (file.createNewFile()) { + Flames.getFlogger().finest("Created report file for " + report.getClass().getSimpleName() + "."); + } + } catch (IOException e) { + e.printStackTrace(); + throw new FlamesDataException("Could not create report file for " + report.getClass().getSimpleName() + "because of a(n) " + e.getClass().getSimpleName() + "."); + } + try { + FileWriter fw = new FileWriter(file); + properties.store(fw, "Flames " + report.getClass().getSimpleName()); + fw.close(); + } catch (IOException e) { + throw new FlamesDataException("Could not save report " + report.getClass().getSimpleName() + " to file."); + } + } +} diff --git a/src/main/java/com/severalcircles/flames/data/SystemDataManager.java b/src/main/java/com/severalcircles/flames/system/manager/SystemDataManager.java similarity index 93% rename from src/main/java/com/severalcircles/flames/data/SystemDataManager.java rename to src/main/java/com/severalcircles/flames/system/manager/SystemDataManager.java index 2d89d0cc..afce0765 100644 --- a/src/main/java/com/severalcircles/flames/data/SystemDataManager.java +++ b/src/main/java/com/severalcircles/flames/system/manager/SystemDataManager.java @@ -2,11 +2,11 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.data; +package com.severalcircles.flames.system.manager; import com.severalcircles.flames.Flames; -import com.severalcircles.flames.FlamesManager; -import com.severalcircles.flames.system.exception.FlamesConfigurationException; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.flames.FlamesConfigurationException; import java.io.File; import java.io.FileInputStream; @@ -14,7 +14,7 @@ import java.io.IOException; import java.util.Properties; import java.util.logging.Level; - +@ExceptionID("911") public class SystemDataManager extends FlamesManager { private static final File config = new File("flames.properties"); // private static final File secureSave = new File(System.getProperty("user.dir") + "/Flames/secure/securesave.sflp"); diff --git a/src/main/java/com/severalcircles/flames/data/user/UserDataManager.java b/src/main/java/com/severalcircles/flames/system/manager/UserDataManager.java similarity index 80% rename from src/main/java/com/severalcircles/flames/data/user/UserDataManager.java rename to src/main/java/com/severalcircles/flames/system/manager/UserDataManager.java index 40cfa581..e1a801e5 100644 --- a/src/main/java/com/severalcircles/flames/data/user/UserDataManager.java +++ b/src/main/java/com/severalcircles/flames/system/manager/UserDataManager.java @@ -2,19 +2,24 @@ * Copyright (c) 2023 Several Circles */ -package com.severalcircles.flames.data.user; +package com.severalcircles.flames.system.manager; import com.severalcircles.flames.Flames; -import com.severalcircles.flames.FlamesManager; -import com.severalcircles.flames.data.SystemDataManager; -import com.severalcircles.flames.system.exception.ConsentException; +import com.severalcircles.flames.data.user.FlamesQuote; +import com.severalcircles.flames.data.user.FlamesUser; +import com.severalcircles.flames.data.user.Rank; +import com.severalcircles.flames.system.exception.ExceptionID; +import com.severalcircles.flames.system.exception.flames.ConsentException; +import com.severalcircles.flames.system.exception.java.FlamesDataException; +import com.severalcircles.flames.system.reports.FlamesReport; +import com.severalcircles.flames.system.reports.NewFlamesUserReport; import net.dv8tion.jda.api.entities.User; import java.io.*; import java.time.Instant; import java.util.Locale; import java.util.Properties; - +@ExceptionID("912") public class UserDataManager extends FlamesManager { private static final File userDataDir = new File(SystemDataManager.getFlamesDirectory().getAbsolutePath() + "/users"); @Override @@ -46,6 +51,13 @@ public FlamesUser loadUser(User user) throws IOException, ConsentException { File userFile = new File(userDataDir.getAbsolutePath() + "/" + user.getId() + ".flp"); if (userFile.createNewFile()) { Flames.getFlogger().fine("Created user data file for " + user.getAsTag() + " at " + userFile.getAbsolutePath()); + try { + FlamesReport nur = new NewFlamesUserReport(user); + nur.run(); + FlamesReportManager.saveReport(nur); + } catch (FlamesDataException ex) { + throw new RuntimeException(ex); + } } properties.load(new FileInputStream(userFile)); FlamesUser fluser; @@ -62,7 +74,7 @@ public FlamesUser loadUser(User user) throws IOException, ConsentException { Locale.forLanguageTag(properties.getProperty("locale")), Integer.parseInt(properties.getProperty("consent")), Boolean.parseBoolean(properties.getProperty("quoteConsent")), - Instant.parse(properties.getProperty("lastBonus"))); + Instant.parse(properties.getProperty("lastBonus")),Double.parseDouble(properties.getProperty("bonusMultiplier"))); fluser.setFavoriteQuote(FlamesQuote.valueOf(properties.getProperty("favoriteQuote"), fluser));} catch (NullPointerException e) { fluser = dataDefault(user); @@ -85,7 +97,7 @@ public static FlamesUser flames() { Locale.forLanguageTag("en-US"), 1, true, - Instant.now()); + Instant.now(), 1); } public static FlamesUser dataDefault(User user) { return new FlamesUser( @@ -99,8 +111,8 @@ public static FlamesUser dataDefault(User user) { Instant.now(), null, Locale.forLanguageTag("en-US"), - 0, + 1, false, - Instant.now()); + Instant.now(),1); } } diff --git a/src/main/java/com/severalcircles/flames/system/reports/ExceptionReport.java b/src/main/java/com/severalcircles/flames/system/reports/ExceptionReport.java new file mode 100644 index 00000000..35993401 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/reports/ExceptionReport.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.reports; + +import com.severalcircles.flames.system.exception.FlamesExceptionHandler; + +import java.util.HashMap; +import java.util.Map; +@RecurringReport(name = "Exception Report", interval = 60 * 60 * 1000) +public class ExceptionReport extends FlamesReport { + + @Override + public Map getReport() { + Map report = new HashMap<>(); + FlamesExceptionHandler.exceptionCounts.forEach((key, value) -> report.put(key.getSimpleName(), value.toString())); + return report; + } +} diff --git a/src/main/java/com/severalcircles/flames/system/reports/FlamesReport.java b/src/main/java/com/severalcircles/flames/system/reports/FlamesReport.java new file mode 100644 index 00000000..f0be0aa8 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/reports/FlamesReport.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.reports; + +import com.severalcircles.flames.Flames; +import com.severalcircles.flames.system.exception.FlamesExceptionHandler; +import com.severalcircles.flames.system.exception.java.FlamesDataException; +import com.severalcircles.flames.system.manager.FlamesReportManager; + +import java.util.Map; +import java.util.TimerTask; + +public abstract class FlamesReport extends TimerTask { + public void run() { + Flames.getFlogger().info("The " + this.getClass().getSimpleName() + " report follows."); + getReport().forEach((key, value) -> Flames.getFlogger().info(key + ": " + value)); + try { + FlamesReportManager.saveReport(this); + } catch (FlamesDataException e) { + new FlamesExceptionHandler(e); + } + } + public abstract Map getReport(); +} diff --git a/src/main/java/com/severalcircles/flames/system/reports/NewFlamesUserReport.java b/src/main/java/com/severalcircles/flames/system/reports/NewFlamesUserReport.java new file mode 100644 index 00000000..5569746e --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/reports/NewFlamesUserReport.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.reports; + +import com.severalcircles.flames.data.user.FlamesUser; +import net.dv8tion.jda.api.entities.User; + +import java.util.HashMap; +import java.util.Map; + +public class NewFlamesUserReport extends FlamesReport { + User user; + public NewFlamesUserReport(User user) { + this.user = user; + } + @Override + public Map getReport() { + Map report = new HashMap<>(); + report.put("discordUser", user.toString()); + return report; + } +} diff --git a/src/main/java/com/severalcircles/flames/system/reports/RecurringReport.java b/src/main/java/com/severalcircles/flames/system/reports/RecurringReport.java new file mode 100644 index 00000000..dc2729b1 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/reports/RecurringReport.java @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.reports; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface RecurringReport { + String name(); + long interval(); +} diff --git a/src/main/java/com/severalcircles/flames/system/reports/StaticReport.java b/src/main/java/com/severalcircles/flames/system/reports/StaticReport.java new file mode 100644 index 00000000..bc1bcd19 --- /dev/null +++ b/src/main/java/com/severalcircles/flames/system/reports/StaticReport.java @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 Several Circles + */ + +package com.severalcircles.flames.system.reports; + +public @interface StaticReport { + String name(); +} diff --git a/src/main/resources/strings/FlamesException.properties b/src/main/resources/strings/FlamesException.properties new file mode 100644 index 00000000..d9ffb416 --- /dev/null +++ b/src/main/resources/strings/FlamesException.properties @@ -0,0 +1,19 @@ +# +# Copyright (c) 2023 Several Circles +# +author=Error Code: %s +description.ConsentException=It's probably best not to worry about it. +description.FlamesDataExeption=Try again. If that doesn't work, that sucks. +helpful.description.default=If you continue to have issues, please report a bug. +helpful.title.AlreadyCollectedException=See you tomorrow! +helpful.title.ConsentException=Remember to respect other users, even if they choose not to use Flames. +helpful.title.default=This kind of error is unusual. +title.AlreadyCollectedException=You've already collected your bonus today. +title.ConsentException=That action would violate that user's consent setting. +title.FlamesConfigurationException=Flames isn't configured properly. +title.FlamesConnectException=This message shouldn't appear. If it does, it's a bug, so tell me right away. +title.FlamesDataException=An error occured while reading your Flames data. +title.FlamesException=That probably shouldn't have happened. +title.FlamesRuntimeException=That might have worked, but it probably didn't. +title.NoCommandException=Not sure how you got here, but you did. + diff --git a/src/main/resources/strings/FlamesException_en.properties b/src/main/resources/strings/FlamesException_en.properties new file mode 100644 index 00000000..90b67cf3 --- /dev/null +++ b/src/main/resources/strings/FlamesException_en.properties @@ -0,0 +1,19 @@ +# +# Copyright (c) 2023 Several Circles +# + +author=Error Code: %s +description.ConsentException=It's probably best not to worry about it. +description.FlamesDataExeption=Try again. If that doesn't work, that sucks. +helpful.description.default=If you continue to have issues, please report a bug. +helpful.title.AlreadyCollectedException=See you tomorrow! +helpful.title.ConsentException=Remember to respect other users, even if they choose not to use Flames. +helpful.title.default=This kind of error is unusual. +title.AlreadyCollectedException=You've already collected your bonus today. +title.ConsentException=That action would violate that user's consent setting. +title.FlamesConfigurationException=Flames isn't configured properly. +title.FlamesConnectException=This message shouldn't appear. What should I do if it does? +title.FlamesDataException=An error occured while reading your Flames data. +title.FlamesException=That probably shouldn't have happened. +title.FlamesRuntimeException=That might have worked, but it probably didn't. +title.NoCommandException=Not sure how you got here, but you did. diff --git a/src/main/resources/strings/FlamesException_es.properties b/src/main/resources/strings/FlamesException_es.properties new file mode 100644 index 00000000..d93f5028 --- /dev/null +++ b/src/main/resources/strings/FlamesException_es.properties @@ -0,0 +1,18 @@ +# +# Copyright (c) 2023 Several Circles +# + +author=Código del error: %s +description.ConsentException=¿Ah, a quien le importa? +description.FlamesDataExeption=Intentalo de nuevo. Si no, vas a ser aplastado. +helpful.description.default=Si vuelvas a encontrarme, denunciar un bug. +helpful.title.AlreadyCollectedException=¡Hasta mañana! +helpful.title.ConsentException=No haces nada...raro. +title.AlreadyCollectedException=Ya has corbrado tu bonus hoy. +title.ConsentException=Al hacer esto violas la consentimiento de esta usario. +title.FlamesConfigurationException=Flames no ha sido configurado correctamente. +title.FlamesConnectException=Este mensaje no debe ser leido. Si lees de todos modos, es un bug. +title.FlamesDataException=Se ha encontrado un error al leer tus datos de Flames. +title.FlamesException=¿...y esto? +title.FlamesRuntimeException=Mmmmm, no lo se. +title.NoCommandException=Has llegado a...¿algo lugar?