Folia support

This commit is contained in:
HaHaWTH 2024-03-24 01:32:20 +08:00
parent 6ef4f0f3e3
commit 457997a430
11 changed files with 64 additions and 94 deletions

16
pom.xml
View File

@ -155,6 +155,10 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>
<version>3.4.1</version> <version>3.4.1</version>
<configuration>
<failOnError>false</failOnError>
<failOnWarnings>false</failOnWarnings>
</configuration>
</plugin> </plugin>
</plugins> </plugins>
</pluginManagement> </pluginManagement>
@ -334,6 +338,10 @@
<pattern>com.google.thirdparty</pattern> <pattern>com.google.thirdparty</pattern>
<shadedPattern>fr.xephi.authme.libs.com.google.thirdparty</shadedPattern> <shadedPattern>fr.xephi.authme.libs.com.google.thirdparty</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>com.cryptomorin.xseries</pattern>
<shadedPattern>fr.xephi.authme.libs.xseries</shadedPattern>
</relocation>
<relocation> <relocation>
<pattern>com.google.j2objc</pattern> <pattern>com.google.j2objc</pattern>
<shadedPattern>fr.xephi.authme.libs.com.google.j2objc</shadedPattern> <shadedPattern>fr.xephi.authme.libs.com.google.j2objc</shadedPattern>
@ -1115,6 +1123,14 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- Universal Scheduler -->
<dependency>
<groupId>com.github.Anon8281</groupId>
<artifactId>UniversalScheduler</artifactId>
<version>0.1.6</version>
<scope>compile</scope>
</dependency>
<!-- JDBC drivers for datasource integration tests --> <!-- JDBC drivers for datasource integration tests -->
<dependency> <dependency>
<groupId>org.xerial</groupId> <groupId>org.xerial</groupId>

View File

