Refactored UserInfoTable#registerUserInfo to a transaction:

- Removed RegisterProcessor
- Refactored UserInfoTable#isRegistered (both) to a query
- Removed UserInfoTable#isRegisteredOnThisServer
- Removed UserInfoTable#getServerUserInfo - not used
- Made login nickname processing non critical
This commit is contained in:
Rsl1122 2019-02-01 12:13:20 +02:00
parent feaf7849d2
commit acd2225c49
14 changed files with 128 additions and 201 deletions

View File

@ -17,7 +17,9 @@
package com.djrapitops.plan.system.listeners.bukkit;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.db.Database;
import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction;
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;
import com.djrapitops.plan.system.cache.SessionCache;
@ -138,6 +140,7 @@ public class PlayerOnlineListener implements Listener {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
UUID serverUUID = serverInfo.getServerUUID();
long time = System.currentTimeMillis();
AFKListener.AFK_TRACKER.performedAction(uuid, time);
@ -145,7 +148,8 @@ public class PlayerOnlineListener implements Listener {
String world = player.getWorld().getName();
String gm = player.getGameMode().name();
dbSystem.getDatabase().executeTransaction(new WorldNameStoreTransaction(serverInfo.getServerUUID(), world));
Database database = dbSystem.getDatabase();
database.executeTransaction(new WorldNameStoreTransaction(serverUUID, world));
InetAddress address = player.getAddress().getAddress();
@ -154,18 +158,15 @@ public class PlayerOnlineListener implements Listener {
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
if (gatheringGeolocations) {
dbSystem.getDatabase().executeTransaction(
database.executeTransaction(
new GeoInfoStoreTransaction(uuid, address, time, geolocationCache::getCountry)
);
}
processing.submitCritical(() -> sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, world, gm)));
runnableFactory.create("Player Register: " + uuid,
processors.player().registerProcessor(uuid, player::getFirstPlayed, playerName,
processors.player().nameProcessor(uuid, displayName),
processors.info().playerPageUpdateProcessor(uuid)
)
).runTaskAsynchronously();
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));
processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid));
}
@EventHandler(priority = EventPriority.MONITOR)

View File

@ -218,4 +218,25 @@ public class DataStoreQueries {
}
};
}
/**
* Store UserInfo about a player on a server in the database.
*
* @param playerUUID UUID of the player.
* @param registered Time the player registered on the server.
* @param serverUUID UUID of the Plan server.
* @return Executable, use inside a {@link com.djrapitops.plan.db.access.transactions.Transaction}
*/
public static Executable registerUserInfo(UUID playerUUID, long registered, UUID serverUUID) {
return new ExecStatement(UserInfoTable.INSERT_STATEMENT) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, playerUUID.toString());
statement.setLong(2, registered);
statement.setString(3, serverUUID.toString());
statement.setBoolean(4, false); // Banned
statement.setBoolean(5, false); // Operator
}
};
}
}

View File

@ -135,7 +135,7 @@ public class PlayerFetchQueries {
* Check if the player's BaseUser is registered.
*
* @param playerUUID UUID of the player.
* @return True if the player's BaseUser is found from plan_users
* @return True if the player's BaseUser is found
*/
public static Query<Boolean> isPlayerRegistered(UUID playerUUID) {
String sql = "SELECT COUNT(1) as c FROM " + UsersTable.TABLE_NAME +
@ -147,4 +147,24 @@ public class PlayerFetchQueries {
}
};
}
/**
* Check if the player's UserInfo is registered.
*
* @param playerUUID UUID of the player.
* @param serverUUID UUID of the Plan server.
* @return True if the player's UserInfo is found
*/
public static Query<Boolean> isPlayerRegisteredOnServer(UUID playerUUID, UUID serverUUID) {
String sql = "SELECT COUNT(1) as c FROM " + UserInfoTable.TABLE_NAME +
" WHERE " + UserInfoTable.USER_UUID + "=?" +
" AND " + UserInfoTable.SERVER_UUID + "=?";
return new HasMoreThanZeroQueryStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, playerUUID.toString());
statement.setString(2, serverUUID.toString());
}
};
}
}

View File

