diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/PlayerFetchQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/PlayerFetchQueries.java index 301b77966..1004bf6d1 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/PlayerFetchQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/PlayerFetchQueries.java @@ -17,9 +17,11 @@ package com.djrapitops.plan.db.access.queries; import com.djrapitops.plan.data.container.GeoInfo; +import com.djrapitops.plan.data.container.UserInfo; import com.djrapitops.plan.db.access.Query; import com.djrapitops.plan.db.access.QueryStatement; import com.djrapitops.plan.db.sql.tables.GeoInfoTable; +import com.djrapitops.plan.db.sql.tables.UserInfoTable; import com.djrapitops.plan.db.sql.tables.UsersTable; import java.sql.PreparedStatement; @@ -97,4 +99,34 @@ public class PlayerFetchQueries { } }; } + + public static Query> playerServerSpecificUserInformation(UUID playerUUID) { + String sql = "SELECT " + + UserInfoTable.TABLE_NAME + "." + UserInfoTable.REGISTERED + ", " + + UserInfoTable.BANNED + ", " + + UserInfoTable.OP + ", " + + UserInfoTable.SERVER_UUID + + " FROM " + UserInfoTable.TABLE_NAME + + " WHERE " + UserInfoTable.TABLE_NAME + "." + UserInfoTable.USER_UUID + "=?"; + + return new QueryStatement>(sql) { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setString(1, playerUUID.toString()); + } + + @Override + public List processResults(ResultSet set) throws SQLException { + List userInformation = new ArrayList<>(); + while (set.next()) { + long registered = set.getLong(UserInfoTable.REGISTERED); + boolean op = set.getBoolean(UserInfoTable.OP); + boolean banned = set.getBoolean(UserInfoTable.BANNED); + UUID serverUUID = UUID.fromString(set.getString(UserInfoTable.SERVER_UUID)); + userInformation.add(new UserInfo(playerUUID, serverUUID, registered, op, banned)); + } + return userInformation; + } + }; + } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/containers/PerServerContainerQuery.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/containers/PerServerContainerQuery.java new file mode 100644 index 000000000..d6a6ec01c --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/containers/PerServerContainerQuery.java @@ -0,0 +1,84 @@ +/* + * 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.queries.containers; + +import com.djrapitops.plan.data.container.Session; +import com.djrapitops.plan.data.container.UserInfo; +import com.djrapitops.plan.data.store.containers.DataContainer; +import com.djrapitops.plan.data.store.containers.PerServerContainer; +import com.djrapitops.plan.data.store.keys.PerServerKeys; +import com.djrapitops.plan.data.store.keys.PlayerKeys; +import com.djrapitops.plan.data.store.mutators.SessionsMutator; +import com.djrapitops.plan.db.SQLDB; +import com.djrapitops.plan.db.access.Query; +import com.djrapitops.plan.db.access.queries.PlayerFetchQueries; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * Used to get a PerServerContainer for a specific player. + * + * @author Rsl1122 + */ +public class PerServerContainerQuery implements Query { + + private final UUID playerUUID; + + public PerServerContainerQuery(UUID playerUUID) { + this.playerUUID = playerUUID; + } + + @Override + public PerServerContainer executeQuery(SQLDB db) { + PerServerContainer perServerContainer = new PerServerContainer(); + + List userInformation = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID)); + for (UserInfo userInfo : userInformation) { + UUID serverUUID = userInfo.getServerUUID(); + + DataContainer container = perServerContainer.getOrDefault(serverUUID, new DataContainer()); + container.putRawData(PlayerKeys.REGISTERED, userInfo.getRegistered()); + container.putRawData(PlayerKeys.BANNED, userInfo.isBanned()); + container.putRawData(PlayerKeys.OPERATOR, userInfo.isOperator()); + perServerContainer.put(serverUUID, container); + } + + Map> sessions = db.getSessionsTable().getSessions(playerUUID); + for (Map.Entry> entry : sessions.entrySet()) { + UUID serverUUID = entry.getKey(); + List serverSessions = entry.getValue(); + + DataContainer container = perServerContainer.getOrDefault(serverUUID, new DataContainer()); + container.putRawData(PerServerKeys.SESSIONS, serverSessions); + + container.putSupplier(PerServerKeys.LAST_SEEN, () -> SessionsMutator.forContainer(container).toLastSeen()); + + container.putSupplier(PerServerKeys.WORLD_TIMES, () -> SessionsMutator.forContainer(container).toTotalWorldTimes()); + container.putSupplier(PerServerKeys.PLAYER_KILLS, () -> SessionsMutator.forContainer(container).toPlayerKillList()); + container.putSupplier(PerServerKeys.PLAYER_DEATHS, () -> SessionsMutator.forContainer(container).toPlayerDeathList()); + container.putSupplier(PerServerKeys.PLAYER_KILL_COUNT, () -> container.getUnsafe(PerServerKeys.PLAYER_KILLS).size()); + container.putSupplier(PerServerKeys.MOB_KILL_COUNT, () -> SessionsMutator.forContainer(container).toMobKillCount()); + container.putSupplier(PerServerKeys.DEATH_COUNT, () -> SessionsMutator.forContainer(container).toDeathCount()); + + perServerContainer.put(serverUUID, container); + } + + return perServerContainer; + } +} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/containers/PlayerContainerQuery.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/containers/PlayerContainerQuery.java index 05c2e2218..9705dad41 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/containers/PlayerContainerQuery.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/containers/PlayerContainerQuery.java @@ -17,11 +17,7 @@ package com.djrapitops.plan.db.access.queries.containers; import com.djrapitops.plan.data.container.Session; -import com.djrapitops.plan.data.container.UserInfo; -import com.djrapitops.plan.data.store.containers.DataContainer; -import com.djrapitops.plan.data.store.containers.PerServerContainer; import com.djrapitops.plan.data.store.containers.PlayerContainer; -import com.djrapitops.plan.data.store.keys.PerServerKeys; import com.djrapitops.plan.data.store.keys.PlayerKeys; import com.djrapitops.plan.data.store.keys.SessionKeys; import com.djrapitops.plan.data.store.mutators.PerServerMutator; @@ -34,7 +30,6 @@ import com.djrapitops.plan.db.access.queries.PlayerFetchQueries; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.UUID; /** @@ -61,7 +56,7 @@ public class PlayerContainerQuery implements Query { container.putCachingSupplier(PlayerKeys.GEO_INFO, () -> db.query(PlayerFetchQueries.playerGeoInfo(uuid))); container.putCachingSupplier(PlayerKeys.PING, () -> db.getPingTable().getPing(uuid)); container.putCachingSupplier(PlayerKeys.NICKNAMES, () -> db.getNicknamesTable().getNicknameInformation(uuid)); - container.putCachingSupplier(PlayerKeys.PER_SERVER, () -> getPerServerData(db)); + container.putCachingSupplier(PlayerKeys.PER_SERVER, () -> db.query(new PerServerContainerQuery(uuid))); container.putSupplier(PlayerKeys.BANNED, () -> new PerServerMutator(container.getUnsafe(PlayerKeys.PER_SERVER)).isBanned()); container.putSupplier(PlayerKeys.OPERATOR, () -> new PerServerMutator(container.getUnsafe(PlayerKeys.PER_SERVER)).isOperator()); @@ -91,42 +86,4 @@ public class PlayerContainerQuery implements Query { return container; } - - private PerServerContainer getPerServerData(SQLDB db) { - PerServerContainer perServerContainer = new PerServerContainer(); - - Map allUserInfo = db.getUserInfoTable().getAllUserInfo(uuid); - for (Map.Entry entry : allUserInfo.entrySet()) { - UUID serverUUID = entry.getKey(); - UserInfo info = entry.getValue(); - - DataContainer container = perServerContainer.getOrDefault(serverUUID, new DataContainer()); - container.putRawData(PlayerKeys.REGISTERED, info.getRegistered()); - container.putRawData(PlayerKeys.BANNED, info.isBanned()); - container.putRawData(PlayerKeys.OPERATOR, info.isOperator()); - perServerContainer.put(serverUUID, container); - } - - Map> sessions = db.getSessionsTable().getSessions(uuid); - for (Map.Entry> entry : sessions.entrySet()) { - UUID serverUUID = entry.getKey(); - List serverSessions = entry.getValue(); - - DataContainer container = perServerContainer.getOrDefault(serverUUID, new DataContainer()); - container.putRawData(PerServerKeys.SESSIONS, serverSessions); - - container.putSupplier(PerServerKeys.LAST_SEEN, () -> SessionsMutator.forContainer(container).toLastSeen()); - - container.putSupplier(PerServerKeys.WORLD_TIMES, () -> SessionsMutator.forContainer(container).toTotalWorldTimes()); - container.putSupplier(PerServerKeys.PLAYER_KILLS, () -> SessionsMutator.forContainer(container).toPlayerKillList()); - container.putSupplier(PerServerKeys.PLAYER_DEATHS, () -> SessionsMutator.forContainer(container).toPlayerDeathList()); - container.putSupplier(PerServerKeys.PLAYER_KILL_COUNT, () -> container.getUnsafe(PerServerKeys.PLAYER_KILLS).size()); - container.putSupplier(PerServerKeys.MOB_KILL_COUNT, () -> SessionsMutator.forContainer(container).toMobKillCount()); - container.putSupplier(PerServerKeys.DEATH_COUNT, () -> SessionsMutator.forContainer(container).toDeathCount()); - - perServerContainer.put(serverUUID, container); - } - - return perServerContainer; - } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/UserInfoTable.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/UserInfoTable.java index 2d61df356..f2cdeaca9 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/UserInfoTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/UserInfoTable.java @@ -143,36 +143,6 @@ public class UserInfoTable extends Table { }); } - public Map getAllUserInfo(UUID uuid) { - String sql = "SELECT " + - TABLE_NAME + "." + REGISTERED + ", " + - BANNED + ", " + - OP + ", " + - SERVER_UUID + - " FROM " + TABLE_NAME + - " WHERE " + TABLE_NAME + "." + USER_UUID + "=?"; - - return query(new QueryStatement>(sql) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setString(1, uuid.toString()); - } - - @Override - public Map processResults(ResultSet set) throws SQLException { - Map map = new HashMap<>(); - while (set.next()) { - long registered = set.getLong(REGISTERED); - boolean op = set.getBoolean(OP); - boolean banned = set.getBoolean(BANNED); - UUID serverUUID = UUID.fromString(set.getString(SERVER_UUID)); - map.put(serverUUID, new UserInfo(uuid, serverUUID, registered, op, banned)); - } - return map; - } - }); - } - public List getServerUserInfo(UUID serverUUID) { String sql = "SELECT " + TABLE_NAME + "." + REGISTERED + ", " + 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 35e626620..88719361f 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 @@ -398,63 +398,52 @@ public abstract class CommonDBTest { } @Test - public void testUserInfoTableRegisterRegistered() throws DBInitException { - saveUserOne(); + public void userInfoTableStoresCorrectUserInformation() { + userRegisterChecksReturnCorrectValues(); + + List userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID)); + List expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, false, false)); + + assertEquals(expected, userInfo); + } + + @Test + public void userRegisterChecksReturnCorrectValues() { UsersTable usersTable = db.getUsersTable(); + assertFalse(usersTable.isRegistered(playerUUID)); + saveUserOne(); assertTrue(usersTable.isRegistered(playerUUID)); UserInfoTable userInfoTable = db.getUserInfoTable(); assertFalse(userInfoTable.isRegistered(playerUUID)); - userInfoTable.registerUserInfo(playerUUID, 223456789L); - commitTest(); - - assertTrue(usersTable.isRegistered(playerUUID)); assertTrue(userInfoTable.isRegistered(playerUUID)); - UserInfo userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID); - assertEquals(playerUUID, userInfo.getPlayerUuid()); - assertEquals(123456789L, (long) usersTable.getRegisterDates().get(0)); - assertEquals(223456789L, userInfo.getRegistered()); - assertFalse(userInfo.isBanned()); - assertFalse(userInfo.isOperator()); - - assertEquals(userInfo, userInfoTable.getServerUserInfo().get(0)); + assertEquals(123456789L, (long) db.getUsersTable().getRegisterDates().get(0)); } @Test - public void testUserInfoTableUpdateBannedOpped() throws DBInitException { - UsersTable usersTable = db.getUsersTable(); - usersTable.registerUser(playerUUID, 223456789L, "Test_name"); - UserInfoTable userInfoTable = db.getUserInfoTable(); - userInfoTable.registerUserInfo(playerUUID, 223456789L); - assertTrue(userInfoTable.isRegistered(playerUUID)); + public void userInfoTableUpdatesBanStatus() { + userRegisterChecksReturnCorrectValues(); - userInfoTable.updateOpStatus(playerUUID, true); - userInfoTable.updateBanStatus(playerUUID, true); - commitTest(); + db.getUserInfoTable().updateBanStatus(playerUUID, true); - UserInfo userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID); - assertTrue(userInfo.isBanned()); - assertTrue(userInfo.isOperator()); + List userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID)); + List expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, true, false)); - userInfoTable.updateOpStatus(playerUUID, false); - userInfoTable.updateBanStatus(playerUUID, true); - commitTest(); + assertEquals(expected, userInfo); + } - userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID); + @Test + public void userInfoTableUpdatesOperatorStatus() { + userRegisterChecksReturnCorrectValues(); - assertTrue(userInfo.isBanned()); - assertFalse(userInfo.isOperator()); + db.getUserInfoTable().updateOpStatus(playerUUID, true); - userInfoTable.updateOpStatus(playerUUID, true); - userInfoTable.updateBanStatus(playerUUID, false); - commitTest(); + List userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID)); + List expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, false, true)); - userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID); - - assertFalse(userInfo.isBanned()); - assertTrue(userInfo.isOperator()); + assertEquals(expected, userInfo); } @Test