diff --git a/pom.xml b/pom.xml
index 577bd82f..dfb4bfb3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -155,6 +155,10 @@
org.apache.maven.plugins
maven-javadoc-plugin
3.4.1
+
+ false
+ false
+
@@ -334,6 +338,10 @@
com.google.thirdparty
fr.xephi.authme.libs.com.google.thirdparty
+
+ com.cryptomorin.xseries
+ fr.xephi.authme.libs.xseries
+
com.google.j2objc
fr.xephi.authme.libs.com.google.j2objc
@@ -1115,6 +1123,14 @@
test
+
+
+ com.github.Anon8281
+ UniversalScheduler
+ 0.1.6
+ compile
+
+
org.xerial
diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java
index 22f1fa09..dbe9aa4a 100644
--- a/src/main/java/fr/xephi/authme/AuthMe.java
+++ b/src/main/java/fr/xephi/authme/AuthMe.java
@@ -2,6 +2,8 @@ package fr.xephi.authme;
import ch.jalu.injector.Injector;
import ch.jalu.injector.InjectorBuilder;
+import com.github.Anon8281.universalScheduler.UniversalScheduler;
+import com.github.Anon8281.universalScheduler.scheduling.schedulers.TaskScheduler;
import fr.xephi.authme.api.v3.AuthMeApi;
import fr.xephi.authme.command.CommandHandler;
import fr.xephi.authme.datasource.DataSource;
@@ -45,7 +47,6 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
-import org.bukkit.scheduler.BukkitScheduler;
import org.jetbrains.annotations.NotNull;
import javax.inject.Inject;
@@ -79,6 +80,7 @@ public class AuthMe extends JavaPlugin {
// Private instances
private EmailService emailService;
private CommandHandler commandHandler;
+ private static TaskScheduler scheduler;
@Inject
public static Settings settings;
private DataSource database;
@@ -130,7 +132,12 @@ public class AuthMe extends JavaPlugin {
return pluginBuildNumber;
}
-
+ /**
+ * Get the scheduler
+ */
+ public static TaskScheduler getScheduler() {
+ return scheduler;
+ }
/**
* Method called when the server enables the plugin.
@@ -139,6 +146,7 @@ public class AuthMe extends JavaPlugin {
public void onEnable() {
// Load the plugin version data from the plugin description file
loadPluginInfo(getDescription().getVersion());
+ scheduler = UniversalScheduler.getScheduler(this);
// Set the Logger instance and log file path
ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME));
@@ -246,7 +254,6 @@ public class AuthMe extends JavaPlugin {
injector.register(AuthMe.class, this);
injector.register(Server.class, getServer());
injector.register(PluginManager.class, getServer().getPluginManager());
- injector.register(BukkitScheduler.class, getServer().getScheduler());
injector.provide(DataFolder.class, getDataFolder());
injector.registerProvider(Settings.class, SettingsProvider.class);
injector.registerProvider(DataSource.class, DataSourceProvider.class);
diff --git a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java
index 34e73196..55f172b6 100644
--- a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java
+++ b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java
@@ -1,8 +1,8 @@
package fr.xephi.authme.data.limbo;
+import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask;
import fr.xephi.authme.task.MessageTask;
import org.bukkit.Location;
-import org.bukkit.scheduler.BukkitTask;
import java.util.ArrayList;
import java.util.Collection;
@@ -22,7 +22,7 @@ public class LimboPlayer {
private final Location loc;
private final float walkSpeed;
private final float flySpeed;
- private BukkitTask timeoutTask = null;
+ private MyScheduledTask timeoutTask = null;
private MessageTask messageTask = null;
private LimboPlayerState state = LimboPlayerState.PASSWORD_REQUIRED;
@@ -81,7 +81,7 @@ public class LimboPlayer {
*
* @return The timeout task associated to the player
*/
- public BukkitTask getTimeoutTask() {
+ public MyScheduledTask getTimeoutTask() {
return timeoutTask;
}
@@ -91,7 +91,7 @@ public class LimboPlayer {
*
* @param timeoutTask The task to set
*/
- public void setTimeoutTask(BukkitTask timeoutTask) {
+ public void setTimeoutTask(MyScheduledTask timeoutTask) {
if (this.timeoutTask != null) {
this.timeoutTask.cancel();
}
diff --git a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java
index 3612e679..7331a653 100644
--- a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java
+++ b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java
@@ -1,5 +1,6 @@
package fr.xephi.authme.data.limbo;
+import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask;
import fr.xephi.authme.data.auth.PlayerCache;
import fr.xephi.authme.data.captcha.RegistrationCaptchaManager;
import fr.xephi.authme.message.MessageKey;
@@ -11,7 +12,6 @@ import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.task.MessageTask;
import fr.xephi.authme.task.TimeoutTask;
import org.bukkit.entity.Player;
-import org.bukkit.scheduler.BukkitTask;
import javax.inject.Inject;
@@ -68,7 +68,7 @@ class LimboPlayerTaskManager {
final int timeout = settings.getProperty(RestrictionSettings.TIMEOUT) * TICKS_PER_SECOND;
if (timeout > 0) {
String message = messages.retrieveSingle(player, MessageKey.LOGIN_TIMEOUT_ERROR);
- BukkitTask task = bukkitService.runTaskLater(new TimeoutTask(player, message, playerCache), timeout);
+ MyScheduledTask task = bukkitService.runTaskLater(new TimeoutTask(player, message, playerCache), timeout);
limbo.setTimeoutTask(task);
}
}
diff --git a/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java b/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java
index 02f17e95..705f3bcc 100644
--- a/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java
+++ b/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java
@@ -1,5 +1,6 @@
package fr.xephi.authme.initialization;
+import com.github.Anon8281.universalScheduler.UniversalRunnable;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.datasource.DataSource;
@@ -18,7 +19,6 @@ import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
-import org.bukkit.scheduler.BukkitRunnable;
import javax.inject.Inject;
import java.util.List;
@@ -96,7 +96,7 @@ public class OnStartupTasks {
if (!settings.getProperty(RECALL_PLAYERS)) {
return;
}
- bukkitService.runTaskTimerAsynchronously(new BukkitRunnable() {
+ bukkitService.runTaskTimerAsynchronously(new UniversalRunnable() {
@Override
public void run() {
List loggedPlayersWithEmptyMail = dataSource.getLoggedPlayersWithEmptyMail();
diff --git a/src/main/java/fr/xephi/authme/initialization/TaskCloser.java b/src/main/java/fr/xephi/authme/initialization/TaskCloser.java
index 7cf1b0a7..8356b28b 100644
--- a/src/main/java/fr/xephi/authme/initialization/TaskCloser.java
+++ b/src/main/java/fr/xephi/authme/initialization/TaskCloser.java
@@ -1,15 +1,9 @@
package fr.xephi.authme.initialization;
-import com.google.common.annotations.VisibleForTesting;
+import com.github.Anon8281.universalScheduler.scheduling.schedulers.TaskScheduler;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.datasource.DataSource;
-import org.bukkit.scheduler.BukkitScheduler;
-import org.bukkit.scheduler.BukkitWorker;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.logging.Level;
import java.util.logging.Logger;
/**
@@ -18,7 +12,7 @@ import java.util.logging.Logger;
*/
public class TaskCloser implements Runnable {
- private final BukkitScheduler scheduler;
+ private final TaskScheduler scheduler;
private final Logger logger;
private final AuthMe plugin;
private final DataSource dataSource;
@@ -30,7 +24,7 @@ public class TaskCloser implements Runnable {
* @param dataSource the data source (nullable)
*/
public TaskCloser(AuthMe plugin, DataSource dataSource) {
- this.scheduler = plugin.getServer().getScheduler();
+ this.scheduler = AuthMe.getScheduler();
this.logger = plugin.getLogger();
this.plugin = plugin;
this.dataSource = dataSource;
@@ -38,58 +32,9 @@ public class TaskCloser implements Runnable {
@Override
public void run() {
- List pendingTasks = getPendingTasks();
- logger.log(Level.INFO, "Waiting for {0} tasks to finish", pendingTasks.size());
- int progress = 0;
-
- //one minute + some time checking the running state
- int tries = 60;
- while (!pendingTasks.isEmpty()) {
- if (tries <= 0) {
- logger.log(Level.INFO, "Async tasks times out after to many tries {0}", pendingTasks);
- break;
- }
-
- try {
- sleep();
- } catch (InterruptedException ignored) {
- Thread.currentThread().interrupt();
- break;
- }
-
- for (Iterator iterator = pendingTasks.iterator(); iterator.hasNext(); ) {
- int taskId = iterator.next();
- if (!scheduler.isCurrentlyRunning(taskId)) {
- iterator.remove();
- progress++;
- logger.log(Level.INFO, "Progress: {0} / {1}", new Object[]{progress, pendingTasks.size()});
- }
- }
-
- tries--;
- }
-
+ scheduler.cancelTasks();
if (dataSource != null) {
dataSource.closeConnection();
}
}
-
- /** Makes the current thread sleep for one second. */
- @VisibleForTesting
- void sleep() throws InterruptedException {
- Thread.sleep(1000);
- }
-
- private List getPendingTasks() {
- List pendingTasks = new ArrayList<>();
- //returns only the async tasks
- for (BukkitWorker pendingTask : scheduler.getActiveWorkers()) {
- if (pendingTask.getOwner().equals(plugin)
- //it's not a periodic task
- && !scheduler.isQueued(pendingTask.getTaskId())) {
- pendingTasks.add(pendingTask.getTaskId());
- }
- }
- return pendingTasks;
- }
}
diff --git a/src/main/java/fr/xephi/authme/service/AntiBotService.java b/src/main/java/fr/xephi/authme/service/AntiBotService.java
index 96ff499f..f902a28f 100644
--- a/src/main/java/fr/xephi/authme/service/AntiBotService.java
+++ b/src/main/java/fr/xephi/authme/service/AntiBotService.java
@@ -1,5 +1,6 @@
package fr.xephi.authme.service;
+import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask;
import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.message.MessageKey;
import fr.xephi.authme.message.Messages;
@@ -8,7 +9,6 @@ import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.ProtectionSettings;
import fr.xephi.authme.util.AtomicIntervalCounter;
-import org.bukkit.scheduler.BukkitTask;
import javax.inject.Inject;
import java.util.Locale;
@@ -32,7 +32,7 @@ public class AntiBotService implements SettingsDependent {
// Service status
private AntiBotStatus antiBotStatus;
private boolean startup;
- private BukkitTask disableTask;
+ private MyScheduledTask disableTask;
private AtomicIntervalCounter flaggedCounter;
@Inject
diff --git a/src/main/java/fr/xephi/authme/service/BukkitService.java b/src/main/java/fr/xephi/authme/service/BukkitService.java
index 797fddf3..c73257d6 100644
--- a/src/main/java/fr/xephi/authme/service/BukkitService.java
+++ b/src/main/java/fr/xephi/authme/service/BukkitService.java
@@ -1,5 +1,7 @@
package fr.xephi.authme.service;
+import com.github.Anon8281.universalScheduler.UniversalRunnable;
+import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.settings.Settings;
@@ -13,8 +15,6 @@ import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
-import org.bukkit.scheduler.BukkitRunnable;
-import org.bukkit.scheduler.BukkitTask;
import javax.inject.Inject;
import java.util.Collection;
@@ -23,6 +23,8 @@ import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
+import static fr.xephi.authme.AuthMe.getScheduler;
+
/**
* Service for operations requiring the Bukkit API, such as for scheduling.
*/
@@ -50,8 +52,8 @@ public class BukkitService implements SettingsDependent {
* @param task Task to be executed
* @return Task id number (-1 if scheduling failed)
*/
- public int scheduleSyncDelayedTask(Runnable task) {
- return Bukkit.getScheduler().scheduleSyncDelayedTask(authMe, task);
+ public void scheduleSyncDelayedTask(Runnable task) {
+ getScheduler().runTask(task);
}
/**
@@ -63,8 +65,8 @@ public class BukkitService implements SettingsDependent {
* @param delay Delay in server ticks before executing task
* @return Task id number (-1 if scheduling failed)
*/
- public int scheduleSyncDelayedTask(Runnable task, long delay) {
- return Bukkit.getScheduler().scheduleSyncDelayedTask(authMe, task, delay);
+ public void scheduleSyncDelayedTask(Runnable task, long delay) {
+ getScheduler().runTaskLater(task, delay);
}
/**
@@ -76,7 +78,7 @@ public class BukkitService implements SettingsDependent {
*/
public void scheduleSyncTaskFromOptionallyAsyncTask(Runnable task) {
if (Bukkit.isPrimaryThread()) {
- task.run();
+ runTask(task);
} else {
scheduleSyncDelayedTask(task);
}
@@ -90,8 +92,8 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if plugin is null
* @throws IllegalArgumentException if task is null
*/
- public BukkitTask runTask(Runnable task) {
- return Bukkit.getScheduler().runTask(authMe, task);
+ public void runTask(Runnable task) {
+ getScheduler().runTask(task);
}
/**
@@ -104,8 +106,8 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if plugin is null
* @throws IllegalArgumentException if task is null
*/
- public BukkitTask runTaskLater(Runnable task, long delay) {
- return Bukkit.getScheduler().runTaskLater(authMe, task, delay);
+ public MyScheduledTask runTaskLater(Runnable task, long delay) {
+ return getScheduler().runTaskLater(task, delay);
}
/**
@@ -118,7 +120,7 @@ public class BukkitService implements SettingsDependent {
if (useAsyncTasks) {
runTaskAsynchronously(task);
} else {
- task.run();
+ runTask(task);
}
}
@@ -133,8 +135,8 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if plugin is null
* @throws IllegalArgumentException if task is null
*/
- public BukkitTask runTaskAsynchronously(Runnable task) {
- return Bukkit.getScheduler().runTaskAsynchronously(authMe, task);
+ public void runTaskAsynchronously(Runnable task) {
+ getScheduler().runTaskAsynchronously(task);
}
/**
@@ -152,7 +154,7 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if task is null
* @throws IllegalStateException if this was already scheduled
*/
- public BukkitTask runTaskTimerAsynchronously(BukkitRunnable task, long delay, long period) {
+ public MyScheduledTask runTaskTimerAsynchronously(UniversalRunnable task, long delay, long period) {
return task.runTaskTimerAsynchronously(authMe, delay, period);
}
@@ -167,7 +169,7 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if plugin is null
* @throws IllegalStateException if this was already scheduled
*/
- public BukkitTask runTaskTimer(BukkitRunnable task, long delay, long period) {
+ public MyScheduledTask runTaskTimer(UniversalRunnable task, long delay, long period) {
return task.runTaskTimer(authMe, delay, period);
}
diff --git a/src/main/java/fr/xephi/authme/task/CleanupTask.java b/src/main/java/fr/xephi/authme/task/CleanupTask.java
index 48d989f1..4f40ddb2 100644
--- a/src/main/java/fr/xephi/authme/task/CleanupTask.java
+++ b/src/main/java/fr/xephi/authme/task/CleanupTask.java
@@ -1,15 +1,15 @@
package fr.xephi.authme.task;
import ch.jalu.injector.factory.SingletonStore;
+import com.github.Anon8281.universalScheduler.UniversalRunnable;
import fr.xephi.authme.initialization.HasCleanup;
-import org.bukkit.scheduler.BukkitRunnable;
import javax.inject.Inject;
/**
* Task run periodically to invoke the cleanup task on services.
*/
-public class CleanupTask extends BukkitRunnable {
+public class CleanupTask extends UniversalRunnable {
@Inject
private SingletonStore hasCleanupStore;
diff --git a/src/main/java/fr/xephi/authme/task/MessageTask.java b/src/main/java/fr/xephi/authme/task/MessageTask.java
index cf4366d9..dd11e8ef 100644
--- a/src/main/java/fr/xephi/authme/task/MessageTask.java
+++ b/src/main/java/fr/xephi/authme/task/MessageTask.java
@@ -1,12 +1,12 @@
package fr.xephi.authme.task;
+import com.github.Anon8281.universalScheduler.UniversalRunnable;
import org.bukkit.entity.Player;
-import org.bukkit.scheduler.BukkitRunnable;
/**
* Message shown to a player in a regular interval as long as he is not logged in.
*/
-public class MessageTask extends BukkitRunnable {
+public class MessageTask extends UniversalRunnable {
private final Player player;
private final String[] message;
diff --git a/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java b/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java
index 5c4a8707..15ab6552 100644
--- a/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java
+++ b/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java
@@ -1,5 +1,6 @@
package fr.xephi.authme.task.purge;
+import com.github.Anon8281.universalScheduler.UniversalRunnable;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.permission.PermissionsManager;
@@ -9,14 +10,13 @@ import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.UUID;
-class PurgeTask extends BukkitRunnable {
+class PurgeTask extends UniversalRunnable {
//how many players we should check for each tick
private static final int INTERVAL_CHECK = 5;