summaryrefslogtreewikicommitdiff
path: root/src/main/java/net/tylermurphy/hideAndSeek/database
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/tylermurphy/hideAndSeek/database')
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/Database.java5
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java20
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java106
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java7
4 files changed, 130 insertions, 8 deletions
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java
index 0489b5d..8afc4ba 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java
@@ -39,6 +39,7 @@ public class Database {
private final GameDataTable playerInfo;
private final NameDataTable nameInfo;
+ private final InventoryTable inventoryInfo;
private final DatabaseConnection connection;
public Database(){
@@ -53,6 +54,8 @@ public class Database {
nameInfo = new NameDataTable(this);
+ inventoryInfo = new InventoryTable(this);
+
LegacyTable legacyTable = new LegacyTable(this);
if(legacyTable.exists()){
if(legacyTable.copyData()){
@@ -69,6 +72,8 @@ public class Database {
public NameDataTable getNameData() { return nameInfo; }
+ public InventoryTable getInventoryData() { return inventoryInfo; }
+
protected Connection connect() {
Connection conn = null;
try {
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java
index ce392a9..929356e 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java
@@ -23,6 +23,7 @@ import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.database.util.PlayerInfo;
import net.tylermurphy.hideAndSeek.game.Board;
import net.tylermurphy.hideAndSeek.game.util.WinType;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.*;
@@ -91,7 +92,7 @@ public class GameDataTable {
}
@Nullable
- public PlayerInfo getInfoRanking(String order, int place) {
+ public PlayerInfo getInfoRanking(@NotNull String order, int place) {
String sql = "SELECT * FROM hs_data ORDER BY "+order+" DESC LIMIT 1 OFFSET ?;";
try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setInt(1, place-1);
@@ -154,7 +155,7 @@ public class GameDataTable {
}
@Nullable
- public Integer getRanking(String order, UUID uuid) {
+ public Integer getRanking(@NotNull String order, @NotNull UUID uuid) {
String sql = "SELECT count(*) AS total FROM hs_data WHERE "+order+" >= (SELECT "+order+" FROM hs_data WHERE uuid = ?) AND "+order+" > 0;";
try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setBytes(1, database.encodeUUID(uuid));
@@ -170,7 +171,16 @@ public class GameDataTable {
return null;
}
- public void addWins(Board board, List<UUID> uuids, List<UUID> winners, Map<String,Integer> hider_kills, Map<String,Integer> hider_deaths, Map<String,Integer> seeker_kills, Map<String,Integer> seeker_deaths, WinType type) {
+ public void addWins(
+ @NotNull Board board,
+ @NotNull List<UUID> uuids,
+ @NotNull List<UUID> winners,
+ @NotNull Map<String,Integer> hider_kills,
+ @NotNull Map<String,Integer> hider_deaths,
+ @NotNull Map<String,Integer> seeker_kills,
+ @NotNull Map<String,Integer> seeker_deaths,
+ @NotNull WinType type
+ ) {
for(UUID uuid : uuids) {
PlayerInfo info = getInfo(uuid);
if(info == null){
@@ -190,7 +200,7 @@ public class GameDataTable {
}
}
- protected boolean updateInfo(byte[] uuid, int hider_wins, int seeker_wins, int hider_games, int seeker_games, int hider_kills, int seeker_kills, int hider_deaths, int seeker_deaths){
+ protected boolean updateInfo(@NotNull byte[] uuid, int hider_wins, int seeker_wins, int hider_games, int seeker_games, int hider_kills, int seeker_kills, int hider_deaths, int seeker_deaths){
boolean success;
String sql = "INSERT OR REPLACE INTO hs_data (uuid, hider_wins, seeker_wins, hider_games, seeker_games, hider_kills, seeker_kills, hider_deaths, seeker_deaths) VALUES (?,?,?,?,?,?,?,?,?)";
try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
@@ -211,7 +221,7 @@ public class GameDataTable {
e.printStackTrace();
success = false;
} finally {
- CACHE.remove(uuid);
+ CACHE.remove(database.decodeUUID(uuid));
}
return success;
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java
new file mode 100644
index 0000000..814ea5e
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/database/InventoryTable.java
@@ -0,0 +1,106 @@
+package net.tylermurphy.hideAndSeek.database;
+
+import net.tylermurphy.hideAndSeek.Main;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.util.io.BukkitObjectInputStream;
+import org.bukkit.util.io.BukkitObjectOutputStream;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.sql.*;
+import java.util.UUID;
+
+public class InventoryTable {
+
+ private final Database database;
+
+ protected InventoryTable(Database database) {
+
+ String sql = "CREATE TABLE IF NOT EXISTS hs_inventory (\n"
+ + " uuid BINARY(16) NOT NULL,\n"
+ + " inventory TEXT NOT NULL,\n"
+ + " PRIMARY KEY (uuid)\n"
+ + ");";
+
+ try(Connection connection = database.connect(); Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ } catch (SQLException e) {
+ Main.getInstance().getLogger().severe("SQL Error: " + e.getMessage());
+ e.printStackTrace();
+ }
+
+ this.database = database;
+ }
+
+ @Nullable
+ public ItemStack[] getInventory(@NotNull UUID uuid) {
+ String sql = "SELECT * FROM hs_inventory WHERE uuid = ?;";
+ try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
+ statement.setBytes(1, database.encodeUUID(uuid));
+ ResultSet rs = statement.executeQuery();
+ if (rs.next()) {
+ String data = rs.getString("inventory");
+ if(data == null) return null;
+ return itemStackArrayFromBase64(data);
+ }
+ rs.close();
+ } catch (SQLException e) {
+ Main.getInstance().getLogger().severe("SQL Error: " + e.getMessage());
+ e.printStackTrace();
+ } catch (IOException e) {
+ Main.getInstance().getLogger().severe("IO Error: " + e.getMessage());
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public boolean saveInventory(@NotNull UUID uuid, @NotNull ItemStack[] itemArray) {
+ String sql = "INSERT OR REPLACE INTO hs_inventory (uuid, inventory) VALUES (?,?)";
+ String data = itemStackArrayToBase64(itemArray);
+ try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
+ statement.setBytes(1, database.encodeUUID(uuid));
+ statement.setString(2, data);
+ statement.execute();
+ statement.close();
+ return true;
+ } catch (SQLException e) {
+ Main.getInstance().getLogger().severe("SQL Error: " + e.getMessage());
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ private String itemStackArrayToBase64(ItemStack[] itemArray) throws IllegalStateException {
+ try {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);
+
+ dataOutput.writeObject(itemArray);
+
+ dataOutput.close();
+
+ return Base64Coder.encodeLines(outputStream.toByteArray());
+ } catch (Exception e) {
+ throw new IllegalStateException("Error whilst saving items, Please contact the developer", e);
+ }
+ }
+
+ private ItemStack[] itemStackArrayFromBase64(String data) throws IOException {
+ try {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
+ BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
+
+ ItemStack[] itemArray = (ItemStack[]) dataInput.readObject();
+
+ dataInput.close();
+ return itemArray;
+ } catch (ClassNotFoundException e) {
+ throw new IOException("Error whilst loading items, Please contact the developer", e);
+ }
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java
index e5ac4bb..dd32507 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/database/NameDataTable.java
@@ -22,6 +22,7 @@ package net.tylermurphy.hideAndSeek.database;
import net.tylermurphy.hideAndSeek.Main;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.management.BufferPoolMXBean;
@@ -51,7 +52,7 @@ public class NameDataTable {
}
@Nullable
- public String getName(UUID uuid) {
+ public String getName(@NotNull UUID uuid) {
String sql = "SELECT * FROM hs_names WHERE uuid = ?;";
try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setBytes(1, database.encodeUUID(uuid));
@@ -73,7 +74,7 @@ public class NameDataTable {
}
@Nullable
- public UUID getUUID(String name) {
+ public UUID getUUID(@NotNull String name) {
String sql = "SELECT * FROM hs_names WHERE name = ?;";
try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setString(1, name);
@@ -94,7 +95,7 @@ public class NameDataTable {
return null;
}
- public boolean update(UUID uuid, String name){
+ public boolean update(@NotNull UUID uuid, @NotNull String name){
String sql = "INSERT OR REPLACE INTO hs_names (uuid, name) VALUES (?,?)";
try(Connection connection = database.connect(); PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setBytes(1, database.encodeUUID(uuid));