|  | 
| 1 | 1 | package com.github.imdmk.automessage; | 
| 2 | 2 | 
 | 
| 3 |  | -import com.github.imdmk.automessage.command.handler.MissingPermissionHandler; | 
| 4 |  | -import com.github.imdmk.automessage.command.handler.NotificationHandler; | 
| 5 |  | -import com.github.imdmk.automessage.command.handler.UsageHandler; | 
| 6 |  | -import com.github.imdmk.automessage.command.implementation.AutoMessageCreateCommand; | 
| 7 |  | -import com.github.imdmk.automessage.command.implementation.AutoMessageListCommand; | 
| 8 |  | -import com.github.imdmk.automessage.command.implementation.AutoMessageRemoveCommand; | 
| 9 |  | -import com.github.imdmk.automessage.command.implementation.AutoMessageStateCommand; | 
| 10 |  | -import com.github.imdmk.automessage.configuration.ConfigurationFactory; | 
|  | 3 | +import com.eternalcode.multification.notice.Notice; | 
|  | 4 | +import com.github.imdmk.automessage.configuration.ConfigurationManager; | 
| 11 | 5 | import com.github.imdmk.automessage.configuration.implementation.PluginConfiguration; | 
| 12 |  | -import com.github.imdmk.automessage.notification.Notification; | 
| 13 |  | -import com.github.imdmk.automessage.notification.NotificationSender; | 
| 14 |  | -import com.github.imdmk.automessage.notification.NotificationType; | 
| 15 |  | -import com.github.imdmk.automessage.notification.argument.NotificationArgument; | 
| 16 |  | -import com.github.imdmk.automessage.notification.argument.NotificationTypeArgument; | 
| 17 |  | -import com.github.imdmk.automessage.notification.implementation.bossbar.argument.BossBarProgressArgument; | 
| 18 |  | -import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudienceManager; | 
| 19 |  | -import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudienceService; | 
| 20 |  | -import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudienceTask; | 
| 21 |  | -import com.github.imdmk.automessage.notification.task.AutoNotificationTask; | 
|  | 6 | +import com.github.imdmk.automessage.feature.command.builder.configuration.CommandConfiguration; | 
|  | 7 | +import com.github.imdmk.automessage.feature.command.builder.configuration.CommandConfigurator; | 
|  | 8 | +import com.github.imdmk.automessage.feature.command.builder.handler.MissingPermissionHandler; | 
|  | 9 | +import com.github.imdmk.automessage.feature.command.builder.handler.UsageHandler; | 
|  | 10 | +import com.github.imdmk.automessage.feature.command.builder.player.PlayerArgument; | 
|  | 11 | +import com.github.imdmk.automessage.feature.command.builder.player.PlayerContextual; | 
|  | 12 | +import com.github.imdmk.automessage.feature.command.implementation.DelayCommand; | 
|  | 13 | +import com.github.imdmk.automessage.feature.command.implementation.ReloadCommand; | 
|  | 14 | +import com.github.imdmk.automessage.feature.message.MessageConfiguration; | 
|  | 15 | +import com.github.imdmk.automessage.feature.message.MessageResultHandler; | 
|  | 16 | +import com.github.imdmk.automessage.feature.message.MessageService; | 
|  | 17 | +import com.github.imdmk.automessage.feature.message.auto.AutoMessageConfiguration; | 
|  | 18 | +import com.github.imdmk.automessage.feature.message.auto.dispatcher.AutoMessageDispatcher; | 
|  | 19 | +import com.github.imdmk.automessage.feature.update.UpdateController; | 
|  | 20 | +import com.github.imdmk.automessage.feature.update.UpdateService; | 
|  | 21 | +import com.github.imdmk.automessage.scheduler.BukkitTaskScheduler; | 
| 22 | 22 | import com.github.imdmk.automessage.scheduler.TaskScheduler; | 
| 23 |  | -import com.github.imdmk.automessage.scheduler.TaskSchedulerImpl; | 
| 24 |  | -import com.github.imdmk.automessage.update.UpdateListener; | 
| 25 |  | -import com.github.imdmk.automessage.update.UpdateService; | 
| 26 |  | -import com.github.imdmk.automessage.util.DurationUtil; | 
| 27 | 23 | import com.google.common.base.Stopwatch; | 
| 28 | 24 | import dev.rollczi.litecommands.LiteCommands; | 
| 29 |  | -import dev.rollczi.litecommands.bukkit.adventure.platform.LiteBukkitAdventurePlatformFactory; | 
| 30 |  | -import dev.rollczi.litecommands.bukkit.tools.BukkitOnlyPlayerContextual; | 
| 31 |  | -import dev.rollczi.litecommands.bukkit.tools.BukkitPlayerArgument; | 
|  | 25 | +import dev.rollczi.litecommands.bukkit.LiteBukkitFactory; | 
| 32 | 26 | import net.kyori.adventure.platform.bukkit.BukkitAudiences; | 
|  | 27 | +import net.kyori.adventure.text.minimessage.MiniMessage; | 
| 33 | 28 | import org.bstats.bukkit.Metrics; | 
| 34 | 29 | import org.bukkit.Server; | 
| 35 | 30 | import org.bukkit.command.CommandSender; | 
| 36 | 31 | import org.bukkit.entity.Player; | 
| 37 | 32 | import org.bukkit.plugin.Plugin; | 
| 38 |  | -import org.bukkit.plugin.java.JavaPlugin; | 
| 39 | 33 | 
 | 
