Skip to content

Commit 518b864

Browse files
committed
Initial commit.
1 parent 76d8b88 commit 518b864

File tree

54 files changed

+643
-1706
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+643
-1706
lines changed

README.md

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,66 @@
1-
# SpentTime
1+
# 💬 AutoMessage — Ultra-Efficient Broadcasting System
22

33
[![Build Status](https://github.com/imDMK/AutoMessage/actions/workflows/gradle.yml/badge.svg)](https://github.com/imDMK/AutoMessage/actions/workflows/gradle.yml)
44
![JDK](https://img.shields.io/badge/JDK-1.17-blue.svg)
5-
![Supported versions](https://img.shields.io/badge/Minecraft-1.17--1.20.1-green.svg)
5+
![Supported versions](https://img.shields.io/badge/Minecraft-1.17--1.21.5-green.svg)
66
[![SpigotMC](https://img.shields.io/badge/SpigotMC-yellow.svg)](https://www.spigotmc.org/resources/automessage.112363/)
77
[![Bukkit](https://img.shields.io/badge/Bukkit-blue.svg)](https://legacy.curseforge.com/minecraft/bukkit-plugins/auto-messages)
88
[![PaperMC](https://img.shields.io/badge/Paper-004ee9.svg)](https://hangar.papermc.io/imDMK/AutoMessage)
99
[![bStats](https://img.shields.io/badge/bStats-00695c)](https://bstats.org/plugin/bukkit/AutoMessages/19487)
1010

11-
Efficient plugin for automatic global messaging with many features and configuration possibilities.
12-
13-
# Features
14-
* Sending a CHAT message.
15-
* Sending an ACTIONBAR message.
16-
* Sending a TITLE and SUBTITLE message.
17-
* Sending a BOSSBAR message (Possibility to configure all parameters).
18-
* Ability to configure all messages sent by the plugin.
19-
* Ability to send messages in different modes.
20-
* Ability to create a message using a command on the server.
21-
* Possibility to enable and disable automatic messages using a command on the server.
22-
* [Adventure](https://github.com/KyoriPowered/adventure) components support.
23-
24-
# Information
25-
If you have suggestions, or questions, or find a bug, please report it using [this](https://github.com/imDMK/AutoMessage/issues) site.
11+
---
12+
13+
### 🚀 Lightweight. Customizable. Blazing Fast.
14+
15+
**AutoMessage** is a high-performance plugin for fully customizable automatic server-wide broadcasts. No lag. No hassle. Just clean, dynamic message delivery across chat, actionbars, titles, and bossbars — all with nearly zero performance impact.
16+
17+
---
18+
19+
## 🧠 Features
20+
21+
**Multiple broadcast types**
22+
• Chat
23+
• ActionBar
24+
• Title & Subtitle
25+
• BossBar (fully configurable: color, style, duration, progress, etc.)
26+
27+
**Advanced configuration**
28+
• Create/edit/delete messages directly
29+
• Toggle automatic messages at any time
30+
• Support for various broadcast modes
31+
• Dynamic intervals between messages
32+
• Full MiniMessage & Adventure API formatting
33+
34+
**Command support**
35+
`/automessage delay`
36+
`/automessage reload`
37+
• You can even configure a command like you want!
38+
39+
**Zero-lag optimized**
40+
Built with efficiency in mind — AutoMessage has no noticeable impact on server performance, even with hundreds of players online.
41+
42+
**Adventure API support**
43+
Integrates with [Kyori Adventure](https://github.com/KyoriPowered/adventure) for rich message styling and component-based formatting.
44+
45+
---
46+
47+
## ✨ Showcase
48+
49+
<!-- Insert your GIFs or images here -->
50+
<!-- Example:
51+
![AutoMessage Chat Preview](https://yourdomain.com/chat-preview.gif)
52+
-->
53+
54+
---
55+
56+
## 🛠️ Feedback & Support
57+
58+
Found a bug? Have a suggestion? Want to contribute?
59+
Open an issue on [GitHub Issues](https://github.com/imDMK/AutoMessage/issues) — your feedback is welcome!
60+
61+
---
62+
63+
## ⭐ Like the plugin?
64+
65+
If you enjoy using **AutoMessage**, please consider leaving a ⭐ rating on [SpigotMC](https://www.spigotmc.org/resources/automessage.112363/)!
66+
It helps support future development and lets others discover it too.

build.gradle

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,44 +27,46 @@ repositories {
2727
}
2828

2929
dependencies {
30-
compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT")
30+
compileOnly("org.spigotmc:spigot-api:1.21.5-R0.1-SNAPSHOT")
3131

3232
implementation("eu.okaeri:okaeri-configs-yaml-snakeyaml:5.0.0-beta.5")
3333
implementation("eu.okaeri:okaeri-configs-serdes-commons:5.0.0-beta.5")
3434

35-
implementation("net.kyori:adventure-platform-bukkit:4.3.1")
36-
implementation("net.kyori:adventure-text-minimessage:4.14.0")
35+
implementation("net.kyori:adventure-platform-bukkit:4.3.4")
36+
implementation("net.kyori:adventure-text-minimessage:4.19.0")
3737

38-
implementation("dev.rollczi.litecommands:core:2.8.9")
39-
implementation("dev.rollczi.litecommands:bukkit-adventure:2.8.9")
38+
implementation("dev.rollczi:litecommands-bukkit:3.9.7")
39+
implementation("dev.rollczi:litecommands-annotations:3.9.7")
4040

41+
implementation("com.eternalcode:multification-bukkit:1.1.4")
42+
implementation("com.eternalcode:multification-okaeri:1.1.4")
4143
implementation("com.eternalcode:gitcheck:1.0.0")
42-
implementation("org.bstats:bstats-bukkit:3.0.2")
44+
45+
implementation("org.bstats:bstats-bukkit:3.1.0")
4346

4447
testImplementation platform("org.junit:junit-bom:5.10.1")
4548
testImplementation("org.junit.jupiter:junit-jupiter:5.10.1")
4649
}
4750

48-
test {
49-
useJUnitPlatform()
50-
}
51-
52-
checkstyle {
53-
toolVersion = "10.12.1"
54-
55-
configFile = file("checkstyle.xml")
56-
}
57-
5851
bukkit {
5952
name = "AutoMessage"
6053
version = "${project.version}"
6154
apiVersion = "1.17"
6255
main = "com.github.imdmk.automessage.AutoMessagePlugin"
63-
author = "DMK"
64-
description = "Simple auto message plugin"
56+
author = "imDMK"
57+
description = "Advanced plugin for sending automatic chat, bossbar, and title messages to players."
6558
website = "https://github.com/imDMK/AutoMessage"
6659
}
6760

61+
test {
62+
useJUnitPlatform()
63+
}
64+
65+
checkstyle {
66+
toolVersion = "10.21.0"
67+
configFile = file("checkstyle.xml")
68+
}
69+
6870
shadowJar {
6971
archiveFileName.set("${project.name} v${project.version}.jar")
7072

@@ -80,14 +82,13 @@ shadowJar {
8082

8183
def prefix = "com.github.imdmk.automessage.lib"
8284
[
83-
"eu.okaeri",
8485
"net.kyori",
8586
"dev.rollczi",
86-
"com.eternalcode",
87-
"org.bstats",
8887
"org.yaml",
89-
"panda.std",
90-
"org.json.simple",
88+
"org.bstats",
89+
"org.json",
90+
"com.eternalcode",
91+
"eu.okaeri",
9192
].each { lib ->
9293
relocate(lib, "${prefix}.${lib}")
9394
}
Lines changed: 75 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,125 @@
11
package com.github.imdmk.automessage;
22

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;
115
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;
2222
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;
2723
import com.google.common.base.Stopwatch;
2824
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;
3226
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
27+
import net.kyori.adventure.text.minimessage.MiniMessage;
3328
import org.bstats.bukkit.Metrics;
3429
import org.bukkit.Server;
3530
import org.bukkit.command.CommandSender;
3631
import org.bukkit.entity.Player;
3732
import org.bukkit.plugin.Plugin;
38-
import org.bukkit.plugin.java.JavaPlugin;
3933

40-
import java.io.File;
41-
import java.time.Duration;
4234
import java.util.concurrent.TimeUnit;
4335
import java.util.logging.Logger;
4436
import java.util.stream.Stream;
4537

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 {
4743

4844
private final Server server;
45+
private final Logger logger;
4946

50-
private final PluginConfiguration pluginConfiguration;
47+
private final ConfigurationManager configurationManager;
5148

52-
private final BukkitAudiences bukkitAudiences;
53-
private final NotificationSender notificationSender;
49+
private final MessageService messageService;
5450

55-
private LiteCommands<CommandSender> liteCommands;
51+
private final TaskScheduler taskScheduler;
52+
53+
private final LiteCommands<CommandSender> liteCommands;
5654

5755
private final Metrics metrics;
5856

59-
public AutoMessage(Plugin plugin) {
57+
AutoMessage(Plugin plugin) {
6058
Stopwatch stopwatch = Stopwatch.createStarted();
6159

62-
Logger logger = plugin.getLogger();
63-
File dataFolder = plugin.getDataFolder();
64-
6560
this.server = plugin.getServer();
61+
this.logger = plugin.getLogger();
6662

6763
/* Configuration */
68-
this.pluginConfiguration = ConfigurationFactory.create(PluginConfiguration.class, new File(dataFolder, "configuration.yml"));
64+
this.configurationManager = new ConfigurationManager(this.logger, plugin.getDataFolder());
6965

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);
7270

7371
/* 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());
7674

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);
8077

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();
8381

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 */
8883
Stream.of(
89-
new UpdateListener(logger, this.pluginConfiguration, this.notificationSender, updateService, taskScheduler)
84+
new UpdateController(this.logger, pluginConfiguration, this.messageService, updateService, this.taskScheduler)
9085
).forEach(listener -> this.server.getPluginManager().registerEvents(listener, plugin));
9186

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))
10290

103-
public void onDisable() {
104-
this.bukkitAudiences.close();
91+
.context(Player.class, new PlayerContextual())
92+
.result(Notice.class, new MessageResultHandler(this.messageService))
10593

106-
if (this.liteCommands != null) {
107-
this.liteCommands.getPlatform().unregisterAll();
108-
}
94+
.missingPermission(new MissingPermissionHandler(this.messageService))
95+
.invalidUsage(new UsageHandler(this.messageService))
10996

110-
this.metrics.shutdown();
111-
}
97+
.commands(
98+
new DelayCommand(this.messageService, autoMessageDispatcher),
99+
new ReloadCommand(this.logger, this.configurationManager, this.messageService)
100+
)
112101

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))
116103

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();
120105

121-
.argument(float.class, "bossBarProgress", new BossBarProgressArgument(this.pluginConfiguration.notificationSettings))
106+
/* Metrics */
107+
this.metrics = new Metrics(plugin, AutoMessagePlugin.METRICS_SERVICE_ID);
122108

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+
}
126111

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();
133122

134-
.register();
123+
this.logger.info("Successfully disabled plugin.");
135124
}
136125
}

src/main/java/com/github/imdmk/automessage/AutoMessagePlugin.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
public class AutoMessagePlugin extends JavaPlugin {
66

7+
/** bStats Metrics service ID for reporting plugin statistics */
8+
public static final int METRICS_SERVICE_ID = 19487;
9+
710
private AutoMessage autoMessage;
811

912
@Override
@@ -13,6 +16,6 @@ public void onEnable() {
1316

1417
@Override
1518
public void onDisable() {
16-
this.autoMessage.onDisable();
19+
this.autoMessage.disable();
1720
}
1821
}

0 commit comments

Comments
 (0)