diff --git a/src/main/java/com/eternalcode/discordapp/DiscordApp.java b/src/main/java/com/eternalcode/discordapp/DiscordApp.java index 32323810..185911fa 100644 --- a/src/main/java/com/eternalcode/discordapp/DiscordApp.java +++ b/src/main/java/com/eternalcode/discordapp/DiscordApp.java @@ -1,7 +1,7 @@ package com.eternalcode.discordapp; -import com.eternalcode.discordapp.automessages.AutoMessageService; -import com.eternalcode.discordapp.automessages.AutoMessageTask; +import com.eternalcode.discordapp.feature.automessages.AutoMessageService; +import com.eternalcode.discordapp.feature.automessages.AutoMessageTask; import com.eternalcode.discordapp.command.AvatarCommand; import com.eternalcode.discordapp.command.BanCommand; import com.eternalcode.discordapp.command.BotInfoCommand; @@ -18,39 +18,39 @@ import com.eternalcode.discordapp.config.ConfigManager; import com.eternalcode.discordapp.config.DatabaseConfig; import com.eternalcode.discordapp.database.DatabaseManager; -import com.eternalcode.discordapp.filter.FilterMessageEmbedController; -import com.eternalcode.discordapp.filter.FilterService; -import com.eternalcode.discordapp.filter.renovate.RenovateForcedPushFilter; -import com.eternalcode.discordapp.guildstats.GuildStatisticsService; -import com.eternalcode.discordapp.guildstats.GuildStatisticsTask; -import com.eternalcode.discordapp.leveling.LevelCommand; -import com.eternalcode.discordapp.leveling.LevelConfig; -import com.eternalcode.discordapp.leveling.LevelController; -import com.eternalcode.discordapp.leveling.LevelService; -import com.eternalcode.discordapp.leveling.experience.ExperienceChangeEvent; -import com.eternalcode.discordapp.leveling.experience.ExperienceConfig; -import com.eternalcode.discordapp.leveling.experience.ExperienceService; -import com.eternalcode.discordapp.leveling.experience.listener.ExperienceMessageListener; -import com.eternalcode.discordapp.leveling.experience.listener.ExperienceReactionListener; -import com.eternalcode.discordapp.leveling.leaderboard.LeaderboardButtonController; -import com.eternalcode.discordapp.leveling.leaderboard.LeaderboardCommand; -import com.eternalcode.discordapp.leveling.leaderboard.LeaderboardService; -import com.eternalcode.discordapp.meeting.MeetingButtonController; -import com.eternalcode.discordapp.meeting.MeetingCleanupTask; -import com.eternalcode.discordapp.meeting.MeetingCommand; -import com.eternalcode.discordapp.meeting.MeetingPollRepository; -import com.eternalcode.discordapp.meeting.MeetingService; -import com.eternalcode.discordapp.meeting.MeetingVoteRepository; +import com.eternalcode.discordapp.feature.filter.FilterMessageEmbedController; +import com.eternalcode.discordapp.feature.filter.FilterService; +import com.eternalcode.discordapp.feature.filter.renovate.RenovateForcedPushFilter; +import com.eternalcode.discordapp.feature.guildstats.GuildStatisticsService; +import com.eternalcode.discordapp.feature.guildstats.GuildStatisticsTask; +import com.eternalcode.discordapp.feature.leveling.LevelCommand; +import com.eternalcode.discordapp.feature.leveling.LevelConfig; +import com.eternalcode.discordapp.feature.leveling.LevelController; +import com.eternalcode.discordapp.feature.leveling.LevelService; +import com.eternalcode.discordapp.feature.leveling.experience.ExperienceChangeEvent; +import com.eternalcode.discordapp.feature.leveling.experience.ExperienceConfig; +import com.eternalcode.discordapp.feature.leveling.experience.ExperienceService; +import com.eternalcode.discordapp.feature.leveling.experience.listener.ExperienceMessageListener; +import com.eternalcode.discordapp.feature.leveling.experience.listener.ExperienceReactionListener; +import com.eternalcode.discordapp.feature.leveling.leaderboard.LeaderboardButtonController; +import com.eternalcode.discordapp.feature.leveling.leaderboard.LeaderboardCommand; +import com.eternalcode.discordapp.feature.leveling.leaderboard.LeaderboardService; +import com.eternalcode.discordapp.feature.meeting.MeetingButtonController; +import com.eternalcode.discordapp.feature.meeting.MeetingCleanupTask; +import com.eternalcode.discordapp.feature.meeting.MeetingCommand; +import com.eternalcode.discordapp.feature.meeting.MeetingPollRepository; +import com.eternalcode.discordapp.feature.meeting.MeetingService; +import com.eternalcode.discordapp.feature.meeting.MeetingVoteRepository; import com.eternalcode.discordapp.observer.ObserverRegistry; -import com.eternalcode.discordapp.review.GitHubReviewReminderService; -import com.eternalcode.discordapp.review.GitHubReviewService; -import com.eternalcode.discordapp.review.GitHubReviewTask; -import com.eternalcode.discordapp.review.command.GitHubReviewCommand; -import com.eternalcode.discordapp.review.database.GitHubReviewMentionRepository; -import com.eternalcode.discordapp.review.database.GitHubReviewMentionRepositoryImpl; +import com.eternalcode.discordapp.feature.review.GitHubReviewReminderService; +import com.eternalcode.discordapp.feature.review.GitHubReviewService; +import com.eternalcode.discordapp.feature.review.GitHubReviewTask; +import com.eternalcode.discordapp.feature.review.command.GitHubReviewCommand; +import com.eternalcode.discordapp.feature.review.database.GitHubReviewMentionRepository; +import com.eternalcode.discordapp.feature.review.database.GitHubReviewMentionRepositoryImpl; import com.eternalcode.discordapp.scheduler.Scheduler; import com.eternalcode.discordapp.scheduler.VirtualThreadSchedulerImpl; -import com.eternalcode.discordapp.ticket.TicketConfigurer; +import com.eternalcode.discordapp.feature.ticket.TicketConfigurer; import com.jagrosh.jdautilities.command.CommandClient; import com.jagrosh.jdautilities.command.CommandClientBuilder; import io.sentry.Sentry; diff --git a/src/main/java/com/eternalcode/discordapp/config/AppConfig.java b/src/main/java/com/eternalcode/discordapp/config/AppConfig.java index fce8d580..6b30afbc 100644 --- a/src/main/java/com/eternalcode/discordapp/config/AppConfig.java +++ b/src/main/java/com/eternalcode/discordapp/config/AppConfig.java @@ -1,9 +1,8 @@ package com.eternalcode.discordapp.config; -import com.eternalcode.discordapp.automessages.AutoMessagesConfig; -import com.eternalcode.discordapp.review.GitHubReviewNotificationType; -import com.eternalcode.discordapp.review.GitHubReviewUser; -import com.eternalcode.discordapp.ticket.TicketConfig; +import com.eternalcode.discordapp.feature.automessages.AutoMessagesConfig; +import com.eternalcode.discordapp.feature.review.GitHubReviewNotificationType; +import com.eternalcode.discordapp.feature.review.GitHubReviewUser; import net.dzikoysk.cdn.entity.Contextual; import net.dzikoysk.cdn.entity.Description; import net.dzikoysk.cdn.source.Resource; diff --git a/src/main/java/com/eternalcode/discordapp/automessages/AutoMessageService.java b/src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessageService.java similarity index 98% rename from src/main/java/com/eternalcode/discordapp/automessages/AutoMessageService.java rename to src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessageService.java index c10a7e91..d130961f 100644 --- a/src/main/java/com/eternalcode/discordapp/automessages/AutoMessageService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessageService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.automessages; +package com.eternalcode.discordapp.feature.automessages; import com.eternalcode.commons.concurrent.FutureHandler; import java.time.Instant; diff --git a/src/main/java/com/eternalcode/discordapp/automessages/AutoMessageTask.java b/src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessageTask.java similarity index 87% rename from src/main/java/com/eternalcode/discordapp/automessages/AutoMessageTask.java rename to src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessageTask.java index 0383a4b8..e11600d4 100644 --- a/src/main/java/com/eternalcode/discordapp/automessages/AutoMessageTask.java +++ b/src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessageTask.java @@ -1,6 +1,6 @@ -package com.eternalcode.discordapp.automessages; +package com.eternalcode.discordapp.feature.automessages; -import com.eternalcode.discordapp.automessages.AutoMessageService.AutoMessageResults; +import com.eternalcode.discordapp.feature.automessages.AutoMessageService.AutoMessageResults; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/eternalcode/discordapp/automessages/AutoMessagesConfig.java b/src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessagesConfig.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/automessages/AutoMessagesConfig.java rename to src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessagesConfig.java index f8ebe13a..379fb225 100644 --- a/src/main/java/com/eternalcode/discordapp/automessages/AutoMessagesConfig.java +++ b/src/main/java/com/eternalcode/discordapp/feature/automessages/AutoMessagesConfig.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.automessages; +package com.eternalcode.discordapp.feature.automessages; import java.time.Duration; import java.util.ArrayList; diff --git a/src/main/java/com/eternalcode/discordapp/filter/Filter.java b/src/main/java/com/eternalcode/discordapp/feature/filter/Filter.java similarity index 64% rename from src/main/java/com/eternalcode/discordapp/filter/Filter.java rename to src/main/java/com/eternalcode/discordapp/feature/filter/Filter.java index 82e7ec3e..bc070d4e 100644 --- a/src/main/java/com/eternalcode/discordapp/filter/Filter.java +++ b/src/main/java/com/eternalcode/discordapp/feature/filter/Filter.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.filter; +package com.eternalcode.discordapp.feature.filter; @FunctionalInterface public interface Filter { diff --git a/src/main/java/com/eternalcode/discordapp/filter/FilterMessageEmbedController.java b/src/main/java/com/eternalcode/discordapp/feature/filter/FilterMessageEmbedController.java similarity index 94% rename from src/main/java/com/eternalcode/discordapp/filter/FilterMessageEmbedController.java rename to src/main/java/com/eternalcode/discordapp/feature/filter/FilterMessageEmbedController.java index f7ac6349..e08ac878 100644 --- a/src/main/java/com/eternalcode/discordapp/filter/FilterMessageEmbedController.java +++ b/src/main/java/com/eternalcode/discordapp/feature/filter/FilterMessageEmbedController.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.filter; +package com.eternalcode.discordapp.feature.filter; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; diff --git a/src/main/java/com/eternalcode/discordapp/filter/FilterResult.java b/src/main/java/com/eternalcode/discordapp/feature/filter/FilterResult.java similarity index 91% rename from src/main/java/com/eternalcode/discordapp/filter/FilterResult.java rename to src/main/java/com/eternalcode/discordapp/feature/filter/FilterResult.java index 1be87429..4698749f 100644 --- a/src/main/java/com/eternalcode/discordapp/filter/FilterResult.java +++ b/src/main/java/com/eternalcode/discordapp/feature/filter/FilterResult.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.filter; +package com.eternalcode.discordapp.feature.filter; public final class FilterResult { diff --git a/src/main/java/com/eternalcode/discordapp/filter/FilterService.java b/src/main/java/com/eternalcode/discordapp/feature/filter/FilterService.java similarity index 91% rename from src/main/java/com/eternalcode/discordapp/filter/FilterService.java rename to src/main/java/com/eternalcode/discordapp/feature/filter/FilterService.java index d6761ce2..c94d7b28 100644 --- a/src/main/java/com/eternalcode/discordapp/filter/FilterService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/filter/FilterService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.filter; +package com.eternalcode.discordapp.feature.filter; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/eternalcode/discordapp/filter/renovate/RenovateForcedPushFilter.java b/src/main/java/com/eternalcode/discordapp/feature/filter/renovate/RenovateForcedPushFilter.java similarity index 75% rename from src/main/java/com/eternalcode/discordapp/filter/renovate/RenovateForcedPushFilter.java rename to src/main/java/com/eternalcode/discordapp/feature/filter/renovate/RenovateForcedPushFilter.java index 76e0734e..b8104ffe 100644 --- a/src/main/java/com/eternalcode/discordapp/filter/renovate/RenovateForcedPushFilter.java +++ b/src/main/java/com/eternalcode/discordapp/feature/filter/renovate/RenovateForcedPushFilter.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.filter.renovate; +package com.eternalcode.discordapp.feature.filter.renovate; -import com.eternalcode.discordapp.filter.Filter; -import com.eternalcode.discordapp.filter.FilterResult; +import com.eternalcode.discordapp.feature.filter.Filter; +import com.eternalcode.discordapp.feature.filter.FilterResult; import java.util.Set; diff --git a/src/main/java/com/eternalcode/discordapp/guildstats/GuildStatisticsService.java b/src/main/java/com/eternalcode/discordapp/feature/guildstats/GuildStatisticsService.java similarity index 98% rename from src/main/java/com/eternalcode/discordapp/guildstats/GuildStatisticsService.java rename to src/main/java/com/eternalcode/discordapp/feature/guildstats/GuildStatisticsService.java index fffe6f5b..67c23bb7 100644 --- a/src/main/java/com/eternalcode/discordapp/guildstats/GuildStatisticsService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/guildstats/GuildStatisticsService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.guildstats; +package com.eternalcode.discordapp.feature.guildstats; import com.eternalcode.commons.concurrent.FutureHandler; import com.eternalcode.discordapp.config.AppConfig; diff --git a/src/main/java/com/eternalcode/discordapp/guildstats/GuildStatisticsTask.java b/src/main/java/com/eternalcode/discordapp/feature/guildstats/GuildStatisticsTask.java similarity index 93% rename from src/main/java/com/eternalcode/discordapp/guildstats/GuildStatisticsTask.java rename to src/main/java/com/eternalcode/discordapp/feature/guildstats/GuildStatisticsTask.java index 210307db..5c536410 100644 --- a/src/main/java/com/eternalcode/discordapp/guildstats/GuildStatisticsTask.java +++ b/src/main/java/com/eternalcode/discordapp/feature/guildstats/GuildStatisticsTask.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.guildstats; +package com.eternalcode.discordapp.feature.guildstats; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/Level.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/Level.java similarity index 89% rename from src/main/java/com/eternalcode/discordapp/leveling/Level.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/Level.java index 5b946bc3..9c872cd7 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/Level.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/Level.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; public class Level { diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelCommand.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelCommand.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/leveling/LevelCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/LevelCommand.java index 58998090..d073407f 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelCommand.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelConfig.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelConfig.java similarity index 93% rename from src/main/java/com/eternalcode/discordapp/leveling/LevelConfig.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/LevelConfig.java index 2cecf2f6..baded141 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelConfig.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelConfig.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; import com.eternalcode.discordapp.config.CdnConfig; import net.dzikoysk.cdn.entity.Contextual; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelController.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelController.java similarity index 92% rename from src/main/java/com/eternalcode/discordapp/leveling/LevelController.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/LevelController.java index a76d8cce..78ffd569 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelController.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelController.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; -import com.eternalcode.discordapp.leveling.experience.Experience; -import com.eternalcode.discordapp.leveling.experience.ExperienceChangeEvent; +import com.eternalcode.discordapp.feature.leveling.experience.Experience; +import com.eternalcode.discordapp.feature.leveling.experience.ExperienceChangeEvent; import com.eternalcode.discordapp.observer.Observer; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.User; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelRepository.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelRepository.java similarity index 86% rename from src/main/java/com/eternalcode/discordapp/leveling/LevelRepository.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/LevelRepository.java index 2af89255..37e046aa 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelRepository.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelRepository.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; import java.util.List; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelRepositoryImpl.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelRepositoryImpl.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/leveling/LevelRepositoryImpl.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/LevelRepositoryImpl.java index 6dbf65a9..4b7fa06f 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelRepositoryImpl.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelRepositoryImpl.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; import com.eternalcode.discordapp.database.DataAccessException; import com.eternalcode.discordapp.database.DatabaseManager; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelService.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelService.java similarity index 93% rename from src/main/java/com/eternalcode/discordapp/leveling/LevelService.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/LevelService.java index d8c94a7c..7ad2074a 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; import com.eternalcode.discordapp.database.DatabaseManager; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelUtil.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelUtil.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/leveling/LevelUtil.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/LevelUtil.java index 7bad229a..6b376d41 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelUtil.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelUtil.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; public final class LevelUtil { diff --git a/src/main/java/com/eternalcode/discordapp/leveling/LevelWrapper.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelWrapper.java similarity index 92% rename from src/main/java/com/eternalcode/discordapp/leveling/LevelWrapper.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/LevelWrapper.java index 5fcf1964..9bd410cc 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/LevelWrapper.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/LevelWrapper.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling; +package com.eternalcode.discordapp.feature.leveling; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/Experience.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/Experience.java similarity index 90% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/Experience.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/Experience.java index 4d8f8451..0a2fe9db 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/Experience.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/Experience.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling.experience; +package com.eternalcode.discordapp.feature.leveling.experience; public class Experience { diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceChangeEvent.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceChangeEvent.java similarity index 66% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceChangeEvent.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceChangeEvent.java index 5ccfa9b1..df37fa7e 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceChangeEvent.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceChangeEvent.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling.experience; +package com.eternalcode.discordapp.feature.leveling.experience; import java.util.function.LongSupplier; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceConfig.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceConfig.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceConfig.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceConfig.java index e837946a..f368d259 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceConfig.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceConfig.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling.experience; +package com.eternalcode.discordapp.feature.leveling.experience; import com.eternalcode.discordapp.config.CdnConfig; import net.dzikoysk.cdn.entity.Contextual; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceRepository.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceRepository.java similarity index 87% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceRepository.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceRepository.java index 817bd88e..11b1e28d 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceRepository.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceRepository.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling.experience; +package com.eternalcode.discordapp.feature.leveling.experience; import java.util.List; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceRepositoryImpl.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceRepositoryImpl.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceRepositoryImpl.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceRepositoryImpl.java index b3c0f72b..e09ff7a9 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceRepositoryImpl.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceRepositoryImpl.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling.experience; +package com.eternalcode.discordapp.feature.leveling.experience; import com.eternalcode.discordapp.database.DataAccessException; import com.eternalcode.discordapp.database.DatabaseManager; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceService.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceService.java similarity index 94% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceService.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceService.java index 149ed7ff..3d7739b3 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling.experience; +package com.eternalcode.discordapp.feature.leveling.experience; import com.eternalcode.discordapp.database.DatabaseManager; import com.eternalcode.discordapp.observer.ObserverRegistry; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceWrapper.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceWrapper.java similarity index 91% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceWrapper.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceWrapper.java index cf512f1b..f56760aa 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/ExperienceWrapper.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/ExperienceWrapper.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.leveling.experience; +package com.eternalcode.discordapp.feature.leveling.experience; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/listener/ExperienceMessageListener.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/listener/ExperienceMessageListener.java similarity index 87% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/listener/ExperienceMessageListener.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/listener/ExperienceMessageListener.java index 6d7cb8f4..0acb5ded 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/listener/ExperienceMessageListener.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/listener/ExperienceMessageListener.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.leveling.experience.listener; +package com.eternalcode.discordapp.feature.leveling.experience.listener; -import com.eternalcode.discordapp.leveling.experience.ExperienceConfig; -import com.eternalcode.discordapp.leveling.experience.ExperienceService; +import com.eternalcode.discordapp.feature.leveling.experience.ExperienceConfig; +import com.eternalcode.discordapp.feature.leveling.experience.ExperienceService; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/experience/listener/ExperienceReactionListener.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/listener/ExperienceReactionListener.java similarity index 89% rename from src/main/java/com/eternalcode/discordapp/leveling/experience/listener/ExperienceReactionListener.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/experience/listener/ExperienceReactionListener.java index 3809d18c..6ca5208a 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/experience/listener/ExperienceReactionListener.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/experience/listener/ExperienceReactionListener.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.leveling.experience.listener; +package com.eternalcode.discordapp.feature.leveling.experience.listener; -import com.eternalcode.discordapp.leveling.experience.ExperienceConfig; -import com.eternalcode.discordapp.leveling.experience.ExperienceService; +import com.eternalcode.discordapp.feature.leveling.experience.ExperienceConfig; +import com.eternalcode.discordapp.feature.leveling.experience.ExperienceService; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent; import net.dv8tion.jda.api.events.message.react.MessageReactionRemoveEvent; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardButtonController.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardButtonController.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardButtonController.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardButtonController.java index d5589d91..d3d42b4e 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardButtonController.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardButtonController.java @@ -1,6 +1,6 @@ -package com.eternalcode.discordapp.leveling.leaderboard; +package com.eternalcode.discordapp.feature.leveling.leaderboard; -import com.eternalcode.discordapp.leveling.Level; +import com.eternalcode.discordapp.feature.leveling.Level; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.components.buttons.Button; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardCommand.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardCommand.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardCommand.java index 49c70f0e..d6f29dcb 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardCommand.java @@ -1,6 +1,6 @@ -package com.eternalcode.discordapp.leveling.leaderboard; +package com.eternalcode.discordapp.feature.leveling.leaderboard; -import com.eternalcode.discordapp.leveling.Level; +import com.eternalcode.discordapp.feature.leveling.Level; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import net.dv8tion.jda.api.EmbedBuilder; diff --git a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardService.java b/src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardService.java similarity index 86% rename from src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardService.java rename to src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardService.java index 0459f631..cf5d3101 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/leveling/leaderboard/LeaderboardService.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.leveling.leaderboard; +package com.eternalcode.discordapp.feature.leveling.leaderboard; -import com.eternalcode.discordapp.leveling.Level; -import com.eternalcode.discordapp.leveling.LevelService; +import com.eternalcode.discordapp.feature.leveling.Level; +import com.eternalcode.discordapp.feature.leveling.LevelService; import net.dv8tion.jda.api.EmbedBuilder; import java.awt.Color; diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingButtonController.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingButtonController.java similarity index 93% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingButtonController.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingButtonController.java index 6e2b7943..a08a5a75 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingButtonController.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingButtonController.java @@ -1,6 +1,6 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; -import com.eternalcode.discordapp.meeting.MeetingService.MeetingButtonUpdater; +import com.eternalcode.discordapp.feature.meeting.MeetingService.MeetingButtonUpdater; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.utils.messages.MessageEditData; diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingCleanupTask.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingCleanupTask.java similarity index 89% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingCleanupTask.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingCleanupTask.java index 78edd880..de8c4ef9 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingCleanupTask.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingCleanupTask.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; import java.time.Instant; import net.dv8tion.jda.api.JDA; diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingCommand.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingCommand.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingCommand.java index 1d4ef80b..b0ea899a 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingCommand.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingPollRepository.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingPollRepository.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingPollRepository.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingPollRepository.java index 37d5027d..ee36b980 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingPollRepository.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingPollRepository.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; import com.eternalcode.discordapp.database.DatabaseManager; import com.eternalcode.discordapp.database.repository.AbstractRepository; diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingPollWrapper.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingPollWrapper.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingPollWrapper.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingPollWrapper.java index 173a07ed..9cd8755e 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingPollWrapper.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingPollWrapper.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingService.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingService.java similarity index 99% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingService.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingService.java index e53f49b7..76764b69 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; import com.eternalcode.discordapp.config.AppConfig; import net.dv8tion.jda.api.EmbedBuilder; diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingStatus.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingStatus.java similarity index 52% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingStatus.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingStatus.java index 1ff3d5a9..3b400ec0 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingStatus.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingStatus.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; public enum MeetingStatus { YES, diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingVoteRepository.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingVoteRepository.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingVoteRepository.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingVoteRepository.java index 534bcc02..b660cc07 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingVoteRepository.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingVoteRepository.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; import com.eternalcode.discordapp.database.DatabaseManager; import com.eternalcode.discordapp.database.repository.AbstractRepository; diff --git a/src/main/java/com/eternalcode/discordapp/meeting/MeetingVoteWrapper.java b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingVoteWrapper.java similarity index 95% rename from src/main/java/com/eternalcode/discordapp/meeting/MeetingVoteWrapper.java rename to src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingVoteWrapper.java index 343cc259..45c299a2 100644 --- a/src/main/java/com/eternalcode/discordapp/meeting/MeetingVoteWrapper.java +++ b/src/main/java/com/eternalcode/discordapp/feature/meeting/MeetingVoteWrapper.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.meeting; +package com.eternalcode.discordapp.feature.meeting; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubPullRequest.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubPullRequest.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/review/GitHubPullRequest.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubPullRequest.java index 7715539b..5ee7a761 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubPullRequest.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubPullRequest.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; import java.util.Objects; import java.util.regex.Matcher; diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubRateLimitInterceptor.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubRateLimitInterceptor.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/review/GitHubRateLimitInterceptor.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubRateLimitInterceptor.java index a4b90998..eecda486 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubRateLimitInterceptor.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubRateLimitInterceptor.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; import java.io.IOException; import java.time.Duration; diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubRetryInterceptor.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubRetryInterceptor.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/review/GitHubRetryInterceptor.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubRetryInterceptor.java index 0150b7bf..89a2f5d0 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubRetryInterceptor.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubRetryInterceptor.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; import java.io.IOException; import okhttp3.Interceptor; diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewMention.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewMention.java similarity index 83% rename from src/main/java/com/eternalcode/discordapp/review/GitHubReviewMention.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewMention.java index ca719088..24b348c2 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewMention.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewMention.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; public record GitHubReviewMention( String pullRequest, diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewNotificationType.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewNotificationType.java similarity index 88% rename from src/main/java/com/eternalcode/discordapp/review/GitHubReviewNotificationType.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewNotificationType.java index c3449439..effeeec9 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewNotificationType.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewNotificationType.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; public enum GitHubReviewNotificationType { diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewReminderService.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewReminderService.java similarity index 98% rename from src/main/java/com/eternalcode/discordapp/review/GitHubReviewReminderService.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewReminderService.java index 3a03f24e..ee669d8d 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewReminderService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewReminderService.java @@ -1,8 +1,8 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; import com.eternalcode.commons.concurrent.FutureHandler; import com.eternalcode.discordapp.config.AppConfig; -import com.eternalcode.discordapp.review.database.GitHubReviewMentionRepository; +import com.eternalcode.discordapp.feature.review.database.GitHubReviewMentionRepository; import com.eternalcode.discordapp.scheduler.Scheduler; import io.sentry.Sentry; import java.io.IOException; diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewService.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewService.java similarity index 99% rename from src/main/java/com/eternalcode/discordapp/review/GitHubReviewService.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewService.java index 002dd57b..6c2a0ac4 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewService.java @@ -1,9 +1,9 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; import com.eternalcode.commons.concurrent.FutureHandler; import com.eternalcode.discordapp.config.AppConfig; import com.eternalcode.discordapp.config.ConfigManager; -import com.eternalcode.discordapp.review.database.GitHubReviewMentionRepository; +import com.eternalcode.discordapp.feature.review.database.GitHubReviewMentionRepository; import io.sentry.Sentry; import java.io.IOException; import java.time.Duration; diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewStatus.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewStatus.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/review/GitHubReviewStatus.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewStatus.java index 8d73e388..916bf0ee 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewStatus.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewStatus.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; public enum GitHubReviewStatus { diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewTask.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewTask.java similarity index 98% rename from src/main/java/com/eternalcode/discordapp/review/GitHubReviewTask.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewTask.java index b3d34b9f..6755962d 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewTask.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewTask.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; import com.eternalcode.commons.concurrent.FutureHandler; import com.eternalcode.discordapp.scheduler.Scheduler; diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewUser.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewUser.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/review/GitHubReviewUser.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewUser.java index 31fa7350..28642ac3 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewUser.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewUser.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; import net.dzikoysk.cdn.entity.Contextual; import net.dzikoysk.cdn.entity.Exclude; diff --git a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewUtil.java b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewUtil.java similarity index 99% rename from src/main/java/com/eternalcode/discordapp/review/GitHubReviewUtil.java rename to src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewUtil.java index 4efe41b0..b325bb25 100644 --- a/src/main/java/com/eternalcode/discordapp/review/GitHubReviewUtil.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/GitHubReviewUtil.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review; +package com.eternalcode.discordapp.feature.review; import com.google.gson.Gson; import com.google.gson.JsonArray; diff --git a/src/main/java/com/eternalcode/discordapp/review/command/GitHubReviewCommand.java b/src/main/java/com/eternalcode/discordapp/feature/review/command/GitHubReviewCommand.java similarity index 63% rename from src/main/java/com/eternalcode/discordapp/review/command/GitHubReviewCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/review/command/GitHubReviewCommand.java index 2a8e5ffe..d395718d 100644 --- a/src/main/java/com/eternalcode/discordapp/review/command/GitHubReviewCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/command/GitHubReviewCommand.java @@ -1,13 +1,13 @@ -package com.eternalcode.discordapp.review.command; +package com.eternalcode.discordapp.feature.review.command; import com.eternalcode.discordapp.config.AppConfig; -import com.eternalcode.discordapp.review.GitHubReviewService; -import com.eternalcode.discordapp.review.command.child.AddChild; -import com.eternalcode.discordapp.review.command.child.ForumTagsIdChild; -import com.eternalcode.discordapp.review.command.child.ListChild; -import com.eternalcode.discordapp.review.command.child.NotificationChild; -import com.eternalcode.discordapp.review.command.child.RemoveChild; -import com.eternalcode.discordapp.review.command.child.RequestChild; +import com.eternalcode.discordapp.feature.review.GitHubReviewService; +import com.eternalcode.discordapp.feature.review.command.child.AddChild; +import com.eternalcode.discordapp.feature.review.command.child.ForumTagsIdChild; +import com.eternalcode.discordapp.feature.review.command.child.ListChild; +import com.eternalcode.discordapp.feature.review.command.child.NotificationChild; +import com.eternalcode.discordapp.feature.review.command.child.RemoveChild; +import com.eternalcode.discordapp.feature.review.command.child.RequestChild; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import net.dv8tion.jda.api.Permission; diff --git a/src/main/java/com/eternalcode/discordapp/review/command/child/AddChild.java b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/AddChild.java similarity index 87% rename from src/main/java/com/eternalcode/discordapp/review/command/child/AddChild.java rename to src/main/java/com/eternalcode/discordapp/feature/review/command/child/AddChild.java index ae010681..8fdd88c3 100644 --- a/src/main/java/com/eternalcode/discordapp/review/command/child/AddChild.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/AddChild.java @@ -1,8 +1,8 @@ -package com.eternalcode.discordapp.review.command.child; +package com.eternalcode.discordapp.feature.review.command.child; -import com.eternalcode.discordapp.review.GitHubReviewNotificationType; -import com.eternalcode.discordapp.review.GitHubReviewService; -import com.eternalcode.discordapp.review.GitHubReviewUser; +import com.eternalcode.discordapp.feature.review.GitHubReviewNotificationType; +import com.eternalcode.discordapp.feature.review.GitHubReviewService; +import com.eternalcode.discordapp.feature.review.GitHubReviewUser; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import io.sentry.Sentry; diff --git a/src/main/java/com/eternalcode/discordapp/review/command/child/ForumTagsIdChild.java b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/ForumTagsIdChild.java similarity index 93% rename from src/main/java/com/eternalcode/discordapp/review/command/child/ForumTagsIdChild.java rename to src/main/java/com/eternalcode/discordapp/feature/review/command/child/ForumTagsIdChild.java index 89eda71c..222fd180 100644 --- a/src/main/java/com/eternalcode/discordapp/review/command/child/ForumTagsIdChild.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/ForumTagsIdChild.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.review.command.child; +package com.eternalcode.discordapp.feature.review.command.child; import com.eternalcode.discordapp.config.AppConfig; import com.jagrosh.jdautilities.command.SlashCommand; diff --git a/src/main/java/com/eternalcode/discordapp/review/command/child/ListChild.java b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/ListChild.java similarity index 87% rename from src/main/java/com/eternalcode/discordapp/review/command/child/ListChild.java rename to src/main/java/com/eternalcode/discordapp/feature/review/command/child/ListChild.java index 02d0fef0..fe31b05c 100644 --- a/src/main/java/com/eternalcode/discordapp/review/command/child/ListChild.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/ListChild.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.review.command.child; +package com.eternalcode.discordapp.feature.review.command.child; -import com.eternalcode.discordapp.review.GitHubReviewService; -import com.eternalcode.discordapp.review.GitHubReviewUser; +import com.eternalcode.discordapp.feature.review.GitHubReviewService; +import com.eternalcode.discordapp.feature.review.GitHubReviewUser; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import io.sentry.Sentry; diff --git a/src/main/java/com/eternalcode/discordapp/review/command/child/NotificationChild.java b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/NotificationChild.java similarity index 87% rename from src/main/java/com/eternalcode/discordapp/review/command/child/NotificationChild.java rename to src/main/java/com/eternalcode/discordapp/feature/review/command/child/NotificationChild.java index cc5297c3..5a4c075a 100644 --- a/src/main/java/com/eternalcode/discordapp/review/command/child/NotificationChild.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/NotificationChild.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.review.command.child; +package com.eternalcode.discordapp.feature.review.command.child; -import com.eternalcode.discordapp.review.GitHubReviewNotificationType; -import com.eternalcode.discordapp.review.GitHubReviewService; +import com.eternalcode.discordapp.feature.review.GitHubReviewNotificationType; +import com.eternalcode.discordapp.feature.review.GitHubReviewService; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import net.dv8tion.jda.api.interactions.commands.OptionType; diff --git a/src/main/java/com/eternalcode/discordapp/review/command/child/RemoveChild.java b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/RemoveChild.java similarity index 92% rename from src/main/java/com/eternalcode/discordapp/review/command/child/RemoveChild.java rename to src/main/java/com/eternalcode/discordapp/feature/review/command/child/RemoveChild.java index eebaff6f..7843c41b 100644 --- a/src/main/java/com/eternalcode/discordapp/review/command/child/RemoveChild.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/RemoveChild.java @@ -1,6 +1,6 @@ -package com.eternalcode.discordapp.review.command.child; +package com.eternalcode.discordapp.feature.review.command.child; -import com.eternalcode.discordapp.review.GitHubReviewService; +import com.eternalcode.discordapp.feature.review.GitHubReviewService; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import io.sentry.Sentry; diff --git a/src/main/java/com/eternalcode/discordapp/review/command/child/RequestChild.java b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/RequestChild.java similarity index 90% rename from src/main/java/com/eternalcode/discordapp/review/command/child/RequestChild.java rename to src/main/java/com/eternalcode/discordapp/feature/review/command/child/RequestChild.java index 4929a5a7..8435a5b8 100644 --- a/src/main/java/com/eternalcode/discordapp/review/command/child/RequestChild.java +++ b/src/main/java/com/eternalcode/discordapp/feature/review/command/child/RequestChild.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.review.command.child; +package com.eternalcode.discordapp.feature.review.command.child; import com.eternalcode.commons.concurrent.FutureHandler; -import com.eternalcode.discordapp.review.GitHubReviewService; +import com.eternalcode.discordapp.feature.review.GitHubReviewService; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import java.util.List; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TicketChannelService.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketChannelService.java similarity index 92% rename from src/main/java/com/eternalcode/discordapp/ticket/TicketChannelService.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/TicketChannelService.java index a8df6e36..acabc6cb 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/TicketChannelService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketChannelService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.ticket; +package com.eternalcode.discordapp.feature.ticket; import com.eternalcode.discordapp.util.UrlValidator; import net.dv8tion.jda.api.EmbedBuilder; @@ -191,21 +191,35 @@ private TextChannel createChannel(long userId, TicketConfig.TicketCategoryConfig String channelName = count == 0 ? "ticket-" + userName : "ticket-" + userName + "-" + (count + 1); Member member = guild.getMemberById(userId); + if (member == null) { + throw new IllegalStateException("Cannot create ticket channel, member not found in guild: " + userId); + } + Role staffRole = this.config.staffRoleId != 0L ? guild.getRoleById(this.config.staffRoleId) : null; - return cat.createTextChannel(channelName) + var channelAction = cat.createTextChannel(channelName) .setTopic("Ticket " + category.displayName) .addPermissionOverride(guild.getPublicRole(), null, List.of(Permission.VIEW_CHANNEL)) .addPermissionOverride(member, List.of(Permission.VIEW_CHANNEL, Permission.MESSAGE_SEND, Permission.MESSAGE_HISTORY), - null) - .addPermissionOverride(staffRole, + null); + + if (staffRole != null) { + channelAction = channelAction.addPermissionOverride(staffRole, List.of( Permission.VIEW_CHANNEL, Permission.MESSAGE_SEND, Permission.MESSAGE_HISTORY, Permission.MESSAGE_MANAGE), - null) - .complete(); + null); + } + else if (this.config.staffRoleId != 0L) { + LOGGER.warn( + "Staff role not found with ID: {}. Creating ticket without staff role override.", + this.config.staffRoleId + ); + } + + return channelAction.complete(); } } diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TicketConfig.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketConfig.java similarity index 99% rename from src/main/java/com/eternalcode/discordapp/ticket/TicketConfig.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/TicketConfig.java index bfffadaa..ae26c251 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/TicketConfig.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketConfig.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.ticket; +package com.eternalcode.discordapp.feature.ticket; import com.eternalcode.discordapp.config.CdnConfig; import java.io.File; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TicketConfigurer.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketConfigurer.java similarity index 80% rename from src/main/java/com/eternalcode/discordapp/ticket/TicketConfigurer.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/TicketConfigurer.java index 66e42202..d650bbaf 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/TicketConfigurer.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketConfigurer.java @@ -1,15 +1,16 @@ -package com.eternalcode.discordapp.ticket; +package com.eternalcode.discordapp.feature.ticket; import com.eternalcode.discordapp.config.AppConfig; import com.eternalcode.discordapp.config.ConfigManager; import com.eternalcode.discordapp.database.DatabaseManager; import com.eternalcode.discordapp.scheduler.Scheduler; -import com.eternalcode.discordapp.ticket.command.TicketCommand; -import com.eternalcode.discordapp.ticket.panel.TicketPanelController; -import com.eternalcode.discordapp.ticket.panel.TicketPanelService; +import com.eternalcode.discordapp.feature.ticket.command.TicketCommand; +import com.eternalcode.discordapp.feature.ticket.panel.TicketPanelController; +import com.eternalcode.discordapp.feature.ticket.panel.TicketPanelService; import com.jagrosh.jdautilities.command.CommandClientBuilder; import java.time.Duration; import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; @@ -80,7 +81,7 @@ public void initialize() { this.commandClientBuilder.addSlashCommands(ticketCommand); - // Manually register ticket command via JDA API as CommandClientBuilder may not register commands added after builder creation + // Manually register ticket command as a safe fallback in case CommandClientBuilder misses late additions. SlashCommandData ticketCommandData = Commands.slash("ticket", "Ticket management solution") .addSubcommands( new SubcommandData("panel", "Displays the ticket panel."), @@ -89,12 +90,17 @@ public void initialize() { new SubcommandData("list", "Lists all active tickets.") ); - this.jda.getGuildById(this.appConfig.guildId).updateCommands() - .addCommands(ticketCommandData) - .queue( - success -> LOGGER.info("Ticket command manually registered via JDA API successfully"), - failure -> LOGGER.error("Failed to manually register ticket command via JDA API", failure) + Guild guild = this.jda.getGuildById(this.appConfig.guildId); + if (guild == null) { + LOGGER.warn("Skipping manual ticket command registration, guild not found: {}", this.appConfig.guildId); + } + else { + // upsertCommand updates/creates a single command without replacing all guild commands. + guild.upsertCommand(ticketCommandData).queue( + success -> LOGGER.info("Ticket command upserted via JDA API successfully"), + failure -> LOGGER.error("Failed to upsert ticket command via JDA API", failure) ); + } // Schedules a task that periodically cleans up inactive tickets. // If an administrator deletes a ticket channel manually instead of clicking "Close ticket", diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TicketRepository.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketRepository.java similarity index 86% rename from src/main/java/com/eternalcode/discordapp/ticket/TicketRepository.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/TicketRepository.java index f3ba0e1c..f7e953b2 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/TicketRepository.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketRepository.java @@ -1,9 +1,9 @@ -package com.eternalcode.discordapp.ticket; +package com.eternalcode.discordapp.feature.ticket; -import static com.eternalcode.discordapp.ticket.TicketWrapper.COLUMN_CATEGORY; -import static com.eternalcode.discordapp.ticket.TicketWrapper.COLUMN_CHANNEL_ID; -import static com.eternalcode.discordapp.ticket.TicketWrapper.COLUMN_CREATED_AT; -import static com.eternalcode.discordapp.ticket.TicketWrapper.COLUMN_USER_ID; +import static com.eternalcode.discordapp.feature.ticket.TicketWrapper.COLUMN_CATEGORY; +import static com.eternalcode.discordapp.feature.ticket.TicketWrapper.COLUMN_CHANNEL_ID; +import static com.eternalcode.discordapp.feature.ticket.TicketWrapper.COLUMN_CREATED_AT; +import static com.eternalcode.discordapp.feature.ticket.TicketWrapper.COLUMN_USER_ID; import com.eternalcode.discordapp.database.DataAccessException; import com.eternalcode.discordapp.database.DatabaseManager; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TicketService.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketService.java similarity index 98% rename from src/main/java/com/eternalcode/discordapp/ticket/TicketService.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/TicketService.java index d48a0b9b..a74b3b8c 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/TicketService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.ticket; +package com.eternalcode.discordapp.feature.ticket; import java.time.Instant; import java.util.List; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TicketWrapper.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketWrapper.java similarity index 96% rename from src/main/java/com/eternalcode/discordapp/ticket/TicketWrapper.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/TicketWrapper.java index cc61fccb..e7c10df1 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/TicketWrapper.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/TicketWrapper.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.ticket; +package com.eternalcode.discordapp.feature.ticket; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TranscriptGeneratorService.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/TranscriptGeneratorService.java similarity index 98% rename from src/main/java/com/eternalcode/discordapp/ticket/TranscriptGeneratorService.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/TranscriptGeneratorService.java index 95c00bcf..21ee022e 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/TranscriptGeneratorService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/TranscriptGeneratorService.java @@ -1,4 +1,4 @@ -package com.eternalcode.discordapp.ticket; +package com.eternalcode.discordapp.feature.ticket; import dev.skywolfxp.transcript.Transcript; import java.io.File; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/command/CloseCommand.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/CloseCommand.java similarity index 92% rename from src/main/java/com/eternalcode/discordapp/ticket/command/CloseCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/command/CloseCommand.java index a6407ed1..025acef6 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/command/CloseCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/CloseCommand.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.ticket.command; +package com.eternalcode.discordapp.feature.ticket.command; import com.eternalcode.commons.concurrent.FutureHandler; -import com.eternalcode.discordapp.ticket.TicketChannelService; +import com.eternalcode.discordapp.feature.ticket.TicketChannelService; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import net.dv8tion.jda.api.Permission; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/command/InfoCommand.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/InfoCommand.java similarity index 91% rename from src/main/java/com/eternalcode/discordapp/ticket/command/InfoCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/command/InfoCommand.java index 1bd44f2a..907afd89 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/command/InfoCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/InfoCommand.java @@ -1,8 +1,8 @@ -package com.eternalcode.discordapp.ticket.command; +package com.eternalcode.discordapp.feature.ticket.command; import com.eternalcode.commons.concurrent.FutureHandler; -import com.eternalcode.discordapp.ticket.TicketService; -import com.eternalcode.discordapp.ticket.TicketWrapper; +import com.eternalcode.discordapp.feature.ticket.TicketService; +import com.eternalcode.discordapp.feature.ticket.TicketWrapper; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import net.dv8tion.jda.api.Permission; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/command/ListCommand.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/ListCommand.java similarity index 92% rename from src/main/java/com/eternalcode/discordapp/ticket/command/ListCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/command/ListCommand.java index d646a628..cafe391a 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/command/ListCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/ListCommand.java @@ -1,8 +1,8 @@ -package com.eternalcode.discordapp.ticket.command; +package com.eternalcode.discordapp.feature.ticket.command; import com.eternalcode.commons.concurrent.FutureHandler; -import com.eternalcode.discordapp.ticket.TicketService; -import com.eternalcode.discordapp.ticket.TicketWrapper; +import com.eternalcode.discordapp.feature.ticket.TicketService; +import com.eternalcode.discordapp.feature.ticket.TicketWrapper; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import java.util.List; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/command/PanelCommand.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/PanelCommand.java similarity index 92% rename from src/main/java/com/eternalcode/discordapp/ticket/command/PanelCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/command/PanelCommand.java index 8a8cdbc6..2d5410d4 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/command/PanelCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/PanelCommand.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.ticket.command; +package com.eternalcode.discordapp.feature.ticket.command; import com.eternalcode.commons.concurrent.FutureHandler; -import com.eternalcode.discordapp.ticket.panel.TicketPanelService; +import com.eternalcode.discordapp.feature.ticket.panel.TicketPanelService; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import net.dv8tion.jda.api.Permission; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/command/TicketCommand.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/TicketCommand.java similarity index 76% rename from src/main/java/com/eternalcode/discordapp/ticket/command/TicketCommand.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/command/TicketCommand.java index 9750a2b5..7bb4ed10 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/command/TicketCommand.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/command/TicketCommand.java @@ -1,8 +1,8 @@ -package com.eternalcode.discordapp.ticket.command; +package com.eternalcode.discordapp.feature.ticket.command; -import com.eternalcode.discordapp.ticket.TicketChannelService; -import com.eternalcode.discordapp.ticket.TicketService; -import com.eternalcode.discordapp.ticket.panel.TicketPanelService; +import com.eternalcode.discordapp.feature.ticket.TicketChannelService; +import com.eternalcode.discordapp.feature.ticket.TicketService; +import com.eternalcode.discordapp.feature.ticket.panel.TicketPanelService; import com.jagrosh.jdautilities.command.SlashCommand; import com.jagrosh.jdautilities.command.SlashCommandEvent; import net.dv8tion.jda.api.Permission; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/panel/TicketPanelController.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/panel/TicketPanelController.java similarity index 97% rename from src/main/java/com/eternalcode/discordapp/ticket/panel/TicketPanelController.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/panel/TicketPanelController.java index 42730c3b..3350fb2e 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/panel/TicketPanelController.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/panel/TicketPanelController.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.ticket.panel; +package com.eternalcode.discordapp.feature.ticket.panel; -import com.eternalcode.discordapp.ticket.TicketConfig; -import com.eternalcode.discordapp.ticket.TicketService; +import com.eternalcode.discordapp.feature.ticket.TicketConfig; +import com.eternalcode.discordapp.feature.ticket.TicketService; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.components.buttons.Button; diff --git a/src/main/java/com/eternalcode/discordapp/ticket/panel/TicketPanelService.java b/src/main/java/com/eternalcode/discordapp/feature/ticket/panel/TicketPanelService.java similarity index 86% rename from src/main/java/com/eternalcode/discordapp/ticket/panel/TicketPanelService.java rename to src/main/java/com/eternalcode/discordapp/feature/ticket/panel/TicketPanelService.java index 82c66a1c..f080e113 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/panel/TicketPanelService.java +++ b/src/main/java/com/eternalcode/discordapp/feature/ticket/panel/TicketPanelService.java @@ -1,7 +1,7 @@ -package com.eternalcode.discordapp.ticket.panel; +package com.eternalcode.discordapp.feature.ticket.panel; -import com.eternalcode.discordapp.ticket.TicketChannelService; -import com.eternalcode.discordapp.ticket.TicketConfig; +import com.eternalcode.discordapp.feature.ticket.TicketChannelService; +import com.eternalcode.discordapp.feature.ticket.TicketConfig; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.components.buttons.Button; @@ -12,6 +12,7 @@ import java.awt.Color; import java.time.Instant; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -40,8 +41,13 @@ public CompletableFuture createTicketPanel() { .map(cat -> Button.secondary(cat.getButtonId(), cat.emoji + " " + cat.displayName)) .collect(Collectors.toList()); + List rows = new ArrayList<>(); for (int i = 0; i < buttons.size(); i += MAX_BUTTONS_PER_ROW) { - builder.setComponents(ActionRow.of(buttons.subList(i, Math.min(i + MAX_BUTTONS_PER_ROW, buttons.size())))); + rows.add(ActionRow.of(buttons.subList(i, Math.min(i + MAX_BUTTONS_PER_ROW, buttons.size())))); + } + + if (!rows.isEmpty()) { + builder.setComponents(rows); } return builder.build(); diff --git a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepository.java b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepository.java deleted file mode 100644 index 10fdf2e2..00000000 --- a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.eternalcode.discordapp.review.database; - -import com.eternalcode.discordapp.review.GitHubPullRequest; -import com.eternalcode.discordapp.review.GitHubReviewStatus; -import com.eternalcode.discordapp.review.GitHubReviewMention; - -import java.util.List; -import java.util.concurrent.CompletableFuture; - -public interface GitHubReviewMentionRepository { - - CompletableFuture markReviewerAsMentioned(GitHubPullRequest pullRequest, long userId, long threadId); - - CompletableFuture isMentioned(GitHubPullRequest pullRequest, long userId); - - CompletableFuture recordReminderSent(GitHubPullRequest pullRequest, long userId); - - CompletableFuture> getReviewersNeedingReminders(java.time.Duration reminderInterval); - - CompletableFuture find(String pullRequest, long userId); - - record ReviewerReminder(long userId, String pullRequestUrl, long threadId) { - } -} diff --git a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepositoryImpl.java b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepositoryImpl.java deleted file mode 100644 index 27a56a1b..00000000 --- a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepositoryImpl.java +++ /dev/null @@ -1,298 +0,0 @@ -package com.eternalcode.discordapp.review.database; - -import com.eternalcode.commons.concurrent.FutureHandler; -import com.eternalcode.discordapp.database.DataAccessException; -import com.eternalcode.discordapp.database.DatabaseManager; -import com.eternalcode.discordapp.database.repository.AbstractRepository; -import com.eternalcode.discordapp.review.GitHubPullRequest; -import com.eternalcode.discordapp.review.GitHubReviewMention; -import com.eternalcode.discordapp.review.GitHubReviewStatus; -import com.eternalcode.discordapp.scheduler.Scheduler; -import com.j256.ormlite.stmt.DeleteBuilder; -import com.j256.ormlite.table.TableUtils; -import io.sentry.Sentry; -import java.sql.SQLException; -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class GitHubReviewMentionRepositoryImpl extends AbstractRepository - implements GitHubReviewMentionRepository { - - private static final Logger LOGGER = Logger.getLogger(GitHubReviewMentionRepositoryImpl.class.getName()); - private static final Duration MENTION_INTERVAL = Duration.ofHours(12); - private static final Duration CLEANUP_INTERVAL = Duration.ofDays(7); - - private final Scheduler scheduler; - - public GitHubReviewMentionRepositoryImpl(DatabaseManager databaseManager, Scheduler scheduler) { - super(databaseManager, GitHubReviewMentionWrapper.class); - this.scheduler = scheduler; - - this.scheduler.scheduleRepeating( - this::performCleanup, - Duration.ofHours(1), - Duration.ofHours(24) - ); - } - - public static GitHubReviewMentionRepository create(DatabaseManager databaseManager, Scheduler scheduler) { - try { - TableUtils.createTableIfNotExists(databaseManager.getConnectionSource(), GitHubReviewMentionWrapper.class); - LOGGER.info("GitHubReviewMentionRepository initialized successfully"); - } - catch (SQLException sqlException) { - Sentry.captureException(sqlException); - throw new DataAccessException("Failed to create github_review_mentions table", sqlException); - } - - return new GitHubReviewMentionRepositoryImpl(databaseManager, scheduler); - } - - @Override - public CompletableFuture markReviewerAsMentioned(GitHubPullRequest pullRequest, long userId, long threadId) { - if (pullRequest == null) { - return CompletableFuture.failedFuture(new IllegalArgumentException("PullRequest cannot be null")); - } - - return CompletableFuture.runAsync(() -> this.scheduler.schedule(() -> { - try { - String pullRequestKey = this.createPullRequestKey(pullRequest); - - GitHubReviewMentionWrapper existingMention = this.select(pullRequestKey).join().orElse(null); - - GitHubReviewMentionWrapper mention; - if (existingMention != null) { - mention = new GitHubReviewMentionWrapper( - pullRequestKey, - userId, - Instant.now().toEpochMilli(), - GitHubReviewStatus.PENDING.name(), - threadId, - 0 - ); - } - else { - mention = new GitHubReviewMentionWrapper( - pullRequestKey, - userId, - Instant.now().toEpochMilli(), - GitHubReviewStatus.PENDING.name(), - threadId, - 0 - ); - } - - this.save(mention); - LOGGER.info("Marked reviewer as mentioned: userId=" + userId + ", PR=" + pullRequest.toUrl()); - } - catch (Exception exception) { - Sentry.captureException(exception); - LOGGER.log(Level.SEVERE, "Error marking reviewer as mentioned", exception); - throw new DataAccessException("Failed to mark reviewer as mentioned", exception); - } - })).exceptionally(FutureHandler::handleException); - } - - @Override - public CompletableFuture isMentioned(GitHubPullRequest pullRequest, long userId) { - if (pullRequest == null) { - return CompletableFuture.completedFuture(false); - } - - return CompletableFuture.supplyAsync(() -> { - try { - String pullRequestKey = this.createPullRequestKey(pullRequest); - GitHubReviewMentionWrapper mention = this.select(pullRequestKey).join().orElse(null); - - if (mention == null) { - return false; - } - - Instant lastMention = mention.getLastMention(); - Instant nextMention = lastMention.plus(MENTION_INTERVAL); - boolean isMentioned = nextMention.isAfter(Instant.now()); - - LOGGER.fine("Checked mention status: userId=" + userId + ", PR=" + pullRequest.toUrl() + ", mentioned=" - + isMentioned); - return isMentioned; - } - catch (Exception exception) { - Sentry.captureException(exception); - LOGGER.log(Level.SEVERE, "Error checking if user is mentioned", exception); - return false; - } - }).exceptionally(throwable -> { - LOGGER.log(Level.SEVERE, "Exception in isMentioned", throwable); - return false; - }); - } - - @Override - public CompletableFuture recordReminderSent(GitHubPullRequest pullRequest, long userId) { - if (pullRequest == null) { - return CompletableFuture.failedFuture(new IllegalArgumentException("PullRequest cannot be null")); - } - - return CompletableFuture.runAsync(() -> { - this.scheduler.schedule(() -> { - try { - String pullRequestKey = this.createPullRequestKey(pullRequest); - GitHubReviewMentionWrapper mention = this.select(pullRequestKey).join().orElse(null); - - if (mention != null) { - mention.setLastReminderSent(Instant.now()); - this.save(mention); - LOGGER.info("Recorded reminder sent: userId=" + userId + ", PR=" + pullRequest.toUrl()); - } - else { - LOGGER.warning("Mention not found when recording reminder: userId=" + userId + ", PR=" - + pullRequest.toUrl()); - } - } - catch (Exception exception) { - Sentry.captureException(exception); - LOGGER.log(Level.SEVERE, "Error recording reminder sent", exception); - throw new DataAccessException("Failed to record reminder sent", exception); - } - }); - }).exceptionally(FutureHandler::handleException); - } - - @Override - public CompletableFuture> getReviewersNeedingReminders(Duration reminderInterval) { - return CompletableFuture.supplyAsync(() -> { - List reminders = new ArrayList<>(); - - try { - Instant now = Instant.now(); - Instant cutoffTime = now.minus(reminderInterval); - long cutoffTimeMillis = cutoffTime.toEpochMilli(); - - List filteredMentions = - this.databaseManager.getDao(GitHubReviewMentionWrapper.class) - .queryBuilder() - .where() - .eq("reviewStatus", GitHubReviewStatus.PENDING.name()) - .and() - .raw("(lastReminderSent IS NULL OR lastReminderSent = 0 OR lastReminderSent < " - + cutoffTimeMillis + ")") - .query(); - - for (GitHubReviewMentionWrapper mention : filteredMentions) { - try { - reminders.add(new ReviewerReminder( - mention.getUserId(), - mention.getPullRequest(), - mention.getThreadId() - )); - } - catch (Exception exception) { - LOGGER.log( - Level.WARNING, - "Error creating reminder for mention: " + mention.getPullRequest(), - exception); - } - } - - LOGGER.info("Found " + reminders.size() + " reviewers needing reminders"); - } - catch (SQLException exception) { - Sentry.captureException(exception); - LOGGER.log(Level.SEVERE, "Database error getting reviewers needing reminders", exception); - throw new DataAccessException("Failed to get reviewers needing reminders", exception); - } - - return reminders; - }).exceptionally(throwable -> { - LOGGER.log(Level.SEVERE, "Exception in getReviewersNeedingReminders", throwable); - return new ArrayList<>(); - }); - } - - @Override - public CompletableFuture find(String pullRequest, long userId) { - if (pullRequest == null || pullRequest.trim().isEmpty()) { - return CompletableFuture.completedFuture(null); - } - - return CompletableFuture.supplyAsync(() -> { - try { - List mentions = - this.databaseManager.getDao(GitHubReviewMentionWrapper.class) - .queryBuilder() - .where() - .eq("pullRequest", pullRequest) - .and() - .eq("userId", userId) - .query(); - - if (mentions.isEmpty()) { - return null; - } - - GitHubReviewMentionWrapper wrapper = mentions.getFirst(); - return wrapper.toMention(); - } - catch (SQLException exception) { - Sentry.captureException(exception); - LOGGER.log(Level.SEVERE, "Database error finding review mention", exception); - throw new DataAccessException("Failed to find review mention", exception); - } - }).exceptionally(throwable -> { - LOGGER.log(Level.SEVERE, "Exception in find", throwable); - return null; - }); - } - - private String createPullRequestKey(GitHubPullRequest pullRequest) { - return pullRequest.toUrl(); - } - - public CompletableFuture cleanupOldMentions(Duration maxAge) { - return CompletableFuture.supplyAsync(() -> { - try { - Instant cutoffTime = Instant.now().minus(maxAge); - long cutoffTimeMillis = cutoffTime.toEpochMilli(); - - DeleteBuilder deleteBuilder = - this.databaseManager.getDao(GitHubReviewMentionWrapper.class).deleteBuilder(); - - deleteBuilder.where() - .lt("lastMention", cutoffTimeMillis) - .and() - .in("reviewStatus", GitHubReviewStatus.MERGED.name(), GitHubReviewStatus.CLOSED.name()); - - int deletedCount = deleteBuilder.delete(); - - if (deletedCount > 0) { - LOGGER.info("Cleaned up " + deletedCount + " old mentions"); - } - - return deletedCount; - } - catch (SQLException exception) { - Sentry.captureException(exception); - LOGGER.log(Level.SEVERE, "Error cleaning up old mentions", exception); - throw new DataAccessException("Failed to cleanup old mentions", exception); - } - }).exceptionally(throwable -> { - LOGGER.log(Level.SEVERE, "Exception in cleanupOldMentions", throwable); - return 0; - }); - } - - private void performCleanup() { - try { - this.cleanupOldMentions(CLEANUP_INTERVAL) - .exceptionally(FutureHandler::handleException); - } - catch (Exception exception) { - LOGGER.log(Level.WARNING, "Error during periodic cleanup", exception); - } - } -} diff --git a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionWrapper.java b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionWrapper.java deleted file mode 100644 index aa87e415..00000000 --- a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionWrapper.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.eternalcode.discordapp.review.database; - -import com.eternalcode.discordapp.review.GitHubReviewMention; -import com.eternalcode.discordapp.review.GitHubReviewStatus; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import java.time.Instant; -import java.util.Objects; - -@DatabaseTable(tableName = "github_review_mentions") -public final class GitHubReviewMentionWrapper { - - @DatabaseField(id = true) - private String pullRequest; - - @DatabaseField - private long userId; - - @DatabaseField - private long lastMention; - - @DatabaseField - private String reviewStatus; - - @DatabaseField - private long threadId; - - @DatabaseField - private long lastReminderSent; - - public GitHubReviewMentionWrapper() { - // ORMLite requires a no-arg constructor - } - - public GitHubReviewMentionWrapper( - String pullRequest, - long userId, - long lastMention, - String reviewStatus, - long threadId, - long lastReminderSent) { - this.pullRequest = pullRequest; - this.userId = userId; - this.lastMention = lastMention; - this.reviewStatus = reviewStatus; - this.threadId = threadId; - this.lastReminderSent = lastReminderSent; - } - - public static GitHubReviewMentionWrapper create( - String pullRequest, - long userId, - Instant lastMention, - GitHubReviewStatus reviewStatus, - long threadId) { - return new GitHubReviewMentionWrapper( - pullRequest, - userId, - lastMention.toEpochMilli(), - reviewStatus.name(), - threadId, - 0 - ); - } - - public String getPullRequest() { - return this.pullRequest; - } - - public long getUserId() { - return this.userId; - } - - public Instant getLastMention() { - return Instant.ofEpochMilli(this.lastMention); - } - - public long getThreadId() { - return this.threadId; - } - - public void setLastReminderSent(Instant lastReminderSent) { - this.lastReminderSent = lastReminderSent == null ? 0 : lastReminderSent.toEpochMilli(); - } - - public GitHubReviewMention toMention() { - return new GitHubReviewMention( - this.pullRequest, - this.userId, - this.lastMention, - this.reviewStatus, - this.threadId, - this.lastReminderSent - ); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof GitHubReviewMentionWrapper that)) { - return false; - } - return this.userId == that.userId && - this.pullRequest != null && - this.pullRequest.equals(that.pullRequest); - } - - @Override - public int hashCode() { - return Objects.hash(this.pullRequest, this.userId); - } - - @Override - public String toString() { - return "GitHubReviewMentionWrapper{" + - "pullRequest='" + pullRequest + '\'' + - ", userId=" + userId + - ", lastMention=" + lastMention + - ", reviewStatus='" + reviewStatus + '\'' + - ", threadId=" + threadId + - ", lastReminderSent=" + lastReminderSent + - '}'; - } -} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 19cd38ae..cb14a25f 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -1,26 +1,67 @@ + + DiscordOfficer + + + + + + + + + + + + + UTF-8 + ${CONSOLE_PATTERN} + + + - - logs/logs-%d{yyyy-MM-dd}.log + ${LOG_DIR}/app.log + true - 90 - 3GB + + ${LOG_DIR}/app.%d{yyyy-MM-dd}.%i.log.gz + 20MB + 30 + 2GB + true - - [%d{dd-MM-yyyy HH:mm:ss}] %boldGreen(%-15.-15logger{0}) %highlight(%-6level) %msg%n + + UTF-8 + ${FILE_PATTERN} - - - [%d{dd-MM-yyyy HH:mm:ss}] %boldGreen(%-15.-15logger{0}) %highlight(%-6level) %msg%n - + + + 2048 + true + - + + 8192 + true - + + + + + + + + + + + + + diff --git a/src/test/java/com/eternalcode/discordapp/review/GitHubReviewUtilTest.java b/src/test/java/com/eternalcode/discordapp/review/GitHubReviewUtilTest.java index d034facd..a67048e8 100644 --- a/src/test/java/com/eternalcode/discordapp/review/GitHubReviewUtilTest.java +++ b/src/test/java/com/eternalcode/discordapp/review/GitHubReviewUtilTest.java @@ -1,5 +1,7 @@ package com.eternalcode.discordapp.review; +import com.eternalcode.discordapp.feature.review.GitHubPullRequest; +import com.eternalcode.discordapp.feature.review.GitHubReviewUtil; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest;