diff --git a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/ChatListener.java b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/ChatListener.java index 610287468..9733bde48 100644 --- a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/ChatListener.java +++ b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/ChatListener.java @@ -16,8 +16,11 @@ */ package com.djrapitops.plan.system.listeners.bukkit; -import com.djrapitops.plan.system.processing.Processing; -import com.djrapitops.plan.system.processing.processors.player.PlayerProcessors; +import com.djrapitops.plan.data.store.objects.Nickname; +import com.djrapitops.plan.db.access.transactions.events.NicknameStoreTransaction; +import com.djrapitops.plan.system.cache.NicknameCache; +import com.djrapitops.plan.system.database.DBSystem; +import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plugin.logging.L; import com.djrapitops.plugin.logging.error.ErrorHandler; import org.bukkit.entity.Player; @@ -36,18 +39,21 @@ import java.util.UUID; */ public class ChatListener implements Listener { - private final PlayerProcessors processorFactory; - private final Processing processing; + private final ServerInfo serverInfo; + private final DBSystem dbSystem; + private final NicknameCache nicknameCache; private final ErrorHandler errorHandler; @Inject public ChatListener( - PlayerProcessors processorFactory, - Processing processing, + ServerInfo serverInfo, + DBSystem dbSystem, + NicknameCache nicknameCache, ErrorHandler errorHandler ) { - this.processorFactory = processorFactory; - this.processing = processing; + this.serverInfo = serverInfo; + this.dbSystem = dbSystem; + this.nicknameCache = nicknameCache; this.errorHandler = errorHandler; } @@ -65,9 +71,17 @@ public class ChatListener implements Listener { } private void actOnChatEvent(AsyncPlayerChatEvent event) { - Player p = event.getPlayer(); - UUID uuid = p.getUniqueId(); - String displayName = p.getDisplayName(); - processing.submit(processorFactory.nameProcessor(uuid, displayName)); + long time = System.currentTimeMillis(); + Player player = event.getPlayer(); + UUID uuid = player.getUniqueId(); + String displayName = player.getDisplayName(); + + if (displayName.equals(nicknameCache.getDisplayName(uuid))) { + return; + } + + dbSystem.getDatabase().executeTransaction( + new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverInfo.getServerUUID())) + ); } } diff --git a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/PlayerOnlineListener.java b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/PlayerOnlineListener.java index 31a8abda9..46c0ac676 100644 --- a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/PlayerOnlineListener.java +++ b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/PlayerOnlineListener.java @@ -17,8 +17,10 @@ package com.djrapitops.plan.system.listeners.bukkit; import com.djrapitops.plan.data.container.Session; +import com.djrapitops.plan.data.store.objects.Nickname; import com.djrapitops.plan.db.Database; import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction; +import com.djrapitops.plan.db.access.transactions.events.NicknameStoreTransaction; import com.djrapitops.plan.db.access.transactions.events.PlayerServerRegisterTransaction; import com.djrapitops.plan.db.access.transactions.events.WorldNameStoreTransaction; import com.djrapitops.plan.system.cache.GeolocationCache; @@ -165,8 +167,15 @@ public class PlayerOnlineListener implements Listener { database.executeTransaction(new PlayerServerRegisterTransaction(uuid, player::getFirstPlayed, playerName, serverUUID)); processing.submitCritical(() -> sessionCache.cacheSession(uuid, new Session(uuid, serverUUID, time, world, gm))); - processing.submitNonCritical(processors.player().nameProcessor(uuid, displayName)); + + if (!displayName.equals(nicknameCache.getDisplayName(uuid))) { + database.executeTransaction( + new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverUUID)) + ); + } + processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid)); + } @EventHandler(priority = EventPriority.MONITOR) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/DataStoreQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/DataStoreQueries.java index 5bc4a263a..62705088c 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/DataStoreQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/DataStoreQueries.java @@ -21,6 +21,7 @@ import com.djrapitops.plan.data.container.Ping; import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.store.keys.SessionKeys; +import com.djrapitops.plan.data.store.objects.Nickname; import com.djrapitops.plan.data.time.GMTimes; import com.djrapitops.plan.db.access.ExecBatchStatement; import com.djrapitops.plan.db.access.ExecStatement; @@ -287,4 +288,44 @@ public class DataStoreQueries { } }; } + + /** + * Store nickname information of a player on a server. + * + * @param playerUUID UUID of the player. + * @param nickname Nickname information. + * @return Executable, use inside a {@link com.djrapitops.plan.db.access.transactions.Transaction} + */ + public static Executable storePlayerNickname(UUID playerUUID, Nickname nickname) { + return connection -> { + if (!updatePlayerNickname(playerUUID, nickname).execute(connection)) { + insertPlayerNickname(playerUUID, nickname).execute(connection); + } + return false; + }; + } + + private static Executable updatePlayerNickname(UUID playerUUID, Nickname nickname) { + return new ExecStatement(NicknamesTable.UPDATE_STATEMENT) { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setLong(1, nickname.getDate()); + statement.setString(2, nickname.getName()); + statement.setString(3, playerUUID.toString()); + statement.setString(4, nickname.getServerUUID().toString()); + } + }; + } + + private static Executable insertPlayerNickname(UUID playerUUID, Nickname nickname) { + return new ExecStatement(NicknamesTable.INSERT_STATEMENT) { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setString(1, playerUUID.toString()); + statement.setString(2, nickname.getServerUUID().toString()); + statement.setString(3, nickname.getName()); + statement.setLong(4, nickname.getDate()); + } + }; + } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/NicknameStoreTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/NicknameStoreTransaction.java new file mode 100644 index 000000000..93bfe3ab5 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/NicknameStoreTransaction.java @@ -0,0 +1,44 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.db.access.transactions.events; + +import com.djrapitops.plan.data.store.objects.Nickname; +import com.djrapitops.plan.db.access.queries.DataStoreQueries; +import com.djrapitops.plan.db.access.transactions.Transaction; + +import java.util.UUID; + +/** + * Transaction to store player's nickname information in the database. + * + * @author Rsl1122 + */ +public class NicknameStoreTransaction extends Transaction { + + private final UUID playerUUID; + private final Nickname nickname; + + public NicknameStoreTransaction(UUID playerUUID, Nickname nickname) { + this.playerUUID = playerUUID; + this.nickname = nickname; + } + + @Override + protected void performOperations() { + execute(DataStoreQueries.storePlayerNickname(playerUUID, nickname)); + } +} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/NicknamesTable.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/NicknamesTable.java index 6c115e698..78f3e4c64 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/NicknamesTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/NicknamesTable.java @@ -19,7 +19,6 @@ package com.djrapitops.plan.db.sql.tables; import com.djrapitops.plan.data.store.objects.Nickname; import com.djrapitops.plan.db.DBType; import com.djrapitops.plan.db.SQLDB; -import com.djrapitops.plan.db.access.ExecStatement; import com.djrapitops.plan.db.access.QueryStatement; import com.djrapitops.plan.db.patches.NicknameLastSeenPatch; import com.djrapitops.plan.db.patches.NicknamesOptimizationPatch; @@ -82,39 +81,6 @@ public class NicknamesTable extends Table { .toString(); } - public void saveUserName(UUID uuid, Nickname name) { - List saved = getNicknameInformation(uuid); - if (saved.contains(name)) { - updateNickname(uuid, name); - } else { - insertNickname(uuid, name); - } - } - - private void updateNickname(UUID uuid, Nickname name) { - execute(new ExecStatement(UPDATE_STATEMENT) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setLong(1, name.getDate()); - statement.setString(2, name.getName()); - statement.setString(3, uuid.toString()); - statement.setString(4, getServerUUID().toString()); - } - }); - } - - private void insertNickname(UUID uuid, Nickname name) { - execute(new ExecStatement(INSERT_STATEMENT) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setString(1, uuid.toString()); - statement.setString(2, getServerUUID().toString()); - statement.setString(3, name.getName()); - statement.setLong(4, name.getDate()); - } - }); - } - public List getNicknameInformation(UUID uuid) { String sql = "SELECT " + NICKNAME + ", " + diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/SaveOperations.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/SaveOperations.java index 37345965d..161f38905 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/SaveOperations.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/SaveOperations.java @@ -75,9 +75,6 @@ public interface SaveOperations { @Deprecated void playerWasKicked(UUID uuid); - @Deprecated - void playerDisplayName(UUID uuid, Nickname nickname); - @Deprecated void session(UUID uuid, Session session); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLSaveOps.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLSaveOps.java index 484215b25..508771973 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLSaveOps.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLSaveOps.java @@ -141,11 +141,6 @@ public class SQLSaveOps extends SQLOps implements SaveOperations { usersTable.kicked(uuid); } - @Override - public void playerDisplayName(UUID uuid, Nickname nickname) { - nicknamesTable.saveUserName(uuid, nickname); - } - @Override public void session(UUID uuid, Session session) { db.executeTransaction(new Transaction() { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/processing/processors/player/NameProcessor.java b/Plan/common/src/main/java/com/djrapitops/plan/system/processing/processors/player/NameProcessor.java deleted file mode 100644 index 59e22ae7a..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/processing/processors/player/NameProcessor.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.system.processing.processors.player; - -import com.djrapitops.plan.data.store.objects.Nickname; -import com.djrapitops.plan.db.Database; -import com.djrapitops.plan.system.cache.NicknameCache; -import com.djrapitops.plan.system.processing.CriticalRunnable; - -import java.util.UUID; - -/** - * Processor for updating name in the database if the player has changed it. - * - * @author Rsl1122 - */ -public class NameProcessor implements CriticalRunnable { - - private final UUID uuid; - private final Nickname nickname; - - private final Database database; - private final NicknameCache nicknameCache; - - NameProcessor( - UUID uuid, Nickname nickname, - Database database, - NicknameCache nicknameCache - ) { - this.uuid = uuid; - this.nickname = nickname; - this.database = database; - this.nicknameCache = nicknameCache; - } - - @Override - public void run() { - String cachedDisplayName = nicknameCache.getDisplayName(uuid); - - boolean sameAsCached = nickname.getName().equals(cachedDisplayName); - if (sameAsCached) { - return; - } - - nicknameCache.updateDisplayName(uuid, nickname.getName()); - - database.save().playerDisplayName(uuid, nickname); - } -} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/processing/processors/player/PlayerProcessors.java b/Plan/common/src/main/java/com/djrapitops/plan/system/processing/processors/player/PlayerProcessors.java index a2651e314..43cf7288e 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/processing/processors/player/PlayerProcessors.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/processing/processors/player/PlayerProcessors.java @@ -16,7 +16,6 @@ */ package com.djrapitops.plan.system.processing.processors.player; -import com.djrapitops.plan.data.store.objects.Nickname; import com.djrapitops.plan.system.cache.NicknameCache; import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.database.DBSystem; @@ -65,9 +64,4 @@ public class PlayerProcessors { public KickProcessor kickProcessor(UUID uuid) { return new KickProcessor(uuid, dbSystem.get().getDatabase()); } - - public NameProcessor nameProcessor(UUID uuid, String displayName) { - Nickname nickname = new Nickname(displayName, System.currentTimeMillis(), serverInfo.get().getServerUUID()); - return new NameProcessor(uuid, nickname, dbSystem.get().getDatabase(), nicknameCache.get()); - } } \ No newline at end of file diff --git a/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java b/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java index 82b4d3a9f..b32afaf25 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java @@ -255,8 +255,8 @@ public abstract class CommonDBTest { NicknamesTable nickTable = db.getNicknamesTable(); Nickname expected = new Nickname("TestNickname", System.currentTimeMillis(), serverUUID); - nickTable.saveUserName(playerUUID, expected); - nickTable.saveUserName(playerUUID, expected); + db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected)); + db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected)); commitTest(); List nicknames = nickTable.getNicknameInformation(playerUUID); @@ -479,7 +479,7 @@ public abstract class CommonDBTest { session.setPlayerKills(createKills()); execute(DataStoreQueries.storeSession(session)); - nicknamesTable.saveUserName(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID)); + db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID))); saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L, "3")); assertTrue(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID))); @@ -517,9 +517,6 @@ public abstract class CommonDBTest { } private void saveAllData() throws NoSuchAlgorithmException { - NicknamesTable nicknamesTable = db.getNicknamesTable(); - TPSTable tpsTable = db.getTpsTable(); - saveUserOne(); saveUserTwo(); @@ -531,7 +528,9 @@ public abstract class CommonDBTest { session.setPlayerKills(createKills()); execute(DataStoreQueries.storeSession(session)); - nicknamesTable.saveUserName(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID)); + db.executeTransaction( + new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID)) + ); saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L, new SHA256Hash("1.2.3.4").create())); @@ -940,8 +939,8 @@ public abstract class CommonDBTest { db.executeTransaction(new PlayerRegisterTransaction(playerUUID, () -> 1L, "Not random")); String nickname = "2" + RandomData.randomString(10); - db.getNicknamesTable().saveUserName(uuid, new Nickname(nickname, System.currentTimeMillis(), serverUUID)); - db.getNicknamesTable().saveUserName(playerUUID, new Nickname("No nick", System.currentTimeMillis(), serverUUID)); + db.executeTransaction(new NicknameStoreTransaction(uuid, new Nickname(nickname, System.currentTimeMillis(), serverUUID))); + db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("No nick", System.currentTimeMillis(), serverUUID))); String search = "2"; diff --git a/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeChatListener.java b/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeChatListener.java index f7c800943..1b1087075 100644 --- a/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeChatListener.java +++ b/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeChatListener.java @@ -16,8 +16,11 @@ */ package com.djrapitops.plan.system.listeners.sponge; -import com.djrapitops.plan.system.processing.Processing; -import com.djrapitops.plan.system.processing.processors.player.PlayerProcessors; +import com.djrapitops.plan.data.store.objects.Nickname; +import com.djrapitops.plan.db.access.transactions.events.NicknameStoreTransaction; +import com.djrapitops.plan.system.cache.NicknameCache; +import com.djrapitops.plan.system.database.DBSystem; +import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plugin.logging.L; import com.djrapitops.plugin.logging.error.ErrorHandler; import org.spongepowered.api.entity.living.player.Player; @@ -36,18 +39,21 @@ import java.util.UUID; */ public class SpongeChatListener { - private final PlayerProcessors processorFactory; - private final Processing processing; + private final ServerInfo serverInfo; + private final DBSystem dbSystem; + private final NicknameCache nicknameCache; private ErrorHandler errorHandler; @Inject public SpongeChatListener( - PlayerProcessors processorFactory, - Processing processing, + ServerInfo serverInfo, + DBSystem dbSystem, + NicknameCache nicknameCache, ErrorHandler errorHandler ) { - this.processorFactory = processorFactory; - this.processing = processing; + this.serverInfo = serverInfo; + this.dbSystem = dbSystem; + this.nicknameCache = nicknameCache; this.errorHandler = errorHandler; } @@ -65,9 +71,16 @@ public class SpongeChatListener { } private void actOnChatEvent(@First Player player) { + long time = System.currentTimeMillis(); UUID uuid = player.getUniqueId(); String displayName = player.getDisplayNameData().displayName().get().toPlain(); - processing.submit(processorFactory.nameProcessor(uuid, displayName)); - } + if (displayName.equals(nicknameCache.getDisplayName(uuid))) { + return; + } + + dbSystem.getDatabase().executeTransaction( + new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverInfo.getServerUUID())) + ); + } } \ No newline at end of file diff --git a/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongePlayerListener.java b/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongePlayerListener.java index 05b74e4a2..06462c38b 100644 --- a/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongePlayerListener.java +++ b/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongePlayerListener.java @@ -17,8 +17,10 @@ package com.djrapitops.plan.system.listeners.sponge; import com.djrapitops.plan.data.container.Session; +import com.djrapitops.plan.data.store.objects.Nickname; import com.djrapitops.plan.db.Database; import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction; +import com.djrapitops.plan.db.access.transactions.events.NicknameStoreTransaction; import com.djrapitops.plan.db.access.transactions.events.PlayerServerRegisterTransaction; import com.djrapitops.plan.db.access.transactions.events.WorldNameStoreTransaction; import com.djrapitops.plan.system.cache.GeolocationCache; @@ -170,7 +172,13 @@ public class SpongePlayerListener { database.executeTransaction(new PlayerServerRegisterTransaction(uuid, () -> time, playerName, serverUUID)); processing.submitCritical(() -> sessionCache.cacheSession(uuid, new Session(uuid, serverUUID, time, world, gm))); - processing.submitNonCritical(processors.player().nameProcessor(uuid, displayName)); + + if (!displayName.equals(nicknameCache.getDisplayName(uuid))) { + database.executeTransaction( + new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverUUID)) + ); + } + processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid)); }