From bbaf4f394b9ad165bd27fb79998ed1f50b3dff89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 8 Dec 2023 22:44:24 +0100 Subject: [PATCH] Added Scheduled server restarts --- .../java/eu/mhsl/craftattack/spawn/Main.java | 2 + .../spawn/appliances/restart/Restart.java | 68 +++++++++++++++++++ .../restart/command/CancelRestartCommand.java | 18 +++++ .../command/ScheduleRestartCommand.java | 18 +++++ .../craftattack/spawn/util/Countdown.java | 52 ++++++++++++++ src/main/resources/plugin.yml | 2 + 6 files changed, 160 insertions(+) create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/Restart.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/command/CancelRestartCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/command/ScheduleRestartCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/util/Countdown.java diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 5d5e1ce..19f4839 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -9,6 +9,7 @@ import eu.mhsl.craftattack.spawn.appliances.event.Event; import eu.mhsl.craftattack.spawn.appliances.help.Help; import eu.mhsl.craftattack.spawn.appliances.playerlimit.PlayerLimit; import eu.mhsl.craftattack.spawn.appliances.report.Report; +import eu.mhsl.craftattack.spawn.appliances.restart.Restart; import eu.mhsl.craftattack.spawn.appliances.tablist.Tablist; import eu.mhsl.craftattack.spawn.appliances.titleClear.TitleClear; import eu.mhsl.craftattack.spawn.appliances.whitelist.Whitelist; @@ -43,6 +44,7 @@ public final class Main extends JavaPlugin { new Help(), new PlayerLimit(), new Whitelist(), + new Restart(), new Debug() ); Bukkit.getLogger().info("Loading appliances..."); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/Restart.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/Restart.java new file mode 100644 index 0000000..2796d73 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/Restart.java @@ -0,0 +1,68 @@ +package eu.mhsl.craftattack.spawn.appliances.restart; + +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.restart.command.CancelRestartCommand; +import eu.mhsl.craftattack.spawn.appliances.restart.command.ScheduleRestartCommand; +import eu.mhsl.craftattack.spawn.util.Countdown; +import eu.mhsl.craftattack.spawn.util.IteratorUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class Restart extends Appliance { + private Countdown countdown; + + public Restart() { + this.countdown = new Countdown(60, this::announce, this::onDone); + } + + public void scheduleRestart() { + try { + this.countdown.start(); + } catch (IllegalStateException e) { + throw new ApplianceCommand.Error(e.getMessage()); + } + } + + public void cancelRestart() { + try { + this.countdown.cancel(); + } catch (IllegalStateException e) { + throw new ApplianceCommand.Error(e.getMessage()); + } + } + + private void announce(int secondsLeft) { + IteratorUtil.onlinePlayers(player -> { + player.sendMessage( + Component.text() + .append(Component.text("Serverneustart in ", NamedTextColor.DARK_RED)) + .append(Component.text(secondsLeft, NamedTextColor.RED)) + .append(Component.text(" Sekunden!", NamedTextColor.DARK_RED)) + ); + }); + } + + private void onDone() { + IteratorUtil.onlinePlayers(player -> { + player.kick( + Component.text() + .appendNewline().appendNewline() + .append(Component.text("Serverneustart", NamedTextColor.DARK_RED)).appendNewline().appendNewline() + .append(Component.text("Wir sind gleich wieder online!", NamedTextColor.GOLD)).appendNewline() + .append(Component.text("Verbinde Dich dann erneut.", NamedTextColor.GRAY)).appendNewline() + .build() + ); + }); + Bukkit.shutdown(); + } + + @Override + protected @NotNull List> commands() { + return List.of(new ScheduleRestartCommand(), new CancelRestartCommand()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/command/CancelRestartCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/command/CancelRestartCommand.java new file mode 100644 index 0000000..9cc6039 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/command/CancelRestartCommand.java @@ -0,0 +1,18 @@ +package eu.mhsl.craftattack.spawn.appliances.restart.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.restart.Restart; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class CancelRestartCommand extends ApplianceCommand { + public CancelRestartCommand() { + super("cancelRestart"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception { + getAppliance().cancelRestart(); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/command/ScheduleRestartCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/command/ScheduleRestartCommand.java new file mode 100644 index 0000000..f86b7c7 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/command/ScheduleRestartCommand.java @@ -0,0 +1,18 @@ +package eu.mhsl.craftattack.spawn.appliances.restart.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.restart.Restart; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class ScheduleRestartCommand extends ApplianceCommand { + public ScheduleRestartCommand() { + super("scheduleRestart"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception { + getAppliance().scheduleRestart(); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/Countdown.java b/src/main/java/eu/mhsl/craftattack/spawn/util/Countdown.java new file mode 100644 index 0000000..64419ba --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/util/Countdown.java @@ -0,0 +1,52 @@ +package eu.mhsl.craftattack.spawn.util; + +import eu.mhsl.craftattack.spawn.Main; +import org.bukkit.Bukkit; + +import java.util.function.Consumer; + +public class Countdown { + private final int countdownFrom; + private boolean running; + private int taskId; + private int current; + private final Consumer announcement; + private final Runnable onDone; + + public Countdown(int countdownFrom, Consumer announcement, Runnable onDone) { + this.countdownFrom = countdownFrom; + this.current = countdownFrom; + this.announcement = announcement; + this.onDone = onDone; + } + + public void start() { + if(this.running) throw new IllegalStateException("Countdown already running!"); + this.running = true; + this.taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance(), this::tick, 20, 20); + } + + public void cancel() { + if(!this.running) throw new IllegalStateException("Countdown not running!"); + this.running = false; + Bukkit.getScheduler().cancelTask(this.taskId); + this.taskId = 0; + this.current = countdownFrom; + } + + public boolean isDone() { + return current <= 0; + } + + private void tick() { + if(current <= 60 && (current <= 10 || current % 10 == 0)) { + this.announcement.accept(current); + } + this.current--; + + if(isDone()) { + this.onDone.run(); + this.cancel(); + } + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 687c3c0..b0abf69 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -30,3 +30,5 @@ commands: discord: aliases: ["dc"] setPlayerLimit: + scheduleRestart: + cancelRestart: \ No newline at end of file