package fr.xephi.authme.service; import ch.jalu.injector.annotations.NoFieldScan; import com.earth2me.essentials.Essentials; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MVWorldManager; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.service.hook.papi.AuthMeExpansion; import me.clip.placeholderapi.PlaceholderAPIPlugin; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import javax.inject.Inject; import java.io.File; /** * Hooks into third-party plugins and allows to perform actions on them. */ @NoFieldScan public class PluginHookService { private final ConsoleLogger logger = ConsoleLoggerFactory.get(PluginHookService.class); private final PluginManager pluginManager; private Essentials essentials; private Plugin cmi; private MultiverseCore multiverse; private PlaceholderAPIPlugin placeholderApi; private AuthMeExpansion authMeExpansion; /** * Constructor. * * @param pluginManager The server's plugin manager */ @Inject public PluginHookService(PluginManager pluginManager) { this.pluginManager = pluginManager; tryHookToEssentials(); tryHookToCmi(); tryHookToMultiverse(); tryHookToPlaceholderApi(); } /** * Enable or disable the social spy status of the given user if Essentials is available. * * @param player The player to modify * @param socialSpyStatus The social spy status (enabled/disabled) to set */ public void setEssentialsSocialSpyStatus(Player player, boolean socialSpyStatus) { if (essentials != null) { essentials.getUser(player).setSocialSpyEnabled(socialSpyStatus); } } /** * If Essentials is hooked into, return Essentials' data folder. * * @return The Essentials data folder, or null if unavailable */ public File getEssentialsDataFolder() { if (essentials != null) { return essentials.getDataFolder(); } return null; } /** * If CMI is hooked into, return CMI' data folder. * * @return The CMI data folder, or null if unavailable */ public File getCmiDataFolder() { Plugin plugin = pluginManager.getPlugin("CMI"); if (plugin == null) { return null; } return plugin.getDataFolder(); } /** * Return the spawn of the given world as defined by Multiverse (if available). * * @param world The world to get the Multiverse spawn for * @return The spawn location from Multiverse, or null if unavailable */ public Location getMultiverseSpawn(World world) { if (multiverse != null) { MVWorldManager manager = multiverse.getMVWorldManager(); if (manager.isMVWorld(world)) { return manager.getMVWorld(world).getSpawnLocation(); } } return null; } // ------ // "Is plugin available" methods // ------ /** * @return true if we have a hook to Essentials, false otherwise */ public boolean isEssentialsAvailable() { return essentials != null; } /** * @return true if we have a hook to CMI, false otherwise */ public boolean isCmiAvailable() { return cmi != null; } /** * @return true if we have a hook to Multiverse, false otherwise */ public boolean isMultiverseAvailable() { return multiverse != null; } // ------ // Hook methods // ------ /** * Attempts to create a hook into Essentials. */ public void tryHookToEssentials() { try { essentials = getPlugin(pluginManager, "Essentials", Essentials.class); } catch (Exception | NoClassDefFoundError ignored) { essentials = null; } } /** * Attempts to create a hook into PlaceholderAPI. */ public void tryHookToPlaceholderApi() { try { placeholderApi = getPlugin(pluginManager, "PlaceholderAPI", PlaceholderAPIPlugin.class); authMeExpansion = new AuthMeExpansion(); authMeExpansion.register(); } catch (Exception | NoClassDefFoundError ignored) { placeholderApi = null; authMeExpansion = null; } } /** * Attempts to create a hook into CMI. */ public void tryHookToCmi() { try { cmi = getPlugin(pluginManager, "CMI", Plugin.class); } catch (Exception | NoClassDefFoundError ignored) { cmi = null; } } /** * Attempts to create a hook into Multiverse. */ public void tryHookToMultiverse() { try { multiverse = getPlugin(pluginManager, "Multiverse-Core", MultiverseCore.class); } catch (Exception | NoClassDefFoundError ignored) { multiverse = null; } } // ------ // Unhook methods // ------ /** * Unhooks from Essentials. */ public void unhookEssentials() { essentials = null; } /** * Unhooks from CMI. */ public void unhookCmi() { cmi = null; } /** * Unhooks from Multiverse. */ public void unhookMultiverse() { multiverse = null; } /** * Unhooks from PlaceholderAPI. */ public void unhookPlaceholderApi() { if (placeholderApi != null) { authMeExpansion.unregister(); placeholderApi = null; } } // ------ // Helpers // ------ private T getPlugin(PluginManager pluginManager, String name, Class clazz) throws Exception, NoClassDefFoundError { if (pluginManager.isPluginEnabled(name)) { T plugin = clazz.cast(pluginManager.getPlugin(name)); logger.info("Hooked successfully into " + name); return plugin; } return null; } }