package me.lucko.luckperms; import lombok.Getter; import me.lucko.luckperms.api.LuckPermsApi; import me.lucko.luckperms.api.implementation.ApiProvider; import me.lucko.luckperms.api.vault.VaultHook; import me.lucko.luckperms.data.Datastore; import me.lucko.luckperms.data.MySQLConfiguration; import me.lucko.luckperms.data.methods.FlatfileDatastore; import me.lucko.luckperms.data.methods.MySQLDatastore; import me.lucko.luckperms.data.methods.SQLiteDatastore; import me.lucko.luckperms.groups.GroupManager; import me.lucko.luckperms.listeners.PlayerListener; import me.lucko.luckperms.runnables.UpdateTask; import me.lucko.luckperms.tracks.TrackManager; import me.lucko.luckperms.users.BukkitUserManager; import me.lucko.luckperms.users.UserManager; import me.lucko.luckperms.utils.LPConfiguration; import me.lucko.luckperms.utils.UuidCache; import org.bukkit.Bukkit; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @Getter public class LPBukkitPlugin extends JavaPlugin implements LuckPermsPlugin { public static final String VERSION = "v1.3"; private LPConfiguration configuration; private UserManager userManager; private GroupManager groupManager; private TrackManager trackManager; private Datastore datastore; private UuidCache uuidCache; @Override public void onEnable() { getLogger().info("Loading configuration..."); configuration = new BukkitConfig(this); // register events PluginManager pm = Bukkit.getPluginManager(); pm.registerEvents(new PlayerListener(this), this); // register commands getLogger().info("Registering commands..."); CommandManagerBukkit commandManager = new CommandManagerBukkit(this); PluginCommand main = getServer().getPluginCommand("luckperms"); main.setExecutor(commandManager); main.setTabCompleter(commandManager); main.setAliases(Arrays.asList("perms", "lp", "permissions", "p", "perm")); getLogger().info("Detecting storage method..."); final String storageMethod = configuration.getStorageMethod(); if (storageMethod.equalsIgnoreCase("mysql")) { getLogger().info("Using MySQL as storage method."); datastore = new MySQLDatastore(this, new MySQLConfiguration( configuration.getDatabaseValue("address"), configuration.getDatabaseValue("database"), configuration.getDatabaseValue("username"), configuration.getDatabaseValue("password") )); } else if (storageMethod.equalsIgnoreCase("sqlite")) { getLogger().info("Using SQLite as storage method."); datastore = new SQLiteDatastore(this, new File(getDataFolder(), "luckperms.sqlite")); } else if (storageMethod.equalsIgnoreCase("flatfile")) { getLogger().info("Using Flatfile (JSON) as storage method."); datastore = new FlatfileDatastore(this, getDataFolder()); } else { getLogger().severe("Storage method '" + storageMethod + "' was not recognised. Using SQLite as fallback."); datastore = new SQLiteDatastore(this, new File(getDataFolder(), "luckperms.sqlite")); } getLogger().info("Initialising datastore..."); datastore.init(); getLogger().info("Loading internal permission managers..."); uuidCache = new UuidCache(getConfiguration().getOnlineMode()); userManager = new BukkitUserManager(this); groupManager = new GroupManager(this); trackManager = new TrackManager(); // Run update task to refresh any online users getLogger().info("Scheduling Update Task to refresh any online users."); try { new UpdateTask(this).run(); } catch (Exception e) { e.printStackTrace(); } int mins = getConfiguration().getSyncTime(); if (mins > 0) { long ticks = mins * 60 * 20; getServer().getScheduler().runTaskTimerAsynchronously(this, new UpdateTask(this), ticks, ticks); } // Provide vault support getLogger().info("Attempting to hook into Vault..."); try { if (getServer().getPluginManager().isPluginEnabled("Vault")) { VaultHook.hook(this); getLogger().info("Registered Vault permission & chat hook."); } else { getLogger().info("Vault not found."); } } catch (Exception e) { getLogger().severe("Error occurred whilst hooking into Vault."); e.printStackTrace(); } getLogger().info("Registering API..."); final ApiProvider provider = new ApiProvider(this); LuckPerms.registerProvider(provider); getServer().getServicesManager().register(LuckPermsApi.class, provider, this, ServicePriority.Normal); getLogger().info("Successfully loaded."); } @Override public void onDisable() { getLogger().info("Closing datastore..."); datastore.shutdown(); getLogger().info("Unregistering API..."); LuckPerms.unregisterProvider(); getServer().getServicesManager().unregisterAll(this); } @Override public void doAsync(Runnable r) { Bukkit.getScheduler().runTaskAsynchronously(this, r); } @Override public void doSync(Runnable r) { Bukkit.getScheduler().runTask(this, r); } @Override public String getVersion() { return VERSION; } @Override public String getPlayerStatus(UUID uuid) { return getServer().getPlayer(getUuidCache().getExternalUUID(uuid)) != null ? "&aOnline" : "&cOffline"; } @Override public int getPlayerCount() { return getServer().getOnlinePlayers().size(); } @Override public List getPlayerList() { return getServer().getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()); } @Override public void runUpdateTask() { getServer().getScheduler().runTaskAsynchronously(this, new UpdateTask(this)); } }