@ -2,6 +2,8 @@ package fr.xephi.authme;
import ch.jalu.injector.Injector; import ch.jalu.injector.Injector;
import ch.jalu.injector.InjectorBuilder; 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.api.v3.AuthMeApi;
import fr.xephi.authme.command.CommandHandler; import fr.xephi.authme.command.CommandHandler;
import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.datasource.DataSource;
@ -45,7 +47,6 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.inject.Inject; import javax.inject.Inject;
@ -79,6 +80,7 @@ public class AuthMe extends JavaPlugin {
// Private instances // Private instances
private EmailService emailService; private EmailService emailService;
private CommandHandler commandHandler; private CommandHandler commandHandler;
private static TaskScheduler scheduler;
@Inject @Inject
public static Settings settings; public static Settings settings;
private DataSource database; private DataSource database;
@ -130,7 +132,12 @@ public class AuthMe extends JavaPlugin {
return pluginBuildNumber; return pluginBuildNumber;
} }
/**
* Get the scheduler
*/
public static TaskScheduler getScheduler() {
return scheduler;
}
/** /**
* Method called when the server enables the plugin. * Method called when the server enables the plugin.
@ -139,6 +146,7 @@ public class AuthMe extends JavaPlugin {
public void onEnable() { public void onEnable() {
// Load the plugin version data from the plugin description file // Load the plugin version data from the plugin description file
loadPluginInfo(getDescription().getVersion()); loadPluginInfo(getDescription().getVersion());
scheduler = UniversalScheduler.getScheduler(this);
// Set the Logger instance and log file path // Set the Logger instance and log file path
ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME)); ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME));
@ -246,7 +254,6 @@ public class AuthMe extends JavaPlugin {
injector.register(AuthMe.class, this); injector.register(AuthMe.class, this);
injector.register(Server.class, getServer()); injector.register(Server.class, getServer());
injector.register(PluginManager.class, getServer().getPluginManager()); injector.register(PluginManager.class, getServer().getPluginManager());
injector.register(BukkitScheduler.class, getServer().getScheduler());
injector.provide(DataFolder.class, getDataFolder()); injector.provide(DataFolder.class, getDataFolder());
injector.registerProvider(Settings.class, SettingsProvider.class); injector.registerProvider(Settings.class, SettingsProvider.class);
injector.registerProvider(DataSource.class, DataSourceProvider.class); injector.registerProvider(DataSource.class, DataSourceProvider.class);

View File

@ -1,8 +1,8 @@
package fr.xephi.authme.data.limbo; package fr.xephi.authme.data.limbo;
import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask;
import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.MessageTask;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.scheduler.BukkitTask;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -22,7 +22,7 @@ public class LimboPlayer {
private final Location loc; private final Location loc;
private final float walkSpeed; private final float walkSpeed;
private final float flySpeed; private final float flySpeed;
private BukkitTask timeoutTask = null; private MyScheduledTask timeoutTask = null;
private MessageTask messageTask = null; private MessageTask messageTask = null;
private LimboPlayerState state = LimboPlayerState.PASSWORD_REQUIRED; private LimboPlayerState state = LimboPlayerState.PASSWORD_REQUIRED;
@ -81,7 +81,7 @@ public class LimboPlayer {
* *
* @return The timeout task associated to the player * @return The timeout task associated to the player
*/ */
public BukkitTask getTimeoutTask() { public MyScheduledTask getTimeoutTask() {
return timeoutTask; return timeoutTask;
} }
@ -91,7 +91,7 @@ public class LimboPlayer {
* *
* @param timeoutTask The task to set * @param timeoutTask The task to set
*/ */
public void setTimeoutTask(BukkitTask timeoutTask) { public void setTimeoutTask(MyScheduledTask timeoutTask) {
if (this.timeoutTask != null) { if (this.timeoutTask != null) {
this.timeoutTask.cancel(); this.timeoutTask.cancel();
} }

View File

@ -1,5 +1,6 @@
package fr.xephi.authme.data.limbo; 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.auth.PlayerCache;
import fr.xephi.authme.data.captcha.RegistrationCaptchaManager; import fr.xephi.authme.data.captcha.RegistrationCaptchaManager;
import fr.xephi.authme.message.MessageKey; 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.MessageTask;
import fr.xephi.authme.task.TimeoutTask; import fr.xephi.authme.task.TimeoutTask;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import javax.inject.Inject; import javax.inject.Inject;
@ -68,7 +68,7 @@ class LimboPlayerTaskManager {
final int timeout = settings.getProperty(RestrictionSettings.TIMEOUT) * TICKS_PER_SECOND; final int timeout = settings.getProperty(RestrictionSettings.TIMEOUT) * TICKS_PER_SECOND;
if (timeout > 0) { if (timeout > 0) {
String message = messages.retrieveSingle(player, MessageKey.LOGIN_TIMEOUT_ERROR); 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); limbo.setTimeoutTask(task);
} }
} }

View File

@ -1,5 +1,6 @@
package fr.xephi.authme.initialization; package fr.xephi.authme.initialization;
import com.github.Anon8281.universalScheduler.UniversalRunnable;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.datasource.DataSource;
@ -18,7 +19,6 @@ import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie; import org.bstats.charts.SimplePie;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; import java.util.List;
@ -96,7 +96,7 @@ public class OnStartupTasks {
if (!settings.getProperty(RECALL_PLAYERS)) { if (!settings.getProperty(RECALL_PLAYERS)) {
return; return;
} }
bukkitService.runTaskTimerAsynchronously(new BukkitRunnable() { bukkitService.runTaskTimerAsynchronously(new UniversalRunnable() {
@Override @Override
public void run() { public void run() {
List<String> loggedPlayersWithEmptyMail = dataSource.getLoggedPlayersWithEmptyMail(); List<String> loggedPlayersWithEmptyMail = dataSource.getLoggedPlayersWithEmptyMail();

View File

@ -1,15 +1,9 @@
package fr.xephi.authme.initialization; 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.AuthMe;
import fr.xephi.authme.datasource.DataSource; 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; import java.util.logging.Logger;
/** /**
@ -18,7 +12,7 @@ import java.util.logging.Logger;
*/ */
public class TaskCloser implements Runnable { public class TaskCloser implements Runnable {
private final BukkitScheduler scheduler; private final TaskScheduler scheduler;
private final Logger logger; private final Logger logger;
private final AuthMe plugin; private final AuthMe plugin;
private final DataSource dataSource; private final DataSource dataSource;
@ -30,7 +24,7 @@ public class TaskCloser implements Runnable {
* @param dataSource the data source (nullable) * @param dataSource the data source (nullable)
*/ */
public TaskCloser(AuthMe plugin, DataSource dataSource) { public TaskCloser(AuthMe plugin, DataSource dataSource) {
this.scheduler = plugin.getServer().getScheduler(); this.scheduler = AuthMe.getScheduler();
this.logger = plugin.getLogger(); this.logger = plugin.getLogger();
this.plugin = plugin; this.plugin = plugin;
this.dataSource = dataSource; this.dataSource = dataSource;
@ -38,58 +32,9 @@ public class TaskCloser implements Runnable {
@Override @Override
public void run() { public void run() {
List<Integer> pendingTasks = getPendingTasks(); scheduler.cancelTasks();
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<Integer> 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--;
}
if (dataSource != null) { if (dataSource != null) {
dataSource.closeConnection(); dataSource.closeConnection();
} }
} }
/** Makes the current thread sleep for one second. */
@VisibleForTesting
void sleep() throws InterruptedException {
Thread.sleep(1000);
}
private List<Integer> getPendingTasks() {
List<Integer> 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;
}
} }

View File

@ -1,5 +1,6 @@
package fr.xephi.authme.service; package fr.xephi.authme.service;
import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask;
import fr.xephi.authme.initialization.SettingsDependent; import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.message.MessageKey; import fr.xephi.authme.message.MessageKey;
import fr.xephi.authme.message.Messages; 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.Settings;
import fr.xephi.authme.settings.properties.ProtectionSettings; import fr.xephi.authme.settings.properties.ProtectionSettings;
import fr.xephi.authme.util.AtomicIntervalCounter; import fr.xephi.authme.util.AtomicIntervalCounter;
import org.bukkit.scheduler.BukkitTask;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale; import java.util.Locale;
@ -32,7 +32,7 @@ public class AntiBotService implements SettingsDependent {
// Service status // Service status
private AntiBotStatus antiBotStatus; private AntiBotStatus antiBotStatus;
private boolean startup; private boolean startup;
private BukkitTask disableTask; private MyScheduledTask disableTask;
private AtomicIntervalCounter flaggedCounter; private AtomicIntervalCounter flaggedCounter;
@Inject @Inject

View File

@ -1,5 +1,7 @@
package fr.xephi.authme.service; 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.AuthMe;
import fr.xephi.authme.initialization.SettingsDependent; import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
@ -13,8 +15,6 @@ import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
@ -23,6 +23,8 @@ import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
import static fr.xephi.authme.AuthMe.getScheduler;
/** /**
* Service for operations requiring the Bukkit API, such as for scheduling. * 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 * @param task Task to be executed
* @return Task id number (-1 if scheduling failed) * @return Task id number (-1 if scheduling failed)
*/ */
public int scheduleSyncDelayedTask(Runnable task) { public void scheduleSyncDelayedTask(Runnable task) {
return Bukkit.getScheduler().scheduleSyncDelayedTask(authMe, task); getScheduler().runTask(task);
} }
/** /**
@ -63,8 +65,8 @@ public class BukkitService implements SettingsDependent {
* @param delay Delay in server ticks before executing task * @param delay Delay in server ticks before executing task
* @return Task id number (-1 if scheduling failed) * @return Task id number (-1 if scheduling failed)
*/ */
public int scheduleSyncDelayedTask(Runnable task, long delay) { public void scheduleSyncDelayedTask(Runnable task, long delay) {
return Bukkit.getScheduler().scheduleSyncDelayedTask(authMe, task, delay); getScheduler().runTaskLater(task, delay);
} }
/** /**
@ -76,7 +78,7 @@ public class BukkitService implements SettingsDependent {
*/ */
public void scheduleSyncTaskFromOptionallyAsyncTask(Runnable task) { public void scheduleSyncTaskFromOptionallyAsyncTask(Runnable task) {
if (Bukkit.isPrimaryThread()) { if (Bukkit.isPrimaryThread()) {
task.run(); runTask(task);
} else { } else {
scheduleSyncDelayedTask(task); scheduleSyncDelayedTask(task);
} }
@ -90,8 +92,8 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if plugin is null
* @throws IllegalArgumentException if task is null * @throws IllegalArgumentException if task is null
*/ */
public BukkitTask runTask(Runnable task) { public void runTask(Runnable task) {
return Bukkit.getScheduler().runTask(authMe, task); getScheduler().runTask(task);
} }
/** /**
@ -104,8 +106,8 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if plugin is null
* @throws IllegalArgumentException if task is null * @throws IllegalArgumentException if task is null
*/ */
public BukkitTask runTaskLater(Runnable task, long delay) { public MyScheduledTask runTaskLater(Runnable task, long delay) {
return Bukkit.getScheduler().runTaskLater(authMe, task, delay); return getScheduler().runTaskLater(task, delay);
} }
/** /**
@ -118,7 +120,7 @@ public class BukkitService implements SettingsDependent {
if (useAsyncTasks) { if (useAsyncTasks) {
runTaskAsynchronously(task); runTaskAsynchronously(task);
} else { } else {
task.run(); runTask(task);
} }
} }
@ -133,8 +135,8 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if plugin is null
* @throws IllegalArgumentException if task is null * @throws IllegalArgumentException if task is null
*/ */
public BukkitTask runTaskAsynchronously(Runnable task) { public void runTaskAsynchronously(Runnable task) {
return Bukkit.getScheduler().runTaskAsynchronously(authMe, task); getScheduler().runTaskAsynchronously(task);
} }
/** /**
@ -152,7 +154,7 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if task is null * @throws IllegalArgumentException if task is null
* @throws IllegalStateException if this was already scheduled * @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); return task.runTaskTimerAsynchronously(authMe, delay, period);
} }
@ -167,7 +169,7 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if plugin is null
* @throws IllegalStateException if this was already scheduled * @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); return task.runTaskTimer(authMe, delay, period);
} }

View File

@ -1,15 +1,15 @@
package fr.xephi.authme.task; package fr.xephi.authme.task;
import ch.jalu.injector.factory.SingletonStore; import ch.jalu.injector.factory.SingletonStore;
import com.github.Anon8281.universalScheduler.UniversalRunnable;
import fr.xephi.authme.initialization.HasCleanup; import fr.xephi.authme.initialization.HasCleanup;
import org.bukkit.scheduler.BukkitRunnable;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Task run periodically to invoke the cleanup task on services. * Task run periodically to invoke the cleanup task on services.
*/ */
public class CleanupTask extends BukkitRunnable { public class CleanupTask extends UniversalRunnable {
@Inject @Inject
private SingletonStore<HasCleanup> hasCleanupStore; private SingletonStore<HasCleanup> hasCleanupStore;

View File

@ -1,12 +1,12 @@
package fr.xephi.authme.task; package fr.xephi.authme.task;
import com.github.Anon8281.universalScheduler.UniversalRunnable;
import org.bukkit.entity.Player; 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. * 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 Player player;
private final String[] message; private final String[] message;

View File

@ -1,5 +1,6 @@
package fr.xephi.authme.task.purge; package fr.xephi.authme.task.purge;
import com.github.Anon8281.universalScheduler.UniversalRunnable;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.permission.PermissionsManager;
@ -9,14 +10,13 @@ import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
class PurgeTask extends BukkitRunnable { class PurgeTask extends UniversalRunnable {
//how many players we should check for each tick //how many players we should check for each tick
private static final int INTERVAL_CHECK = 5; private static final int INTERVAL_CHECK = 5;