2016-06-14 05:06:58 +02:00
|
|
|
package org.appledash.saneeconomy;
|
|
|
|
|
2017-09-22 04:58:00 +02:00
|
|
|
import com.google.common.collect.Iterables;
|
|
|
|
import com.google.common.io.ByteArrayDataInput;
|
|
|
|
import com.google.common.io.ByteArrayDataOutput;
|
|
|
|
import com.google.common.io.ByteStreams;
|
2017-07-03 18:54:32 +02:00
|
|
|
import org.appledash.saneeconomy.command.*;
|
2016-06-14 05:06:58 +02:00
|
|
|
import org.appledash.saneeconomy.economy.EconomyManager;
|
2017-11-10 13:10:09 +01:00
|
|
|
import org.appledash.saneeconomy.economy.backend.EconomyStorageBackend;
|
2017-07-03 06:17:18 +02:00
|
|
|
import org.appledash.saneeconomy.economy.backend.type.EconomyStorageBackendMySQL;
|
2016-08-15 08:34:55 +02:00
|
|
|
import org.appledash.saneeconomy.economy.logger.TransactionLogger;
|
2017-09-22 04:58:00 +02:00
|
|
|
import org.appledash.saneeconomy.event.SaneEconomyTransactionEvent;
|
2016-06-14 05:29:26 +02:00
|
|
|
import org.appledash.saneeconomy.listeners.JoinQuitListener;
|
2016-07-12 00:53:17 +02:00
|
|
|
import org.appledash.saneeconomy.updates.GithubVersionChecker;
|
2016-09-18 11:05:39 +02:00
|
|
|
import org.appledash.saneeconomy.utils.SaneEconomyConfiguration;
|
2016-06-15 01:19:00 +02:00
|
|
|
import org.appledash.saneeconomy.vault.VaultHook;
|
2017-07-03 06:17:18 +02:00
|
|
|
import org.appledash.sanelib.SanePlugin;
|
2017-07-03 18:54:32 +02:00
|
|
|
import org.appledash.sanelib.command.SaneCommand;
|
2017-09-22 04:58:00 +02:00
|
|
|
import org.bukkit.OfflinePlayer;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.Listener;
|
2016-06-14 05:06:58 +02:00
|
|
|
|
|
|
|
import java.io.File;
|
2017-09-23 13:24:28 +02:00
|
|
|
import java.util.*;
|
2016-06-14 05:06:58 +02:00
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Created by AppleDash on 6/13/2016.
|
|
|
|
* Blackjack is still best pony.
|
|
|
|
*/
|
2017-07-03 06:17:18 +02:00
|
|
|
public class SaneEconomy extends SanePlugin implements ISaneEconomy {
|
2016-06-14 05:06:58 +02:00
|
|
|
private static SaneEconomy instance;
|
|
|
|
private EconomyManager economyManager;
|
2016-06-15 01:19:00 +02:00
|
|
|
private VaultHook vaultHook;
|
2016-08-15 08:34:55 +02:00
|
|
|
private TransactionLogger transactionLogger;
|
2016-10-02 18:36:53 +02:00
|
|
|
private GithubVersionChecker versionChecker;
|
2016-06-14 05:06:58 +02:00
|
|
|
|
2019-11-04 18:08:24 +01:00
|
|
|
private final Map<String, SaneCommand> COMMANDS = new HashMap<String, SaneCommand>() {
|
|
|
|
{
|
2019-11-04 18:25:17 +01:00
|
|
|
this.put("balance", new BalanceCommand(SaneEconomy.this));
|
|
|
|
this.put("ecoadmin", new EconomyAdminCommand(SaneEconomy.this));
|
|
|
|
this.put("pay", new PayCommand(SaneEconomy.this));
|
|
|
|
this.put("saneeconomy", new SaneEcoCommand(SaneEconomy.this));
|
|
|
|
this.put("balancetop", new BalanceTopCommand(SaneEconomy.this));
|
2019-11-04 18:08:24 +01:00
|
|
|
}
|
|
|
|
};
|
2016-06-14 11:33:02 +02:00
|
|
|
|
2016-06-14 05:06:58 +02:00
|
|
|
public SaneEconomy() {
|
|
|
|
instance = this;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onEnable() {
|
2017-07-03 06:17:18 +02:00
|
|
|
super.onEnable();
|
|
|
|
|
2019-11-04 18:25:17 +01:00
|
|
|
if (!this.loadConfig()) { /* Invalid backend type or connection error of some sort */
|
|
|
|
this.shutdown();
|
2016-06-14 11:52:40 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-07-15 23:02:04 +02:00
|
|
|
if (this.getConfig().getBoolean("locale-override", false)) {
|
|
|
|
Locale.setDefault(Locale.ENGLISH);
|
|
|
|
}
|
|
|
|
|
2019-11-04 18:25:17 +01:00
|
|
|
this.loadCommands();
|
|
|
|
this.loadListeners();
|
2016-07-12 00:53:17 +02:00
|
|
|
|
2019-11-04 18:25:17 +01:00
|
|
|
if (this.getServer().getPluginManager().isPluginEnabled("Vault")) {
|
|
|
|
this.vaultHook = new VaultHook(this);
|
|
|
|
this.vaultHook.hook();
|
|
|
|
this.getLogger().info("Hooked into Vault.");
|
2016-07-12 00:53:17 +02:00
|
|
|
} else {
|
2019-11-04 18:25:17 +01:00
|
|
|
this.getLogger().info("Not hooking into Vault because it isn't loaded.");
|
2016-07-12 00:53:17 +02:00
|
|
|
}
|
|
|
|
|
2017-09-23 13:24:28 +02:00
|
|
|
if (this.getConfig().getBoolean("update-check", true)) {
|
2019-11-04 18:25:17 +01:00
|
|
|
this.versionChecker = new GithubVersionChecker("SaneEconomyCore", this.getDescription().getVersion().replace("-SNAPSHOT", ""));
|
|
|
|
this.getServer().getScheduler().runTaskAsynchronously(this, this.versionChecker::checkUpdateAvailable);
|
2017-09-23 13:24:28 +02:00
|
|
|
}
|
2016-07-12 02:22:07 +02:00
|
|
|
|
2019-11-04 18:25:17 +01:00
|
|
|
this.getServer().getScheduler().runTaskTimerAsynchronously(this, () -> {
|
|
|
|
this.economyManager.getBackend().reloadTopPlayerBalances();
|
2017-11-10 13:06:44 +01:00
|
|
|
}, 0L, (20L * this.getConfig().getLong("economy.baltop-update-interval", 300L)) /* Update baltop every 5 minutes by default */);
|
2017-09-22 04:58:00 +02:00
|
|
|
|
|
|
|
if (this.getConfig().getBoolean("multi-server-sync", false)) {
|
|
|
|
this.getServer().getPluginManager().registerEvents(new Listener() {
|
|
|
|
@EventHandler
|
|
|
|
public void onTransaction(SaneEconomyTransactionEvent evt) { // Trust me, I'm a doctor.
|
2017-11-10 13:06:44 +01:00
|
|
|
OfflinePlayer[] playersToSync = { evt.getTransaction().getSender().tryCastToPlayer(), evt.getTransaction().getReceiver().tryCastToPlayer() };
|
2017-09-22 04:58:00 +02:00
|
|
|
|
2017-09-23 13:24:28 +02:00
|
|
|
Player fakeSender = Iterables.getFirst(SaneEconomy.this.getServer().getOnlinePlayers(), null);
|
2017-09-22 04:58:00 +02:00
|
|
|
|
2017-09-23 13:24:28 +02:00
|
|
|
if (fakeSender == null) {
|
|
|
|
return;
|
2017-09-22 04:58:00 +02:00
|
|
|
}
|
2017-09-23 13:24:28 +02:00
|
|
|
|
2017-11-10 13:06:44 +01:00
|
|
|
Arrays.stream(playersToSync).filter(p -> (p != null) && !p.isOnline()).forEach(p -> {
|
2017-09-23 13:24:28 +02:00
|
|
|
ByteArrayDataOutput bado = ByteStreams.newDataOutput();
|
2019-11-10 23:54:03 +01:00
|
|
|
bado.writeUTF("Forward");
|
2019-11-11 22:08:04 +01:00
|
|
|
bado.writeUTF("ONLINE");
|
2017-09-23 13:24:28 +02:00
|
|
|
bado.writeUTF("SaneEconomy");
|
|
|
|
bado.writeUTF("SyncPlayer");
|
|
|
|
bado.writeUTF(p.getUniqueId().toString());
|
|
|
|
fakeSender.sendPluginMessage(SaneEconomy.this, "BungeeCord", bado.toByteArray());
|
|
|
|
});
|
2017-09-22 04:58:00 +02:00
|
|
|
}
|
|
|
|
}, this);
|
|
|
|
this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", (channel, player, bytes) -> {
|
|
|
|
if (!channel.equals("BungeeCord")) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ByteArrayDataInput badi = ByteStreams.newDataInput(bytes);
|
|
|
|
String subChannel = badi.readUTF();
|
|
|
|
|
|
|
|
if (subChannel.equals("SaneEconomy")) {
|
|
|
|
String opCode = badi.readUTF();
|
|
|
|
|
2017-09-23 13:24:28 +02:00
|
|
|
if (opCode.equals("SyncPlayer")) {
|
|
|
|
String playerUuid = badi.readUTF();
|
2017-11-10 13:10:09 +01:00
|
|
|
this.economyManager.getBackend().reloadEconomable(String.format("player:%s", playerUuid), EconomyStorageBackend.EconomableReloadReason.CROSS_SERVER_SYNC);
|
2017-09-22 04:58:00 +02:00
|
|
|
} else {
|
2017-11-10 13:06:44 +01:00
|
|
|
this.getLogger().warning("Invalid OpCode received on SaneEconomy plugin message channel: " + opCode);
|
2017-09-22 04:58:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
|
|
|
|
}
|
2016-06-15 01:19:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDisable() {
|
2019-11-04 18:25:17 +01:00
|
|
|
if (this.vaultHook != null) {
|
|
|
|
this.getLogger().info("Unhooking from Vault.");
|
|
|
|
this.vaultHook.unhook();
|
2016-07-12 00:53:17 +02:00
|
|
|
}
|
2016-08-14 22:52:02 +02:00
|
|
|
|
2017-07-13 02:06:14 +02:00
|
|
|
this.flushEconomyManager();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void flushEconomyManager() {
|
|
|
|
if (this.economyManager != null) {
|
|
|
|
this.getLogger().info("Flushing database...");
|
|
|
|
this.economyManager.getBackend().waitUntilFlushed();
|
2017-07-11 00:09:55 +02:00
|
|
|
|
2017-07-13 02:06:14 +02:00
|
|
|
if (this.economyManager.getBackend() instanceof EconomyStorageBackendMySQL) {
|
2019-11-04 18:25:17 +01:00
|
|
|
((EconomyStorageBackendMySQL) this.economyManager.getBackend()).closeConnections();
|
|
|
|
if (!((EconomyStorageBackendMySQL) this.economyManager.getBackend()).getConnection().getConnection().isFinished()) {
|
2017-07-03 18:48:05 +02:00
|
|
|
this.getLogger().warning("SaneDatabase didn't terminate all threads, something weird is going on?");
|
|
|
|
}
|
2017-07-03 06:17:18 +02:00
|
|
|
}
|
2016-09-19 08:08:25 +02:00
|
|
|
}
|
2016-06-14 11:52:40 +02:00
|
|
|
}
|
|
|
|
|
2017-07-13 02:06:14 +02:00
|
|
|
public boolean loadConfig() {
|
2019-11-04 18:25:17 +01:00
|
|
|
File configFile = new File(this.getDataFolder(), "config.yml");
|
2016-06-14 11:52:40 +02:00
|
|
|
|
2019-11-04 18:25:17 +01:00
|
|
|
if (configFile.exists() && this.getConfig().getBoolean("debug", false)) {
|
|
|
|
this.getLogger().info("Resetting configuration to default since debug == true.");
|
2016-06-14 13:18:40 +02:00
|
|
|
configFile.delete();
|
2019-11-04 18:25:17 +01:00
|
|
|
this.saveDefaultConfig();
|
|
|
|
this.reloadConfig();
|
|
|
|
this.getConfig().set("debug", true);
|
|
|
|
this.saveConfig();
|
2016-06-14 13:18:40 +02:00
|
|
|
} else {
|
2017-07-13 02:06:14 +02:00
|
|
|
if (!configFile.exists()) {
|
|
|
|
this.saveDefaultConfig();
|
|
|
|
}
|
|
|
|
this.reloadConfig();
|
2016-06-14 11:52:40 +02:00
|
|
|
}
|
2016-06-14 05:06:58 +02:00
|
|
|
|
2017-07-13 02:06:14 +02:00
|
|
|
this.flushEconomyManager(); // If we're reloading the configuration, we flush the old economy manager first
|
|
|
|
|
2016-09-21 23:37:51 +02:00
|
|
|
SaneEconomyConfiguration config = new SaneEconomyConfiguration(this);
|
2016-06-14 05:06:58 +02:00
|
|
|
|
2019-11-04 18:25:17 +01:00
|
|
|
this.economyManager = config.loadEconomyBackend();
|
|
|
|
this.transactionLogger = config.loadLogger();
|
2016-09-18 10:58:15 +02:00
|
|
|
|
2019-11-04 18:25:17 +01:00
|
|
|
this.saveConfig();
|
2016-09-18 11:11:22 +02:00
|
|
|
|
2019-11-04 18:25:17 +01:00
|
|
|
return this.economyManager != null;
|
2016-09-18 10:58:15 +02:00
|
|
|
}
|
|
|
|
|
2016-06-14 11:33:02 +02:00
|
|
|
private void loadCommands() {
|
2019-11-04 18:25:17 +01:00
|
|
|
this.getLogger().info("Initializing commands...");
|
|
|
|
this.COMMANDS.forEach((name, command) -> this.getCommand(name).setExecutor(command));
|
|
|
|
this.getLogger().info("Initialized commands.");
|
2016-06-14 11:52:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private void loadListeners() {
|
2019-11-04 18:25:17 +01:00
|
|
|
this.getLogger().info("Initializing listeners...");
|
|
|
|
this.getServer().getPluginManager().registerEvents(new JoinQuitListener(this), this);
|
|
|
|
this.getLogger().info("Initialized listeners.");
|
2016-06-14 11:33:02 +02:00
|
|
|
}
|
|
|
|
|
2019-11-04 18:08:24 +01:00
|
|
|
private void shutdown() {
|
2019-11-04 18:25:17 +01:00
|
|
|
this.getServer().getPluginManager().disablePlugin(this);
|
2016-06-14 05:06:58 +02:00
|
|
|
}
|
|
|
|
|
2016-10-02 18:36:53 +02:00
|
|
|
public GithubVersionChecker getVersionChecker() {
|
2019-11-04 18:25:17 +01:00
|
|
|
return this.versionChecker;
|
2016-10-02 18:36:53 +02:00
|
|
|
}
|
|
|
|
|
2016-06-14 05:06:58 +02:00
|
|
|
/**
|
2017-01-02 09:43:30 +01:00
|
|
|
* Get the active EconomyManager
|
2016-06-14 05:06:58 +02:00
|
|
|
* @return EconomyManager
|
|
|
|
*/
|
2016-09-18 10:37:44 +02:00
|
|
|
@Override
|
2016-06-14 05:06:58 +02:00
|
|
|
public EconomyManager getEconomyManager() {
|
2019-11-04 18:25:17 +01:00
|
|
|
return this.economyManager;
|
2016-06-14 05:06:58 +02:00
|
|
|
}
|
|
|
|
|
2016-08-15 08:34:55 +02:00
|
|
|
/**
|
2017-01-02 09:43:30 +01:00
|
|
|
* Get the active TransactionLogger
|
2016-08-15 08:34:55 +02:00
|
|
|
* @return TransactionLogger, if there is one.
|
|
|
|
*/
|
2016-09-18 10:37:44 +02:00
|
|
|
@Override
|
2017-01-02 09:43:30 +01:00
|
|
|
public Optional<TransactionLogger> getTransactionLogger() {
|
2019-11-04 18:25:17 +01:00
|
|
|
return Optional.ofNullable(this.transactionLogger);
|
2016-08-15 08:34:55 +02:00
|
|
|
}
|
|
|
|
|
2016-06-14 05:06:58 +02:00
|
|
|
/**
|
|
|
|
* Get the current plugin instance.
|
|
|
|
* @return Instance
|
|
|
|
*/
|
2017-07-17 22:11:58 +02:00
|
|
|
@Deprecated
|
2016-06-14 05:06:58 +02:00
|
|
|
public static SaneEconomy getInstance() {
|
|
|
|
return instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the logger for the plugin.
|
|
|
|
* @return Plugin logger.
|
|
|
|
*/
|
2019-11-04 18:08:24 +01:00
|
|
|
public static Logger logger() {
|
2016-08-14 22:18:43 +02:00
|
|
|
return instance.getLogger();
|
2016-06-14 05:06:58 +02:00
|
|
|
}
|
2017-07-15 22:36:32 +02:00
|
|
|
|
2017-11-10 13:06:44 +01:00
|
|
|
@Override
|
2017-07-15 22:36:32 +02:00
|
|
|
public VaultHook getVaultHook() {
|
2019-11-04 18:25:17 +01:00
|
|
|
return this.vaultHook;
|
2017-07-15 22:36:32 +02:00
|
|
|
}
|
2016-06-14 05:06:58 +02:00
|
|
|
}
|