package fr.xephi.authme.service; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.initialization.SettingsDependent; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.PluginSettings; import org.bukkit.BanEntry; import org.bukkit.BanList; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitTask; import javax.inject.Inject; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.Set; /** * Service for operations requiring the Bukkit API, such as for scheduling. */ public class BukkitService implements SettingsDependent { /** Number of ticks per second in the Bukkit main thread. */ public static final int TICKS_PER_SECOND = 20; /** Number of ticks per minute. */ public static final int TICKS_PER_MINUTE = 60 * TICKS_PER_SECOND; private final AuthMe authMe; private final boolean getOnlinePlayersIsCollection; private Method getOnlinePlayers; private boolean useAsyncTasks; @Inject BukkitService(AuthMe authMe, Settings settings) { this.authMe = authMe; getOnlinePlayersIsCollection = initializeOnlinePlayersIsCollectionField(); reload(settings); } /** * Schedules a once off task to occur as soon as possible. *
* This task will be executed by the main server thread. * * @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); } /** * Schedules a once off task to occur after a delay. *
* This task will be executed by the main server thread. * * @param task Task to be executed * @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); } /** * Schedules a synchronous task if async tasks are enabled; if not, it runs the task immediately. * Use this when {@link #runTaskOptionallyAsync(Runnable) optionally asynchronous tasks} have to * run something synchronously. * * @param task the task to be run */ public void scheduleSyncTaskFromOptionallyAsyncTask(Runnable task) { if (useAsyncTasks) { scheduleSyncDelayedTask(task); } else { task.run(); } } /** * Returns a task that will run on the next server tick. * * @param task the task to be run * @return a BukkitTask that contains the id number * @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if task is null */ public BukkitTask runTask(Runnable task) { return Bukkit.getScheduler().runTask(authMe, task); } /** * Returns a task that will run after the specified number of server * ticks. * * @param task the task to be run * @param delay the ticks to wait before running the task * @return a BukkitTask that contains the id number * @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); } /** * Schedules this task to run asynchronously or immediately executes it based on * AuthMe's configuration. * * @param task the task to run */ public void runTaskOptionallyAsync(Runnable task) { if (useAsyncTasks) { runTaskAsynchronously(task); } else { task.run(); } } /** * Asynchronous tasks should never access any API in Bukkit. Great care * should be taken to assure the thread-safety of asynchronous tasks. *
* Returns a task that will run asynchronously. * * @param task the task to be run * @return a BukkitTask that contains the id number * @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if task is null */ public BukkitTask runTaskAsynchronously(Runnable task) { return Bukkit.getScheduler().runTaskAsynchronously(authMe, task); } /** * Asynchronous tasks should never access any API in Bukkit. Great care * should be taken to assure the thread-safety of asynchronous tasks. *
* Returns a task that will repeatedly run asynchronously until cancelled,
* starting after the specified number of server ticks.
*
* @param task the task to be run
* @param delay the ticks to wait before running the task for the first
* time
* @param period the ticks to wait between runs
* @return a BukkitTask that contains the id number
* @throws IllegalArgumentException if task is null
*/
public BukkitTask runTaskTimerAsynchronously(Runnable task, long delay, long period) {
return Bukkit.getScheduler().runTaskTimerAsynchronously(authMe, task, delay, period);
}
/**
* Schedules the given task to repeatedly run until cancelled, starting after the
* specified number of server ticks.
*
* @param task the task to schedule
* @param delay the ticks to wait before running the task
* @param period the ticks to wait between runs
* @return a BukkitTask that contains the id number
* @throws IllegalArgumentException if plugin is null
* @throws IllegalStateException if this was already scheduled
* @see BukkitScheduler#runTaskTimer(Plugin, Runnable, long, long)
*/
public BukkitTask runTaskTimer(BukkitRunnable task, long delay, long period) {
return task.runTaskTimer(authMe, period, delay);
}
/**
* Broadcast a message to all players.
*
* @param message the message
* @return the number of players
*/
public int broadcastMessage(String message) {
return Bukkit.broadcastMessage(message);
}
/**
* Gets the player with the exact given name, case insensitive.
*
* @param name Exact name of the player to retrieve
* @return a player object if one was found, null otherwise
*/
public Player getPlayerExact(String name) {
return authMe.getServer().getPlayerExact(name);
}
/**
* Gets a set containing all banned players.
*
* @return a set containing banned players
*/
public Set