From f46709623b8938b4acdbfaf0e719cbdea7659f52 Mon Sep 17 00:00:00 2001 From: Luca Acquafredda Date: Thu, 20 Jun 2024 00:11:37 +0200 Subject: [PATCH] Players premium management improved --- .../hg/managers/DatabaseManager.java | 75 ++++++++++++++++--- .../minecraft/hg/managers/PlayerManager.java | 2 + 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/main/java/lar/minecraft/hg/managers/DatabaseManager.java b/src/main/java/lar/minecraft/hg/managers/DatabaseManager.java index a38ccb0..c36cb6c 100644 --- a/src/main/java/lar/minecraft/hg/managers/DatabaseManager.java +++ b/src/main/java/lar/minecraft/hg/managers/DatabaseManager.java @@ -94,9 +94,27 @@ public static int createTables() { if (isDatabaseEnabled()) { try { Statement statementCreate = dbConnection.createStatement(); - statementCreate.executeUpdate("CREATE TABLE IF NOT EXISTS hg_games (server_id int NOT NULL, id int NOT NULL, winner_uuid varchar(100), win_datetime datetime)"); - statementCreate.executeUpdate("CREATE TABLE IF NOT EXISTS played_hg_games (server_id int NOT NULL, id int NOT NULL, player_uuid varchar(100))"); - statementCreate.executeUpdate("CREATE TABLE IF NOT EXISTS players (uuid varchar(100), name varchar(100))"); + statementCreate.executeUpdate("CREATE TABLE IF NOT EXISTS `hg_games` (" + + " `server_id` int(11) NOT NULL," + + " `id` int(11) NOT NULL," + + " `winner_uuid` varchar(100) DEFAULT NULL," + + " `win_datetime` datetime DEFAULT NULL," + + " `game_start_datetime` datetime DEFAULT NULL," + + " UNIQUE KEY `hg_games_server_id_IDX` (`server_id`,`id`) USING BTREE" + + " )"); + statementCreate.executeUpdate("CREATE TABLE IF NOT EXISTS `played_hg_games` (" + + " `server_id` int(11) NOT NULL," + + " `id` int(11) NOT NULL," + + " `player_uuid` varchar(100) NOT NULL," + + " UNIQUE KEY `played_hg_games_server_id_IDX` (`server_id`,`id`,`player_uuid`) USING BTREE" + + " )"); + statementCreate.executeUpdate("CREATE TABLE IF NOT EXISTS `players` (" + + " `uuid` varchar(100) NOT NULL," + + " `name` varchar(100) NOT NULL," + + " `premium_expire_date` date DEFAULT NULL," + + " `last_time_online` datetime DEFAULT NULL," + + " UNIQUE KEY `players_uuid_IDX` (`uuid`) USING BTREE" + + " )"); statementCreate.executeUpdate("CREATE OR REPLACE" + " ALGORITHM = UNDEFINED VIEW `hunger_games`.`v_Scoreboard` AS (" + " select" @@ -108,6 +126,20 @@ public static int createTables() { + " ((`hunger_games`.`players`.`uuid` = `hunger_games`.`hg_games`.`winner_uuid`)))" + " group by" + " `hunger_games`.`hg_games`.`winner_uuid`);"); + statementCreate.executeUpdate("CREATE OR REPLACE" + + " ALGORITHM = UNDEFINED VIEW `v_players` AS (" + + " select" + + "`players`.`uuid` AS `uuid`," + + " `players`.`name` AS `name`," + + " (case" + + " when ((`players`.`premium_expire_date` is not null)" + + " and (curdate() <= `players`.`premium_expire_date`)) then 1" + + " else 0" + + " end) AS `premium`," + + " `players`.`premium_expire_date` AS `premium_expire_date`," + + " `players`.`last_time_online` AS `last_time_online`" + + " from" + + "`players`);"); statementCreate.close(); } catch (SQLException e) { e.printStackTrace(); @@ -166,12 +198,10 @@ public static void saveStartingDateTime(int ServerId, int HGGameId) { } /** - * Save the information of all players that joined the game - * @param ServerId - * @param HGGameId + * Add player or update the existing record into players table * @param player */ - public static void addPlayerJoin(int ServerId, int HGGameId, Player player) { + public static void addPlayer(Player player) { if (isDatabaseEnabled()) { try { Statement statementRead = dbConnection.createStatement(); @@ -182,12 +212,37 @@ public static void addPlayerJoin(int ServerId, int HGGameId, Player player) { while (resultSet.next()) { int foundRows = resultSet.getInt("playerFound"); if (foundRows == 0) { - statementInsert.executeUpdate(String.format("INSERT INTO players (uuid, name) VALUES ('%s', '%s');", player.getUniqueId(), player.getName())); + statementInsert.executeUpdate(String.format("INSERT INTO players (uuid, name, last_time_online) VALUES ('%s', '%s', NOW());", player.getUniqueId(), player.getName())); + }else { + statementInsert.executeUpdate(String.format("UPDATE players SET last_time_online = NOW() WHERE uuid = '%s';", player.getUniqueId())); } } + + statementRead.close(); + statementInsert.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + /** + * Save the information of all players that joined the game + * @param ServerId + * @param HGGameId + * @param player + */ + public static void addPlayerJoin(int ServerId, int HGGameId, Player player) { + if (isDatabaseEnabled()) { + try { + Statement statementRead = dbConnection.createStatement(); + Statement statementInsert = dbConnection.createStatement(); + + //Add player into players table if not existing + DatabaseManager.addPlayer(player); //Add player into played hg games if not existing - resultSet = statementRead.executeQuery(String.format("SELECT COUNT(*) AS playerFound FROM played_hg_games WHERE server_id = %d AND id = %d AND player_uuid = '%s';", ServerId, HGGameId, player.getUniqueId().toString())); + ResultSet resultSet = statementRead.executeQuery(String.format("SELECT COUNT(*) AS playerFound FROM played_hg_games WHERE server_id = %d AND id = %d AND player_uuid = '%s';", ServerId, HGGameId, player.getUniqueId().toString())); while (resultSet.next()) { int foundRows = resultSet.getInt("playerFound"); if (foundRows == 0) { @@ -257,7 +312,7 @@ public static boolean isPlayerPremium(String playerUUID){ if (isDatabaseEnabled()) { try { Statement statementRead = dbConnection.createStatement(); - ResultSet resultSet = statementRead.executeQuery(String.format("SELECT premium FROM players WHERE uuid = '%s';", playerUUID)); + ResultSet resultSet = statementRead.executeQuery(String.format("SELECT premium FROM v_players WHERE uuid = '%s';", playerUUID)); boolean isPremium = false; while (resultSet.next()) { diff --git a/src/main/java/lar/minecraft/hg/managers/PlayerManager.java b/src/main/java/lar/minecraft/hg/managers/PlayerManager.java index 0dea9bd..d767abc 100644 --- a/src/main/java/lar/minecraft/hg/managers/PlayerManager.java +++ b/src/main/java/lar/minecraft/hg/managers/PlayerManager.java @@ -41,6 +41,8 @@ public class PlayerManager implements Listener { public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); event.setJoinMessage(null); + //Log player join on database + DatabaseManager.addPlayer(player); if (SpigotPlugin.isWaitingForStart() || SpigotPlugin.isLobby()) { // Teleport each player to a random location Location spawnLocation = ServerManager.getSurfaceRandomLocation(30, SpigotPlugin.newSpawnLocation, 0, 2, 0);