@ -30,8 +30,8 @@ import java.util.function.LongSupplier;
*/
public class PlayerRegisterTransaction extends Transaction {
private final UUID playerUUID;
private final LongSupplier registered;
protected final UUID playerUUID;
protected final LongSupplier registered;
private final String playerName;
public PlayerRegisterTransaction(UUID playerUUID, LongSupplier registered, String playerName) {

View File

@ -0,0 +1,46 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.db.access.transactions.events;
import com.djrapitops.plan.db.access.queries.DataStoreQueries;
import com.djrapitops.plan.db.access.queries.PlayerFetchQueries;
import java.util.UUID;
import java.util.function.LongSupplier;
/**
* Transaction for registering player's BaseUser and UserInfo to the database.
*
* @author Rsl1122
*/
public class PlayerServerRegisterTransaction extends PlayerRegisterTransaction {
private final UUID serverUUID;
public PlayerServerRegisterTransaction(UUID playerUUID, LongSupplier registered, String playerName, UUID serverUUID) {
super(playerUUID, registered, playerName);
this.serverUUID = serverUUID;
}
@Override
protected void performOperations() {
super.performOperations();
if (!query(PlayerFetchQueries.isPlayerRegisteredOnServer(playerUUID, serverUUID))) {
execute(DataStoreQueries.registerUserInfo(playerUUID, registered.getAsLong(), serverUUID));
}
}
}

View File

@ -24,7 +24,6 @@ import com.djrapitops.plan.db.access.QueryStatement;
import com.djrapitops.plan.db.patches.UserInfoOptimizationPatch;
import com.djrapitops.plan.db.patches.Version10Patch;
import com.djrapitops.plan.db.sql.parsing.CreateTableParser;
import com.djrapitops.plan.db.sql.parsing.Select;
import com.djrapitops.plan.db.sql.parsing.Sql;
import com.djrapitops.plan.db.sql.parsing.Update;
@ -78,43 +77,6 @@ public class UserInfoTable extends Table {
.toString();
}
public void registerUserInfo(UUID uuid, long registered) {
execute(new ExecStatement(INSERT_STATEMENT) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, uuid.toString());
statement.setLong(2, registered);
statement.setString(3, getServerUUID().toString());
statement.setBoolean(4, false);
statement.setBoolean(5, false);
}
});
}
public boolean isRegistered(UUID uuid, UUID serverUUID) {
String sql = Select.from(TABLE_NAME, "COUNT(" + USER_UUID + ") as c")
.where(USER_UUID + "=?")
.and(SERVER_UUID + "=?")
.toString();
return query(new QueryStatement<Boolean>(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, uuid.toString());
statement.setString(2, serverUUID.toString());
}
@Override
public Boolean processResults(ResultSet set) throws SQLException {
return set.next() && set.getInt("c") >= 1;
}
});
}
public boolean isRegistered(UUID uuid) {
return isRegistered(uuid, getServerUUID());
}
public void updateOpStatus(UUID uuid, boolean op) {
String sql = Update.values(TABLE_NAME, OP)
.where(USER_UUID + "=?")
@ -177,19 +139,6 @@ public class UserInfoTable extends Table {
});
}
/**
* Used for getting info of all users on THIS server.
*
* @return List of UserInfo objects.
*/
public List<UserInfo> getServerUserInfo() {
return getServerUserInfo(getServerUUID());
}
public boolean isRegisteredOnThisServer(UUID player) {
return isRegistered(player, getServerUUID());
}
public Set<UUID> getSavedUUIDs(UUID serverUUID) {
String sql = "SELECT " + USER_UUID + " FROM " + TABLE_NAME + " WHERE " + SERVER_UUID + "=?";

View File

@ -21,9 +21,6 @@ import java.util.UUID;
@Deprecated
public interface CheckOperations {
@Deprecated
boolean isPlayerRegisteredOnThisServer(UUID player);
@Deprecated
boolean isServerInDatabase(UUID serverUUID);
}

View File

@ -79,9 +79,6 @@ public interface SaveOperations {
@Deprecated
void playerDisplayName(UUID uuid, Nickname nickname);
@Deprecated
void registerNewUserOnThisServer(UUID uuid, long registered);
@Deprecated
void insertTPSforThisServer(TPS tps);

View File

@ -27,11 +27,6 @@ public class SQLCheckOps extends SQLOps implements CheckOperations {
super(db);
}
@Override
public boolean isPlayerRegisteredOnThisServer(UUID player) {
return userInfoTable.isRegisteredOnThisServer(player);
}
@Override
public boolean isServerInDatabase(UUID serverUUID) {
return serverTable.getServerID(serverUUID).isPresent();

View File

@ -152,11 +152,6 @@ public class SQLSaveOps extends SQLOps implements SaveOperations {
nicknamesTable.saveUserName(uuid, nickname);
}
@Override
public void registerNewUserOnThisServer(UUID uuid, long registered) {
userInfoTable.registerUserInfo(uuid, registered);
}
@Override
public void insertTPSforThisServer(TPS tps) {
tpsTable.insertTPS(tps);

View File

@ -30,7 +30,6 @@ import javax.inject.Singleton;
import java.util.List;
import java.util.UUID;
import java.util.function.BooleanSupplier;
import java.util.function.LongSupplier;
/**
* Factory for creating Runnables related to Player data to run with {@link com.djrapitops.plan.system.processing.Processing}.
@ -82,8 +81,4 @@ public class PlayerProcessors {
return new PingInsertProcessor(uuid, serverInfo.get().getServerUUID(), pingList, dbSystem.get().getDatabase());
}
public RegisterProcessor registerProcessor(UUID uuid, LongSupplier registered, String name, Runnable... afterProcess) {
return new RegisterProcessor(uuid, registered, name, processing.get(), dbSystem.get().getDatabase(), afterProcess);
}
}

View File

@ -1,76 +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 <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.system.processing.processors.player;
import com.djrapitops.plan.db.Database;
import com.djrapitops.plan.db.access.transactions.events.PlayerRegisterTransaction;
import com.djrapitops.plan.system.database.databases.operation.CheckOperations;
import com.djrapitops.plan.system.database.databases.operation.SaveOperations;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.utilities.Verify;
import java.util.UUID;
import java.util.function.LongSupplier;
/**
* Registers the user to the database and marks first session if the user has no actions.
*
* @author Rsl1122
*/
public class RegisterProcessor extends AbsRunnable {
private final UUID uuid;
private final LongSupplier registered;
private final String name;
private final Runnable[] afterProcess;
private final Processing processing;
private final Database database;
RegisterProcessor(
UUID uuid, LongSupplier registered, String name,
Processing processing, Database database,
Runnable... afterProcess
) {
this.uuid = uuid;
this.registered = registered;
this.name = name;
this.processing = processing;
this.database = database;
this.afterProcess = afterProcess;
}
@Override
public void run() {
Verify.nullCheck(uuid, () -> new IllegalStateException("UUID was null"));
CheckOperations check = database.check();
SaveOperations save = database.save();
try {
database.executeTransaction(new PlayerRegisterTransaction(uuid, registered, name));
if (!check.isPlayerRegisteredOnThisServer(uuid)) {
save.registerNewUserOnThisServer(uuid, registered.getAsLong());
}
} finally {
for (Runnable runnable : afterProcess) {
processing.submit(runnable);
}
cancel();
}
}
}

View File

@ -33,10 +33,7 @@ import com.djrapitops.plan.db.access.Query;
import com.djrapitops.plan.db.access.queries.*;
import com.djrapitops.plan.db.access.queries.containers.ContainerFetchQueries;
import com.djrapitops.plan.db.access.transactions.*;
import com.djrapitops.plan.db.access.transactions.events.CommandStoreTransaction;
import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction;
import com.djrapitops.plan.db.access.transactions.events.PlayerRegisterTransaction;
import com.djrapitops.plan.db.access.transactions.events.WorldNameStoreTransaction;
import com.djrapitops.plan.db.access.transactions.events.*;
import com.djrapitops.plan.db.patches.Patch;
import com.djrapitops.plan.db.sql.tables.*;
import com.djrapitops.plan.system.PlanSystem;
@ -226,7 +223,7 @@ public abstract class CommonDBTest {
}
private void saveUserOne() {
db.executeTransaction(new PlayerRegisterTransaction(playerUUID, () -> 123456789L, "Test"));
playerIsRegisteredToBothTables();
db.getUsersTable().kicked(playerUUID);
}
@ -400,7 +397,7 @@ public abstract class CommonDBTest {
@Test
public void userInfoTableStoresCorrectUserInformation() {
userRegisterChecksReturnCorrectValues();
saveUserOne();
List<UserInfo> userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID));
List<UserInfo> expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, false, false));
@ -408,24 +405,9 @@ public abstract class CommonDBTest {
assertEquals(expected, userInfo);
}
@Test
public void userRegisterChecksReturnCorrectValues() {
UsersTable usersTable = db.getUsersTable();
assertFalse(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID)));
saveUserOne();
assertTrue(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID)));
UserInfoTable userInfoTable = db.getUserInfoTable();
assertFalse(userInfoTable.isRegistered(playerUUID));
userInfoTable.registerUserInfo(playerUUID, 223456789L);
assertTrue(userInfoTable.isRegistered(playerUUID));
assertEquals(123456789L, (long) db.getUsersTable().getRegisterDates().get(0));
}
@Test
public void userInfoTableUpdatesBanStatus() {
userRegisterChecksReturnCorrectValues();
saveUserOne();
db.getUserInfoTable().updateBanStatus(playerUUID, true);
@ -437,7 +419,7 @@ public abstract class CommonDBTest {
@Test
public void userInfoTableUpdatesOperatorStatus() {
userRegisterChecksReturnCorrectValues();
saveUserOne();
db.getUserInfoTable().updateOpStatus(playerUUID, true);
@ -484,12 +466,10 @@ public abstract class CommonDBTest {
saveUserTwo();
UserInfoTable userInfoTable = db.getUserInfoTable();
UsersTable usersTable = db.getUsersTable();
SessionsTable sessionsTable = db.getSessionsTable();
NicknamesTable nicknamesTable = db.getNicknamesTable();
db.executeTransaction(new PlayerRegisterTransaction(playerUUID, () -> 223456789L, "Test_name"));
userInfoTable.registerUserInfo(playerUUID, 223456789L);
db.executeTransaction(new PlayerServerRegisterTransaction(playerUUID, () -> 223456789L, "Test_name", serverUUID));
saveTwoWorlds();
Session session = new Session(playerUUID, serverUUID, 12345L, "", "");
@ -506,7 +486,7 @@ public abstract class CommonDBTest {
db.executeTransaction(new RemovePlayerTransaction(playerUUID));
assertFalse(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID)));
assertFalse(userInfoTable.isRegistered(playerUUID));
assertFalse(db.query(PlayerFetchQueries.isPlayerRegisteredOnServer(playerUUID, serverUUID)));
assertTrue(nicknamesTable.getNicknames(playerUUID).isEmpty());
assertTrue(db.query(PlayerFetchQueries.playerGeoInfo(playerUUID)).isEmpty());
assertTrue(sessionsTable.getSessions(playerUUID).isEmpty());
@ -546,7 +526,6 @@ public abstract class CommonDBTest {
saveUserOne();
saveUserTwo();
userInfoTable.registerUserInfo(playerUUID, 223456789L);
saveTwoWorlds();
Session session = new Session(playerUUID, serverUUID, 12345L, "", "");
@ -778,13 +757,20 @@ public abstract class CommonDBTest {
}
@Test
public void testRegister() {
public void playerIsRegisteredToUsersTable() {
assertFalse(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID)));
assertFalse(db.check().isPlayerRegisteredOnThisServer(playerUUID));
db.executeTransaction(new PlayerRegisterTransaction(playerUUID, () -> 1000L, "name"));
db.save().registerNewUserOnThisServer(playerUUID, 500L);
assertTrue(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID)));
assertTrue(db.check().isPlayerRegisteredOnThisServer(playerUUID));
assertFalse(db.query(PlayerFetchQueries.isPlayerRegisteredOnServer(playerUUID, serverUUID)));
}
@Test
public void playerIsRegisteredToBothTables() {
assertFalse(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID)));
assertFalse(db.query(PlayerFetchQueries.isPlayerRegisteredOnServer(playerUUID, serverUUID)));
db.executeTransaction(new PlayerServerRegisterTransaction(playerUUID, () -> 1000L, "name", serverUUID));
assertTrue(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID)));
assertTrue(db.query(PlayerFetchQueries.isPlayerRegisteredOnServer(playerUUID, serverUUID)));
}
@Test

