Database Handler + Queue System blueprint

This commit is contained in:
RonanCraft 2022-04-07 16:45:09 -04:00
parent d8129df29b
commit 3fe5c25e7b
9 changed files with 249 additions and 57 deletions

View File

@ -3,8 +3,10 @@ package me.SuperRonanCraft.BetterRTP;
import lombok.Getter; import lombok.Getter;
import me.SuperRonanCraft.BetterRTP.player.PlayerInfo; import me.SuperRonanCraft.BetterRTP.player.PlayerInfo;
import me.SuperRonanCraft.BetterRTP.player.commands.Commands; import me.SuperRonanCraft.BetterRTP.player.commands.Commands;
import me.SuperRonanCraft.BetterRTP.player.events.Listener; import me.SuperRonanCraft.BetterRTP.player.events.EventListener;
import me.SuperRonanCraft.BetterRTP.player.rtp.RTP; import me.SuperRonanCraft.BetterRTP.player.rtp.RTP;
import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueHandler;
import me.SuperRonanCraft.BetterRTP.references.Permissions; import me.SuperRonanCraft.BetterRTP.references.Permissions;
import me.SuperRonanCraft.BetterRTP.references.web.Updater; import me.SuperRonanCraft.BetterRTP.references.web.Updater;
import me.SuperRonanCraft.BetterRTP.references.depends.DepEconomy; import me.SuperRonanCraft.BetterRTP.references.depends.DepEconomy;
@ -27,7 +29,7 @@ public class BetterRTP extends JavaPlugin {
private final DepEconomy eco = new DepEconomy(); private final DepEconomy eco = new DepEconomy();
private final Commands cmd = new Commands(this); private final Commands cmd = new Commands(this);
private final RTP rtp = new RTP(); private final RTP rtp = new RTP();
private final Listener listener = new Listener(); private final EventListener listener = new EventListener();
private static BetterRTP instance; private static BetterRTP instance;
private final Files files = new Files(); private final Files files = new Files();
private final RTPInventories invs = new RTPInventories(); private final RTPInventories invs = new RTPInventories();
@ -35,6 +37,8 @@ public class BetterRTP extends JavaPlugin {
@Getter private final PlayerDataManager playerDataManager = new PlayerDataManager(); @Getter private final PlayerDataManager playerDataManager = new PlayerDataManager();
private final Settings settings = new Settings(); private final Settings settings = new Settings();
@Getter private final CooldownHandler cooldowns = new CooldownHandler(); @Getter private final CooldownHandler cooldowns = new CooldownHandler();
private final QueueHandler queue = new QueueHandler();
@Getter private final DatabaseHandler databaseHandler = new DatabaseHandler();
public void onEnable() { public void onEnable() {
instance = this; instance = this;
@ -42,6 +46,7 @@ public class BetterRTP extends JavaPlugin {
new Metrics(this); new Metrics(this);
loadAll(); loadAll();
listener.registerEvents(this); listener.registerEvents(this);
queue.registerEvents(this);
} }
public void onDisable() { public void onDisable() {
@ -113,6 +118,7 @@ public class BetterRTP extends JavaPlugin {
//(Re)Load all plugin systems/files/cache //(Re)Load all plugin systems/files/cache
private void loadAll() { private void loadAll() {
playerDataManager.clear(); playerDataManager.clear();
databaseHandler.load();
files.loadAll(); files.loadAll();
settings.load(); settings.load();
invs.load(); invs.load();

View File

@ -2,6 +2,7 @@ package me.SuperRonanCraft.BetterRTP.player.events;
import me.SuperRonanCraft.BetterRTP.BetterRTP; import me.SuperRonanCraft.BetterRTP.BetterRTP;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
@ -10,7 +11,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
public class Listener implements org.bukkit.event.Listener { public class EventListener implements Listener {
private final Join join = new Join(); private final Join join = new Join();
private final Leave leave = new Leave(); private final Leave leave = new Leave();
private final Interact interact = new Interact(); private final Interact interact = new Interact();

View File

@ -1,31 +0,0 @@
package me.SuperRonanCraft.BetterRTP.player.rtp.queue;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_FindLocationEvent;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import java.util.HashMap;
import java.util.List;
public class RTPQueue implements Listener { //Randomly queues up some randomly safe locations
HashMap<RTPWorld, List<Location>> queue = new HashMap<>();
public void load() {
Bukkit.getPluginManager().registerEvents(this, BetterRTP.getInstance());
//queue();
}
@EventHandler
public void onRtpFindLoc(RTP_FindLocationEvent e) {
RTPWorld world = e.getWorld();
}
private void queue(RTPWorld world) {
}
}

View File

@ -0,0 +1,33 @@
package me.SuperRonanCraft.BetterRTP.references.database;
import lombok.Getter;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import org.bukkit.Bukkit;
public class DatabaseHandler {
@Getter private final DatabasePlayers databasePlayers = new DatabasePlayers();
@Getter private final DatabaseCooldownsWorlds databaseCooldownsWorlds = new DatabaseCooldownsWorlds();
@Getter private final DatabaseQueue databaseQueue = new DatabaseQueue();
public void load() {
Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> {
databasePlayers.load();
databaseCooldownsWorlds.load();
databaseQueue.load();
});
}
public static DatabasePlayers getPlayers() {
return BetterRTP.getInstance().getDatabaseHandler().getDatabasePlayers();
}
public static DatabaseCooldownsWorlds getWorldCooldowns() {
return BetterRTP.getInstance().getDatabaseHandler().getDatabaseCooldownsWorlds();
}
public static DatabaseQueue getQueue() {
return BetterRTP.getInstance().getDatabaseHandler().getDatabaseQueue();
}
}

View File

@ -0,0 +1,102 @@
package me.SuperRonanCraft.BetterRTP.references.database;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.references.player.playerdata.PlayerData;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueData;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
public class DatabaseQueue extends SQLite {
public DatabaseQueue() {
super(DATABASE_TYPE.PLAYERS);
}
@Override
public List<String> getTables() {
List<String> list = new ArrayList<>();
list.add("Queue");
return list;
}
public enum COLUMNS {
ID("id", "long PRIMARY KEY AUTOINCREMENT"),
//COOLDOWN DATA
X("x", "long"),
Y("y", "long"),
Z("z", "long"),
WORLD("world", "varchar(32)"),
GENERATED("generated", "long"),
//USES("uses", "integer"),
;
public final String name;
public final String type;
COLUMNS(String name, String type) {
this.name = name;
this.type = type;
}
}
public List<QueueData> getQueues() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<QueueData> queueDataList = new ArrayList<>();
try {
conn = getSQLConnection();
ps = conn.prepareStatement("SELECT * FROM " + tables.get(0));
rs = ps.executeQuery();
while (rs.next()) {
long x = rs.getLong(COLUMNS.X.name);
long y = rs.getLong(COLUMNS.Y.name);
long z = rs.getLong(COLUMNS.Z.name);
String worldName = rs.getString(COLUMNS.WORLD.name);
long generated = rs.getLong(COLUMNS.GENERATED.name);
World world = Bukkit.getWorld(worldName);
if (world != null) {
QueueData data = new QueueData(new Location(world, x, y, z), generated);
queueDataList.add(data);
}
}
} catch (SQLException ex) {
BetterRTP.getInstance().getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex);
} finally {
close(ps, rs, conn);
}
return queueDataList;
}
//Set a queue to save
public void addQueue(QueueData data) {
String pre = "INSERT INTO ";
String sql = pre + tables.get(0) + " ("
+ COLUMNS.X.name + ", "
+ COLUMNS.Y.name + ", "
+ COLUMNS.Z.name + ", "
+ COLUMNS.WORLD.name + ", "
+ COLUMNS.GENERATED.name + " "
//+ COLUMNS.USES.name + " "
+ ") VALUES(?, ?, ?, ?, ?)";
List<Object> params = new ArrayList<Object>() {{
add(data.getLocation().getX());
add(data.getLocation().getY());
add(data.getLocation().getZ());
add(data.getLocation().getWorld().getName());
add(data.getGenerated());
//add(data.getUses());
}};
sqlUpdate(sql, params);
}
}

View File

@ -4,7 +4,7 @@ import lombok.Getter;
import me.SuperRonanCraft.BetterRTP.BetterRTP; import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.references.PermissionNode; import me.SuperRonanCraft.BetterRTP.references.PermissionNode;
import me.SuperRonanCraft.BetterRTP.references.database.DatabaseCooldownsWorlds; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseCooldownsWorlds;
import me.SuperRonanCraft.BetterRTP.references.database.DatabasePlayers; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler;
import me.SuperRonanCraft.BetterRTP.references.file.FileBasics; import me.SuperRonanCraft.BetterRTP.references.file.FileBasics;
import me.SuperRonanCraft.BetterRTP.references.player.HelperPlayer; import me.SuperRonanCraft.BetterRTP.references.player.HelperPlayer;
import me.SuperRonanCraft.BetterRTP.references.player.playerdata.PlayerData; import me.SuperRonanCraft.BetterRTP.references.player.playerdata.PlayerData;
@ -25,8 +25,6 @@ public class CooldownHandler {
@Getter private int cooldownTime; //Global Cooldown timer @Getter private int cooldownTime; //Global Cooldown timer
private int lockedAfter; //Rtp's before being locked private int lockedAfter; //Rtp's before being locked
private final List<Player> downloading = new ArrayList<>(); private final List<Player> downloading = new ArrayList<>();
private final DatabaseCooldownsWorlds cooldowns = new DatabaseCooldownsWorlds();
private final DatabasePlayers players = new DatabasePlayers();
//private final DatabaseCooldownsGlobal globalCooldown = new DatabaseCooldownsGlobal(); //private final DatabaseCooldownsGlobal globalCooldown = new DatabaseCooldownsGlobal();
public void load() { public void load() {
@ -40,22 +38,17 @@ public class CooldownHandler {
lockedAfter = config.getInt("Settings.Cooldown.LockAfter"); lockedAfter = config.getInt("Settings.Cooldown.LockAfter");
cooldownByWorld = config.getBoolean("Settings.Cooldown.PerWorld"); cooldownByWorld = config.getBoolean("Settings.Cooldown.PerWorld");
} }
Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> { queueDownload();
//globalCooldown.load();
players.load();
cooldowns.load();
checkLater();
});
} }
private void checkLater() { private void queueDownload() {
Bukkit.getScheduler().runTaskLaterAsynchronously(BetterRTP.getInstance(), () -> { Bukkit.getScheduler().runTaskLaterAsynchronously(BetterRTP.getInstance(), () -> {
if (cooldownByWorld && !cooldowns.isLoaded()) { if (cooldownByWorld && !DatabaseHandler.getWorldCooldowns().isLoaded()) {
checkLater(); queueDownload();
return; return;
} }
if (!players.isLoaded()) { if (!DatabaseHandler.getPlayers().isLoaded()) {
checkLater(); queueDownload();
return; return;
} }
//OldCooldownConverter.loadOldCooldowns(); //OldCooldownConverter.loadOldCooldowns();
@ -141,7 +134,7 @@ public class CooldownHandler {
else else
getDatabaseWorlds().removePlayer(data.getUuid(), data.getWorld()); getDatabaseWorlds().removePlayer(data.getUuid(), data.getWorld());
} }
players.setData(getData(player)); DatabaseHandler.getPlayers().setData(getData(player));
}); });
} }
@ -157,7 +150,7 @@ public class CooldownHandler {
playerData.getCooldowns().put(world, cooldown); playerData.getCooldowns().put(world, cooldown);
} }
//Player Data //Player Data
players.setupData(playerData); DatabaseHandler.getPlayers().setupData(playerData);
downloading.remove(player); downloading.remove(player);
} }
@ -168,7 +161,7 @@ public class CooldownHandler {
@Nullable @Nullable
private DatabaseCooldownsWorlds getDatabaseWorlds() { private DatabaseCooldownsWorlds getDatabaseWorlds() {
if (cooldownByWorld) if (cooldownByWorld)
return cooldowns; return DatabaseHandler.getWorldCooldowns();
return null; return null;
} }

View File

@ -0,0 +1,16 @@
package me.SuperRonanCraft.BetterRTP.references.rtpinfo;
import lombok.Getter;
import org.bukkit.Location;
public class QueueData {
@Getter Location location;
@Getter long generated;
public QueueData(Location location, long generated) {
this.location = location;
this.generated = generated;
}
}

View File

@ -0,0 +1,64 @@
package me.SuperRonanCraft.BetterRTP.references.rtpinfo;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_FindLocationEvent;
import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.PluginManager;
import java.util.ArrayList;
import java.util.List;
public class QueueHandler implements Listener { //Randomly queues up some randomly safe locations
boolean loaded = false;
List<QueueData> queueList = new ArrayList<>();
private final int queueSize = 32;
public void registerEvents(BetterRTP pl) {
PluginManager pm = pl.getServer().getPluginManager();
pm.registerEvents(this, pl);
}
public void load() {
loaded = false;
queueDownload();
}
private void queueDownload() {
//LOAD FROM DATABASE
Bukkit.getScheduler().runTaskLaterAsynchronously(BetterRTP.getInstance(), () -> {
if (!DatabaseHandler.getQueue().isLoaded()) {
queueDownload();
return;
}
//Download all queue cached from last session
queueList = DatabaseHandler.getQueue().getQueues();
loaded = true;
}, 10L);
}
@EventHandler
public void onRtpFindLoc(RTP_FindLocationEvent e) {
//RTPWorld world = e.getWorld();
Location location = e.getLocation();
List<QueueData> deleteList = new ArrayList<>();
for (QueueData data : queueList) {
Location dataLoc = data.getLocation();
if (location.getBlockX() == dataLoc.getBlockX()
&& location.getBlockY() == dataLoc.getBlockY()
&& location.getBlockZ() == dataLoc.getBlockZ()
&& location.getWorld().getName().equals(dataLoc.getWorld().getName())) {
deleteList.add(data);
}
}
deleteList.forEach(queueData -> queueList.remove(queueData));
}
}

View File

@ -8,17 +8,19 @@ permissions:
betterrtp.player: true betterrtp.player: true
betterrtp.reload: true betterrtp.reload: true
betterrtp.updater: true betterrtp.updater: true
betterrtp.group.*: true
betterrtp.world: betterrtp.world:
description: RTP into other worlds description: Ability to use the world command
betterrtp.world.*: betterrtp.world.*:
description: RTP in all enabled worlds description: RTP in all enabled worlds
betterrtp.world.<world>: betterrtp.world.<world>:
description: RTP in <world> description: RTP in world named world
betterrtp.bypass.*: betterrtp.bypass.*:
children: children:
betterrtp.bypass.cooldown: true betterrtp.bypass.cooldown: true
betterrtp.bypass.delay: true betterrtp.bypass.delay: true
betterrtp.bypass.economy: true betterrtp.bypass.economy: true
betterrtp.bypass.hunger: true
betterrtp.use: betterrtp.use:
description: Use RTP command description: Use RTP command
default: true default: true
@ -41,6 +43,8 @@ permissions:
description: Bypass delays description: Bypass delays
betterrtp.bypass.economy: betterrtp.bypass.economy:
description: Bypass economy description: Bypass economy
betterrtp.bypass.hunger:
description: Bypass hunger
#Reload #Reload
betterrtp.reload: betterrtp.reload:
description: Reload the config description: Reload the config
@ -50,4 +54,8 @@ permissions:
default: op default: op
betterrtp.test: betterrtp.test:
description: While debugger enabled, be able to test particles, potion effects and sounds description: While debugger enabled, be able to test particles, potion effects and sounds
default: op
#Permission Groups
betterrtp.group.*:
description: Allow access to all permission groups
default: op default: op