EpicHeads/src/main/java/com/songoda/epicheads/EpicHeads.java

331 lines
12 KiB
Java
Raw Normal View History

2019-05-04 11:05:54 +02:00
package com.songoda.epicheads;
2019-09-08 04:38:34 +02:00
import com.songoda.core.SongodaCore;
import com.songoda.core.SongodaPlugin;
import com.songoda.core.commands.CommandManager;
2019-09-09 16:55:27 +02:00
import com.songoda.core.compatibility.CompatibleMaterial;
2019-09-08 04:38:34 +02:00
import com.songoda.core.configuration.Config;
2022-09-05 22:50:19 +02:00
import com.songoda.core.database.DataMigrationManager;
import com.songoda.core.database.DatabaseConnector;
import com.songoda.core.database.SQLiteConnector;
2019-09-08 04:38:34 +02:00
import com.songoda.core.gui.GuiManager;
import com.songoda.core.hooks.EconomyManager;
import com.songoda.core.hooks.PluginHook;
import com.songoda.core.hooks.economies.Economy;
2022-09-05 22:50:19 +02:00
import com.songoda.epicheads.commands.*;
import com.songoda.epicheads.database.DataManager;
import com.songoda.epicheads.database.migrations._1_InitialMigration;
import com.songoda.epicheads.head.Category;
2019-05-05 09:28:55 +02:00
import com.songoda.epicheads.head.Head;
import com.songoda.epicheads.head.HeadManager;
2019-05-13 22:13:27 +02:00
import com.songoda.epicheads.listeners.DeathListeners;
2019-05-05 09:28:55 +02:00
import com.songoda.epicheads.listeners.ItemListeners;
import com.songoda.epicheads.listeners.LoginListeners;
2019-05-06 02:21:51 +02:00
import com.songoda.epicheads.players.EPlayer;
2019-05-05 09:28:55 +02:00
import com.songoda.epicheads.players.PlayerManager;
2019-09-08 04:38:34 +02:00
import com.songoda.epicheads.settings.Settings;
2019-05-06 02:21:51 +02:00
import com.songoda.epicheads.utils.storage.Storage;
import com.songoda.epicheads.utils.storage.StorageRow;
import com.songoda.epicheads.utils.storage.types.StorageYaml;
2019-05-04 11:05:54 +02:00
import org.bukkit.Bukkit;
2022-09-05 22:50:19 +02:00
import org.bukkit.ChatColor;
2019-07-20 17:23:02 +02:00
import org.bukkit.plugin.PluginManager;
2019-05-05 09:28:55 +02:00
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
2022-09-05 22:50:19 +02:00
import java.io.*;
2019-05-05 09:28:55 +02:00
import java.net.URL;
import java.nio.charset.StandardCharsets;
2022-09-05 22:50:19 +02:00
import java.util.ArrayList;
import java.util.List;
2019-05-05 09:28:55 +02:00
import java.util.Optional;
2019-05-06 02:21:51 +02:00
import java.util.UUID;
2019-05-04 11:05:54 +02:00
2019-09-08 04:38:34 +02:00
public class EpicHeads extends SongodaPlugin {
private static EpicHeads INSTANCE;
2019-05-04 11:05:54 +02:00
2019-09-08 15:35:39 +02:00
private final GuiManager guiManager = new GuiManager(this);
2019-05-05 09:28:55 +02:00
private HeadManager headManager;
private PlayerManager playerManager;
2019-05-04 11:05:54 +02:00
private CommandManager commandManager;
2019-10-11 19:24:52 +02:00
private PluginHook itemEconomyHook;
2019-05-04 11:05:54 +02:00
2022-09-05 22:50:19 +02:00
private DatabaseConnector databaseConnector;
private DataManager dataManager;
2019-05-04 11:05:54 +02:00
public static EpicHeads getInstance() {
return INSTANCE;
}
@Override
2019-09-08 04:38:34 +02:00
public void onPluginLoad() {
2019-05-04 11:05:54 +02:00
INSTANCE = this;
2019-10-11 19:24:52 +02:00
this.itemEconomyHook = PluginHook.addHook(Economy.class, "EpicHeads", com.songoda.epicheads.utils.ItemEconomy.class);
2019-09-08 04:38:34 +02:00
}
2019-05-04 11:05:54 +02:00
2019-09-08 04:38:34 +02:00
@Override
public void onPluginDisable() {
2022-09-05 22:50:19 +02:00
shutdownDataManager(this.dataManager);
this.databaseConnector.closeConnection();
2019-09-08 04:38:34 +02:00
}
@Override
public void onPluginEnable() {
// Run Songoda Updater
2019-09-09 16:55:27 +02:00
SongodaCore.registerPlugin(this, 26, CompatibleMaterial.PLAYER_HEAD);
2019-05-04 11:05:54 +02:00
2019-09-08 04:38:34 +02:00
// Load Economy
EconomyManager.load();
2019-05-04 11:05:54 +02:00
// Setup Managers
this.headManager = new HeadManager();
this.playerManager = new PlayerManager();
2019-09-08 04:38:34 +02:00
// Setup Config
Settings.setupConfig();
this.setLocale(Settings.LANGUGE_MODE.getString(), false);
2019-05-04 11:05:54 +02:00
2019-09-08 04:38:34 +02:00
// Set economy preference
2019-09-08 15:35:39 +02:00
String ecoPreference = Settings.ECONOMY_PLUGIN.getString();
if (ecoPreference.equalsIgnoreCase("item")) {
2019-09-08 15:35:39 +02:00
EconomyManager.getManager().setPreferredHook(itemEconomyHook);
} else {
EconomyManager.getManager().setPreferredHook(ecoPreference);
}
2019-09-08 04:38:34 +02:00
// Register commands
this.commandManager = new CommandManager(this);
2019-09-08 15:35:39 +02:00
this.commandManager.addCommand(new CommandEpicHeads(guiManager))
2019-09-08 04:38:34 +02:00
.addSubCommands(
new CommandAdd(this),
new CommandBase64(this),
new CommandGive(this),
new CommandGiveToken(this),
new CommandHelp(this),
new CommandReload(this),
2019-09-08 15:35:39 +02:00
new CommandSearch(guiManager),
new CommandSettings(guiManager),
2019-09-08 04:38:34 +02:00
new CommandUrl(this)
);
2019-05-04 11:05:54 +02:00
2019-05-05 09:28:55 +02:00
// Register Listeners
2019-09-08 04:38:34 +02:00
guiManager.init();
PluginManager pluginManager = Bukkit.getPluginManager();
2019-07-20 17:23:02 +02:00
pluginManager.registerEvents(new DeathListeners(this), this);
pluginManager.registerEvents(new ItemListeners(this), this);
pluginManager.registerEvents(new LoginListeners(this), this);
2019-05-05 09:28:55 +02:00
// Download Heads
downloadHeads();
// Load Heads
loadHeads();
2019-09-08 04:38:34 +02:00
int timeout = Settings.AUTOSAVE.getInt() * 60 * 20;
2022-09-05 22:50:19 +02:00
Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> dataManager.saveAllPlayers(), timeout, timeout);
2019-05-04 11:05:54 +02:00
}
@Override
public void onDataLoad() {
2022-09-05 22:50:19 +02:00
// Database stuff.
this.databaseConnector = new SQLiteConnector(this);
this.getLogger().info("Data handler connected using SQLite.");
this.dataManager = new DataManager(this.databaseConnector, this);
DataMigrationManager dataMigrationManager = new DataMigrationManager(this.databaseConnector, this.dataManager,
new _1_InitialMigration());
dataMigrationManager.runMigrations();
Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
// Legacy data! Yay!
File folder = getDataFolder();
File dataFile = new File(folder, "data.yml");
boolean converted = false;
if (dataFile.exists()) {
converted = true;
Storage storage = new StorageYaml(this);
if (storage.containsGroup("players")) {
console.sendMessage("[" + getDescription().getName() + "] " + ChatColor.RED +
"Conversion process starting. Do NOT turn off your server. " +
"EpicHeads hasn't fully loaded yet, so make sure users don't" +
"interact with the plugin until the conversion process is complete.");
List<EPlayer> players = new ArrayList<>();
for (StorageRow row : storage.getRowsByGroup("players")) {
if (row.get("uuid").asObject() == null) {
continue;
}
players.add(new EPlayer(
UUID.fromString(row.get("uuid").asString()),
(List<String>) row.get("favorites").asObject()));
}
dataManager.migratePlayers(players);
}
2019-05-06 02:21:51 +02:00
2022-09-05 22:50:19 +02:00
if (storage.containsGroup("local")) {
for (StorageRow row : storage.getRowsByGroup("local")) {
String tagStr = row.get("category").asString();
Optional<Category> tagOptional = headManager.getCategories().stream()
.filter(t -> t.getName().equalsIgnoreCase(tagStr)).findFirst();
Category category = tagOptional.orElseGet(() -> new Category(tagStr));
Head head = new Head(row.get("id").asInt(),
row.get("name").asString(),
row.get("url").asString(),
category,
true,
null,
(byte) 0);
dataManager.createLocalHead(head);
}
if (storage.containsGroup("disabled")) {
List<Integer> ids = new ArrayList<>();
for (StorageRow row : storage.getRowsByGroup("disabled")) {
ids.add(row.get("id").asInt());
}
dataManager.migrateDisabledHead(ids);
}
}
2019-05-06 02:21:51 +02:00
2022-09-05 22:50:19 +02:00
dataFile.delete();
2019-05-06 02:21:51 +02:00
}
2022-09-05 22:50:19 +02:00
final boolean finalConverted = converted;
dataManager.queueAsync(() -> {
if (finalConverted) {
console.sendMessage("[" + getDescription().getName() + "] " + ChatColor.GREEN + "Conversion complete :)");
}
2019-05-06 02:21:51 +02:00
2022-09-05 22:50:19 +02:00
this.dataManager.getLocalHeads((heads) -> {
this.headManager.addLocalHeads(heads);
getLogger().info("Loaded " + headManager.getHeads().size() + " heads");
});
this.dataManager.getDisabledHeads((ids) -> {
for (int id : ids) {
headManager.disableHead(new Head(id, false));
}
});
}, "create");
});
}
2019-05-05 09:28:55 +02:00
private void downloadHeads() {
try {
InputStream is = new URL("https://songoda.github.io/EpicHeads/heads.json").openStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
2019-05-05 09:28:55 +02:00
String jsonText = readAll(rd);
JSONParser parser = new JSONParser();
JSONArray json = (JSONArray) parser.parse(jsonText);
try (FileWriter file = new FileWriter(new File(getDataFolder(), "heads.json"))) {
2019-05-05 09:28:55 +02:00
file.write(json.toJSONString());
}
} catch (Exception ex) {
getLogger().warning("Failed to download heads: " + ex.getMessage());
2019-05-05 09:28:55 +02:00
}
}
private boolean loadHeads() {
try {
this.headManager.clear();
2020-02-27 22:24:46 +01:00
this.headManager.addCategory(new Category(getLocale()
.getMessage("general.word.latestpack").getMessage(), true));
2019-05-05 09:28:55 +02:00
JSONParser parser = new JSONParser();
JSONArray jsonArray = (JSONArray) parser.parse(new FileReader(getDataFolder() + "/heads.json"));
for (Object o : jsonArray) {
JSONObject jsonObject = (JSONObject) o;
String categoryStr = (String) jsonObject.get("tags");
Optional<Category> tagOptional = headManager.getCategories().stream().filter(t -> t.getName().equalsIgnoreCase(categoryStr)).findFirst();
2019-05-05 09:28:55 +02:00
Category category = tagOptional.orElseGet(() -> new Category(categoryStr));
2019-05-05 09:28:55 +02:00
int id = Integer.parseInt((String) jsonObject.get("id"));
Head head = new Head(id,
2019-05-05 09:28:55 +02:00
(String) jsonObject.get("name"),
(String) jsonObject.get("url"),
category,
false,
(String) jsonObject.get("pack"),
2019-05-05 09:28:55 +02:00
Byte.parseByte((String) jsonObject.get("staff_picked")));
if (head.getName() == null || head.getName().equals("null")
|| head.getPack() != null && head.getPack().equals("null")) continue;
2019-05-05 09:28:55 +02:00
if (!tagOptional.isPresent())
headManager.addCategory(category);
2019-05-05 09:28:55 +02:00
headManager.addHead(head);
}
} catch (IOException | ParseException ex) {
getLogger().warning(() -> {
if (ex instanceof ParseException) {
return "Disabling plugin, failed to parse heads: " + ex.getMessage();
}
return "Disabling plugin, failed to load heads: " + ex.getMessage();
});
2019-05-05 09:28:55 +02:00
return false;
}
2019-05-05 09:28:55 +02:00
return true;
}
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
2019-09-08 04:38:34 +02:00
@Override
public void onConfigReload() {
this.setLocale(getConfig().getString("System.Language Mode"), true);
2019-07-19 16:39:19 +02:00
this.locale.reloadMessages();
2019-09-08 04:38:34 +02:00
downloadHeads();
loadHeads();
2019-05-04 11:05:54 +02:00
}
2019-09-08 04:38:34 +02:00
@Override
public List<Config> getExtraConfig() {
return null;
}
public CommandManager getCommandManager() {
return commandManager;
2019-05-04 11:05:54 +02:00
}
2019-05-05 09:28:55 +02:00
public HeadManager getHeadManager() {
return headManager;
}
public PlayerManager getPlayerManager() {
return playerManager;
}
2022-09-05 22:50:19 +02:00
public DatabaseConnector getDatabaseConnector() {
return databaseConnector;
}
public DataManager getDataManager() {
return dataManager;
}
2019-05-04 11:05:54 +02:00
}