From b4454057dbdee4bdaf40602b4b750f12df0353ae Mon Sep 17 00:00:00 2001 From: SamB440 Date: Mon, 16 Dec 2019 17:31:23 +0000 Subject: [PATCH] First SQL code, add listeners --- .../islandearth/rpgregions/RPGRegions.java | 10 ++++ .../listener/ConnectionListener.java | 23 ++++++++ .../rpgregions/listener/RegionListener.java | 13 +++++ .../managers/data/StorageManager.java | 15 +++++- .../data/account/RPGRegionsAccount.java | 15 +++--- .../managers/data/sql/SqlStorage.java | 53 ++++++++++++++++--- 6 files changed, 112 insertions(+), 17 deletions(-) create mode 100644 src/main/java/net/islandearth/rpgregions/listener/ConnectionListener.java create mode 100644 src/main/java/net/islandearth/rpgregions/listener/RegionListener.java diff --git a/src/main/java/net/islandearth/rpgregions/RPGRegions.java b/src/main/java/net/islandearth/rpgregions/RPGRegions.java index 51d0c13..ab4a224 100644 --- a/src/main/java/net/islandearth/rpgregions/RPGRegions.java +++ b/src/main/java/net/islandearth/rpgregions/RPGRegions.java @@ -5,10 +5,14 @@ import net.islandearth.languagy.language.LanguagyImplementation; import net.islandearth.languagy.language.LanguagyPluginHook; import net.islandearth.languagy.language.Translator; import net.islandearth.rpgregions.api.RPGRegionsAPI; +import net.islandearth.rpgregions.listener.ConnectionListener; +import net.islandearth.rpgregions.listener.RegionListener; import net.islandearth.rpgregions.managers.RPGRegionsManagers; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; @@ -90,6 +94,12 @@ public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, Langu saveConfig(); } + private void registerListeners() { + PluginManager pm = Bukkit.getPluginManager(); + pm.registerEvents(new ConnectionListener(this), this); + pm.registerEvents(new RegionListener(), this); + } + public static RPGRegionsAPI getAPI() { return plugin; } diff --git a/src/main/java/net/islandearth/rpgregions/listener/ConnectionListener.java b/src/main/java/net/islandearth/rpgregions/listener/ConnectionListener.java new file mode 100644 index 0000000..4a1bf84 --- /dev/null +++ b/src/main/java/net/islandearth/rpgregions/listener/ConnectionListener.java @@ -0,0 +1,23 @@ +package net.islandearth.rpgregions.listener; + +import net.islandearth.rpgregions.RPGRegions; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +public class ConnectionListener implements Listener { + + private final RPGRegions plugin; + + public ConnectionListener(RPGRegions plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onLeave(PlayerQuitEvent pqe) { + Player player = pqe.getPlayer(); + if (plugin.getManagers().getStorageManager().getCachedAccounts().containsKey(player.getUniqueId())) + plugin.getManagers().getStorageManager().removeCachedAccount(player.getUniqueId()); + } +} diff --git a/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java b/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java new file mode 100644 index 0000000..c6a4c20 --- /dev/null +++ b/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java @@ -0,0 +1,13 @@ +package net.islandearth.rpgregions.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; + +public class RegionListener implements Listener { + + @EventHandler + public void onMove(PlayerMoveEvent pme) { + + } +} diff --git a/src/main/java/net/islandearth/rpgregions/managers/data/StorageManager.java b/src/main/java/net/islandearth/rpgregions/managers/data/StorageManager.java index 996a9fc..fec4338 100644 --- a/src/main/java/net/islandearth/rpgregions/managers/data/StorageManager.java +++ b/src/main/java/net/islandearth/rpgregions/managers/data/StorageManager.java @@ -1,9 +1,20 @@ package net.islandearth.rpgregions.managers.data; import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; -import org.bukkit.entity.Player; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentMap; public interface StorageManager { - RPGRegionsAccount getAccount(Player player); + CompletableFuture getAccount(UUID uuid); + + ConcurrentMap getCachedAccounts(); + + void removeCachedAccount(UUID uuid); + + default String getDatabaseUuid(UUID uuid) { + return uuid.toString().replace("-", ""); + } } diff --git a/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java b/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java index d4ddb1c..9348bae 100644 --- a/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java +++ b/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java @@ -6,13 +6,14 @@ import java.util.UUID; public class RPGRegionsAccount { + private UUID uuid; + private List discoveredRegions = new ArrayList<>(); + + public RPGRegionsAccount(UUID uuid, List discoveredRegions) { + this.discoveredRegions = discoveredRegions; + } + public List getDiscoveredRegions() { return discoveredRegions; } - - private List discoveredRegions = new ArrayList<>(); - - public RPGRegionsAccount(UUID uuid) { - - } -} +} \ No newline at end of file diff --git a/src/main/java/net/islandearth/rpgregions/managers/data/sql/SqlStorage.java b/src/main/java/net/islandearth/rpgregions/managers/data/sql/SqlStorage.java index 8560262..3306557 100644 --- a/src/main/java/net/islandearth/rpgregions/managers/data/sql/SqlStorage.java +++ b/src/main/java/net/islandearth/rpgregions/managers/data/sql/SqlStorage.java @@ -1,17 +1,24 @@ package net.islandearth.rpgregions.managers.data.sql; -import co.aikar.idb.DB; -import co.aikar.idb.Database; -import co.aikar.idb.DatabaseOptions; -import co.aikar.idb.PooledDatabaseOptions; +import co.aikar.idb.*; +import com.google.common.collect.ImmutableMap; import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.managers.data.StorageManager; import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; -import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + public class SqlStorage implements StorageManager { + private ConcurrentMap cachedAccounts = new ConcurrentHashMap<>(); + public SqlStorage() { RPGRegions plugin = JavaPlugin.getPlugin(RPGRegions.class); DatabaseOptions options = DatabaseOptions.builder().mysql(plugin.getConfig().getString("sql.user"), @@ -20,11 +27,41 @@ public class SqlStorage implements StorageManager { plugin.getConfig().getString("sql.host") + ":" + plugin.getConfig().getString("sql.port")).build(); Database db = PooledDatabaseOptions.builder().options(options).createHikariDatabase(); DB.setGlobalDatabase(db); - //TODO make table + try { + db.executeUpdate("CREATE TABLE IF NOT EXISTS Discoveries (uuid varchar(32) NOT NULL, region varchar(32) NOT NULL, time datetime NOT NULL, PRIMARY KEY(uuid))"); + } catch (SQLException e) { + e.printStackTrace(); + } } @Override - public RPGRegionsAccount getAccount(Player player) { - return null; + public CompletableFuture getAccount(UUID uuid) { + CompletableFuture future = new CompletableFuture<>(); + if (cachedAccounts.containsKey(uuid)) { + future.complete(cachedAccounts.get(uuid)); + } else { + DB.getResultsAsync("SELECT region FROM Discoveries WHERE uuid = ?", getDatabaseUuid(uuid)).whenComplete((results, error) -> { + List regions = new ArrayList<>(); + for (DbRow row : results) { + regions.add(row.getString("region")); + } + + RPGRegionsAccount account = new RPGRegionsAccount(uuid, regions); + cachedAccounts.put(uuid, account); + future.complete(account); + }); + } + return future; + } + + @Override + public ConcurrentMap getCachedAccounts() { + return (ConcurrentMap) ImmutableMap.copyOf(cachedAccounts); + } + + @Override + public void removeCachedAccount(UUID uuid) { + //TODO save new regions + cachedAccounts.remove(uuid); } }