package dev.plex.services; import com.google.common.collect.Lists; import dev.plex.Plex; import dev.plex.services.impl.BanService; import dev.plex.services.impl.GameRuleService; import dev.plex.services.impl.UpdateCheckerService; import org.bukkit.Bukkit; import org.bukkit.scheduler.BukkitTask; import java.util.List; public class ServiceManager { private final List services = Lists.newArrayList(); public ServiceManager() { registerService(new BanService()); registerService(new GameRuleService()); registerService(new UpdateCheckerService()); } public void startServices() { for (AbstractService service : services) { if (!service.isRepeating()) { BukkitTask task = Bukkit.getScheduler().runTask(Plex.get(), service::run); service.setTaskId(task.getTaskId()); } else if (service.isRepeating() && service.isAsynchronous()) { BukkitTask task = Bukkit.getScheduler().runTaskTimerAsynchronously(Plex.get(), service::run, 0, 20L * service.repeatInSeconds()); service.setTaskId(task.getTaskId()); } else if (service.isRepeating() && !service.isAsynchronous()) { BukkitTask task = Bukkit.getScheduler().runTaskTimer(Plex.get(), service::run, 0, 20L * service.repeatInSeconds()); service.setTaskId(task.getTaskId()); } } } public AbstractService getService(Class clazz) { return services.stream().filter(service -> service.getClass().isAssignableFrom(clazz)).findFirst().orElse(null); } public void startService(AbstractService service) { if (!service.isRepeating()) { BukkitTask task = Bukkit.getScheduler().runTask(Plex.get(), service::run); service.setTaskId(task.getTaskId()); } else if (service.isRepeating() && service.isAsynchronous()) { BukkitTask task = Bukkit.getScheduler().runTaskTimerAsynchronously(Plex.get(), service::run, 0, 20L * service.repeatInSeconds()); service.setTaskId(task.getTaskId()); } else if (service.isRepeating() && !service.isAsynchronous()) { BukkitTask task = Bukkit.getScheduler().runTaskTimer(Plex.get(), service::run, 0, 20L * service.repeatInSeconds()); service.setTaskId(task.getTaskId()); } } public void endService(AbstractService service) { Bukkit.getScheduler().cancelTask(service.getTaskId()); } private void registerService(AbstractService service) { services.add(service); } public int serviceCount() { return services.size(); } }