View File

@ -17,7 +17,9 @@
package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.db.Database;
import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction;
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;
import com.djrapitops.plan.system.cache.SessionCache;
@ -142,6 +144,7 @@ public class SpongePlayerListener {
Player player = event.getTargetEntity();
UUID uuid = player.getUniqueId();
UUID serverUUID = serverInfo.getServerUUID();
long time = System.currentTimeMillis();
SpongeAFKListener.AFK_TRACKER.performedAction(uuid, time);
@ -150,7 +153,8 @@ public class SpongePlayerListener {
Optional<GameMode> gameMode = player.getGameModeData().get(Keys.GAME_MODE);
String gm = gameMode.map(mode -> mode.getName().toUpperCase()).orElse("ADVENTURE");
dbSystem.getDatabase().executeTransaction(new WorldNameStoreTransaction(serverInfo.getServerUUID(), world));
Database database = dbSystem.getDatabase();
database.executeTransaction(new WorldNameStoreTransaction(serverUUID, world));
InetAddress address = player.getConnection().getAddress().getAddress();
@ -159,18 +163,15 @@ public class SpongePlayerListener {
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
if (gatheringGeolocations) {
dbSystem.getDatabase().executeTransaction(
database.executeTransaction(
new GeoInfoStoreTransaction(uuid, address, time, geolocationCache::getCountry)
);
}
processing.submitCritical(() -> sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, world, gm)));
runnableFactory.create("Player Register: " + uuid,
processors.player().registerProcessor(uuid, () -> time, playerName,
processors.player().nameProcessor(uuid, displayName),
processors.info().playerPageUpdateProcessor(uuid)
)
).runTaskAsynchronously();
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));
processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid));
}
@Listener(order = Order.POST)