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>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<failOnError>false</failOnError>
<failOnWarnings>false</failOnWarnings>
</configuration>
</plugin>
</plugins>
</pluginManagement>
@ -334,6 +338,10 @@
<pattern>com.google.thirdparty</pattern>
<shadedPattern>fr.xephi.authme.libs.com.google.thirdparty</shadedPattern>
</relocation>
<relocation>
<pattern>com.cryptomorin.xseries</pattern>
<shadedPattern>fr.xephi.authme.libs.xseries</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.j2objc</pattern>
<shadedPattern>fr.xephi.authme.libs.com.google.j2objc</shadedPattern>
@ -1115,6 +1123,14 @@
<scope>test</scope>
</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 -->
<dependency>
<groupId>org.xerial</groupId>

View File

@ -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);

View File

@ -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();
}

View File

@ -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);
}
}

View File

@ -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<String> loggedPlayersWithEmptyMail = dataSource.getLoggedPlayersWithEmptyMail();

View File

@ -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<Integer> 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<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--;
}
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<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;
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

View File

@ -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);
}

View File

@ -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<HasCleanup> hasCleanupStore;

View File

@ -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;

View File

@ -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;