diff --git a/bin/.gitignore b/bin/.gitignore
index c2d9872..1874f1d 100644
--- a/bin/.gitignore
+++ b/bin/.gitignore
@@ -1 +1,7 @@
/com/
+/bungee.yml
+/config.yml
+/lang.yml
+/lang_cn.yml
+/lang_en.yml
+/plugin.yml
diff --git a/pom.xml b/pom.xml
index c3b2f91..bc110d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
.
- ${basedir}
+ ${basedir}/src/
diff --git a/bungee.yml b/src/bungee.yml
similarity index 100%
rename from bungee.yml
rename to src/bungee.yml
diff --git a/config.yml b/src/config.yml
similarity index 100%
rename from config.yml
rename to src/config.yml
diff --git a/lang.yml b/src/lang.yml
similarity index 100%
rename from lang.yml
rename to src/lang.yml
diff --git a/lang_cn.yml b/src/lang_cn.yml
similarity index 100%
rename from lang_cn.yml
rename to src/lang_cn.yml
diff --git a/lang_en.yml b/src/lang_en.yml
similarity index 100%
rename from lang_en.yml
rename to src/lang_en.yml
diff --git a/plugin.yml b/src/plugin.yml
similarity index 100%
rename from plugin.yml
rename to src/plugin.yml
diff --git a/target/BugRepGUI-b.jar b/target/BugRepGUI-b.jar
new file mode 100644
index 0000000..20d3eb0
Binary files /dev/null and b/target/BugRepGUI-b.jar differ
diff --git a/target/classes/bungee.yml b/target/classes/bungee.yml
new file mode 100644
index 0000000..1a363e1
--- /dev/null
+++ b/target/classes/bungee.yml
@@ -0,0 +1,4 @@
+name: BugRepGUI
+main: com.ilummc.bugrepgui.bungee.Main
+version: 1.5b
+author: IzzelAliz
\ No newline at end of file
diff --git a/target/classes/com/ilummc/bugrepgui/Bug.java b/target/classes/com/ilummc/bugrepgui/Bug.java
new file mode 100644
index 0000000..b835614
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/Bug.java
@@ -0,0 +1,124 @@
+package com.ilummc.bugrepgui;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.SkullMeta;
+
+public class Bug {
+ /*
+ * SERIAL REPNAME REPTIME REPMSG EXENAME EXETIME EXEMSG EXECUTED BACK METHOD
+ */
+ @SuppressWarnings("deprecation")
+ OfflinePlayer player = Bukkit.getOfflinePlayer("Steve"), exeplayer = Bukkit.getOfflinePlayer("Steve");
+ String repmsg = "", reptime = "", exetime = "", exemsg = "";
+ Date date = new Date();
+ Locale l;
+ Integer serial = 0, method = 0;
+
+ public Bug(Player player) {
+ this.player = player;
+ repmsg = "";
+ date = new Date();
+ l = new Locale(Storage.getConfig().getString("lang"), Storage.getConfig().getString("locale"));
+ reptime = String.format(l, "%tc", date);
+ }
+
+ @SuppressWarnings("deprecation")
+ public Bug(int serial, String reptime, String repname, String repmsg) {
+ this.repmsg = repmsg;
+ this.reptime = reptime;
+ this.serial = serial;
+ this.player = Bukkit.getOfflinePlayer(repname);
+
+ }
+
+ @SuppressWarnings("deprecation")
+ public Bug(int serial, String reptime, String repname, String repmsg, String exetime, String exename, String exemsg,
+ Integer method) {
+ this.repmsg = repmsg;
+ this.reptime = reptime;
+ this.serial = serial;
+ this.player = Bukkit.getOfflinePlayer(repname);
+ this.exeplayer = Bukkit.getOfflinePlayer(exename);
+ this.exetime = exetime;
+ this.exemsg = exemsg;
+ this.method = method;
+ }
+
+ public ItemStack toItem() {
+ ItemStack head = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
+ SkullMeta m = (SkullMeta) head.getItemMeta();
+ m.setOwner(player.getName());
+ m.setDisplayName(serial.toString());
+ List l = new ArrayList<>();
+ l.add("¡ìb" + player.getName());
+ l.add("¡ìe" + reptime + "¡ìf");
+ String[] lorem = this.repmsg.split("#");
+ for (int i = 0; i < lorem.length; i++) {
+ l.add("¡ìe" + lorem[i]);
+ }
+ m.setLore(l);
+ head.setItemMeta(m);
+ return head;
+ }
+
+ public ItemStack toItemExecuted(){
+ ItemStack head = new ItemStack(Material.SKULL_ITEM, 1 ,(short)3);
+ SkullMeta m =(SkullMeta) head.getItemMeta();
+ m.setOwner(player.getName());
+ m.setDisplayName("¡ìa#"+serial.toString());
+ List l = new ArrayList<>();
+ l.add("¡ìb"+player.getName());
+ l.add("¡ìe"+reptime+"¡ìf");
+ String[] lorem= this.repmsg.split("#");
+ for(int i=0;i 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;
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/EventListener.java b/target/classes/com/ilummc/bugrepgui/EventListener.java
new file mode 100644
index 0000000..c6929a4
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/EventListener.java
@@ -0,0 +1,142 @@
+package com.ilummc.bugrepgui;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.bukkit.event.player.PlayerCommandPreprocessEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.inventory.Inventory;
+
+public class EventListener implements org.bukkit.event.Listener {
+ String alias;
+ public EventListener setAlias(String msg) {
+ this.alias = msg;
+ return this;
+ }
+
+ @EventHandler
+ public void onCommand(PlayerCommandPreprocessEvent evt) {
+ if (evt.getMessage().equalsIgnoreCase("/"+alias)) {
+ evt.setCancelled(true);
+ Player sender = evt.getPlayer();
+ if (sender.hasPermission("bugrepgui.report")) {
+ Bug bug = new Bug(sender);
+ Storage.putMap(bug);
+ Storage.send(sender, "input-bug-info");
+ return;
+ } else {
+ Storage.send(sender, "no-perm");
+ return;
+ }
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
+ public void onChat(AsyncPlayerChatEvent evt) {
+ String regex2 = "[^']+";
+ Pattern pattern2 = Pattern.compile(regex2);
+ Matcher m2 = pattern2.matcher(evt.getMessage());
+ if (Storage.map.containsKey(evt.getPlayer().getUniqueId().toString())) {
+ evt.setCancelled(true);
+ if (m2.matches()) {
+ Bug bug = Storage.map.get(evt.getPlayer().getUniqueId().toString());
+ bug.append(evt.getMessage());
+ evt.getPlayer().sendMessage(Storage.getMsg("continue-input"));
+ return;
+ } else {
+ Storage.send(evt.getPlayer(), "illegal-char");
+ return;
+ }
+ }
+ if (Storage.back.containsKey(evt.getPlayer().getUniqueId().toString())) {
+ evt.setCancelled(true);
+ Database.back(Storage.back.get(evt.getPlayer().getUniqueId().toString()), evt.getMessage(),
+ evt.getPlayer());
+ if (!Storage.getConfig().getBoolean("use-bungee")) {
+ Notify.notifyb(Storage.back.get(evt.getPlayer().getUniqueId().toString()), evt.getMessage(),
+ evt.getPlayer());
+ }
+ Storage.back.remove(evt.getPlayer().getUniqueId().toString());
+ Storage.send(evt.getPlayer(), "send-back-success");
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
+ public void onMove(PlayerMoveEvent evt) {
+ if (Storage.map.containsKey(evt.getPlayer().getUniqueId().toString())) {
+ evt.setCancelled(true);
+ Bug bug = Storage.map.get(evt.getPlayer().getUniqueId().toString());
+ Database.insert(bug);
+ evt.getPlayer().sendMessage(Storage.getPrefix()
+ + Storage.getMsg("rep-suc").replaceAll("%serial%", Database.getSerial(evt.getPlayer())));
+ if (!Storage.getConfig().getBoolean("use-bungee")) {
+ Notify.notifyt(evt.getPlayer());
+ }
+ Storage.map.remove(evt.getPlayer().getUniqueId().toString());
+ return;
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
+ public void onOffline(PlayerQuitEvent evt) {
+ if (Storage.map.containsKey(evt.getPlayer().getUniqueId().toString())) {
+ Storage.map.remove(evt.getPlayer().getUniqueId().toString());
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
+ public void onClick(InventoryClickEvent evt) {
+ String regex = "[¡ì[0-9a-fA-f]]*\\u005b\\s[0-9]*\\s/\\s[0-9]*\\s\\u005d\\s*[\\d\\D]*";
+ Pattern pattern = Pattern.compile(regex);
+ Matcher m = pattern.matcher(evt.getInventory().getTitle());
+ String regex2 = "[¡ì[0-9a-fA-f]]*\\u0028\\s[0-9]*\\s/\\s[0-9]*\\s\\u0029\\s*[\\d\\D]*";
+ Pattern pattern2 = Pattern.compile(regex2);
+ Matcher m2 = pattern2.matcher(evt.getInventory().getTitle());
+ if (m2.matches()) {
+ evt.setCancelled(true);
+ Inventory inv = evt.getInventory();
+ Integer id = evt.getRawSlot();
+ String arr = evt.getInventory().getTitle();
+ String pagestr = "";
+ for (int i = 4;; i++) {
+ if (arr.charAt(i) >= '0' && arr.charAt(i) <= '9') {
+ pagestr = pagestr + arr.charAt(i);
+ } else {
+ break;
+ }
+ }
+ Integer page = Integer.parseInt(pagestr);
+ GUI.clickHis(inv, page, id, evt.getClick(), (Player) evt.getWhoClicked());
+ }
+ if (m.matches()) {
+ evt.setCancelled(true);
+ Inventory inv = evt.getInventory();
+ Integer id = evt.getRawSlot();
+ String arr = evt.getInventory().getTitle();
+ String pagestr = "";
+ for (int i = 4;; i++) {
+ if (arr.charAt(i) >= '0' && arr.charAt(i) <= '9') {
+ pagestr = pagestr + arr.charAt(i);
+ } else {
+ break;
+ }
+ }
+ Integer page = Integer.parseInt(pagestr);
+ GUI.click(inv, page, id, evt.getClick(), (Player) evt.getWhoClicked());
+ return;
+ }
+
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
+ public void onJoin(PlayerJoinEvent evt) {
+ Database.check(evt.getPlayer());
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/GUI.java b/target/classes/com/ilummc/bugrepgui/GUI.java
new file mode 100644
index 0000000..24f96b4
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/GUI.java
@@ -0,0 +1,235 @@
+package com.ilummc.bugrepgui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+public class GUI {
+ static List invs = new ArrayList<>();
+ static List his = new ArrayList<>();
+ static Integer pages;
+
+ public static void open(Player player, int page) {
+ loadInv();
+ player.closeInventory();
+ player.openInventory(invs.get(page - 1));
+ }
+
+ public static void openHistory(Player player, int page) {
+ loadHis(player);
+ player.closeInventory();
+ player.openInventory(his.get(page - 1));
+ }
+
+ public static void loadHis(Player player) {
+ his = new ArrayList<>();
+ List set = Database.listHis();
+ Iterator it = set.iterator();
+ List nlist = new ArrayList<>();
+ while (it.hasNext()) {
+ nlist.add(it.next().toItemExecuted());
+ }
+ setItemHis(nlist, player);
+ }
+
+ public static boolean loadInv() {
+ invs = new ArrayList<>();
+ List set = Database.list();
+ Iterator it = set.iterator();
+ List nlist = new ArrayList<>();
+ while (it.hasNext()) {
+ nlist.add(it.next().toItem());
+ }
+ setItem(nlist);
+ return true;
+ }
+
+ private static void setItemHis(List nlist, Player player) {
+ ItemStack lp = new ItemStack(Material.REDSTONE);
+ ItemMeta lm = lp.getItemMeta();
+ lm.setDisplayName(Storage.getMsg("last-page"));
+ lp.setItemMeta(lm);
+ ItemStack np = new ItemStack(Material.EMERALD);
+ ItemMeta nm = np.getItemMeta();
+ nm.setDisplayName(Storage.getMsg("next-page"));
+ np.setItemMeta(nm);
+ ItemStack usage = new ItemStack(Material.PAPER);
+ ItemMeta um = usage.getItemMeta();
+ um.setDisplayName(Storage.getMsg("to-not-executed"));
+ usage.setItemMeta(um);
+ ItemStack re = new ItemStack(Material.BOOK);
+ ItemMeta rm = re.getItemMeta();
+ rm.setDisplayName(Storage.getMsg("refresh"));
+ re.setItemMeta(rm);
+ ItemStack ex = new ItemStack(Material.NETHER_STAR);
+ ItemMeta em = ex.getItemMeta();
+ em.setDisplayName(Storage.getMsg("exit"));
+ ex.setItemMeta(em);
+ Iterator iter = nlist.iterator();
+ int all = nlist.size();
+ pages = (((all % 45) == 0) && (all != 0)) ? (all / 45) : (all / 45 + 1);
+ for (Integer t = 1; t <= pages; t++) {
+ Inventory inv = Bukkit.createInventory(player, 54,
+ "¡ìd( " + t.toString() + " / " + pages.toString() + " ) " + Storage.getMsg("history-name"));
+ for (int i = 0; i <= 44 && iter.hasNext(); i++) {
+ ItemStack it = iter.next();
+ inv.setItem(i, it);
+ }
+ inv.setItem(45, lp);
+ inv.setItem(47, np);
+ inv.setItem(51, usage);
+ inv.setItem(49, re);
+ inv.setItem(53, ex);
+ his.add(t - 1, inv);
+ }
+ }
+
+ public static void setItem(List item) {
+ ItemStack lp = new ItemStack(Material.REDSTONE);
+ ItemMeta lm = lp.getItemMeta();
+ lm.setDisplayName(Storage.getMsg("last-page"));
+ lp.setItemMeta(lm);
+ ItemStack np = new ItemStack(Material.EMERALD);
+ ItemMeta nm = np.getItemMeta();
+ nm.setDisplayName(Storage.getMsg("next-page"));
+ np.setItemMeta(nm);
+ ItemStack usage = new ItemStack(Material.PAPER);
+ ItemMeta um = usage.getItemMeta();
+ um.setDisplayName(Storage.getMsg("usage-name"));
+ List lore = Storage.getMsgs("usage-lore");
+ um.setLore(lore);
+ usage.setItemMeta(um);
+ ItemStack re = new ItemStack(Material.BOOK);
+ ItemMeta rm = re.getItemMeta();
+ rm.setDisplayName(Storage.getMsg("refresh"));
+ re.setItemMeta(rm);
+ ItemStack ex = new ItemStack(Material.NETHER_STAR);
+ ItemMeta em = ex.getItemMeta();
+ em.setDisplayName(Storage.getMsg("exit"));
+ ex.setItemMeta(em);
+ // add items to bug view
+ Iterator iter = item.iterator();
+ int all = item.size();
+ pages = (((all % 45) == 0) && (all != 0)) ? (all / 45) : (all / 45 + 1);
+ for (Integer t = 1; t <= pages; t++) {
+ Inventory inv = Bukkit.createInventory(null, 54,
+ "¡ìd[ " + t.toString() + " / " + pages.toString() + " ] " + Storage.getMsg("gui-name"));
+ for (int i = 0; i <= 44 && iter.hasNext(); i++) {
+ ItemStack it = iter.next();
+ inv.setItem(i, it);
+ }
+ inv.setItem(45, lp);
+ inv.setItem(47, np);
+ inv.setItem(51, usage);
+ inv.setItem(49, re);
+ inv.setItem(53, ex);
+ invs.add(t - 1, inv);
+ }
+ }
+
+ /**
+ *
+ * @param inv
+ * this inventory
+ * @param page
+ * this page
+ * @param id
+ * slot id
+ * @param click
+ * click type
+ */
+ public static void click(Inventory inv, Integer page, Integer id, ClickType click, Player player) {
+ if (inv.getItem(id) != null) {
+ ItemStack item = inv.getItem(id);
+ String serial = item.getItemMeta().getDisplayName();
+ if (id != 45 && id != 47 && id != 49 && id != 51 && id != 53) {
+ if (click.isLeftClick() && (!click.isShiftClick())) {
+ ItemMeta im = item.getItemMeta();
+ List lore = im.getLore();
+ lore.add(Storage.getMsg("executed"));
+ item.setItemMeta(im);
+ inv.clear(id);
+ inv.setItem(id, item);
+ Database.qback(serial, player);
+ Notify.notifyb(serial, Storage.getConfig().getString("auto-sendback-msg"), player);
+ }
+ if (click.isRightClick() && (!click.isShiftClick())) {
+ // need to add a serial to this map
+ Storage.back.put(player.getUniqueId().toString(), serial);
+ Storage.send(player, "send-back");
+ player.closeInventory();
+ }
+ if (click.isLeftClick() && (click.isShiftClick())) {
+ ItemMeta im = item.getItemMeta();
+ List lore = im.getLore();
+ lore.add(Storage.getMsg("executed"));
+ item.setItemMeta(im);
+ inv.clear(id);
+ inv.setItem(id, item);
+ Database.ignore(serial, player);
+ }
+ } else {
+ if (id == 45) {
+ if (page != 1) {
+ open(player, page - 1);
+ } else {
+ Storage.send(player, "no-this-page");
+ }
+ }
+ if (id == 47) {
+ if (page != pages) {
+ open(player, page + 1);
+ } else {
+ Storage.send(player, "no-this-page");
+ }
+ }
+ if (id == 49) {
+ loadInv();
+ player.closeInventory();
+ open(player, page);
+ }
+ if (id == 53) {
+ player.closeInventory();
+ }
+ }
+ }
+ }
+
+ public static void clickHis(Inventory inv, Integer page, Integer id, ClickType click, Player player) {
+ if (id >= 0 && id <= 53 && inv.getItem(id) != null) {
+ if (id == 45) {
+ if (page != 1) {
+ openHistory(player, page - 1);
+ } else {
+ Storage.send(player, "no-this-page");
+ }
+ }
+ if (id == 47) {
+ if (page != pages) {
+ openHistory(player, page + 1);
+ } else {
+ Storage.send(player, "no-this-page");
+ }
+ }
+ if (id == 49) {
+ loadHis(player);
+ player.closeInventory();
+ openHistory(player, page);
+ }
+ if (id == 51) {
+ player.closeInventory();
+ open(player, 1);
+ }
+ if (id == 53) {
+ player.closeInventory();
+ }
+ }
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/Main.java b/target/classes/com/ilummc/bugrepgui/Main.java
new file mode 100644
index 0000000..6ba3328
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/Main.java
@@ -0,0 +1,28 @@
+package com.ilummc.bugrepgui;
+
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.java.*;
+
+import com.ilummc.bugrepgui.util.UpdateChecker;
+
+public class Main extends JavaPlugin {
+ @Override
+ public void onEnable() {
+ this.saveDefaultConfig();
+ String lang = this.getConfig().getString("lang");
+ String alias = this.getConfig().getString("alias");
+ this.saveResource("lang_" + lang + ".yml", false);
+ Storage.init(this.getConfig(), this.getDataFolder(), "lang_" + lang + ".yml");
+ getServer().getPluginManager().registerEvents(new EventListener().setAlias(getConfig().getString("alias")),
+ this);
+ getCommand("bug").setExecutor(new cmdExe());
+ getCommand("bugrepgui").setExecutor(new cmdExe());
+ if (this.getConfig().getBoolean("check-update"))
+ UpdateChecker.check(this.getDescription().getVersion(), this.getDescription().getWebsite());
+ }
+
+ @Override
+ public void onDisable() {
+ Bukkit.getLogger().info("[BugRepGUI] Thanks for chosing this plugin!");
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/Notify.java b/target/classes/com/ilummc/bugrepgui/Notify.java
new file mode 100644
index 0000000..e57af1f
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/Notify.java
@@ -0,0 +1,35 @@
+package com.ilummc.bugrepgui;
+
+import org.bukkit.Bukkit;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.entity.Player;
+
+public class Notify {
+
+ public static void notifyt(Player player) {
+ OfflinePlayer[] list = Bukkit.getOfflinePlayers();
+ for (int i = 0; i < list.length; i++) {
+ if (list[i].isOnline()) {
+ if ((list[i]).getPlayer().hasPermission("bugrepgui.notify")) {
+ (list[i]).getPlayer()
+ .sendMessage(Storage.getPrefix()
+ + Storage.getMsg("notify-op").replaceAll("%player%", player.getName())
+ .replaceAll("%serial%", Database.getSerial(player)));
+ }
+ }
+ }
+ }
+
+ public static void notifyb(String serial, String msg, Player exename) {
+ Player player = Database.getRepPlayer(serial);
+ if (player.isOnline()) {
+ String str = Database.format.replaceAll("%serial%", serial.toString())
+ .replaceAll("%exename%", exename.getDisplayName()).replaceAll("%reply%", msg);
+ String str2 = Database.format2.replaceAll("%serial%", serial.toString())
+ .replaceAll("%exename%", exename.getDisplayName()).replaceAll("%reply%", msg);
+ String msgs[] = { str, Storage.compile(str2) };
+ player.sendMessage(msgs);
+ Database.setback(serial);
+ }
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/Stats.java b/target/classes/com/ilummc/bugrepgui/Stats.java
new file mode 100644
index 0000000..488147e
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/Stats.java
@@ -0,0 +1,53 @@
+package com.ilummc.bugrepgui;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import com.ilummc.bugrepgui.stats.Reporter;
+
+public class Stats {
+ public static String[] loadTextRep() {
+ Map res = Database.loadStatsRep();
+ Set set = res.keySet();
+ Iterator it = set.iterator();
+ Set rank = new TreeSet<>();
+ while (it.hasNext()) {
+ String name = it.next();
+ Reporter rep = new Reporter(name, res.get(name));
+ rank.add(rep);
+ }
+ String[] msg = new String[rank.size() + 2];
+ msg[0] = Storage.getMsg("rep-rank");
+ Iterator its = rank.iterator();
+ for (int i = 1; i <= rank.size(); i++) {
+ Reporter next = its.next();
+ msg[i] = next.getName() + " : " + next.getAmount().toString();
+ }
+ Integer all = rank.size();
+ msg[all + 1] = Storage.getMsg("rep-stats").replaceAll("%amount%", all.toString());
+ return msg;
+ }
+ public static String[] loadTextExe() {
+ Map res = Database.loadStatsExe();
+ Set set = res.keySet();
+ Iterator it = set.iterator();
+ Set rank = new TreeSet<>();
+ while (it.hasNext()) {
+ String name = it.next();
+ Reporter rep = new Reporter(name, res.get(name));
+ rank.add(rep);
+ }
+ String[] msg = new String[rank.size() + 2];
+ msg[0] = Storage.getMsg("exe-rank");
+ Iterator its = rank.iterator();
+ for (int i = 1; i <= rank.size(); i++) {
+ Reporter next = its.next();
+ msg[i] = next.getName() + " : " + next.getAmount().toString();
+ }
+ Integer all = rank.size();
+ msg[all + 1] = Storage.getMsg("rep-stats").replaceAll("%amount%", all.toString());
+ return msg;
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/Storage.java b/target/classes/com/ilummc/bugrepgui/Storage.java
new file mode 100644
index 0000000..0e1cf14
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/Storage.java
@@ -0,0 +1,143 @@
+package com.ilummc.bugrepgui;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+
+public class Storage {
+ private static FileConfiguration configyml;
+ private static File folder;
+ static String serial;
+ static File lang;
+ static boolean debug;
+ static String format = "%serial%:\n serial: '#%serial%'\n name: '%player%'\n time: '%time%'\n file: '%path%'\n executed: false\n";
+ private static FileConfiguration langyml;
+ // this is a temporary list for reporters
+ public static Map map = new HashMap<>();
+ // this is a temporary list for ops who send back
+ public static Map back = new HashMap<>();
+
+ public static void init(FileConfiguration config, File thisfolder, String language) {
+ configyml = config;
+ folder = thisfolder;
+ lang = new File(thisfolder, language);
+ langyml = YamlConfiguration.loadConfiguration(lang);
+ debug = configyml.getBoolean("debug");
+ Database.connect();
+ }
+
+ public static void reload() {
+ init(configyml, folder, "lang_" + configyml.getString("lang", "en") + ".yml");
+ }
+
+ public static void putMap(Bug bug) {
+ Storage.map.put(bug.getRepUUID(), bug);
+ }
+
+ public static File getFolder() {
+ return folder;
+ }
+
+ public static FileConfiguration getConfig() {
+ return configyml;
+ }
+
+ public static FileConfiguration getLang() {
+ return langyml;
+ }
+
+ public static String compile(String str) {
+ char[] cha = str.toCharArray();
+ for (int i = 0; i < str.length(); i++) {
+ if (cha[i] == '&') {
+ if ((cha[i + 1] >= '0' && cha[i + 1] <= '9') || (cha[i + 1] >= 'a' && cha[i + 1] <= 'f')) {
+ cha[i] = '¡ì';
+ }
+ }
+ }
+ return String.valueOf(cha);
+ }
+
+ public static String getMsg(String msg) {
+ String str = langyml.getString(msg, "¡ìePlease check the lang_" + configyml.getString("lang", "xx") + ".yml!!!");
+ return compile(str);
+ }
+
+ public static List getMsgs(String msg) {
+ List list = langyml.getStringList(msg);
+ for (int i = 0; i < list.size(); i++) {
+ list.set(i, compile(list.get(i)));
+ }
+ return list;
+ }
+
+ public static String getPrefix() {
+ return getMsg("prefix");
+ }
+
+ public static void send(Player player, String msg) {
+ player.sendMessage(getPrefix() + getMsg(msg));
+ }
+
+ public static void send(CommandSender player, String msg) {
+ player.sendMessage(getPrefix() + getMsg(msg));
+ }
+
+ public static void sends(Player player, String[] msg) {
+ for (int i = 0; i < msg.length; i++) {
+ if (msg[i] != null && msg[i] != "")
+ player.sendMessage(getPrefix() + msg[i]);
+ }
+ }
+
+ public static void log(String msg) {
+ Bukkit.getLogger().info(
+ getLang().getString(getPrefix().replaceAll("¡ì", ""), "[BugRepGUI]") + getMsg(msg).replaceAll("¡ì", ""));
+ }
+
+ public static void logExcept(Exception e) {
+ Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "[BugRepGUI] Err occured: " + e.getMessage());
+ if (debug) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void getHelp(Player player) {
+ List helpl = langyml.getStringList("help");
+ String[] help = new String[helpl.size()];
+ for (int i = 0; i < helpl.size(); i++) {
+ help[i] = compile(helpl.get(i));
+ }
+ player.sendMessage(help);
+ }
+
+ public static void getHelp(CommandSender player) {
+ List helpl = langyml.getStringList("help");
+ String[] help = new String[helpl.size()];
+ for (int i = 0; i < helpl.size(); i++) {
+ help[i] = compile(helpl.get(i));
+ }
+ player.sendMessage(help);
+ }
+
+ public static String transfer(String string) {
+ char[] ch = string.toCharArray();
+ StringBuffer out = new StringBuffer();
+ for (int i = 0; i < ch.length; i++) {
+ if (ch[i] == ' ')
+ out.append("\\s");
+ else
+ out.append(String.valueOf(ch[i]));
+ }
+ return out.toString();
+ }
+
+}
diff --git a/target/classes/com/ilummc/bugrepgui/bungee/BungeeListener.java b/target/classes/com/ilummc/bugrepgui/bungee/BungeeListener.java
new file mode 100644
index 0000000..cbe8533
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/bungee/BungeeListener.java
@@ -0,0 +1,19 @@
+package com.ilummc.bugrepgui.bungee;
+
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+import net.md_5.bungee.api.event.ChatEvent;
+import net.md_5.bungee.api.plugin.Listener;
+import net.md_5.bungee.event.EventHandler;
+
+public class BungeeListener implements Listener {
+ @EventHandler
+ public void onChat(ChatEvent evt) {
+ if (!(evt.getSender() instanceof ProxiedPlayer)) {
+ return;
+ }
+ ProxiedPlayer p = (ProxiedPlayer) evt.getSender();
+ if (Main.config.getString("stop-sign").equals(evt.getMessage())) {
+ GlobalNotify.notifyt(p);
+ }
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/bungee/GlobalNotify.java b/target/classes/com/ilummc/bugrepgui/bungee/GlobalNotify.java
new file mode 100644
index 0000000..02669e9
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/bungee/GlobalNotify.java
@@ -0,0 +1,167 @@
+package com.ilummc.bugrepgui.bungee;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collection;
+import java.util.Iterator;
+
+import com.ilummc.bugrepgui.Storage;
+
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+
+public class GlobalNotify {
+ private static Connection c = null;
+ private static Statement state = null;
+ public static String format = Main.lang.getString("join-notify");
+ public static String format2 = Main.lang.getString("join-notify2");
+
+ public static void init() {
+ Thread post = new Thread(new Runnable() {
+ long spd = Main.config.getInt("check-speed");
+ @Override
+ public void run() {
+ while (true) {
+ Collection l = Main.server.getPlayers();
+ Iterator it = l.iterator();
+ while(it.hasNext()){
+ ProxiedPlayer p = it.next();
+ check(p.getName());
+ try {
+ Thread.sleep(spd);
+ } catch (InterruptedException e) {
+ Main.printException(e.getMessage());
+ }
+ }
+ }
+ }
+ });
+ post.start();
+ }
+
+ @SuppressWarnings("deprecation")
+ public static void notifyt(ProxiedPlayer player) {
+ Collection l = Main.server.getPlayers();
+ Iterator it = l.iterator();
+ while(it.hasNext()){
+ ProxiedPlayer p = it.next();
+ if(p.hasPermission("bugrepgui.notify")){
+ p.sendMessage(Main.lang.getString("notify-op").replaceAll("%player%", player.getName()));
+ }
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ public static void sends(String player, String[] msg){
+ ProxiedPlayer p = Main.server.getPlayer(player);
+ for (int i = 0; i < msg.length; i++) {
+ if (msg[i] != null && msg[i] != "")
+ p.sendMessage(getPrefix() + msg[i]);
+ }
+ }
+ public static String getPrefix(){
+ return Storage.compile(Main.lang.getString("prefix"));
+ }
+ public static void check(String player) {
+ connect();
+ String sql = "SELECT SERIAL,EXEMSG,EXENAME FROM br_bug WHERE REPNAME = '" + player
+ + "' 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) {
+ Main.printException(e.getMessage());
+ }
+ 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) {
+ Main.printException(e.getMessage());
+ }
+ }
+ 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) {
+ Main.printException(e.getMessage());
+ }
+ close();
+ }
+
+ public static void connect() {
+ if (!conMySQL()) {
+ Main.log.warning("[BugRepGUI] MySQL connect failed!");
+ Main.log.warning("**************************************************");
+ Main.log.warning("[BugRepGUI] Must check the MySQL server settings!!");
+ Main.log.warning("[BugRepGUI] Must check the MySQL server settings!!");
+ Main.log.warning("**************************************************");
+ }
+
+ }
+
+ public static void close() {
+ try {
+ state.close();
+ state = null;
+ c.close();
+ } catch (Exception e) {
+ Main.printException(e.getMessage());
+ }
+ }
+ public static boolean conMySQL() {
+ String url = "jdbc:mysql://" + Main.config.getString("mysql-url") + ":"
+ + Main.config.getString("mysql-port") + "/" +Main.config.getString("mysql-db");
+ try {
+ Class.forName("com.mysql.jdbc.Driver");
+ c = DriverManager.getConnection(url, Main.config.getString("mysql-username"),
+ Main.config.getString("mysql-password"));
+ state = c.createStatement();
+ } catch (SQLException e) {
+ Main.printException(e.getMessage());
+ return false;
+ } catch (ClassNotFoundException e) {
+ Main.printException(e.getMessage());
+ 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) {
+ Main.printException(e.getMessage());
+ }
+ return true;
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/bungee/Main.java b/target/classes/com/ilummc/bugrepgui/bungee/Main.java
new file mode 100644
index 0000000..d12e881
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/bungee/Main.java
@@ -0,0 +1,84 @@
+package com.ilummc.bugrepgui.bungee;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.CopyOption;
+import java.nio.file.Files;
+import java.util.logging.Logger;
+
+import net.md_5.bungee.api.ProxyServer;
+import net.md_5.bungee.api.plugin.Plugin;
+import net.md_5.bungee.config.Configuration;
+import net.md_5.bungee.config.ConfigurationProvider;
+import net.md_5.bungee.config.YamlConfiguration;
+
+public class Main extends Plugin {
+ static Logger log;
+ static File folder;
+ static Configuration config;
+ static Configuration lang;
+ static File cf;
+ static File lf;
+ static ProxyServer server;
+
+ public void onEnable() {
+ this.init(this.getDataFolder(), this.getLogger());
+ this.getLogger().info("BungeeCord mode is on!");
+ this.getProxy().getPluginManager().registerListener(this, new BungeeListener());
+ }
+
+ @Override
+ public void onDisable() {
+ try {
+ ConfigurationProvider.getProvider(YamlConfiguration.class).save(config, cf);
+ ConfigurationProvider.getProvider(YamlConfiguration.class).save(lang, lf);
+ } catch (Exception e) {
+ printException(e.getMessage());
+ }
+ this.getLogger().info("BugRepGUI disabled! Thanks for chosing us!");
+ }
+
+ public void init(File f, Logger log) {
+ if (!this.getDataFolder().exists()) {
+ this.getDataFolder().mkdir();
+ }
+ Main.log = log;
+ Main.folder = f;
+ Main.server = this.getProxy();
+ cf = new File(f + "/config.yml");
+ try {
+ if (!cf.exists()) {
+ Files.copy(getResourceAsStream("config.yml"), cf.toPath(), new CopyOption[0]);
+ }
+ reloadConfig();
+ lf = new File(f + "/lang_"+config.getString("lang")+".yml");
+ if (!lf.exists()) {
+ Files.copy(getResourceAsStream("lang_" + config.getString("lang") + ".yml"), lf.toPath(),
+ new CopyOption[0]);
+ }
+ reloadLang();
+ } catch (Exception e) {
+ printException(e.getMessage());
+ }
+
+ }
+
+ private void reloadConfig() {
+ try {
+ config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(cf);
+ } catch (IOException e) {
+ printException(e.getMessage());
+ }
+ }
+ private void reloadLang() {
+ try {
+ lang = ConfigurationProvider.getProvider(YamlConfiguration.class).load(lf);
+ } catch (IOException e) {
+ printException(e.getMessage());
+ }
+ }
+
+ public static void printException(String msg) {
+ log.warning("Error: " + msg);
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/cmdExe.java b/target/classes/com/ilummc/bugrepgui/cmdExe.java
new file mode 100644
index 0000000..3c58cb3
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/cmdExe.java
@@ -0,0 +1,116 @@
+package com.ilummc.bugrepgui;
+
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+public class cmdExe implements CommandExecutor {
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ if (command.getName().equals("report")) {
+ if (sender instanceof Player) {
+ if (sender.hasPermission("bugrepgui.report")) {
+ Bug bug = new Bug((Player) sender);
+ Storage.putMap(bug);
+ Storage.send(sender, "input-bug-info");
+ return true;
+ } else {
+ Storage.send(sender, "no-perm");
+ return true;
+ }
+ } else {
+ Storage.send(sender, "must-player-run");
+ return true;
+ }
+ } else {
+ if (args.length == 1 && args[0].equalsIgnoreCase("help")) {
+ Storage.getHelp(sender);
+ return true;
+ }
+ if (args.length == 1 && args[0].equalsIgnoreCase("view")) {
+ if (sender instanceof Player) {
+ if (sender.hasPermission("bugrepgui.view")) {
+ GUI.open((Player) sender, 1);
+ } else {
+ Storage.send(sender, "no-perm");
+ }
+ return true;
+ } else {
+ Storage.send(sender, "must-player-run");
+ }
+ return true;
+ }
+ if (args.length == 2 && args[0].equalsIgnoreCase("view") && args[1].equalsIgnoreCase("history")) {
+ if (sender instanceof Player) {
+ if (sender.hasPermission("bugrepgui.view")) {
+ GUI.openHistory((Player) sender, 1);
+ } else {
+ Storage.send(sender, "no-perm");
+ }
+ return true;
+ } else {
+ Storage.send(sender, "must-player-run");
+ }
+ }
+ if (args.length == 1 && args[0].equalsIgnoreCase("report")) {
+ if (sender instanceof Player) {
+ if (sender.hasPermission("bugrepgui.report")) {
+ Bug bug = new Bug((Player) sender);
+ Storage.putMap(bug);
+ Storage.send(sender, "input-bug-info");
+ return true;
+ } else {
+ Storage.send(sender, "no-perm");
+ return true;
+ }
+ } else {
+ Storage.send(sender, "must-player-run");
+ return true;
+ }
+ }
+ if (args.length == 2 && args[0].equalsIgnoreCase("stats")) {
+ if (args[1].equalsIgnoreCase("text")) {
+ if (sender.hasPermission("bugrepgui.stats.text")) {
+ final CommandSender send = sender;
+ Thread t = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ send.sendMessage(Stats.loadTextRep());
+ try {
+ Thread.sleep(3000);
+ Storage.send(send, "wait");
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ Storage.logExcept(e);
+ }
+ send.sendMessage(Stats.loadTextExe());
+ }
+ });
+ t.start();
+ return true;
+ } else {
+ Storage.send(sender, "no-perm");
+ return true;
+ }
+ }
+ if (args[1].equalsIgnoreCase("gui")) {
+ return true;
+ }
+ return true;
+ }
+ if (args.length == 1 && args[0].equalsIgnoreCase("reload")) {
+ if (sender.hasPermission("bugrepgui.reload")) {
+ Storage.reload();
+ Storage.send(sender, "reload-suc");
+ return true;
+ } else {
+ Storage.send(sender, "no-perm");
+ }
+ }
+ Storage.getHelp(sender);
+ return true;
+ }
+ }
+}
diff --git a/target/classes/com/ilummc/bugrepgui/stats/Reporter.java b/target/classes/com/ilummc/bugrepgui/stats/Reporter.java
new file mode 100644
index 0000000..f7432e2
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/stats/Reporter.java
@@ -0,0 +1,28 @@
+package com.ilummc.bugrepgui.stats;
+
+import org.bukkit.Bukkit;
+import org.bukkit.OfflinePlayer;
+
+public class Reporter implements Comparable {
+ OfflinePlayer player;
+ Integer amount = 0;
+
+ @SuppressWarnings("deprecation")
+ public Reporter(String player, Integer amount) {
+ this.player = Bukkit.getOfflinePlayer(player);
+ this.amount = amount;
+ }
+
+ public Integer getAmount() {
+ return this.amount;
+ }
+ public String getName(){
+ return this.player.getName();
+ }
+
+ @Override
+ public int compareTo(Reporter other) {
+ return this.amount - other.getAmount();
+ }
+
+}
diff --git a/target/classes/com/ilummc/bugrepgui/util/UpdateChecker.java b/target/classes/com/ilummc/bugrepgui/util/UpdateChecker.java
new file mode 100644
index 0000000..4f821dc
--- /dev/null
+++ b/target/classes/com/ilummc/bugrepgui/util/UpdateChecker.java
@@ -0,0 +1,48 @@
+package com.ilummc.bugrepgui.util;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.bukkit.Bukkit;
+
+import com.ilummc.bugrepgui.Storage;
+
+public class UpdateChecker {
+ public static void check(String version, String web) {
+ final String ver = version;
+ final String webn = web;
+ Thread t = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ Storage.log("checking-update");
+ try {
+ HttpURLConnection c = (HttpURLConnection) new URL("http://www.spigotmc.org/api/general.php")
+ .openConnection();
+ c.setDoOutput(true);
+ c.setRequestMethod("POST");
+ c.getOutputStream()
+ .write(("key=98BE0FE67F88AB82B4C197FAF1DC3B69206EFDCC4D3B80FC83A00037510B99B4&resource=35119")
+ .getBytes("UTF-8"));
+ String oldVersion = ver;
+ String newVersion = new BufferedReader(new InputStreamReader(c.getInputStream())).readLine()
+ .replaceAll("[a-zA-Z ]", "");
+ if (newVersion.equals(oldVersion)) {
+ Storage.log("no-new-version");
+ } else {
+ String[] msg = Storage.getMsg("new-version").replaceAll("%version%", newVersion)
+ .replaceAll("%website%", webn).split("\\\\n");
+ for (int i = 0; i < msg.length; i++) {
+ msg[i] = Storage.getPrefix() + Storage.compile(msg[i]);
+ }
+ Bukkit.getConsoleSender().sendMessage(msg);
+ }
+ } catch (Exception e) {
+ Storage.logExcept(e);
+ }
+ }
+ });
+ t.start();
+ }
+}
diff --git a/target/classes/config.yml b/target/classes/config.yml
new file mode 100644
index 0000000..36b596c
--- /dev/null
+++ b/target/classes/config.yml
@@ -0,0 +1,27 @@
+#BugReportGUI Configuration file
+#Google is your friend :)
+debug: false
+check-update: true
+#This could be sqlite, mysql
+database: sqlite
+#These are required if database is set to MySQL
+mysql-url: 'localhost'
+mysql-port: 3306
+mysql-username: ''
+mysql-password: ''
+mysql-db: ''
+###########################################################################
+#This controls the date format(such as CST or PST or EST) in the bug view #
+# Here is a country list for you :) #
+# https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 #
+###########################################################################
+locale: 'US'
+lang: 'en'
+#This controls the message when left click a bug
+auto-sendback-msg: '&eThanks for your reporting'
+#Report Alias
+alias: 'r'
+#If you use bungeecord, please set this to true and set database to mysql
+use-bungee: false
+#This controls the speed of checking sendback (in ms)
+check-speed: 2000
\ No newline at end of file
diff --git a/target/classes/lang.yml b/target/classes/lang.yml
new file mode 100644
index 0000000..732813b
--- /dev/null
+++ b/target/classes/lang.yml
@@ -0,0 +1,23 @@
+prefix: '§d[BugRepGUI] '
+rep-suc: '§eSuccessfully report bug serial #%serial%'
+get-help: '§eUse §a/bug help §fto get help'
+must-player-run: '§cThis command must be run as player!'
+input-bug-info: '§ePlease input bug information. You can divide it in several parts if its too long, and send as§a ##bug§f for several times'
+continue-input: '§eContinue input and use §a#end# §fto stop this input'
+illegal-char: '§cYour input contains illegal character, please check and retry!'
+not-complete: '§cPlease finish reporting first! Chat with§a #end#§c may help'
+gui-name: '§cBug View'
+last-page: '§eLast Page'
+next-page: '§eNext Page'
+executed: '§aThis one has been executed!'
+usage-name: '§eUsage'
+usage-lore:
+ - '§aUse left click to quick executed'
+ - '§aUse right click to send back some message to reporter'
+ - '§aUse shift+left click to ignore this'
+send-back: '§ePlease type your message here'
+send-back-continue: '§eYou can continue to send and use §a##stop §eto finish'
+send-back-success: '§eYour message has been sent to this player'
+no-perm: '§cYou dont have permission to do this!'
+no-this-page: '§eNo mre pages!'
+join-notify: '§bYuor bug §a#%serial% §bhas been accept! Reply - §f%msg%'
\ No newline at end of file
diff --git a/target/classes/lang_cn.yml b/target/classes/lang_cn.yml
new file mode 100644
index 0000000..372d40f
--- /dev/null
+++ b/target/classes/lang_cn.yml
@@ -0,0 +1,48 @@
+prefix: '&d[BugRepGUI] '
+rep-suc: '&eæˆåŠŸæäº¤,ç¼–å·#%serial%'
+get-help: '&e使用&a/bug help &f获得更多帮助'
+must-player-run: '&c这个命令必须由玩家使用!'
+input-bug-info: '&eè¯·è¾“å…¥ä½ è¦æäº¤çš„å†…å®¹'
+continue-input: '&eè¯·ç»§ç»æäº¤,ç§»åŠ¨ä»¥å®Œæˆæäº¤'
+illegal-char: '&cä½ çš„è¾“å…¥å«æœ‰éžæ³•å—符,è¯·æ£€æŸ¥å¹¶é‡æ–°æäº¤!'
+not-complete: '&cè¯·å…ˆå®Œæˆæäº¤!'
+gui-name: '&cæµè§ˆå…¨éƒ¨'
+history-name: '&b历å²è®°å½•'
+last-page: '&e上一页'
+next-page: '&e下一页'
+executed: '&a处ç†å®Œæˆ!'
+usage-name: '&e使用说明'
+usage-lore:
+ - '&a左键å•击å³å¯å¿«æ·å›žå¤'
+ - '&aå³é”®å•击,å‘é€ä½ 的消æ¯ç»™æäº¤è€…'
+ - '&aSHIFT+å·¦é”®å¿½ç•¥è¿™æ¡æäº¤'
+send-back: '&eè¯·åœ¨è¿™é‡Œè¾“å…¥ä½ çš„æ¶ˆæ¯,这将å‘é€ç»™æäº¤è€…'
+send-back-success: '&eä½ çš„æ¶ˆæ¯å·²ç»å‘é€ç»™äº†æäº¤è€…'
+no-perm: '&cä½ æ²¡æœ‰æƒé™è¿™æ ·åš!'
+no-this-page: '&e没有更多了!'
+join-notify: '&bä½ æäº¤çš„ç¼–å· &a#%serial% &bçš„bug已由 %exename% 处ç†!'
+join-notify2: '&b回å¤è‡ª %exename% - %reply%'
+reload-suc: '&eæˆåŠŸé‡è½½BugRepGUI'
+notify-op: '&e%player% æäº¤äº†æ–°çš„ä¿¡æ¯,ç¼–å· %serial%'
+item-msg: '&b%method%&b自%exename%'
+method-autoreply: '&e自动回å¤'
+method-manualreply: '&e手动回å¤'
+method-ignore: '&e忽略'
+refresh: '&e刷新'
+exit: '&e退出'
+to-not-executed: '&e切æ¢è‡³æœªå¤„ç†è§†å›¾'
+rep-rank: '&b===æäº¤æŽ’行 & 统计==='
+rep-stats: '&b===å…± %amount% æ¡è®°å½•==='
+exe-rank: '&b===å¤„ç†æŽ’è¡Œ & 统计==='
+wait: '&a请ç‰å¾…5ç§’'
+help:
+ - '&b======BugRepGUI======'
+ - '&ahttp://www.mcbbs.net/forum.php?mod=viewthread&tid=665729'
+ - '&a/bug view &f- 打开GUI颿¿æµè§ˆæ‰€æœ‰bug'
+ - '&a/bug view history &f- 查看历å²è®°å½•'
+ - '&a/bug stats text &f- 查看文å—统计信æ¯'
+ - '&c (如果人数较多,这会消耗ä¸å°‘CPU)'
+ - '&a/bug report &f- æäº¤ä¸€æ¡bug'
+ - '&a/bug reload &f- é‡è½½BugRepGUI'
+ - '&a/report &f- æäº¤ä¸€æ¡bug'
+ - '&b======BugRepGUI======'
\ No newline at end of file
diff --git a/target/classes/lang_en.yml b/target/classes/lang_en.yml
new file mode 100644
index 0000000..52ddb1c
--- /dev/null
+++ b/target/classes/lang_en.yml
@@ -0,0 +1,48 @@
+prefix: '&d[BugRepGUI] '
+rep-suc: '&eSuccessfully report bug serial #%serial%'
+get-help: '&eUse &a/bug help &fto get help'
+must-player-run: '&cThis command must be run as player!'
+input-bug-info: '&ePlease input bug information. You can divide it in several parts if its too long.'
+continue-input: '&eContinue input and try to move to stop this input'
+illegal-char: '&cYour input contains illegal character, please check and retry!'
+not-complete: '&cPlease finish reporting first!'
+gui-name: '&cBug View'
+history-name: '&bHistory View'
+last-page: '&eLast Page'
+next-page: '&eNext Page'
+executed: '&aThis one has been executed!'
+usage-name: '&eUsage'
+usage-lore:
+ - '&aUse left click to quick executed'
+ - '&aUse right click to send back some message to reporter'
+ - '&aUse shift+left click to ignore this'
+send-back: '&ePlease type your message here, and this will send to reporter'
+send-back-success: '&eYour message has been sent to this player'
+no-perm: '&cYou dont have permission to do this!'
+no-this-page: '&eNo mre pages!'
+join-notify: '&bYour report No &a#%serial% &bhas been executed by %exename%!'
+join-notify2: '&bReply from %exename% - %reply%'
+reload-suc: '&eSuccessfully reload BugRepGUI'
+notify-op: '&e%player% report a new message #%serial%'
+item-msg: '&b%method%&b by %exename%'
+method-autoreply: '&eAuto replied'
+method-manualreply: '&eManually replied'
+method-ignore: '&eIgnored'
+refresh: '&eRefresh'
+exit: '&eExit'
+to-not-executed: '&eTurn to not executed bugs'
+rep-rank: '&b===Reporter Rank & Stats==='
+rep-stats: '&b===All %amount% records in total==='
+exe-rank: '&b===Executer Rank & Stats==='
+wait: '&aPlease wait for 5 seconds'
+help:
+ - '&b======BugRepGUI======'
+ - '&ahttps://www.spigotmc.org/resources/bugreportgui.35119/'
+ - '&a/bug view &f- View all bugs'
+ - '&a/bug view history &f- View historic records'
+ - '&a/bug stats text &f- View text statistics'
+ - '&c (If player is too much, this will cost a lot.)'
+ - '&a/bug report &f- Report'
+ - '&a/bug reload &f- Reload plugin'
+ - '&a/report &f- Report a bug'
+ - '&b======BugRepGUI======'
\ No newline at end of file
diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml
new file mode 100644
index 0000000..3bcf68b
--- /dev/null
+++ b/target/classes/plugin.yml
@@ -0,0 +1,44 @@
+name: BugRepGUI
+main: com.ilummc.bugrepgui.Main
+version: 1.7
+author: IzzelAliz
+website: https://www.spigotmc.org/resources/bugreportgui-better-than-rating.35119/
+commands:
+ bug:
+ description: /bug help for more help
+ usage: /bug help
+ bugrepgui:
+ description: /bugrepgui for more help
+ usage: /bugrepgui
+
+permissions:
+ bugrepgui.admin:
+ description: Gives access to all BugRepGUI commands
+ children:
+ bugrepgui.view: true
+ bugrepgui.execute: true
+ bugrepgui.sendback: true
+ bugrepgui.notify: true
+ bugrepgui.stats.text: true
+ bugrepgui.user:
+ description: Gives access to user commands
+ children:
+ bugrepgui.report: true
+ bugrepgui.view:
+ description: Allows you to have a view to all bugs
+ default: op
+ bugrepgui.sendback:
+ description: Allows you to send back to the reporter
+ default: op
+ bugrepgui.execute:
+ description: Allows you to execute a reported bug
+ default: op
+ bugrepgui.report:
+ description: Allows you to report an known bug
+ default: true
+ bugrepgui.notify:
+ description: Allows op to be notified when someone report a bug
+ default: op
+ bugrepgui.stats.text:
+ description: Allows you to view text statistics
+ default: op
\ No newline at end of file
diff --git a/target/classes/pom.xml b/target/classes/pom.xml
deleted file mode 100644
index c3b2f91..0000000
--- a/target/classes/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
- 4.0.0
-
- com.ilummc.bugrepgui
- BugRepGUI
- b
-
-
- bungeecord-repo
- https://oss.sonatype.org/content/repositories/snapshots
-
-
- spigot-repo
- https://hub.spigotmc.org/nexus/content/repositories/snapshots/
-
-
-
-
-
-
-
- .
- ${basedir}
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.5.1
-
-
- default-compile
- compile
-
- compile
-
-
-
-
- 1.8
- 1.8
- GBK
-
-
-
-
-
-
-
- net.md-5
- bungeecord-api
- 1.7-SNAPSHOT
- jar
- provided
-
-
-
- org.spigotmc
- spigot-api
- 1.8.3-R0.1-SNAPSHOT
- provided
-
-
-
- org.bukkit
- bukkit
- 1.8.3-R0.1-SNAPSHOT
- provided
-
-
-
\ No newline at end of file
diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..2807c58
--- /dev/null
+++ b/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Fri Jun 30 13:26:31 CST 2017
+version=b
+groupId=com.ilummc.bugrepgui
+artifactId=BugRepGUI