/** * CitizensCMD - Add-on for Citizens * Copyright (C) 2018 Mateus Moreira *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. *

* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. *

* You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package me.mattmoreira.citizenscmd; import me.mattmoreira.citizenscmd.commands.*; import me.mattmoreira.citizenscmd.commands.base.CommandHandler; import me.mattmoreira.citizenscmd.files.CooldownHandler; import me.mattmoreira.citizenscmd.files.DataHandler; import me.mattmoreira.citizenscmd.files.LangHandler; import me.mattmoreira.citizenscmd.listeners.NPCListener; import me.mattmoreira.citizenscmd.listeners.UpdateEvent; import me.mattmoreira.citizenscmd.metrics.Metrics; import me.mattmoreira.citizenscmd.permissions.PermissionsManager; import me.mattmoreira.citizenscmd.schedulers.CooldownScheduler; import me.mattmoreira.citizenscmd.schedulers.UpdateScheduler; import me.mattmoreira.citizenscmd.updater.SpigotUpdater; import me.mattmoreira.citizenscmd.utility.DisplayFormat; import me.mattmoreira.citizenscmd.utility.Util; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.util.HashMap; import java.util.stream.Stream; import static me.mattmoreira.citizenscmd.utility.Util.*; public final class CitizensCMD extends JavaPlugin { /** * Supported languages */ private final String[] REGISTERED_LANG_FILES = {"en", "pt", "ro", "bg", "no", "ch"}; private static CommandHandler commandHandler = null; private static LangHandler lang = null; private static DataHandler dataHandler = null; private static CooldownHandler cooldownHandler = null; private static PermissionsManager permissionsManager = null; private static Economy economy = null; private static boolean papi = false; private static boolean updateStatus = false; private static boolean shift = false; private static String newVersion; private static DisplayFormat displayFormat; private static HashMap waitingList; public void onEnable() { if (!hasCitizens()) { Util.disablePlugin(this); return; } commandHandler = new CommandHandler(this); commandHandler.enable(); checkOldConfig(this); new Metrics(this); info(color(TAG + "&3Citizens&cCMD &8&o" + getDescription().getVersion() + " &8By &3Mateus Moreira &c@LichtHund")); permissionsManager = new PermissionsManager(this); dataHandler = new DataHandler(this); dataHandler.initialize(); cooldownHandler = new CooldownHandler(this); Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> cooldownHandler.initialize(), 30L); saveDefaultConfig(); registerCommands(); registerEvents(); registerLangs(this); setLang(getConfig().getString("lang")); if (hasPAPI()) { switch (lang.getLanguage()) { case "en": info(color(TAG + "&7Using &aPlaceholderAPI&7!")); break; case "pt": info(color(TAG + "&7Usando &aPlaceholderAPI&7!")); break; case "ro": info(color(TAG + "&7Folositi &aPlaceholderAPI&7!")); break; case "bg": info(color(TAG + "&7Използвайки &aPlaceholderAPI&7!")); break; case "no": info(color(TAG + "&7Bruk &aPlaceholderAPI&7!")); break; case "ch": info(color(TAG + "&7运用 &aPlaceholderAPI&7!")); break; } papi = true; } if (setupEconomy()) { switch (lang.getLanguage()) { case "en": info(color(TAG + "&7Using &aVault&7!")); break; case "pt": info(color(TAG + "&7Usando &aVault&7!")); break; case "ro": info(color(TAG + "&7Folositi &aVault&7!")); break; case "bg": info(color(TAG + "&7Използвайки &aVault&7!")); break; case "no": info(color(TAG + "&7Bruk &aVault&7!")); break; case "ch": info(color(TAG + "&7运用 &aVault&7!")); break; } } waitingList = new HashMap<>(); if (getConfig().contains("cooldown-time-display")) { switch (getConfig().getString("cooldown-time-display").toLowerCase()) { case "short": displayFormat = DisplayFormat.SHORT; break; case "medium": displayFormat = DisplayFormat.MEDIUM; break; case "full": displayFormat = DisplayFormat.FULL; break; default: displayFormat = DisplayFormat.MEDIUM; } } else displayFormat = DisplayFormat.MEDIUM; if (upCheck(this)) { SpigotUpdater updater = new SpigotUpdater(this, 30224); try { // If there's an update, tell the user that they can update if (updater.checkForUpdates()) { updateStatus = true; newVersion = updater.getLatestVersion(); switch (lang.getLanguage()) { case "en": info(color(TAG + "&cA new version of CitizensCMD is now available:")); break; case "pt": info(color(TAG + "&cA new version of CitizensCMD is now available:")); break; case "ro": info(color(TAG + "&cO noua versiune a CitizensCMD este acum valabila:")); break; case "bg": info(color(TAG + "&cНалична е нова версия на CitizensCMD:")); break; case "no": info(color(TAG + "&cEn ny versjon av CitizensCMD er nå tilgjengelig:")); break; case "ch": info(color(TAG + "&cCitizensCMD的新版本现已推出:")); break; } info(color(TAG + "&b&o" + updater.getResourceURL())); } } catch (Exception e) { // If it can't check for an update, tell the user and throw an error. info("Could not check for updates! Stacktrace:"); e.printStackTrace(); } } new UpdateScheduler(this).runTaskTimerAsynchronously(this, 72000L, 72000L); new CooldownScheduler(this).runTaskTimerAsynchronously(this, 36000L, 36000L); } @Override public void onDisable() { if (commandHandler != null) { commandHandler.disable(); cooldownHandler.saveToFile(); } } private boolean hasCitizens() { return Bukkit.getPluginManager().isPluginEnabled("Citizens"); } /** * Checks if PAPI is installed or not on the server * * @return Returns true if PAPI is found and false if not */ private boolean hasPAPI() { return Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI"); } /** * Registers all the commands to be used */ private void registerCommands() { getCommand("npcmd").setExecutor(commandHandler); Stream.of(new CMDHelp(this), new CMDAdd(this), new CMDCooldown(this), new CMDList(this), new CMDReload(this), new CMDRemove(this), new CMDEdit(this), new CMDPrice(this), new CMDSound()).forEach(commandHandler::register); } /** * Registers all the events to be used */ private void registerEvents() { PluginManager pm = getServer().getPluginManager(); pm.registerEvents(new UpdateEvent(this), this); pm.registerEvents(new NPCListener(this), this); } /** * Sets up the economy if Vault is present * * @return returns true or false depending on if Vault is or not present */ private boolean setupEconomy() { if (getServer().getPluginManager().getPlugin("Vault") == null) { return false; } RegisteredServiceProvider registeredServiceProvider = getServer().getServicesManager().getRegistration(Economy.class); if (registeredServiceProvider == null) { return false; } economy = registeredServiceProvider.getProvider(); shift = getConfig().getBoolean("shift-confirm"); return economy != null; } /** * Creates all the language files */ private void registerLangs(CitizensCMD plugin) { File langFile; for (String registeredLangFile : REGISTERED_LANG_FILES) { langFile = new File(plugin.getDataFolder(), "lang/" + registeredLangFile + ".yml"); if (!langFile.exists()) plugin.saveResource("lang/" + registeredLangFile + ".yml", false); } } /** * Sets the language that is supposed to be used */ public void setLang(String language) { switch (language.toLowerCase()) { case "en": case "eng": case "english": lang = new LangHandler(this, "en"); break; case "pt": case "port": case "portuguese": lang = new LangHandler(this, "pt"); break; case "ro": case "roma": case "romanian": lang = new LangHandler(this, "ro"); break; case "bg": case "bulg": case "bulgarian": lang = new LangHandler(this, "bg"); break; case "no": case "norw": case "norwegian": lang = new LangHandler(this, "no"); break; case "ch": case "chi": case "chinese": lang = new LangHandler(this, "ch"); break; default: lang = new LangHandler(this, "en"); break; } lang.initialize(); } /** * Gets the language that is selected on the config * * @return returns the language */ public LangHandler getLang() { return lang; } /** * Gets if or not should alert player of new update on join * * @return Returns update status */ public boolean getUpdateStatus() { return updateStatus; } /** * Sets new update status from scheduler * * @param newUpdateStatus New boolean with the update status; */ public void setUpdateStatus(boolean newUpdateStatus) { CitizensCMD.updateStatus = newUpdateStatus; } /** * Gets String with new version * * @return the new version */ public String getNewVersion() { return newVersion; } /** * Sets the new version string * * @param newVersion the new version to be set */ public void setNewVersion(String newVersion) { CitizensCMD.newVersion = newVersion; } /** * Gets the NPC data to be used in other classes without needing to open the file * * @return returns the DataHandler class */ public DataHandler getDataHandler() { return dataHandler; } /** * Gets the cooldown handler to check for cooldown informations * * @return Returns the cooldown handler */ public CooldownHandler getCooldownHandler() { return cooldownHandler; } /** * Gets the permission manager to set and unset permission * * @return the permission manager class */ public PermissionsManager getPermissionsManager() { return permissionsManager; } /** * Gets the economy to be used * * @return Returns the economy */ public static Economy getEconomy() { return economy; } /** * Gets the hashmap with the players waiting to confirm the NPC payment * * @return returns the list of players */ public HashMap getWaitingList() { return waitingList; } /** * Checks if player needs to shift or not to confirm payment * * @return Returns the boolean of whether or not players should shift */ public boolean shouldShift() { return shift; } /** * Sets the new shifting rule * * @param shift The new shifting rule */ public void setShift(boolean shift) { CitizensCMD.shift = shift; } /** * Checks is PAPI is present or not * * @return Returns true if PAPI is being used */ public boolean papiEnabled() { return papi; } /** * Gets the display format to be used * * @return Returns either SHORT, MEDIUM OR FULL */ public DisplayFormat getDisplayFormat() { return displayFormat; } /** * Sets the new display format when reloading * * @param displayFormat The new display format */ public void setDisplayFormat(DisplayFormat displayFormat) { CitizensCMD.displayFormat = displayFormat; } }