diff --git a/build.gradle b/build.gradle index ac54b5d..c6ed030 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,7 @@ repositories { dependencies { + implementation 'com.google.code.gson:gson:2.10.1' api 'commons-io:commons-io:2.11.0' api 'org.apache.commons:commons-pool2:2.11.1' api 'org.mariadb.jdbc:mariadb-java-client:3.1.3' diff --git a/src/main/java/uk/hotten/staffog/StaffOGPlugin.java b/src/main/java/uk/hotten/staffog/StaffOGPlugin.java index 201b75b..2d60437 100644 --- a/src/main/java/uk/hotten/staffog/StaffOGPlugin.java +++ b/src/main/java/uk/hotten/staffog/StaffOGPlugin.java @@ -8,6 +8,7 @@ import uk.hotten.staffog.commands.*; import uk.hotten.staffog.data.DatabaseManager; import uk.hotten.staffog.punish.PunishManager; import uk.hotten.staffog.security.SecurityManager; +import uk.hotten.staffog.tasks.TaskManager; import uk.hotten.staffog.utils.Console; public class StaffOGPlugin extends JavaPlugin { @@ -28,6 +29,7 @@ public class StaffOGPlugin extends JavaPlugin { DatabaseManager databaseManager = new DatabaseManager(this); PunishManager punishManager = new PunishManager(this); SecurityManager securityManager = new SecurityManager(this); + TaskManager taskManager = new TaskManager(this); getCommand("stafflink").setExecutor(new StaffLinkCommand()); diff --git a/src/main/java/uk/hotten/staffog/punish/PunishManager.java b/src/main/java/uk/hotten/staffog/punish/PunishManager.java index 7b4d67a..4b4725e 100644 --- a/src/main/java/uk/hotten/staffog/punish/PunishManager.java +++ b/src/main/java/uk/hotten/staffog/punish/PunishManager.java @@ -140,6 +140,42 @@ public class PunishManager { } } + public PunishEntry getPunishment(PunishType type, int id) { + try (Connection connection = DatabaseManager.getInstance().createConnection()) { + + PreparedStatement statement = connection.prepareStatement("SELECT * FROM `" + type.getTable() + "` WHERE `id`=?"); + statement.setLong(1, id); + + ResultSet rs = statement.executeQuery(); + + if (!rs.next()) + return null; + + PunishEntry entry = new PunishEntry(type); + entry.setId(rs.getLong("id")); + entry.setUuid(UUID.fromString(rs.getString("uuid"))); + entry.setReason(rs.getString("reason")); + entry.setByUuid(rs.getString("by_uuid")); + entry.setByName(rs.getString("by_name")); + entry.setTime(rs.getLong("time")); + entry.setUntil(rs.getLong("until")); + entry.setActive(rs.getInt("active") == 1); + + if (entry.checkDurationOver()) { + expirePunishment(entry); + return null; + } + + return entry; + + + } catch (Exception e) { + Console.error("Failed to get punishment info for id " + id); + e.printStackTrace(); + return null; + } + } + public PunishEntry checkActivePunishment(PunishType type, UUID uuid) { try (Connection connection = DatabaseManager.getInstance().createConnection()) { diff --git a/src/main/java/uk/hotten/staffog/tasks/TaskManager.java b/src/main/java/uk/hotten/staffog/tasks/TaskManager.java new file mode 100644 index 0000000..7d7d9ae --- /dev/null +++ b/src/main/java/uk/hotten/staffog/tasks/TaskManager.java @@ -0,0 +1,87 @@ +package uk.hotten.staffog.tasks; + +import com.google.gson.Gson; +import lombok.Getter; +import org.bukkit.plugin.java.JavaPlugin; +import uk.hotten.staffog.data.DatabaseManager; +import uk.hotten.staffog.punish.PunishManager; +import uk.hotten.staffog.punish.data.PunishEntry; +import uk.hotten.staffog.tasks.data.TaskEntry; +import uk.hotten.staffog.tasks.data.UnpunishTask; +import uk.hotten.staffog.utils.Console; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; + +public class TaskManager { + + @Getter private JavaPlugin plugin; + + public TaskManager(JavaPlugin plugin) { + this.plugin = plugin; + + plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, () -> { + for (TaskEntry entry : checkForTasks()) { + switch (entry.getTask()) { + case "unpunish": { + processUnpunish(entry); + deleteTask(entry.getId()); + break; + } + } + } + }, 0, 1200); + } + + private ArrayList checkForTasks() { + try (Connection connection = DatabaseManager.getInstance().createConnection()){ + PreparedStatement statement = connection.prepareStatement("SELECT * FROM `staffog_task`;"); + + ResultSet rs = statement.executeQuery(); + + ArrayList toReturn = new ArrayList<>(); + + while (rs.next()) { + TaskEntry entry = new TaskEntry(); + entry.setId(rs.getInt("id")); + entry.setTask(rs.getString("task")); + entry.setData(rs.getString("data")); + toReturn.add(entry); + } + + return toReturn; + } catch (Exception e) { + e.printStackTrace(); + return new ArrayList<>(); + } + } + + private void processUnpunish(TaskEntry entry) { + if (!entry.getTask().equals("unpunish")) + return; + + Gson gson = new Gson(); + UnpunishTask task = gson.fromJson(entry.getData(), UnpunishTask.class); + PunishEntry punishEntry = PunishManager.getInstance().getPunishment(task.getType(), task.getId()); + punishEntry.setRemovedUuid(task.getRemovedUuid().toString()); + punishEntry.setRemovedName(task.getRemovedName()); + punishEntry.setRemovedReason(task.getRemovedReason()); + punishEntry.setRemovedTime(task.getRemovedTime()); + punishEntry.setActive(false); + PunishManager.getInstance().removePunishment(punishEntry); + } + + private void deleteTask(int id) { + try (Connection connection = DatabaseManager.getInstance().createConnection()){ + PreparedStatement statement = connection.prepareStatement("DELETE FROM `staffog_task` WHERE `id`=?"); + statement.setInt(1, id); + + statement.executeQuery(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/uk/hotten/staffog/tasks/data/TaskEntry.java b/src/main/java/uk/hotten/staffog/tasks/data/TaskEntry.java new file mode 100644 index 0000000..ea42a08 --- /dev/null +++ b/src/main/java/uk/hotten/staffog/tasks/data/TaskEntry.java @@ -0,0 +1,12 @@ +package uk.hotten.staffog.tasks.data; + +import lombok.Getter; +import lombok.Setter; + +public class TaskEntry { + + @Getter @Setter private int id; + @Getter @Setter private String task; + @Getter @Setter private String data; + +} diff --git a/src/main/java/uk/hotten/staffog/tasks/data/UnpunishTask.java b/src/main/java/uk/hotten/staffog/tasks/data/UnpunishTask.java new file mode 100644 index 0000000..3791d74 --- /dev/null +++ b/src/main/java/uk/hotten/staffog/tasks/data/UnpunishTask.java @@ -0,0 +1,28 @@ +package uk.hotten.staffog.tasks.data; + +import lombok.Getter; +import uk.hotten.staffog.punish.data.PunishType; + +import java.util.UUID; + +public class UnpunishTask { + + @Getter private PunishType type; + @Getter private int id; + @Getter private UUID removedUuid; + @Getter private String removedName; + @Getter private String removedReason; + @Getter private long removedTime; + + public UnpunishTask(String type, int id, String removedUuid, String removedName, String removedReason, long removedTime) { + this.type = PunishType.valueOf(type); + this.id = id; + this.removedUuid = UUID.fromString(removedUuid); + this.removedName = removedName; + this.removedReason = removedReason; + this.removedTime = removedTime; + } + + public UnpunishTask() { } + +}