package me.gtacraft.plugins.gangs; import lombok.Getter; import me.gtacraft.plugins.gangs.commands.CommandHandler; import me.gtacraft.plugins.gangs.commands.GangStaffCommands; import me.gtacraft.plugins.gangs.commands.UserCommands; import me.gtacraft.plugins.gangs.database.SQLConnectionThread; import me.gtacraft.plugins.gangs.database.SQLQueryThread; import me.gtacraft.plugins.gangs.database.SQLVars; import me.gtacraft.plugins.gangs.listeners.GTAConnectDisconnectListener; import me.gtacraft.plugins.gangs.listeners.GTADamageListener; import me.gtacraft.plugins.gangs.listeners.GTAMovementListener; import me.gtacraft.plugins.gangs.listeners.GTAVoiceListener; import me.gtacraft.plugins.gangs.util.LocationUtil; import me.gtacraft.plugins.gangs.util.Util; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.plugin.java.JavaPlugin; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * Created by Connor on 6/29/14. Designed for the GTA-Factions project. */ public class GTAGangs extends JavaPlugin { public static Logger log = new Logger(); @Getter private static GTAGangs instance; public static volatile CopyOnWriteArrayList<String> sql_query = new CopyOnWriteArrayList<String>(); // All SQL queries to run on ThreadPool. public static volatile HashMap<String, Player> async_player_map = new HashMap<String, Player>(); // Thread safe player map public SQLQueryThread sql_worker; public void onEnable() { instance = this; saveDefaultConfig(); loadConfigValues(); TELEPORT_TIME = getConfig().getInt("TeleportTime"); AUTO_SAVE_TIME = getConfig().getInt("AutoSaveTime"); INVITE_DURATION = getConfig().getInt("InviteDuration"); CHAT_FORMAT = getConfig().getString("ChatFormat"); sql_worker = new SQLQueryThread(); sql_worker.start(); sql_query.add(SQLVars.formatSqlCall(SQLVars.CREATE_DATABASE)); doSQLWork(); sql_query.add(SQLVars.formatSqlCall(SQLVars.CREATE_GANGS_TABLE)); sql_query.add(SQLVars.formatSqlCall(SQLVars.CREATE_PLAYERS_TABLE)); doSQLWork(); initListeners(); loadGangs(); getCommand("gang").setExecutor(CommandHandler.getInstance()); new UserCommands(); new GangStaffCommands(); for (Player player : Bukkit.getOnlinePlayers()) { async_player_map.put(player.getName(), player); GTAConnectDisconnectListener.getInstance().onAsyncPlayerPreLogin(new AsyncPlayerPreLoginEvent(player.getName(), player.getAddress().getAddress(), player.getUniqueId())); } GangInviteManager.zBegin(); Runnable autoSave = new Runnable() { @Override public void run() { autosave(); } }; Bukkit.getScheduler().scheduleAsyncRepeatingTask(this, autoSave, AUTO_SAVE_TIME*20, AUTO_SAVE_TIME*20); } public static int TELEPORT_TIME; public static int AUTO_SAVE_TIME; public static int INVITE_DURATION; public static String CHAT_FORMAT; private void loadGangs() { long before = System.currentTimeMillis(); try { PreparedStatement statement = SQLConnectionThread.getConnection().prepareStatement(SQLVars.formatSqlCall(SQLVars.GET_GANGS)); statement.execute(); ResultSet rs = statement.getResultSet(); while (rs.next()) { String name = rs.getString("name"); String members = rs.getString("members"); List<OfflinePlayer> all = Util.fromString(members); int friendlyFire = rs.getInt("friendly_fire"); String hideout = rs.getString("hideout"); Location loc = null; if (hideout != null) loc = LocationUtil.fromString(hideout); Gang gang = new Gang(all, name, friendlyFire); gang.setHideout(loc); GangManager.insertGang(gang); } long now = System.currentTimeMillis(); int diff = (int)(now-before); log.log("Gangs loaded in "+diff+" millaseconds!", this.getClass()); } catch (Exception err) { err.printStackTrace(); log.error("Could not load gangs! Disabling plugin!", this.getClass()); this.setEnabled(false); } } private void loadConfigValues() { 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")); } private void initListeners() { new GTAConnectDisconnectListener(); new GTADamageListener(); new GTAMovementListener(); new GTAVoiceListener(); } 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 void onDisable() { autosave(); } public void autosave() { log.notice("Autosaving all gangs... Next save time in "+AUTO_SAVE_TIME+" seconds!", this.getClass()); for (Gang gang : GangManager.getGangs()) { String members = Util.fromMembers(gang.getAllMembers()); if (members.equals("")) { sql_query.add(SQLVars.DELETE_GANG.replace("%name%", gang.getName())); } sql_query.add(SQLVars.UPDATE_GANG .replace("%members%", members) .replace("%friendly_fire%", gang.isFriendlyFire() ? "1" : "0") .replace("%hideout%", (gang.getHideout() == null ? "NULL" : LocationUtil.fromLocation(gang.getHideout()))) .replace("%name%", gang.getName())); } for (Player player : Bukkit.getOnlinePlayers()) { GangMember member = GangMember.fromPlayer(player); String gang = (member.getGang() == null ? "NULL" : "'"+member.getGang().getName()+"'"); String role = (member.getRole() == null ? "NULL" : member.getRole().getPermissionLevel()+""); sql_query.add(SQLVars.UPDATE_PLAYER.replace("%uuid", player.getUniqueId().toString()).replace("'%gang%'", gang).replace("%role%", role)); } } }