|
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