| 40 |  | -import java.io.File; | 
| 41 |  | -import java.time.Duration; | 
| 42 | 34 | import java.util.concurrent.TimeUnit; | 
| 43 | 35 | import java.util.logging.Logger; | 
| 44 | 36 | import java.util.stream.Stream; | 
| 45 | 37 | 
 | 
| 46 |  | -public class AutoMessage  { | 
|  | 38 | +/** | 
|  | 39 | + * Core plugin initializer responsible for setting up configuration, | 
|  | 40 | + * services, commands, schedulers, and external integrations. | 
|  | 41 | + */ | 
|  | 42 | +class AutoMessage { | 
| 47 | 43 | 
 | 
| 48 | 44 |     private final Server server; | 
|  | 45 | +    private final Logger logger; | 
| 49 | 46 | 
 | 
| 50 |  | -    private final PluginConfiguration pluginConfiguration; | 
|  | 47 | +    private final ConfigurationManager configurationManager; | 
| 51 | 48 | 
 | 
| 52 |  | -    private final BukkitAudiences bukkitAudiences; | 
| 53 |  | -    private final NotificationSender notificationSender; | 
|  | 49 | +    private final MessageService messageService; | 
| 54 | 50 | 
 | 
| 55 |  | -    private LiteCommands<CommandSender> liteCommands; | 
|  | 51 | +    private final TaskScheduler taskScheduler; | 
|  | 52 | + | 
|  | 53 | +    private final LiteCommands<CommandSender> liteCommands; | 
| 56 | 54 | 
 | 
| 57 | 55 |     private final Metrics metrics; | 
| 58 | 56 | 
 | 
| 59 |  | -    public AutoMessage(Plugin plugin) { | 
|  | 57 | +    AutoMessage(Plugin plugin) { | 
| 60 | 58 |         Stopwatch stopwatch = Stopwatch.createStarted(); | 
| 61 | 59 | 
 | 
| 62 |  | -        Logger logger = plugin.getLogger(); | 
| 63 |  | -        File dataFolder = plugin.getDataFolder(); | 
| 64 |  | - | 
| 65 | 60 |         this.server = plugin.getServer(); | 
|  | 61 | +        this.logger = plugin.getLogger(); | 
| 66 | 62 | 
 | 
| 67 | 63 |         /* Configuration */ | 
| 68 |  | -        this.pluginConfiguration = ConfigurationFactory.create(PluginConfiguration.class, new File(dataFolder, "configuration.yml")); | 
|  | 64 | +        this.configurationManager = new ConfigurationManager(this.logger, plugin.getDataFolder()); | 
| 69 | 65 | 
 | 
| 70 |  | -        /* Managers */ | 
| 71 |  | -        BossBarAudienceManager bossBarAudienceManager = new BossBarAudienceManager(); | 
|  | 66 | +        PluginConfiguration pluginConfiguration = this.configurationManager.create(PluginConfiguration.class); | 
|  | 67 | +        MessageConfiguration messageConfiguration = this.configurationManager.create(MessageConfiguration.class); | 
|  | 68 | +        AutoMessageConfiguration autoMessageConfiguration = this.configurationManager.create(AutoMessageConfiguration.class); | 
|  | 69 | +        CommandConfiguration commandConfiguration = this.configurationManager.create(CommandConfiguration.class); | 
| 72 | 70 | 
 | 
| 73 | 71 |         /* Services */ | 
| 74 |  | -        BossBarAudienceService bossBarAudienceService = new BossBarAudienceService(bossBarAudienceManager); | 
| 75 |  | -        UpdateService updateService = new UpdateService(plugin.getDescription()); | 
|  | 72 | +        this.messageService = new MessageService(messageConfiguration, BukkitAudiences.create(plugin), MiniMessage.miniMessage()); | 
|  | 73 | +        UpdateService updateService = new UpdateService(pluginConfiguration, plugin.getDescription()); | 
| 76 | 74 | 
 | 
| 77 |  | -        /* Adventure */ | 
| 78 |  | -        this.bukkitAudiences = BukkitAudiences.create(plugin); | 
| 79 |  | -        this.notificationSender = new NotificationSender(this.bukkitAudiences); | 
|  | 75 | +        /* Scheduler */ | 
|  | 76 | +        this.taskScheduler = new BukkitTaskScheduler(plugin, this.server); | 
| 80 | 77 | 
 | 
| 81 |  | -        /* Tasks */ | 
| 82 |  | -        TaskScheduler taskScheduler = new TaskSchedulerImpl(plugin, this.server); | 
|  | 78 | +        /* Dispatcher */ | 
|  | 79 | +        AutoMessageDispatcher autoMessageDispatcher = new AutoMessageDispatcher(this.configurationManager, autoMessageConfiguration, this.messageService, this.taskScheduler); | 
|  | 80 | +        autoMessageDispatcher.schedule(); | 
| 83 | 81 | 
 | 
| 84 |  | -        taskScheduler.runTimerAsync(new AutoNotificationTask(this.pluginConfiguration, this.notificationSender, bossBarAudienceService), 0L, DurationUtil.toTicks(this.pluginConfiguration.autoMessagesDelay)); | 
| 85 |  | -        taskScheduler.runTimerAsync(new BossBarAudienceTask(bossBarAudienceManager, bossBarAudienceService), 0L, DurationUtil.toTicks(Duration.ofSeconds(1))); | 
| 86 |  | - | 
| 87 |  | -        /* Listeners */ | 
|  | 82 | +        /* Controllers */ | 
| 88 | 83 |         Stream.of( | 
| 89 |  | -                new UpdateListener(logger, this.pluginConfiguration, this.notificationSender, updateService, taskScheduler) | 
|  | 84 | +                new UpdateController(this.logger, pluginConfiguration, this.messageService, updateService, this.taskScheduler) | 
| 90 | 85 |         ).forEach(listener -> this.server.getPluginManager().registerEvents(listener, plugin)); | 
| 91 | 86 | 
 | 
| 92 |  | -        /* Commands */ | 
| 93 |  | -        if (this.pluginConfiguration.commandSettings.autoMessageEnabled) { | 
| 94 |  | -            this.liteCommands = this.registerLiteCommands(); | 
| 95 |  | -        } | 
| 96 |  | - | 
| 97 |  | -        /* Metrics */ | 
| 98 |  | -        this.metrics = new Metrics((JavaPlugin) plugin, 19487); | 
| 99 |  | - | 
| 100 |  | -        logger.info("Enabled plugin in " + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) + "ms."); | 
| 101 |  | -    } | 
|  | 87 | +        /* LiteCommands */ | 
|  | 88 | +        this.liteCommands = LiteBukkitFactory.builder("AutoMessage", plugin, this.server) | 
|  | 89 | +                .argument(Player.class, new PlayerArgument(this.server, messageConfiguration)) | 
| 102 | 90 | 
 | 
| 103 |  | -    public void onDisable() { | 
| 104 |  | -        this.bukkitAudiences.close(); | 
|  | 91 | +                .context(Player.class, new PlayerContextual()) | 
|  | 92 | +                .result(Notice.class, new MessageResultHandler(this.messageService)) | 
| 105 | 93 | 
 | 
| 106 |  | -        if (this.liteCommands != null) { | 
| 107 |  | -            this.liteCommands.getPlatform().unregisterAll(); | 
| 108 |  | -        } | 
|  | 94 | +                .missingPermission(new MissingPermissionHandler(this.messageService)) | 
|  | 95 | +                .invalidUsage(new UsageHandler(this.messageService)) | 
| 109 | 96 | 
 | 
| 110 |  | -        this.metrics.shutdown(); | 
| 111 |  | -    } | 
|  | 97 | +                .commands( | 
|  | 98 | +                        new DelayCommand(this.messageService, autoMessageDispatcher), | 
|  | 99 | +                        new ReloadCommand(this.logger, this.configurationManager, this.messageService) | 
|  | 100 | +                ) | 
| 112 | 101 | 
 | 
| 113 |  | -    private LiteCommands<CommandSender> registerLiteCommands() { | 
| 114 |  | -        return LiteBukkitAdventurePlatformFactory.builder(this.server, "AutoMessage", false, this.bukkitAudiences, true) | 
| 115 |  | -                .contextualBind(Player.class, new BukkitOnlyPlayerContextual<>("Command only for player")) | 
|  | 102 | +                .editorGlobal(new CommandConfigurator(this.logger, commandConfiguration)) | 
| 116 | 103 | 
 | 
| 117 |  | -                .argument(Player.class, new BukkitPlayerArgument<>(this.server, this.pluginConfiguration.notificationSettings.playerNotFound)) | 
| 118 |  | -                .argument(NotificationType.class, new NotificationTypeArgument(this.pluginConfiguration.notificationSettings)) | 
| 119 |  | -                .argument(Notification.class, new NotificationArgument(this.pluginConfiguration, this.pluginConfiguration.notificationSettings)) | 
|  | 104 | +                .build(); | 
| 120 | 105 | 
 | 
| 121 |  | -                .argument(float.class, "bossBarProgress", new BossBarProgressArgument(this.pluginConfiguration.notificationSettings)) | 
|  | 106 | +        /* Metrics */ | 
|  | 107 | +        this.metrics = new Metrics(plugin, AutoMessagePlugin.METRICS_SERVICE_ID); | 
| 122 | 108 | 
 | 
| 123 |  | -                .invalidUsageHandler(new UsageHandler(this.pluginConfiguration.notificationSettings, this.notificationSender)) | 
| 124 |  | -                .permissionHandler(new MissingPermissionHandler(this.pluginConfiguration.notificationSettings, this.notificationSender)) | 
| 125 |  | -                .resultHandler(Notification.class, new NotificationHandler(this.notificationSender)) | 
|  | 109 | +        this.logger.info("Enabled plugin in " + stopwatch.elapsed(TimeUnit.MILLISECONDS) + "ms."); | 
|  | 110 | +    } | 
| 126 | 111 | 
 | 
| 127 |  | -                .commandInstance( | 
| 128 |  | -                        new AutoMessageStateCommand(this.pluginConfiguration, this.pluginConfiguration.notificationSettings, this.notificationSender), | 
| 129 |  | -                        new AutoMessageCreateCommand(this.pluginConfiguration, this.pluginConfiguration.notificationSettings, this.notificationSender), | 
| 130 |  | -                        new AutoMessageListCommand(this.pluginConfiguration, this.pluginConfiguration.notificationSettings, this.notificationSender), | 
| 131 |  | -                        new AutoMessageRemoveCommand(this.pluginConfiguration, this.pluginConfiguration.notificationSettings, this.notificationSender) | 
| 132 |  | -                ) | 
|  | 112 | +    /** | 
|  | 113 | +     * Gracefully shuts down all plugin components and resources. | 
|  | 114 | +     * Called during plugin disable. | 
|  | 115 | +     */ | 
|  | 116 | +    void disable() { | 
|  | 117 | +        this.configurationManager.shutdown(); | 
|  | 118 | +        this.messageService.close(); | 
|  | 119 | +        this.liteCommands.unregister(); | 
|  | 120 | +        this.metrics.shutdown(); | 
|  | 121 | +        this.taskScheduler.shutdown(); | 
| 133 | 122 | 
 | 
| 134 |  | -                .register(); | 
|  | 123 | +        this.logger.info("Successfully disabled plugin."); | 
| 135 | 124 |     } | 
| 136 | 125 | } | 
0 commit comments