package com.alttd.fishingevent.timer; import com.alttd.fishingevent.config.Messages; import com.alttd.fishingevent.scoreboard.ScoreboardManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.Server; import java.time.Duration; import java.time.Instant; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; public class EventManager { private static EventManager instance = null; private boolean running = false; private Instant startTime; private Duration duration; private EventAutoMessages eventAutoMessages; private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); private EventManager() {} public static EventManager getInstance() { if (instance == null) instance = new EventManager(); return instance; } public boolean startEvent(Server server, Duration duration) { if (running) return false; running = true; startTime = Instant.now(); this.duration = duration; server.sendMessage(MiniMessage.miniMessage().deserialize(Messages.TIMER.EVENT_START, Placeholder.parsed("minutes", String.valueOf(duration.toMinutes())))); eventAutoMessages = new EventAutoMessages(startTime, duration, server); if (scheduler.isShutdown() || scheduler.isTerminated()) scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(eventAutoMessages, 5, 1, TimeUnit.SECONDS); return true; } public boolean isRunning() { return running; } public void stop() { if (!scheduler.isTerminated() && !scheduler.isShutdown()) { scheduler.shutdownNow(); } running = false; } protected void end(Server server) { if (!scheduler.isTerminated() && !scheduler.isShutdown()) { scheduler.shutdownNow(); } running = false; AtomicReference message = new AtomicReference<>(MiniMessage.miniMessage().deserialize(Messages.TIMER.EVENT_END)); ScoreboardManager.getInstance().getTop10().stream().limit(3).forEachOrdered(playerScore -> message.set(message.get().append(Component.newline()).append(MiniMessage.miniMessage().deserialize(Messages.TIMER.WINNER_FORMAT, TagResolver.resolver( Placeholder.component("player", playerScore.player().displayName()), Placeholder.unparsed("rarity", playerScore.fish().getRarity().displayName()), Placeholder.component("fish", playerScore.fish().fishName()), Placeholder.parsed("length", String.format("%.2f", playerScore.biggestFish())) ))))); server.sendMessage(message.get()); } }