diff --git a/pom.xml b/pom.xml
index 372361c..8567d76 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
com.songoda
UltimateModeration
4.0.0
- 1.2.9
+ 2
clean install
UltimateModeration-${project.version}
@@ -97,7 +97,7 @@
org.spigotmc
spigot
- 1.15
+ 1.16.1
com.github.MilkBowl
diff --git a/src/main/java/com/songoda/ultimatemoderation/UltimateModeration.java b/src/main/java/com/songoda/ultimatemoderation/UltimateModeration.java
index 72eddff..058b895 100644
--- a/src/main/java/com/songoda/ultimatemoderation/UltimateModeration.java
+++ b/src/main/java/com/songoda/ultimatemoderation/UltimateModeration.java
@@ -6,13 +6,19 @@ import com.songoda.core.commands.CommandManager;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.core.configuration.Config;
+import com.songoda.core.database.DataMigrationManager;
+import com.songoda.core.database.DatabaseConnector;
+import com.songoda.core.database.MySQLConnector;
+import com.songoda.core.database.SQLiteConnector;
import com.songoda.core.gui.GuiManager;
import com.songoda.ultimatemoderation.commands.*;
+import com.songoda.ultimatemoderation.database.DataManager;
+import com.songoda.ultimatemoderation.database.migrations._1_InitialMigration;
import com.songoda.ultimatemoderation.listeners.*;
+import com.songoda.ultimatemoderation.moderate.ModerationManager;
import com.songoda.ultimatemoderation.punish.AppliedPunishment;
import com.songoda.ultimatemoderation.punish.PunishmentNote;
import com.songoda.ultimatemoderation.punish.PunishmentType;
-import com.songoda.ultimatemoderation.punish.player.PlayerPunishData;
import com.songoda.ultimatemoderation.punish.player.PunishmentManager;
import com.songoda.ultimatemoderation.punish.template.Template;
import com.songoda.ultimatemoderation.punish.template.TemplateManager;
@@ -27,11 +33,14 @@ import com.songoda.ultimatemoderation.tickets.TicketManager;
import com.songoda.ultimatemoderation.tickets.TicketResponse;
import com.songoda.ultimatemoderation.tickets.TicketStatus;
import com.songoda.ultimatemoderation.utils.Methods;
-import com.songoda.ultimatemoderation.utils.gui.AbstractGUI;
import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
import org.bukkit.plugin.PluginManager;
+import java.io.File;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.UUID;
public class UltimateModeration extends SongodaPlugin {
@@ -43,8 +52,10 @@ public class UltimateModeration extends SongodaPlugin {
private CommandManager commandManager;
private PunishmentManager punishmentManager;
private StaffChatManager staffChatManager;
+ private ModerationManager moderationManager;
- private Storage storage;
+ private DatabaseConnector databaseConnector;
+ private DataManager dataManager;
public static UltimateModeration getInstance() {
return INSTANCE;
@@ -57,8 +68,6 @@ public class UltimateModeration extends SongodaPlugin {
@Override
public void onPluginDisable() {
- storage.doSave();
- this.storage.closeConnection();
}
@Override
@@ -80,23 +89,17 @@ public class UltimateModeration extends SongodaPlugin {
);
this.commandManager.addCommand(new CommandBan(this));
this.commandManager.addCommand(new CommandClearChat(this));
- this.commandManager.addCommand(new CommandCommandSpy(this));
- this.commandManager.addCommand(new CommandFreeze(this));
- this.commandManager.addCommand(new CommandInvSee(this));
this.commandManager.addCommand(new CommandKick(this));
this.commandManager.addCommand(new CommandMute(this));
this.commandManager.addCommand(new CommandRandomPlayer(this));
- this.commandManager.addCommand(new CommandRevive(this));
this.commandManager.addCommand(new CommandRunTemplate(this));
this.commandManager.addCommand(new CommandSlowMode(this));
- this.commandManager.addCommand(new CommandSpy(this));
this.commandManager.addCommand(new CommandStaffChat(this));
this.commandManager.addCommand(new CommandTicket(this));
this.commandManager.addCommand(new CommandToggleChat(this));
this.commandManager.addCommand(new CommandUnBan(this));
this.commandManager.addCommand(new CommandUnMute(this));
this.commandManager.addCommand(new CommandVanish(this));
- this.commandManager.addCommand(new CommandViewEnderChest(this));
this.commandManager.addCommand(new CommandWarn(this));
// Setup Managers
@@ -104,14 +107,138 @@ public class UltimateModeration extends SongodaPlugin {
this.templateManager = new TemplateManager();
this.punishmentManager = new PunishmentManager();
this.staffChatManager = new StaffChatManager();
+ this.moderationManager = new ModerationManager(this);
- // Load data
- this.checkStorage();
- Bukkit.getScheduler().scheduleSyncDelayedTask(this, this::loadFromFile, 1L);
+ // Database stuff, go!
+ try {
+ if (Settings.MYSQL_ENABLED.getBoolean()) {
+ String hostname = Settings.MYSQL_HOSTNAME.getString();
+ int port = Settings.MYSQL_PORT.getInt();
+ String database = Settings.MYSQL_DATABASE.getString();
+ String username = Settings.MYSQL_USERNAME.getString();
+ String password = Settings.MYSQL_PASSWORD.getString();
+ boolean useSSL = Settings.MYSQL_USE_SSL.getBoolean();
+
+ this.databaseConnector = new MySQLConnector(this, hostname, port, database, username, password, useSSL);
+ this.getLogger().info("Data handler connected using MySQL.");
+ } else {
+ this.databaseConnector = new SQLiteConnector(this);
+ this.getLogger().info("Data handler connected using SQLite.");
+ }
+ } catch (Exception ex) {
+ this.getLogger().severe("Fatal error trying to connect to database. Please make sure all your connection settings are correct and try again. Plugin has been disabled.");
+ this.emergencyStop();
+ }
+
+ this.dataManager = new DataManager(this.databaseConnector, this);
+ DataMigrationManager dataMigrationManager = new DataMigrationManager(this.databaseConnector, this.dataManager,
+ new _1_InitialMigration());
+ dataMigrationManager.runMigrations();
+
+ Bukkit.getScheduler().runTaskLaterAsynchronously(this, () -> {
+ // Legacy Data
+ File folder = getDataFolder();
+ File dataFile = new File(folder, "data.yml");
+
+ boolean converted = false;
+ if (dataFile.exists()) {
+ converted = true;
+ Storage storage = new StorageYaml(this);
+ console.sendMessage("[" + getDescription().getName() + "] " + ChatColor.RED + "Conversion process starting DO NOT turn off your server... " +
+ "UltimateModeration hasn't fully loaded yet so its best users don't interact with the plugin until conversion completes.");
+ if (storage.containsGroup("templates")) {
+ for (StorageRow row : storage.getRowsByGroup("templates")) {
+ Template template = new Template(PunishmentType.valueOf(row.get("type").asString()),
+ row.get("duration").asLong(),
+ row.get("reason").asString(),
+ UUID.fromString(row.get("creator").asString()),
+ row.get("name").asString());
+ dataManager.createTemplate(template);
+ }
+ }
+
+ if (storage.containsGroup("punishments")) {
+ for (StorageRow row : storage.getRowsByGroup("punishments")) {
+ AppliedPunishment appliedPunishment = new AppliedPunishment(PunishmentType.valueOf(row.get("type").asString()),
+ row.get("duration").asLong(),
+ row.get("reason").asString(),
+ UUID.fromString(row.get("victim").asString()),
+ row.get("punisher").asObject() == null ? null : UUID.fromString(row.get("punisher").asString()),
+ row.get("expiration").asLong());
+ dataManager.createAppliedPunishment(appliedPunishment);
+ }
+ }
+
+ if (storage.containsGroup("notes")) {
+ for (StorageRow row : storage.getRowsByGroup("notes")) {
+ PunishmentNote note = new PunishmentNote(row.get("note").asString(),
+ UUID.fromString(row.get("author").asString()),
+ UUID.fromString(row.get("subject").asString()),
+ row.get("creation").asLong());
+ dataManager.createNote(note);
+ }
+ }
+
+ Map tickets = new HashMap<>();
+ if (storage.containsGroup("tickets")) {
+ for (StorageRow row : storage.getRowsByGroup("tickets")) {
+
+ int id = Integer.parseInt(row.get("id").asString());
+ Ticket ticket = new Ticket(
+ UUID.fromString(row.get("player").asString()),
+ row.get("subject").asString(),
+ row.get("type").asString());
+ ticket.setId(id);
+ ticket.setLocation(Methods.unserializeLocation(row.get("location").asString()));
+ ticket.setStatus(TicketStatus.valueOf(row.get("status").asString()));
+ tickets.put(id, ticket);
+ }
+ }
+
+ if (storage.containsGroup("ticketresponses")) {
+ for (StorageRow row : storage.getRowsByGroup("ticketresponses")) {
+ int id = row.get("ticketid").asInt();
+ TicketResponse ticketResponse = new TicketResponse(
+ UUID.fromString(row.get("author").asString()),
+ row.get("message").asString(),
+ Long.parseLong(row.get("posted").asString()));
+
+ tickets.get(id).addResponse(ticketResponse);
+ ticketResponse.setTicketId(id);
+ }
+ }
+ for (Ticket ticket : tickets.values())
+ dataManager.createTicket(ticket);
+ }
+ dataFile.delete();
+
+ final boolean convrted = converted;
+ getDataManager().queueAsync(() -> {
+ if (convrted)
+ console.sendMessage("[" + getDescription().getName() + "] " + ChatColor.GREEN + "Conversion complete :)");
+ // Load data from DB
+ this.dataManager.getTemplates((templates) -> {
+ for (Template template : templates) {
+ this.templateManager.addTemplate(template);
+ }
+ });
+ this.dataManager.getAppliedPunishments((appliedPunishments) -> {
+ for (AppliedPunishment punishment : appliedPunishments)
+ this.punishmentManager.getPlayer(punishment.getVictim()).addPunishment(punishment);
+ });
+ this.dataManager.getNotes((notes) -> {
+ for (PunishmentNote note : notes)
+ this.punishmentManager.getPlayer(note.getSubject()).addNotes(note);
+ });
+ this.dataManager.getTickets((tickets) -> {
+ for (Ticket ticket : tickets.values())
+ this.ticketManager.addTicket(ticket);
+ });
+ }, "create");
+ }, 20);
// Register Listeners
guiManager.init();
- AbstractGUI.initializeListeners(this);
PluginManager pluginManager = Bukkit.getPluginManager();
pluginManager.registerEvents(new CommandListener(this), this);
pluginManager.registerEvents(new DeathListener(this), this);
@@ -130,85 +257,6 @@ public class UltimateModeration extends SongodaPlugin {
// Start tasks
SlowModeTask.startTask(this);
-
- int timeout = Settings.AUTOSAVE.getInt() * 60 * 20;
- Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> storage.doSave(), timeout, timeout);
- }
-
- private void checkStorage() {
- this.storage = new StorageYaml(this);
- }
-
- private void loadFromFile() {
- if (storage.containsGroup("templates")) {
- for (StorageRow row : storage.getRowsByGroup("templates")) {
- Template template = new Template(PunishmentType.valueOf(row.get("type").asString()),
- row.get("duration").asLong(),
- row.get("reason").asString(),
- UUID.fromString(row.get("creator").asString()),
- row.get("name").asString(),
- UUID.fromString(row.get("uuid").asString()));
- templateManager.addTemplate(template);
- }
- }
- if (storage.containsGroup("punishments")) {
- for (StorageRow row : storage.getRowsByGroup("punishments")) {
- UUID playerUUID = UUID.fromString(row.get("victim").asString());
- AppliedPunishment appliedPunishment = new AppliedPunishment(PunishmentType.valueOf(row.get("type").asString()),
- row.get("duration").asLong(),
- row.get("reason").asString(),
- UUID.fromString(row.get("victim").asString()),
- row.get("punisher").asObject() == null ? null : UUID.fromString(row.get("punisher").asString()),
- row.get("expiration").asLong(),
- playerUUID);
- PlayerPunishData playerPunishData = getPunishmentManager().getPlayer(playerUUID);
- playerPunishData.addPunishment(appliedPunishment);
- playerPunishData.audit();
- }
- }
-
- if (storage.containsGroup("notes")) {
- for (StorageRow row : storage.getRowsByGroup("notes")) {
- UUID playerUUID = UUID.fromString(row.get("subject").asString());
- PunishmentNote note = new PunishmentNote(UUID.fromString(row.get("uuid").asString()),
- row.get("note").asString(),
- UUID.fromString(row.get("author").asString()),
- UUID.fromString(row.get("subject").asString()),
- row.get("creation").asLong());
-
- PlayerPunishData playerPunishData = getPunishmentManager().getPlayer(playerUUID);
- playerPunishData.addNotes(note);
- }
- }
-
- if (storage.containsGroup("tickets")) {
- for (StorageRow row : storage.getRowsByGroup("tickets")) {
-
- int id = Integer.parseInt(row.get("id").asString());
- Ticket ticket = new Ticket(
- UUID.fromString(row.get("player").asString()),
- row.get("subject").asString(),
- row.get("type").asString());
- ticket.setTicketId(id);
- ticket.setLocation(Methods.unserializeLocation(row.get("location").asString()));
- ticket.setStatus(TicketStatus.valueOf(row.get("status").asString()));
- ticketManager.addTicket(ticket, id);
- }
- }
-
- if (storage.containsGroup("ticketresponses")) {
- for (StorageRow row : storage.getRowsByGroup("ticketresponses")) {
- int id = row.get("ticketid").asInt();
- TicketResponse ticketResponse = new TicketResponse(
- UUID.fromString(row.get("author").asString()),
- row.get("message").asString(),
- Long.parseLong(row.get("posted").asString()));
- ticketResponse.setTicketId(id);
- ticketManager.getTicket(id).addResponse(ticketResponse);
-
- }
- }
- storage.doSave();
}
@Override
@@ -242,7 +290,19 @@ public class UltimateModeration extends SongodaPlugin {
return staffChatManager;
}
+ public DataManager getDataManager() {
+ return dataManager;
+ }
+
+ public DatabaseConnector getDatabaseConnector() {
+ return databaseConnector;
+ }
+
public GuiManager getGuiManager() {
return guiManager;
}
+
+ public ModerationManager getModerationManager() {
+ return moderationManager;
+ }
}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandBan.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandBan.java
index 07abdc4..57c3a3e 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandBan.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandBan.java
@@ -67,7 +67,7 @@ public class CommandBan extends AbstractCommand {
long durationFinal = duration;
Bukkit.getScheduler().runTaskAsynchronously(instance, () -> {
- if (sender instanceof Player && VaultPermissions.hasPermission(Bukkit.getWorlds().get(0).getName(), player, "um.ban.exempt")) {
+ if (sender instanceof Player && VaultPermissions.hasPermission(player, "um.ban.exempt")) {
instance.getLocale().newMessage("You cannot ban this player.").sendPrefixedMessage(sender);
return;
}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandCommandSpy.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandCommandSpy.java
deleted file mode 100644
index def8037..0000000
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandCommandSpy.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.songoda.ultimatemoderation.commands;
-
-import com.songoda.core.commands.AbstractCommand;
-import com.songoda.ultimatemoderation.UltimateModeration;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-public class CommandCommandSpy extends AbstractCommand {
-
- private UltimateModeration instance;
- private static List inSpy = new ArrayList<>();
-
- public CommandCommandSpy(UltimateModeration instance) {
- super(CommandType.CONSOLE_OK, "CommandSpy");
- this.instance = instance;
- }
-
- public static boolean isSpying(Player player) {
- return !inSpy.contains(player.getUniqueId());
- }
-
- @Override
- protected ReturnType runCommand(CommandSender sender, String... args) {
- Player player = ((Player) sender);
-
- if (inSpy.contains(player.getUniqueId())) {
- inSpy.remove(player.getUniqueId());
- instance.getLocale().getMessage("command.commandspy.toggleOn").sendPrefixedMessage(player);
- } else {
- inSpy.add(player.getUniqueId());
- instance.getLocale().getMessage("command.commandspy.toggleOff").sendPrefixedMessage(player);
- }
- return ReturnType.SUCCESS;
- }
-
- @Override
- protected List onTab(CommandSender sender, String... args) {
- return null;
- }
-
- @Override
- public String getPermissionNode() {
- return "Um.commandspy";
- }
-
- @Override
- public String getSyntax() {
- return "/Commandspy";
- }
-
- @Override
- public String getDescription() {
- return "Allows you to see inside of a players enderchest.";
- }
-}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandFreeze.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandFreeze.java
deleted file mode 100644
index 2f2dcde..0000000
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandFreeze.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.songoda.ultimatemoderation.commands;
-
-import com.songoda.core.commands.AbstractCommand;
-import com.songoda.ultimatemoderation.UltimateModeration;
-import org.bukkit.Bukkit;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-public class CommandFreeze extends AbstractCommand {
-
- private UltimateModeration instance;
- private static List frozen = new ArrayList<>();
-
- public CommandFreeze(UltimateModeration instance) {
- super(CommandType.CONSOLE_OK, "Freeze");
- this.instance = instance;
- }
-
- public static void freeze(OfflinePlayer player, CommandSender sender) {
- UltimateModeration instance = UltimateModeration.getInstance();
- if (frozen.contains(player.getUniqueId())) {
- frozen.remove(player.getUniqueId());
- instance.getLocale().getMessage("command.freeze.remove")
- .processPlaceholder("player", player.getPlayer().getDisplayName()).sendPrefixedMessage(sender);
- instance.getLocale().getMessage("command.freeze.alertremove").sendPrefixedMessage(sender);
- } else {
- frozen.add(player.getUniqueId());
- instance.getLocale().getMessage("command.freeze.add")
- .processPlaceholder("player", player.getPlayer().getDisplayName()).sendPrefixedMessage(sender);
- instance.getLocale().getMessage("command.freeze.alertadd").sendPrefixedMessage(player.getPlayer());
- }
- }
-
- public static boolean isFrozen(OfflinePlayer player) {
- return frozen.contains(player.getUniqueId());
- }
-
- @Override
- protected ReturnType runCommand(CommandSender sender, String... args) {
- if (args.length != 1)
- return ReturnType.SYNTAX_ERROR;
-
- Player player = Bukkit.getPlayer(args[0]);
-
- if (player == null) {
- instance.getLocale().newMessage("That player does not exist or is not online.").sendPrefixedMessage(sender);
- return ReturnType.FAILURE;
- }
-
- if (sender instanceof Player && player.hasPermission("um.freeze.exempt")) {
- instance.getLocale().newMessage("That player cannot be frozen.").sendPrefixedMessage(sender);
- return ReturnType.FAILURE;
- }
-
- freeze(player, sender);
-
- return ReturnType.SUCCESS;
- }
-
- @Override
- protected List onTab(CommandSender sender, String... args) {
- if (args.length == 1) {
- List players = new ArrayList<>();
- for (Player player : Bukkit.getOnlinePlayers()) {
- players.add(player.getName());
- }
- return players;
- }
- return null;
- }
-
- @Override
- public String getPermissionNode() {
- return "um.freeze";
- }
-
- @Override
- public String getSyntax() {
- return "/Freeze ";
- }
-
- @Override
- public String getDescription() {
- return "Allows you to freeze a player.";
- }
-}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandInvSee.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandInvSee.java
deleted file mode 100644
index b2ab774..0000000
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandInvSee.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.songoda.ultimatemoderation.commands;
-
-import com.songoda.core.commands.AbstractCommand;
-import com.songoda.ultimatemoderation.UltimateModeration;
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class CommandInvSee extends AbstractCommand {
-
- private UltimateModeration instance;
-
- public CommandInvSee(UltimateModeration instance) {
- super(CommandType.PLAYER_ONLY, "InvSee");
- this.instance = instance;
- }
-
- @Override
- protected ReturnType runCommand(CommandSender sender, String... args) {
- if (args.length != 1)
- return ReturnType.SYNTAX_ERROR;
-
- Player player = Bukkit.getPlayer(args[0]);
-
- if (player == null) {
- instance.getLocale().newMessage("That player does not exist or is not online").sendPrefixedMessage(sender);
- return ReturnType.FAILURE;
- }
-
- if (player.hasPermission("um.invsee.exempt")) {
- instance.getLocale().newMessage("You cannot invsee that player.").sendPrefixedMessage(sender);
- return ReturnType.FAILURE;
- }
-
- ((Player) sender).openInventory(player.getInventory());
- return ReturnType.SUCCESS;
- }
-
- @Override
- protected List onTab(CommandSender sender, String... args) {
- if (args.length == 1) {
- List players = new ArrayList<>();
- for (Player player : Bukkit.getOnlinePlayers()) {
- players.add(player.getName());
- }
- return players;
- }
- return null;
- }
-
- @Override
- public String getPermissionNode() {
- return "um.invsee";
- }
-
- @Override
- public String getSyntax() {
- return "/InvSee ";
- }
-
- @Override
- public String getDescription() {
- return "Allows you to see inside of a players inventory.";
- }
-}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandKick.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandKick.java
index a4bedf2..28ff94a 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandKick.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandKick.java
@@ -13,7 +13,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-public class CommandKick extends AbstractCommand {
+public class CommandKick extends AbstractCommand {
private UltimateModeration instance;
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandMute.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandMute.java
index 340b4fc..6675ca4 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandMute.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandMute.java
@@ -54,7 +54,7 @@ public class CommandMute extends AbstractCommand {
return ReturnType.FAILURE;
}
- if (sender instanceof Player && VaultPermissions.hasPermission(Bukkit.getWorlds().get(0).getName(), player, "um.mute.exempt")) {
+ if (sender instanceof Player && VaultPermissions.hasPermission(player, "um.mute.exempt")) {
instance.getLocale().newMessage("You cannot mute that player.").sendPrefixedMessage(sender);
return ReturnType.FAILURE;
}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandRandomPlayer.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandRandomPlayer.java
index 8775981..f3398fd 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandRandomPlayer.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandRandomPlayer.java
@@ -26,7 +26,7 @@ public class CommandRandomPlayer extends AbstractCommand {
players.remove(sender);
if (players.size() == 0) {
- instance.getLocale().newMessage("&c You are the only one online!").sendPrefixedMessage(sender);
+ instance.getLocale().newMessage("&cYou are the only one online!").sendPrefixedMessage(sender);
return ReturnType.FAILURE;
}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandRevive.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandRevive.java
deleted file mode 100644
index f73b270..0000000
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandRevive.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.songoda.ultimatemoderation.commands;
-
-import com.songoda.core.commands.AbstractCommand;
-import com.songoda.ultimatemoderation.UltimateModeration;
-import com.songoda.ultimatemoderation.listeners.DeathListener;
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-public class CommandRevive extends AbstractCommand {
-
- private UltimateModeration instance;
-
- public CommandRevive(UltimateModeration instance) {
- super(CommandType.CONSOLE_OK, "Revive");
- this.instance = instance;
- }
-
- @Override
- protected ReturnType runCommand(CommandSender sender, String... args) {
- if (args.length != 1)
- return ReturnType.SYNTAX_ERROR;
-
- Player player = Bukkit.getPlayer(args[0]);
-
- if (player == null) {
- instance.getLocale().newMessage("That player does not exist or is not online.").sendPrefixedMessage(sender);
- return ReturnType.FAILURE;
- }
-
- if (!(revive(player, sender))) return ReturnType.FAILURE;
-
- instance.getLocale().getMessage("command.revive.revived").sendPrefixedMessage(player);
- instance.getLocale().getMessage("command.revive.success")
- .processPlaceholder("player", player.getName()).sendPrefixedMessage(sender);
- return ReturnType.SUCCESS;
- }
-
- @Override
- protected List onTab(CommandSender sender, String... args) {
- if (args.length == 1) {
- List players = new ArrayList<>();
- for (Player player : Bukkit.getOnlinePlayers()) {
- players.add(player.getName());
- }
- return players;
- }
- return null;
- }
-
- public static boolean revive(Player player, CommandSender sender) {
- UltimateModeration instance = UltimateModeration.getInstance();
- List drops = DeathListener.getLastDrop(player);
-
- if (drops == null) {
- instance.getLocale().getMessage("command.revive.noloot").sendPrefixedMessage(sender);
- return false;
- }
-
- ItemStack[] dropArr = new ItemStack[drops.size()];
- dropArr = drops.toArray(dropArr);
-
- HashMap leftOver = player.getInventory().addItem(dropArr);
-
- for (ItemStack item : leftOver.values()) {
- player.getWorld().dropItemNaturally(player.getLocation(), item);
- }
- return true;
- }
-
- @Override
- public String getPermissionNode() {
- return "um.revive";
- }
-
- @Override
- public String getSyntax() {
- return "/Revive ";
- }
-
- @Override
- public String getDescription() {
- return "Allows you to revive a player.";
- }
-}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandRunTemplate.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandRunTemplate.java
index b7ec2e8..e5283a4 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandRunTemplate.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandRunTemplate.java
@@ -62,7 +62,7 @@ public class CommandRunTemplate extends AbstractCommand {
} else if (args.length == 2) {
List lines = new ArrayList<>();
for (Template template : instance.getTemplateManager().getTemplates().values()) {
- lines.add(template.getTemplateName());
+ lines.add(template.getName());
}
}
return null;
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandTicket.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandTicket.java
index 79f0092..fe4d873 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandTicket.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandTicket.java
@@ -2,7 +2,7 @@ package com.songoda.ultimatemoderation.commands;
import com.songoda.core.commands.AbstractCommand;
import com.songoda.ultimatemoderation.UltimateModeration;
-import com.songoda.ultimatemoderation.gui.GUITicketManager;
+import com.songoda.ultimatemoderation.gui.TicketManagerGui;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -21,7 +21,7 @@ public class CommandTicket extends AbstractCommand {
protected ReturnType runCommand(CommandSender sender, String... args) {
Player senderP = ((Player) sender);
- new GUITicketManager(instance, senderP, senderP);
+ new TicketManagerGui(instance, senderP, senderP);
return ReturnType.SUCCESS;
}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandUltimateModeration.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandUltimateModeration.java
index 616acb7..710f0c3 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandUltimateModeration.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandUltimateModeration.java
@@ -2,7 +2,7 @@ package com.songoda.ultimatemoderation.commands;
import com.songoda.core.commands.AbstractCommand;
import com.songoda.ultimatemoderation.UltimateModeration;
-import com.songoda.ultimatemoderation.gui.GUIPlayers;
+import com.songoda.ultimatemoderation.gui.MainGui;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -19,7 +19,7 @@ public class CommandUltimateModeration extends AbstractCommand {
@Override
protected ReturnType runCommand(CommandSender sender, String... args) {
- new GUIPlayers(instance, (Player) sender);
+ instance.getGuiManager().showGUI((Player) sender, new MainGui(instance, (Player) sender));
return ReturnType.SUCCESS;
}
@@ -40,6 +40,6 @@ public class CommandUltimateModeration extends AbstractCommand {
@Override
public String getDescription() {
- return "Displays this page.";
+ return "Displays the moderation panel.";
}
}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandUnBan.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandUnBan.java
index 191845c..3aa7845 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandUnBan.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandUnBan.java
@@ -72,6 +72,6 @@ public class CommandUnBan extends AbstractCommand {
@Override
public String getDescription() {
- return "Allows you to ban players.";
+ return "Allows you to unban players.";
}
}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandViewEnderChest.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandViewEnderChest.java
deleted file mode 100644
index 518c1e9..0000000
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandViewEnderChest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.songoda.ultimatemoderation.commands;
-
-import com.songoda.core.commands.AbstractCommand;
-import com.songoda.ultimatemoderation.UltimateModeration;
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class CommandViewEnderChest extends AbstractCommand {
-
- private UltimateModeration instance;
-
- public CommandViewEnderChest(UltimateModeration instance) {
- super(CommandType.PLAYER_ONLY, "ViewEnderChest");
- this.instance = instance;
- }
-
- @Override
- protected ReturnType runCommand(CommandSender sender, String... args) {
-
- if (args.length != 1)
- return ReturnType.SYNTAX_ERROR;
-
- Player player = Bukkit.getPlayer(args[0]);
-
- if (player == null) {
- instance.getLocale().newMessage("That player does not exist or is not online.").sendPrefixedMessage(sender);
- return ReturnType.FAILURE;
- }
-
- if (player.hasPermission("um.viewenderchest.exempt")) {
- instance.getLocale().newMessage("You cannot view the enderchest of that player.").sendPrefixedMessage(sender);
- return ReturnType.FAILURE;
- }
-
- ((Player) sender).openInventory(player.getEnderChest());
- return ReturnType.SUCCESS;
- }
-
- @Override
- protected List onTab(CommandSender sender, String... args) {
- if (args.length == 1) {
- List players = new ArrayList<>();
- for (Player player : Bukkit.getOnlinePlayers()) {
- players.add(player.getName());
- }
- return players;
- }
- return null;
- }
-
- @Override
- public String getPermissionNode() {
- return "um.viewenderchest";
- }
-
- @Override
- public String getSyntax() {
- return "/ViewEnderChest ";
- }
-
- @Override
- public String getDescription() {
- return "Allows you to see inside of a players enderchest.";
- }
-}
diff --git a/src/main/java/com/songoda/ultimatemoderation/commands/CommandWarn.java b/src/main/java/com/songoda/ultimatemoderation/commands/CommandWarn.java
index 357ea35..596c6c2 100644
--- a/src/main/java/com/songoda/ultimatemoderation/commands/CommandWarn.java
+++ b/src/main/java/com/songoda/ultimatemoderation/commands/CommandWarn.java
@@ -49,12 +49,12 @@ public class CommandWarn extends AbstractCommand {
OfflinePlayer player = Bukkit.getOfflinePlayer(args[0]);
- if (player == null) {
+ if (!player.hasPlayedBefore()) {
instance.getLocale().newMessage("That player does not exist.").sendPrefixedMessage(sender);
return ReturnType.FAILURE;
}
- if (sender instanceof Player && VaultPermissions.hasPermission(Bukkit.getWorlds().get(0).getName(), player, "um.warning.exempt")) {
+ if (sender instanceof Player && VaultPermissions.hasPermission(player, "um.warning.exempt")) {
instance.getLocale().newMessage("You cannot warn that player.").sendPrefixedMessage(sender);
return ReturnType.FAILURE;
}
diff --git a/src/main/java/com/songoda/ultimatemoderation/database/DataManager.java b/src/main/java/com/songoda/ultimatemoderation/database/DataManager.java
new file mode 100644
index 0000000..7c0458e
--- /dev/null
+++ b/src/main/java/com/songoda/ultimatemoderation/database/DataManager.java
@@ -0,0 +1,321 @@
+package com.songoda.ultimatemoderation.database;
+
+import com.songoda.core.database.DataManagerAbstract;
+import com.songoda.core.database.DatabaseConnector;
+import com.songoda.ultimatemoderation.punish.AppliedPunishment;
+import com.songoda.ultimatemoderation.punish.PunishmentNote;
+import com.songoda.ultimatemoderation.punish.PunishmentType;
+import com.songoda.ultimatemoderation.punish.template.Template;
+import com.songoda.ultimatemoderation.tickets.Ticket;
+import com.songoda.ultimatemoderation.tickets.TicketResponse;
+import com.songoda.ultimatemoderation.tickets.TicketStatus;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.plugin.Plugin;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.*;
+import java.util.function.Consumer;
+
+public class DataManager extends DataManagerAbstract {
+
+ public DataManager(DatabaseConnector databaseConnector, Plugin plugin) {
+ super(databaseConnector, plugin);
+ }
+
+ public void createTemplate(Template template) {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
+ String createTemplate = "INSERT INTO " + this.getTablePrefix() + "templates (punishment_type, duration, reason, name, creator) VALUES (?, ?, ?, ?, ?)";
+ try (PreparedStatement statement = connection.prepareStatement(createTemplate)) {
+ statement.setString(1, template.getPunishmentType().name());
+ statement.setLong(2, template.getDuration());
+ statement.setString(3, template.getReason());
+ statement.setString(4, template.getName());
+ statement.setString(5, template.getCreator().toString());
+ statement.executeUpdate();
+ }
+
+ int templateId = this.lastInsertedId(connection, "templates");
+ template.setId(templateId);
+ }), "create");
+ }
+
+ public void deleteTemplate(Template template) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String deleteTemplate = "DELETE FROM " + this.getTablePrefix() + "templates WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteTemplate)) {
+ statement.setLong(1, template.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void getTemplates(Consumer> callback) {
+ List templates = new ArrayList<>();
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ try (Statement statement = connection.createStatement()) {
+ String selectTemplates = "SELECT * FROM " + this.getTablePrefix() + "templates";
+ ResultSet result = statement.executeQuery(selectTemplates);
+ while (result.next()) {
+ int id = result.getInt("id");
+ PunishmentType punishmentType = PunishmentType.valueOf(result.getString("punishment_type"));
+ long duration = result.getLong("duration");
+ String reason = result.getString("reason");
+ String name = result.getString("name");
+ UUID creator = UUID.fromString(result.getString("creator"));
+ Template template = new Template(punishmentType, duration, reason, creator, name);
+ template.setId(id);
+ templates.add(template);
+ }
+ }
+
+ this.sync(() -> callback.accept(templates));
+ }));
+ }
+
+ public void createAppliedPunishment(AppliedPunishment punishment) {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
+ String createPunishment = "INSERT INTO " + this.getTablePrefix() + "punishments (type, duration, reason, victim, punisher, expiration) VALUES (?, ?, ?, ?, ?, ?)";
+ try (PreparedStatement statement = connection.prepareStatement(createPunishment)) {
+ statement.setString(1, punishment.getPunishmentType().name());
+ statement.setLong(2, punishment.getDuration());
+ statement.setString(3, punishment.getReason());
+ statement.setString(4, punishment.getVictim().toString());
+ statement.setString(5, punishment.getPunisher().toString());
+ statement.setLong(6, punishment.getExpiration());
+ statement.executeUpdate();
+ }
+
+ int punishmentId = this.lastInsertedId(connection, "punishments");
+ punishment.setId(punishmentId);
+ }), "create");
+ }
+
+ public void deleteAppliedPunishment(AppliedPunishment punishment) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String deletePunishment = "DELETE FROM " + this.getTablePrefix() + "punishments WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deletePunishment)) {
+ statement.setLong(1, punishment.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void updateAppliedPunishment(AppliedPunishment punishment) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String updatePunishment = "UPDATE " + this.getTablePrefix() + "punishments set type = ?, duration = ?, reason = ?, victim = ?, punisher = ?, expiration = ? WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(updatePunishment)) {
+ statement.setString(1, punishment.getPunishmentType().name());
+ statement.setLong(2, punishment.getDuration());
+ statement.setString(3, punishment.getReason());
+ statement.setString(4, punishment.getVictim().toString());
+ statement.setString(5, punishment.getPunisher().toString());
+ statement.setLong(6, punishment.getExpiration());
+ statement.setLong(7, punishment.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void getAppliedPunishments(Consumer> callback) {
+ List appliedPunishments = new ArrayList<>();
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ try (Statement statement = connection.createStatement()) {
+ String selectPunishments = "SELECT * FROM " + this.getTablePrefix() + "punishments";
+ ResultSet result = statement.executeQuery(selectPunishments);
+ while (result.next()) {
+ int id = result.getInt("id");
+ PunishmentType punishmentType = PunishmentType.valueOf(result.getString("type"));
+ long duration = result.getLong("duration");
+ String reason = result.getString("reason");
+ UUID victim = UUID.fromString(result.getString("victim"));
+ UUID punisher = UUID.fromString(result.getString("punisher"));
+ long expiration = result.getLong("expiration");
+ appliedPunishments.add(new AppliedPunishment(punishmentType, duration, reason, victim, punisher, expiration, id));
+ }
+ }
+
+ this.sync(() -> callback.accept(appliedPunishments));
+ }));
+ }
+
+ public void createNote(PunishmentNote note) {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
+ String createNote = "INSERT INTO " + this.getTablePrefix() + "notes (note, author, subject, creation) VALUES (?, ?, ?, ?)";
+ try (PreparedStatement statement = connection.prepareStatement(createNote)) {
+ statement.setString(1, note.getNote());
+ statement.setString(2, note.getAuthor().toString());
+ statement.setString(3, note.getSubject().toString());
+ statement.setLong(4, note.getCreationDate());
+ statement.executeUpdate();
+ }
+
+ int noteId = this.lastInsertedId(connection, "notes");
+ note.setId(noteId);
+ }), "create");
+ }
+
+ public void deleteNote(PunishmentNote note) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String deleteNote = "DELETE FROM " + this.getTablePrefix() + "notes WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteNote)) {
+ statement.setLong(1, note.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void getNotes(Consumer> callback) {
+ List notes = new ArrayList<>();
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ try (Statement statement = connection.createStatement()) {
+ String getNotes = "SELECT * FROM " + this.getTablePrefix() + "notes";
+ ResultSet result = statement.executeQuery(getNotes);
+ while (result.next()) {
+ int id = result.getInt("id");
+ String note = result.getString("note");
+ UUID author = UUID.fromString(result.getString("author"));
+ UUID subject = UUID.fromString(result.getString("subject"));
+ long creation = result.getLong("creation");
+ notes.add(new PunishmentNote(id, note, author, subject, creation));
+ }
+ }
+
+ this.sync(() -> callback.accept(notes));
+ }));
+ }
+
+ public void createTicket(Ticket ticket) {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
+ String createTicket = "INSERT INTO " + this.getTablePrefix() + "tickets (victim, subject, type, status, world, x, y, z, pitch, yaw) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ try (PreparedStatement statement = connection.prepareStatement(createTicket)) {
+ statement.setString(1, ticket.getVictim().toString());
+ statement.setString(2, ticket.getSubject());
+ statement.setString(3, ticket.getType());
+ statement.setString(4, ticket.getStatus().name());
+
+ Location location = ticket.getLocation();
+
+ statement.setString(5, location.getWorld().getName());
+ statement.setDouble(6, location.getX());
+ statement.setDouble(7, location.getY());
+ statement.setDouble(8, location.getZ());
+ statement.setFloat(9, location.getPitch());
+ statement.setFloat(10, location.getYaw());
+ statement.executeUpdate();
+ }
+
+ for (TicketResponse response : ticket.getResponses())
+ createTicketResponse(response);
+
+ int ticketId = this.lastInsertedId(connection, "tickets");
+ ticket.setId(ticketId);
+ }), "create");
+ }
+
+ public void deleteTicket(Ticket ticket) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String deleteTicket = "DELETE FROM " + this.getTablePrefix() + "tickets WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteTicket)) {
+ statement.setLong(1, ticket.getId());
+ statement.executeUpdate();
+ }
+
+ String deleteTicketResponses = "DELETE FROM " + this.getTablePrefix() + "ticket_responses WHERE ticket_id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteTicketResponses)) {
+ statement.setLong(1, ticket.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void updateTicket(Ticket ticket) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String updateTicket = "UPDATE " + this.getTablePrefix() + "tickets SET victim = ?, subject = ?, type = ?, status = ?, world = ?, x = ?, y = ?, z = ?, pitch = ?, yaw = ? WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(updateTicket)) {
+ statement.setString(1, ticket.getVictim().toString());
+ statement.setString(2, ticket.getSubject());
+ statement.setString(3, ticket.getType());
+ statement.setString(4, ticket.getStatus().name());
+
+ Location location = ticket.getLocation();
+
+ statement.setString(5, location.getWorld().getName());
+ statement.setDouble(6, location.getX());
+ statement.setDouble(7, location.getY());
+ statement.setDouble(8, location.getZ());
+ statement.setFloat(9, location.getPitch());
+ statement.setFloat(10, location.getYaw());
+ statement.setInt(11, ticket.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void getTickets(Consumer