package me.gtacraft.economy;
import me.gtacraft.economy.database.SQLConnectionThread;
import me.gtacraft.economy.database.SQLQueryThread;
import me.gtacraft.economy.database.SQLVars;
import me.gtacraft.economy.util.Util;
import me.gtacraft.plugins.safezone.util.SafezoneUtil;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
public class GTAEconomy extends JavaPlugin {
public static Logger log = new Logger();
private static GTAEconomy plugin;
public static volatile CopyOnWriteArrayList<String> sql_query = new CopyOnWriteArrayList<>();
public static volatile HashMap<UUID, Double> player_balances = new HashMap<>();
public SQLQueryThread sql_worker;
public static GTAEconomy get() {
return plugin;
}
public void onEnable() {
plugin = this;
saveDefaultConfig();
FileConfiguration f = getConfig();
SQLVars.SQL_HOST = f.getString("SQL.Host");
SQLVars.SQL_DB = f.getString("SQL.DB");
SQLVars.SQL_USER = f.getString("SQL.User");
SQLVars.SQL_PASS = f.getString("SQL.Pass");
SQLVars.SQL_PORT = f.getInt("SQL.Port");
SQLVars.SQL_URL = SQLVars.formatSqlCall(f.getString("SQL.URL"));
sql_worker = new SQLQueryThread();
sql_worker.start();
sql_query.add(SQLVars.formatSqlCall(SQLVars.CREATE_DATABASE));
sql_query.add(SQLVars.formatSqlCall(SQLVars.CREATE_ECO_TABLE));
doSQLWork();
new EconomyListener();
//hah no async u fool
for (Player player : Bukkit.getOnlinePlayers()) {
EconomyListener.get().onAsyncPreLogin(new AsyncPlayerPreLoginEvent(player.getName(), player.getAddress().getAddress(), player.getUniqueId()));
}
}
public void doSQLWork() {
for(String query : sql_query){
Connection con = null;
PreparedStatement pst = null;
try {
pst = SQLConnectionThread.getConnection().prepareStatement(query);
pst.executeUpdate();
} catch (Exception ex) {
ex.printStackTrace();
log.error(query, this.getClass());
} finally {
try {
if (pst != null) {
pst.close();
}
if (con != null) {
con.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
sql_query.remove(query);
}
}
public boolean onCommand(final CommandSender sender_, final Command cmd, final String label, final String[] args) {
final CommandSender player = sender_;
Runnable async = new Runnable() {
public void run() {
if (cmd.getName().equalsIgnoreCase("eco")) {
if (!player.isOp()) {
player.sendMessage(Util.f("&cYou do not have permission to use this command!"));
return;
}
if (args.length < 2) {
player.sendMessage(Util.f("&eFormat: &7/"+label+" <set,give,take,reset,check> [user] (balance)"));
return;
}
String swap = args[0].toLowerCase();
Player find = Bukkit.getPlayer(args[1]);
if (find == null) {
player.sendMessage(Util.f("&e"+args[1]+" &cis not online!"));
return;
}
switch (swap) {
case "clean": {
try {
PreparedStatement ps = SQLConnectionThread.getConnection().prepareCall("SELECT * FROM `gta_economy`;");
ps.execute();
ResultSet set = ps.getResultSet();
int clean = 0;
while (set.next()) {
String uuid = set.getString("uuid");
double balance = set.getDouble("balance");
if (balance < 0 || balance > 200000) {
++clean;
if (Bukkit.getOfflinePlayer(UUID.fromString(uuid)).isOnline()) {
Player p = Bukkit.getOfflinePlayer(UUID.fromString(uuid)).getPlayer();
p.sendMessage(ChatColor.RED+"Balance reset!");
EconomyAPI.setUserBalance(p.getUniqueId(), 0);
}
sql_query.add("UPDATE `gta_economy` SET balance=0 WHERE uuid='"+uuid+"'");
}
}
player.sendMessage("Cleaned: "+clean+" accounts!");
} catch (Exception ex) {
player.sendMessage(ChatColor.RED+"Error!");
ex.printStackTrace();
}
return;
}
case "set": {
if (args.length < 3) {
player.sendMessage(Util.f("&eFormat: &7/"+label+" set [user] [balance]"));
return;
}
double set = 0.0;
try { set = Double.parseDouble(args[2]); } catch (NumberFormatException err) {
player.sendMessage(Util.f("&c"+args[2]+" is not a valid number!"));
return;
}
EconomyAPI.setUserBalance(find.getUniqueId(), set);
player.sendMessage(Util.f("&aUser &e"+find.getName()+" &aset to: &e$"+format.format(set)));
break;
}
case "give": {
if (args.length < 3) {
player.sendMessage(Util.f("&eFormat: &7/"+label+" give [user] [balance]"));
return;
}
double set = 0.0;
try { set = Double.parseDouble(args[2]); } catch (NumberFormatException err) {
player.sendMessage(Util.f("&c"+args[2]+" is not a valid number!"));
return;
}
double has = EconomyAPI.getUserBalance(find.getUniqueId());
double before = set;
set = set+has;
EconomyAPI.setUserBalance(find.getUniqueId(), set);
player.sendMessage(Util.f("&aAdded &e$"+format.format(before)+" &ato &e"+find.getName()+"&a's balance! Current balance: &e$"+format.format(set)));
break;
}
case "take": {
if (args.length < 3) {
player.sendMessage(Util.f("&eFormat: &7/"+label+" take [user] [balance]"));
return;
}
double take = 0.0;
try { take = Double.parseDouble(args[2]); } catch (NumberFormatException err) {
player.sendMessage(Util.f("&c"+args[2]+" is not a valid number!"));
return;
}
double has = EconomyAPI.getUserBalance(find.getUniqueId());
double before = take;
take = has-take;
EconomyAPI.setUserBalance(find.getUniqueId(), take);
player.sendMessage(Util.f("&aTook &e$"+format.format(before)+" &ato &e"+find.getName()+"&a's balance! Current balance: &e$"+format.format(take)));
break;
}
case "reset": {
EconomyAPI.setUserBalance(find.getUniqueId(), 0.0);
player.sendMessage(Util.f("&aReset &e"+find.getName()+"&a's balance back to &e$0.00"));
break;
}
case "check": {
double has = EconomyAPI.getUserBalance(find.getUniqueId());
player.sendMessage(Util.f("&e"+find.getName()+"&a's balance is: &e$"+format.format(has)));
break;
}
}
} else if (cmd.getName().equalsIgnoreCase("bal")) {
if (!(player instanceof Player)) {
log.error("You must be a player to use this command!", getClass());
return;
}
Player p = (Player)player;
double bal = player_balances.get(p.getUniqueId());
String display = format.format(bal);
player.sendMessage(Util.f("&aYour balance: &e$"+display));
return;
} else if (cmd.getName().equalsIgnoreCase("withdraw")) {
if (!(player instanceof Player)) {
log.error("You must be a player to use this command!", getClass());
return;
}
Player p = (Player)player;
if (Bukkit.getPluginManager().getPlugin("Safezone") == null) {
player.sendMessage(Util.f("&c&l(!) &cYou cannot use this command on a hub server!"));
return;
}
if (!(SafezoneUtil.isInSafeZone(p.getLocation()))) {
player.sendMessage(Util.f("&c&l(!) &cYou must be in a safe zone to withdraw cash."));
return;
}
boolean hasSpace = space(p);
if (args.length < 1) {
player.sendMessage(Util.f("&eFormat: &7/"+label+" [amount]"));
return;
}
double take = 0.0;
try { take = Math.abs(Double.parseDouble(args[0])); } catch (NumberFormatException err) {
player.sendMessage(Util.f("&c"+args[0]+" is not a valid number!"));
return;
}
if (take > 50000 || take <= 0) {
player.sendMessage(Util.f("&cYou cannot withdraw this amount of money!"));
return;
}
double cashHas = EconomyAPI.getUserBalance(p.getUniqueId());
if (cashHas < take) {
player.sendMessage(Util.f("&c&l(!) &cYou do not have enough money to complete this transaction!"));
return;
}
if (!(hasSpace)) {
player.sendMessage(Util.f("&c&l(!) &cYou do not have enough room in your inventory!"));
return;
}
EconomyAPI.setUserBalance(p.getUniqueId(), cashHas-take);
ItemStack stack = cash_item.clone();
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(Util.f("&a&l$"+take));
stack.setItemMeta(meta);
p.getInventory().addItem(stack);
player.sendMessage(Util.f("&a&l(!) &aWithdraw complete! You now have &e$"+format.format(take)+"&a in cash!"));
}
return;
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(this, async);
return true;
}
static ItemStack cash_item = new ItemStack(Material.EMERALD);
static {
ItemMeta cashMeta = cash_item.getItemMeta();
cashMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&aMoney"));
cashMeta.setLore(Arrays.asList("Directly deposited into bank account when picked up!"));
cash_item.setItemMeta(cashMeta);
}
static boolean space(Player player) {
return player.getInventory().firstEmpty() != -1;
}
static DecimalFormat format = new DecimalFormat("#,##0.00");
public void onDisable() {
saveDefaultConfig();
try {
for (UUID u : player_balances.keySet()) {
PreparedStatement statement = SQLConnectionThread.getConnection().prepareStatement(SQLVars.UPDATE_PLAYER
.replace("%balance%", player_balances.get(u)+"")
.replace("%uuid%", u.toString()));
statement.execute();
}
} catch (SQLException err) {
err.printStackTrace();
}
}
}