package com.ilummc.bugrepgui; import java.sql.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.bukkit.Bukkit; import org.bukkit.entity.Player; public class Database { /* * SERIAL REPNAME REPTIME REPMSG EXENAME EXETIME EXEMSG EXECUTED BACK * EXECUTED 1:MANUALREPLY 2:AUTOREPLY 3:IGNORE */ private static String dbtype = Storage.getConfig().getString("database", "sqlite"); private static Connection c = null; private static Statement state = null; private static String autoback = Storage.getConfig().getString("auto-sendback-msg"); public static String format = Storage.getMsg("join-notify"); public static String format2 = Storage.getMsg("join-notify2"); public static void test(){ connect(); String sql = "INSERT INTO br_bug (REPNAME, REPTIME, REPMSG, EXENAME, EXETIME, EXEMSG, EXECUTED, BACK)" + " VALUES ('a','b','c','d','g','h',1,1);"; try { state.executeUpdate(sql); } catch (SQLException e) { Storage.logExcept(e); } } public static Map loadStatsRep() { connect(); String sql = "SELECT REPNAME FROM br_bug;"; Map reprank = new TreeMap<>(); Integer repmax = 1; try { ResultSet res = state.executeQuery(sql); while (res.next()) { String repname = res.getString("REPNAME"); if (reprank.containsKey(repname)) { reprank.replace(repname, reprank.get(repname) + 1); if (repmax < reprank.get(repname)) repmax++; } else { reprank.put(repname, 1); } } } catch (SQLException e) { Storage.logExcept(e); } return reprank; } public static Map loadStatsExe() { connect(); String sql = "SELECT EXENAME,EXECUTED FROM br_bug;"; Map exerank = new TreeMap<>(); Integer exemax = 1; try { ResultSet res = state.executeQuery(sql); while (res.next()) { String exename = res.getString("EXENAME"); if (exerank.containsKey(exename)) { exerank.replace(exename, exerank.get(exename) + 1); if (exemax < exerank.get(exename)) exemax++; } else { exerank.put(exename, 1); } } } catch (SQLException e) { Storage.logExcept(e); } return exerank; } @SuppressWarnings("deprecation") public static Player getRepPlayer(String serial) { connect(); String sql = "SELECT REPNAME FROM br_bug WHERE SERIAL =" + serial + ";"; String name = "Steve"; try { ResultSet res = state.executeQuery(sql); if (res.next()) { name = res.getString("REPNAME"); res.close(); res = null; } } catch (SQLException e) { Storage.logExcept(e); } finally { close(); } return Bukkit.getPlayer(name); } public static void check(Player player) { connect(); String sql = "SELECT SERIAL,EXEMSG,EXENAME FROM br_bug WHERE REPNAME = '" + player.getName() + "' AND (EXECUTED = 1 OR EXECUTED = 2) AND BACK = 0 ORDER BY SERIAL ASC;"; String send[] = new String[12]; Integer[] ser = new Integer[6]; try { ResultSet res = state.executeQuery(sql); int limit = 0; while (((limit += 2) < 12) && res.next()) { Integer serial = res.getInt("SERIAL"); String msg = res.getString("EXEMSG"); String exename = res.getString("EXENAME"); String str = format.replaceAll("%serial%", serial.toString()).replaceAll("%exename%", exename) .replaceAll("%reply%", msg); String str2 = format2.replaceAll("%serial%", serial.toString()).replaceAll("%exename%", exename) .replaceAll("%reply%", msg); send[limit - 2] = Storage.compile(str); send[limit - 1] = Storage.compile(str2); ser[limit / 2] = serial; } res.close(); } catch (SQLException e) { Storage.logExcept(e); } Storage.sends(player, send); close(); setback(ser); } public static void setback(Integer[] ser) { connect(); for (int i = 1; i < (ser.length) && (ser[i] != null); i++) { String sql2 = "UPDATE br_bug SET BACK = 1 WHERE SERIAL = " + ser[i].toString() + ";"; try { state.executeUpdate(sql2); } catch (SQLException e) { Storage.logExcept(e); } } close(); } public static void setback(String ser) { connect(); String sql = "UPDATE br_bug SET BACK = 1 WHERE SERIAL = " + ser + ";"; try { state.executeUpdate(sql); } catch (SQLException e) { Storage.logExcept(e); } close(); } public static void qback(String serial, Player player) { // auto reply method connect(); Date date = new Date(); String exetime = String.format("%tc", date); String sql = "UPDATE br_bug SET EXETIME = '" + exetime + "', EXENAME = '" + player.getName() + "' ,EXECUTED = 2, EXEMSG = '" + autoback + "' WHERE SERIAL = " + serial + ";"; try { state.executeUpdate(sql); } catch (SQLException e) { Storage.logExcept(e); } close(); } public static void back(String serial, String msg, Player player) { // manual reply method connect(); Date date = new Date(); String exetime = String.format("%tc", date); String sql = "UPDATE br_bug SET EXETIME = '" + exetime + "', EXENAME = '" + player.getName() + "', EXECUTED = 1, EXEMSG = '" + msg + "' WHERE SERIAL = " + serial + ";"; try { state.executeUpdate(sql); } catch (SQLException e) { Storage.logExcept(e); } close(); } public static List list() { connect(); List set = new ArrayList<>(); String sql = "SELECT SERIAL,REPTIME,REPNAME,REPMSG FROM br_bug WHERE EXECUTED = 0;"; try { ResultSet res = state.executeQuery(sql); while (res.next()) { Bug bug = new Bug(res.getInt("SERIAL"), res.getString("REPTIME"), res.getString("REPNAME"), res.getString("REPMSG")); set.add(bug); } } catch (SQLException e) { Storage.logExcept(e); } close(); return set; } public static List listHis() { connect(); List set = new ArrayList<>(); String sql = "SELECT SERIAL,REPTIME,REPNAME,REPMSG,EXENAME,EXETIME,EXEMSG,EXECUTED FROM br_bug WHERE BACK = 1"; try { ResultSet res = state.executeQuery(sql); while (res.next()) { Bug bug = new Bug(res.getInt("SERIAL"), res.getString("REPTIME"), res.getString("REPNAME"), res.getString("REPMSG"), res.getString("EXETIME"), res.getString("EXENAME"), res.getString("EXEMSG"), res.getInt("EXECUTED")); set.add(bug); } } catch (SQLException e) { Storage.logExcept(e); } close(); return set; } public static void insert(Bug bug) { connect(); String sql = "INSERT INTO br_bug (REPTIME,REPNAME,REPMSG,EXECUTED,BACK)" + " VALUES ('" + bug.getRepTime() + "','" + bug.getName() + "','" + bug.getMsg() + "',0,0);"; try { state.executeUpdate(sql); } catch (SQLException e) { Storage.logExcept(e); } close(); } public static void ignore(String serial, Player player) { connect(); Date date = new Date(); String exetime = String.format("tc", date); String sql = "UPDATE br_bug SET EXETIME = '" + exetime + "', EXENAME = '" + player.getName() + "', EXECUTED = 3 WHERE SERIAL = " + serial + ";"; try { state.executeUpdate(sql); } catch (SQLException e) { Storage.logExcept(e); } close(); } public static String getSerial(Player player) { connect(); String sql = "SELECT SERIAL FROM br_bug WHERE REPNAME = '" + player.getName() + "' ORDER BY SERIAL DESC;"; Integer i = 0; try { ResultSet res = state.executeQuery(sql); if (res.next()) { i = res.getInt("SERIAL"); } res.close(); res = null; } catch (SQLException e1) { Storage.logExcept(e1); } finally { close(); } return i.toString(); } public static void connect() { if (dbtype.equalsIgnoreCase("sqlite")) { conSQLite(); } if (dbtype.equalsIgnoreCase("mysql")) { if (!conMySQL()) { Bukkit.getLogger().warning("[BugRepGUI] MySQL connect failed!"); Bukkit.getLogger().warning("[BugRepGUI] Now using SQLite!"); conSQLite(); } } } public static void close() { try { state.close(); state = null; c.close(); } catch (Exception e) { Storage.logExcept(e); } } public static void conSQLite() { try { Class.forName("org.sqlite.JDBC"); c = DriverManager.getConnection("jdbc:sqlite:" + Storage.getFolder().getAbsolutePath() + "/bug.db"); state = c.createStatement(); } catch (SQLException e) { Storage.logExcept(e); } catch (ClassNotFoundException e) { Storage.logExcept(e); } String sql = "CREATE TABLE IF NOT EXISTS br_bug " + "(SERIAL INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + " REPNAME TEXT NOT NULL, " + " REPTIME TEXT NOT NULL, " + " REPMSG TEXT NOT NULL, " + " EXENAME TEXT, " + " EXETIME TEXT, " + " EXEMSG TEXT, " + " EXECUTED INTEGER, " + " BACK INTEGER);"; try { state.executeUpdate(sql); } catch (SQLException e) { Storage.logExcept(e); } } public static boolean conMySQL() { String url = "jdbc:mysql://" + Storage.getConfig().getString("mysql-url") + ":" + Storage.getConfig().getString("mysql-port") + "/" + Storage.getConfig().getString("mysql-db"); try { Class.forName("com.mysql.jdbc.Driver"); c = DriverManager.getConnection(url, Storage.getConfig().getString("mysql-username"), Storage.getConfig().getString("mysql-password")); state = c.createStatement(); } catch (SQLException e) { Storage.logExcept(e); return false; } catch (ClassNotFoundException e) { Storage.logExcept(e); return false; } String sql = "CREATE TABLE IF NOT EXISTS br_bug " + "(SERIAL INT PRIMARY KEY AUTO_INCREMENT NOT NULL," + " REPNAME TEXT NOT NULL, " + " REPTIME TEXT NOT NULL, " + " REPMSG TEXT NOT NULL, " + " EXENAME TEXT, " + " EXETIME TEXT, " + " EXEMSG TEXT, " + " EXECUTED INT, " + " BACK INT);"; try { state.executeUpdate(sql); } catch (SQLException e) { Storage.logExcept(e); } return true; } }