mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-03-10 05:39:19 +01:00
Refactored GeoInfo storage into a Transaction:
- Refactored GeoInfoTable#saveGeoInfo into queries - Removed IPUpdateProcessor
This commit is contained in:
parent
87d77240fa
commit
cb22c0f80a
@ -17,7 +17,9 @@
|
|||||||
package com.djrapitops.plan.system.listeners.bukkit;
|
package com.djrapitops.plan.system.listeners.bukkit;
|
||||||
|
|
||||||
import com.djrapitops.plan.data.container.Session;
|
import com.djrapitops.plan.data.container.Session;
|
||||||
|
import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction;
|
||||||
import com.djrapitops.plan.db.access.transactions.events.WorldNameStoreTransaction;
|
import com.djrapitops.plan.db.access.transactions.events.WorldNameStoreTransaction;
|
||||||
|
import com.djrapitops.plan.system.cache.GeolocationCache;
|
||||||
import com.djrapitops.plan.system.cache.SessionCache;
|
import com.djrapitops.plan.system.cache.SessionCache;
|
||||||
import com.djrapitops.plan.system.database.DBSystem;
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.info.server.ServerInfo;
|
import com.djrapitops.plan.system.info.server.ServerInfo;
|
||||||
@ -54,6 +56,7 @@ public class PlayerOnlineListener implements Listener {
|
|||||||
private final Processing processing;
|
private final Processing processing;
|
||||||
private final ServerInfo serverInfo;
|
private final ServerInfo serverInfo;
|
||||||
private final DBSystem dbSystem;
|
private final DBSystem dbSystem;
|
||||||
|
private final GeolocationCache geolocationCache;
|
||||||
private final SessionCache sessionCache;
|
private final SessionCache sessionCache;
|
||||||
private final ErrorHandler errorHandler;
|
private final ErrorHandler errorHandler;
|
||||||
private final Status status;
|
private final Status status;
|
||||||
@ -66,6 +69,7 @@ public class PlayerOnlineListener implements Listener {
|
|||||||
Processing processing,
|
Processing processing,
|
||||||
ServerInfo serverInfo,
|
ServerInfo serverInfo,
|
||||||
DBSystem dbSystem,
|
DBSystem dbSystem,
|
||||||
|
GeolocationCache geolocationCache,
|
||||||
SessionCache sessionCache,
|
SessionCache sessionCache,
|
||||||
Status status,
|
Status status,
|
||||||
RunnableFactory runnableFactory,
|
RunnableFactory runnableFactory,
|
||||||
@ -76,6 +80,7 @@ public class PlayerOnlineListener implements Listener {
|
|||||||
this.processing = processing;
|
this.processing = processing;
|
||||||
this.serverInfo = serverInfo;
|
this.serverInfo = serverInfo;
|
||||||
this.dbSystem = dbSystem;
|
this.dbSystem = dbSystem;
|
||||||
|
this.geolocationCache = geolocationCache;
|
||||||
this.sessionCache = sessionCache;
|
this.sessionCache = sessionCache;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
this.runnableFactory = runnableFactory;
|
this.runnableFactory = runnableFactory;
|
||||||
@ -148,11 +153,15 @@ public class PlayerOnlineListener implements Listener {
|
|||||||
String displayName = player.getDisplayName();
|
String displayName = player.getDisplayName();
|
||||||
|
|
||||||
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
|
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
|
||||||
|
if (gatheringGeolocations) {
|
||||||
|
dbSystem.getDatabase().executeTransaction(
|
||||||
|
new GeoInfoStoreTransaction(uuid, address, time, geolocationCache::getCountry)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
processing.submitCritical(() -> sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, world, gm)));
|
processing.submitCritical(() -> sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, world, gm)));
|
||||||
runnableFactory.create("Player Register: " + uuid,
|
runnableFactory.create("Player Register: " + uuid,
|
||||||
processors.player().registerProcessor(uuid, player::getFirstPlayed, playerName,
|
processors.player().registerProcessor(uuid, player::getFirstPlayed, playerName,
|
||||||
gatheringGeolocations ? processors.player().ipUpdateProcessor(uuid, address, time) : null,
|
|
||||||
processors.player().nameProcessor(uuid, playerName, displayName),
|
processors.player().nameProcessor(uuid, playerName, displayName),
|
||||||
processors.info().playerPageUpdateProcessor(uuid)
|
processors.info().playerPageUpdateProcessor(uuid)
|
||||||
)
|
)
|
||||||
|
@ -17,7 +17,10 @@
|
|||||||
package com.djrapitops.plan.system.listeners.bungee;
|
package com.djrapitops.plan.system.listeners.bungee;
|
||||||
|
|
||||||
import com.djrapitops.plan.data.container.Session;
|
import com.djrapitops.plan.data.container.Session;
|
||||||
|
import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction;
|
||||||
|
import com.djrapitops.plan.system.cache.GeolocationCache;
|
||||||
import com.djrapitops.plan.system.cache.SessionCache;
|
import com.djrapitops.plan.system.cache.SessionCache;
|
||||||
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.info.server.ServerInfo;
|
import com.djrapitops.plan.system.info.server.ServerInfo;
|
||||||
import com.djrapitops.plan.system.processing.Processing;
|
import com.djrapitops.plan.system.processing.Processing;
|
||||||
import com.djrapitops.plan.system.processing.processors.Processors;
|
import com.djrapitops.plan.system.processing.processors.Processors;
|
||||||
@ -48,6 +51,8 @@ public class PlayerOnlineListener implements Listener {
|
|||||||
private final PlanConfig config;
|
private final PlanConfig config;
|
||||||
private final Processors processors;
|
private final Processors processors;
|
||||||
private final Processing processing;
|
private final Processing processing;
|
||||||
|
private final DBSystem dbSystem;
|
||||||
|
private final GeolocationCache geolocationCache;
|
||||||
private final SessionCache sessionCache;
|
private final SessionCache sessionCache;
|
||||||
private final ServerInfo serverInfo;
|
private final ServerInfo serverInfo;
|
||||||
private final ErrorHandler errorHandler;
|
private final ErrorHandler errorHandler;
|
||||||
@ -57,6 +62,8 @@ public class PlayerOnlineListener implements Listener {
|
|||||||
PlanConfig config,
|
PlanConfig config,
|
||||||
Processors processors,
|
Processors processors,
|
||||||
Processing processing,
|
Processing processing,
|
||||||
|
DBSystem dbSystem,
|
||||||
|
GeolocationCache geolocationCache,
|
||||||
SessionCache sessionCache,
|
SessionCache sessionCache,
|
||||||
ServerInfo serverInfo,
|
ServerInfo serverInfo,
|
||||||
ErrorHandler errorHandler
|
ErrorHandler errorHandler
|
||||||
@ -64,6 +71,8 @@ public class PlayerOnlineListener implements Listener {
|
|||||||
this.config = config;
|
this.config = config;
|
||||||
this.processors = processors;
|
this.processors = processors;
|
||||||
this.processing = processing;
|
this.processing = processing;
|
||||||
|
this.dbSystem = dbSystem;
|
||||||
|
this.geolocationCache = geolocationCache;
|
||||||
this.sessionCache = sessionCache;
|
this.sessionCache = sessionCache;
|
||||||
this.serverInfo = serverInfo;
|
this.serverInfo = serverInfo;
|
||||||
this.errorHandler = errorHandler;
|
this.errorHandler = errorHandler;
|
||||||
@ -81,10 +90,13 @@ public class PlayerOnlineListener implements Listener {
|
|||||||
sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, null, null));
|
sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, null, null));
|
||||||
|
|
||||||
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
|
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
|
||||||
|
if (gatheringGeolocations) {
|
||||||
|
dbSystem.getDatabase().executeTransaction(
|
||||||
|
new GeoInfoStoreTransaction(uuid, address, time, geolocationCache::getCountry)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
processing.submit(processors.player().proxyRegisterProcessor(uuid, name, time,
|
processing.submit(processors.player().proxyRegisterProcessor(uuid, name, time));
|
||||||
gatheringGeolocations ? processors.player().ipUpdateProcessor(uuid, address, time) : null
|
|
||||||
));
|
|
||||||
processing.submit(processors.info().playerPageUpdateProcessor(uuid));
|
processing.submit(processors.info().playerPageUpdateProcessor(uuid));
|
||||||
ResponseCache.clearResponse(PageId.SERVER.of(serverInfo.getServerUUID()));
|
ResponseCache.clearResponse(PageId.SERVER.of(serverInfo.getServerUUID()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.djrapitops.plan.db.access.queries;
|
package com.djrapitops.plan.db.access.queries;
|
||||||
|
|
||||||
|
import com.djrapitops.plan.data.container.GeoInfo;
|
||||||
import com.djrapitops.plan.data.container.Session;
|
import com.djrapitops.plan.data.container.Session;
|
||||||
import com.djrapitops.plan.data.store.keys.SessionKeys;
|
import com.djrapitops.plan.data.store.keys.SessionKeys;
|
||||||
import com.djrapitops.plan.data.time.GMTimes;
|
import com.djrapitops.plan.data.time.GMTimes;
|
||||||
@ -137,4 +138,38 @@ public class DataStoreQueries {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Executable storeGeoInfo(UUID playerUUID, GeoInfo geoInfo) {
|
||||||
|
return connection -> {
|
||||||
|
if (!updateGeoInfo(playerUUID, geoInfo).execute(connection)) {
|
||||||
|
return insertGeoInfo(playerUUID, geoInfo).execute(connection);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Executable updateGeoInfo(UUID playerUUID, GeoInfo geoInfo) {
|
||||||
|
return new ExecStatement(GeoInfoTable.UPDATE_STATEMENT) {
|
||||||
|
@Override
|
||||||
|
public void prepare(PreparedStatement statement) throws SQLException {
|
||||||
|
statement.setLong(1, geoInfo.getDate());
|
||||||
|
statement.setString(2, playerUUID.toString());
|
||||||
|
statement.setString(3, geoInfo.getIpHash());
|
||||||
|
statement.setString(4, geoInfo.getGeolocation());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Executable insertGeoInfo(UUID playerUUID, GeoInfo geoInfo) {
|
||||||
|
return new ExecStatement(GeoInfoTable.INSERT_STATEMENT) {
|
||||||
|
@Override
|
||||||
|
public void prepare(PreparedStatement statement) throws SQLException {
|
||||||
|
statement.setString(1, playerUUID.toString());
|
||||||
|
statement.setString(2, geoInfo.getIp());
|
||||||
|
statement.setString(3, geoInfo.getIpHash());
|
||||||
|
statement.setString(4, geoInfo.getGeolocation());
|
||||||
|
statement.setLong(5, geoInfo.getDate());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* 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.data.container.GeoInfo;
|
||||||
|
import com.djrapitops.plan.db.access.queries.DataStoreQueries;
|
||||||
|
import com.djrapitops.plan.db.access.transactions.Transaction;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transaction to update Geo information of a player in the database.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
public class GeoInfoStoreTransaction extends Transaction {
|
||||||
|
|
||||||
|
private static boolean hasFailed = false;
|
||||||
|
|
||||||
|
private final UUID playerUUID;
|
||||||
|
private InetAddress ip;
|
||||||
|
private long time;
|
||||||
|
private Function<String, String> geolocationFunction;
|
||||||
|
|
||||||
|
private GeoInfo geoInfo;
|
||||||
|
|
||||||
|
public GeoInfoStoreTransaction(
|
||||||
|
UUID playerUUID,
|
||||||
|
InetAddress ip,
|
||||||
|
long time,
|
||||||
|
Function<String, String> geolocationFunction
|
||||||
|
) {
|
||||||
|
this.playerUUID = playerUUID;
|
||||||
|
this.ip = ip;
|
||||||
|
this.time = time;
|
||||||
|
this.geolocationFunction = geolocationFunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GeoInfoStoreTransaction(UUID playerUUID, GeoInfo geoInfo) {
|
||||||
|
this.playerUUID = playerUUID;
|
||||||
|
this.geoInfo = geoInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean shouldBeExecuted() {
|
||||||
|
return !hasFailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void performOperations() {
|
||||||
|
try {
|
||||||
|
if (geoInfo == null) geoInfo = createGeoInfo();
|
||||||
|
|
||||||
|
execute(DataStoreQueries.storeGeoInfo(playerUUID, geoInfo));
|
||||||
|
} catch (NoSuchAlgorithmException noSHA256Available) {
|
||||||
|
// SHA256 not available.
|
||||||
|
hasFailed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private GeoInfo createGeoInfo() throws NoSuchAlgorithmException {
|
||||||
|
String country = geolocationFunction.apply(ip.getHostAddress());
|
||||||
|
return new GeoInfo(ip, country, time);
|
||||||
|
}
|
||||||
|
}
|
@ -19,19 +19,20 @@ package com.djrapitops.plan.db.sql.tables;
|
|||||||
import com.djrapitops.plan.data.container.GeoInfo;
|
import com.djrapitops.plan.data.container.GeoInfo;
|
||||||
import com.djrapitops.plan.db.DBType;
|
import com.djrapitops.plan.db.DBType;
|
||||||
import com.djrapitops.plan.db.SQLDB;
|
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.access.QueryStatement;
|
||||||
import com.djrapitops.plan.db.access.queries.LargeFetchQueries;
|
import com.djrapitops.plan.db.access.queries.LargeFetchQueries;
|
||||||
import com.djrapitops.plan.db.patches.*;
|
import com.djrapitops.plan.db.patches.*;
|
||||||
import com.djrapitops.plan.db.sql.parsing.CreateTableParser;
|
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.Sql;
|
||||||
import com.djrapitops.plan.utilities.comparators.GeoInfoComparator;
|
import com.djrapitops.plan.utilities.comparators.GeoInfoComparator;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Table that is in charge of storing common IP and Geolocation data for users.
|
* Table that is in charge of storing common IP and Geolocation data for users.
|
||||||
@ -65,6 +66,11 @@ public class GeoInfoTable extends Table {
|
|||||||
+ GEOLOCATION + ", "
|
+ GEOLOCATION + ", "
|
||||||
+ LAST_USED
|
+ LAST_USED
|
||||||
+ ") VALUES (?, ?, ?, ?, ?)";
|
+ ") VALUES (?, ?, ?, ?, ?)";
|
||||||
|
public static final String UPDATE_STATEMENT = "UPDATE " + TABLE_NAME + " SET "
|
||||||
|
+ LAST_USED + "=?" +
|
||||||
|
" WHERE " + USER_UUID + "=?" +
|
||||||
|
" AND " + IP_HASH + "=?" +
|
||||||
|
" AND " + GEOLOCATION + "=?";
|
||||||
|
|
||||||
public GeoInfoTable(SQLDB db) {
|
public GeoInfoTable(SQLDB db) {
|
||||||
super(TABLE_NAME, db);
|
super(TABLE_NAME, db);
|
||||||
@ -106,67 +112,6 @@ public class GeoInfoTable extends Table {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateGeoInfo(UUID uuid, GeoInfo info) {
|
|
||||||
String sql = "UPDATE " + tableName + " SET "
|
|
||||||
+ LAST_USED + "=?" +
|
|
||||||
" WHERE " + USER_UUID + "=?" +
|
|
||||||
" AND " + IP_HASH + "=?" +
|
|
||||||
" AND " + GEOLOCATION + "=?";
|
|
||||||
|
|
||||||
execute(new ExecStatement(sql) {
|
|
||||||
@Override
|
|
||||||
public void prepare(PreparedStatement statement) throws SQLException {
|
|
||||||
statement.setLong(1, info.getDate());
|
|
||||||
statement.setString(2, uuid.toString());
|
|
||||||
statement.setString(3, info.getIpHash());
|
|
||||||
statement.setString(4, info.getGeolocation());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void saveGeoInfo(UUID uuid, GeoInfo info) {
|
|
||||||
List<GeoInfo> geoInfo = getGeoInfo(uuid);
|
|
||||||
if (geoInfo.contains(info)) {
|
|
||||||
updateGeoInfo(uuid, info);
|
|
||||||
} else {
|
|
||||||
insertGeoInfo(uuid, info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void insertGeoInfo(UUID uuid, GeoInfo info) {
|
|
||||||
execute(new ExecStatement(INSERT_STATEMENT) {
|
|
||||||
@Override
|
|
||||||
public void prepare(PreparedStatement statement) throws SQLException {
|
|
||||||
statement.setString(1, uuid.toString());
|
|
||||||
statement.setString(2, info.getIp());
|
|
||||||
statement.setString(3, info.getIpHash());
|
|
||||||
statement.setString(4, info.getGeolocation());
|
|
||||||
statement.setLong(5, info.getDate());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Optional<String> getGeolocation(String ip) {
|
|
||||||
String sql = Select.from(tableName, GEOLOCATION)
|
|
||||||
.where(IP + "=?")
|
|
||||||
.toString();
|
|
||||||
|
|
||||||
return query(new QueryStatement<Optional<String>>(sql) {
|
|
||||||
@Override
|
|
||||||
public void prepare(PreparedStatement statement) throws SQLException {
|
|
||||||
statement.setString(1, ip);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<String> processResults(ResultSet set) throws SQLException {
|
|
||||||
if (set.next()) {
|
|
||||||
return Optional.of(set.getString(GEOLOCATION));
|
|
||||||
}
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> getNetworkGeolocations() {
|
public List<String> getNetworkGeolocations() {
|
||||||
List<String> geolocations = new ArrayList<>();
|
List<String> geolocations = new ArrayList<>();
|
||||||
|
|
||||||
|
@ -73,9 +73,6 @@ public interface SaveOperations {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
void registerNewUser(UUID uuid, long registered, String name);
|
void registerNewUser(UUID uuid, long registered, String name);
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
void geoInfo(UUID uuid, GeoInfo geoInfo);
|
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
void playerWasKicked(UUID uuid);
|
void playerWasKicked(UUID uuid);
|
||||||
|
|
||||||
|
@ -142,11 +142,6 @@ public class SQLSaveOps extends SQLOps implements SaveOperations {
|
|||||||
usersTable.registerUser(uuid, registered, name);
|
usersTable.registerUser(uuid, registered, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void geoInfo(UUID uuid, GeoInfo geoInfo) {
|
|
||||||
geoInfoTable.saveGeoInfo(uuid, geoInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void playerWasKicked(UUID uuid) {
|
public void playerWasKicked(UUID uuid) {
|
||||||
usersTable.kicked(uuid);
|
usersTable.kicked(uuid);
|
||||||
|
@ -1,64 +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.data.container.GeoInfo;
|
|
||||||
import com.djrapitops.plan.db.Database;
|
|
||||||
import com.djrapitops.plan.system.cache.GeolocationCache;
|
|
||||||
import com.djrapitops.plan.system.processing.CriticalRunnable;
|
|
||||||
|
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the IP and Geolocation of a user.
|
|
||||||
*
|
|
||||||
* @author Rsl1122
|
|
||||||
*/
|
|
||||||
public class IPUpdateProcessor implements CriticalRunnable {
|
|
||||||
|
|
||||||
private final UUID uuid;
|
|
||||||
private final InetAddress ip;
|
|
||||||
private final long time;
|
|
||||||
|
|
||||||
private final Database database;
|
|
||||||
private final GeolocationCache geolocationCache;
|
|
||||||
|
|
||||||
IPUpdateProcessor(
|
|
||||||
UUID uuid, InetAddress ip, long time,
|
|
||||||
Database database,
|
|
||||||
GeolocationCache geolocationCache
|
|
||||||
) {
|
|
||||||
this.uuid = uuid;
|
|
||||||
this.ip = ip;
|
|
||||||
this.time = time;
|
|
||||||
this.database = database;
|
|
||||||
this.geolocationCache = geolocationCache;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
String country = geolocationCache.getCountry(ip.getHostAddress());
|
|
||||||
GeoInfo geoInfo = new GeoInfo(ip, country, time);
|
|
||||||
database.save().geoInfo(uuid, geoInfo);
|
|
||||||
} catch (NoSuchAlgorithmException ignore) {
|
|
||||||
// Ignored, SHA-256 should be available
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -27,7 +27,6 @@ import dagger.Lazy;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.function.BooleanSupplier;
|
import java.util.function.BooleanSupplier;
|
||||||
@ -74,10 +73,6 @@ public class PlayerProcessors {
|
|||||||
return new EndSessionProcessor(uuid, time, dataCache.get());
|
return new EndSessionProcessor(uuid, time, dataCache.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
public IPUpdateProcessor ipUpdateProcessor(UUID uuid, InetAddress ip, long time) {
|
|
||||||
return new IPUpdateProcessor(uuid, ip, time, dbSystem.get().getDatabase(), geolocationCache.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
public KickProcessor kickProcessor(UUID uuid) {
|
public KickProcessor kickProcessor(UUID uuid) {
|
||||||
return new KickProcessor(uuid, dbSystem.get().getDatabase());
|
return new KickProcessor(uuid, dbSystem.get().getDatabase());
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ import com.djrapitops.plan.db.access.queries.*;
|
|||||||
import com.djrapitops.plan.db.access.queries.containers.ContainerFetchQueries;
|
import com.djrapitops.plan.db.access.queries.containers.ContainerFetchQueries;
|
||||||
import com.djrapitops.plan.db.access.transactions.*;
|
import com.djrapitops.plan.db.access.transactions.*;
|
||||||
import com.djrapitops.plan.db.access.transactions.events.CommandStoreTransaction;
|
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.WorldNameStoreTransaction;
|
import com.djrapitops.plan.db.access.transactions.events.WorldNameStoreTransaction;
|
||||||
import com.djrapitops.plan.db.patches.Patch;
|
import com.djrapitops.plan.db.patches.Patch;
|
||||||
import com.djrapitops.plan.db.sql.tables.*;
|
import com.djrapitops.plan.db.sql.tables.*;
|
||||||
@ -233,28 +234,20 @@ public abstract class CommonDBTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIPTable() throws DBInitException {
|
public void geoInformationIsStored() throws DBInitException {
|
||||||
saveUserOne();
|
saveUserOne();
|
||||||
GeoInfoTable geoInfoTable = db.getGeoInfoTable();
|
|
||||||
|
|
||||||
String expectedIP = "1.2.3.4";
|
String expectedIP = "1.2.3.4";
|
||||||
String expectedGeoLoc = "TestLocation";
|
String expectedGeoLoc = "TestLocation";
|
||||||
long time = System.currentTimeMillis();
|
long time = System.currentTimeMillis();
|
||||||
|
|
||||||
GeoInfo expected = new GeoInfo(expectedIP, expectedGeoLoc, time, "3");
|
GeoInfo expected = new GeoInfo(expectedIP, expectedGeoLoc, time, "3");
|
||||||
geoInfoTable.saveGeoInfo(playerUUID, expected);
|
saveGeoInfo(playerUUID, expected);
|
||||||
geoInfoTable.saveGeoInfo(playerUUID, expected);
|
|
||||||
commitTest();
|
commitTest();
|
||||||
|
|
||||||
List<GeoInfo> getInfo = geoInfoTable.getGeoInfo(playerUUID);
|
List<GeoInfo> geolocations = db.query(LargeFetchQueries.fetchAllGeoInformation()).getOrDefault(playerUUID, new ArrayList<>());
|
||||||
assertEquals(1, getInfo.size());
|
assertEquals(1, geolocations.size());
|
||||||
GeoInfo actual = getInfo.get(0);
|
assertEquals(expected, geolocations.get(0));
|
||||||
assertEquals(expected, actual);
|
|
||||||
assertEquals(time, actual.getDate());
|
|
||||||
|
|
||||||
Optional<String> result = geoInfoTable.getGeolocation(expectedIP);
|
|
||||||
assertTrue(result.isPresent());
|
|
||||||
assertEquals(expectedGeoLoc, result.get());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -518,7 +511,7 @@ public abstract class CommonDBTest {
|
|||||||
|
|
||||||
execute(DataStoreQueries.storeSession(session));
|
execute(DataStoreQueries.storeSession(session));
|
||||||
nicknamesTable.saveUserName(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID));
|
nicknamesTable.saveUserName(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID));
|
||||||
geoInfoTable.saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L, "3"));
|
saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L, "3"));
|
||||||
|
|
||||||
assertTrue(usersTable.isRegistered(playerUUID));
|
assertTrue(usersTable.isRegistered(playerUUID));
|
||||||
|
|
||||||
@ -576,7 +569,7 @@ public abstract class CommonDBTest {
|
|||||||
|
|
||||||
execute(DataStoreQueries.storeSession(session));
|
execute(DataStoreQueries.storeSession(session));
|
||||||
nicknamesTable.saveUserName(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID));
|
nicknamesTable.saveUserName(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID));
|
||||||
geoInfoTable.saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L,
|
saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L,
|
||||||
new SHA256Hash("1.2.3.4").create()));
|
new SHA256Hash("1.2.3.4").create()));
|
||||||
|
|
||||||
assertTrue(usersTable.isRegistered(playerUUID));
|
assertTrue(usersTable.isRegistered(playerUUID));
|
||||||
@ -613,6 +606,10 @@ public abstract class CommonDBTest {
|
|||||||
securityTable.addNewUser(new WebUser("Test", "RandomGarbageBlah", 0));
|
securityTable.addNewUser(new WebUser("Test", "RandomGarbageBlah", 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void saveGeoInfo(UUID uuid, GeoInfo geoInfo) {
|
||||||
|
db.executeTransaction(new GeoInfoStoreTransaction(uuid, geoInfo));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSessionTableNPEWhenNoPlayers() {
|
public void testSessionTableNPEWhenNoPlayers() {
|
||||||
Map<UUID, Long> lastSeen = db.getSessionsTable().getLastSeenForAllPlayers();
|
Map<UUID, Long> lastSeen = db.getSessionsTable().getLastSeenForAllPlayers();
|
||||||
@ -815,11 +812,11 @@ public abstract class CommonDBTest {
|
|||||||
usersTable.registerUser(secondUuid, 0, "");
|
usersTable.registerUser(secondUuid, 0, "");
|
||||||
usersTable.registerUser(thirdUuid, 0, "");
|
usersTable.registerUser(thirdUuid, 0, "");
|
||||||
|
|
||||||
geoInfoTable.saveGeoInfo(firstUuid, new GeoInfo("-", "Test1", 0, "3"));
|
saveGeoInfo(firstUuid, new GeoInfo("-", "Test1", 0, "3"));
|
||||||
GeoInfo secondInfo = new GeoInfo("-", "Test2", 5, "3");
|
GeoInfo secondInfo = new GeoInfo("-", "Test2", 5, "3");
|
||||||
geoInfoTable.saveGeoInfo(firstUuid, secondInfo);
|
saveGeoInfo(firstUuid, secondInfo);
|
||||||
geoInfoTable.saveGeoInfo(secondUuid, new GeoInfo("-", "Test3", 0, "3"));
|
saveGeoInfo(secondUuid, new GeoInfo("-", "Test3", 0, "3"));
|
||||||
geoInfoTable.saveGeoInfo(thirdUuid, new GeoInfo("-", "Test4", 0, "3"));
|
saveGeoInfo(thirdUuid, new GeoInfo("-", "Test4", 0, "3"));
|
||||||
|
|
||||||
List<String> geolocations = geoInfoTable.getNetworkGeolocations();
|
List<String> geolocations = geoInfoTable.getNetworkGeolocations();
|
||||||
|
|
||||||
|
@ -17,7 +17,9 @@
|
|||||||
package com.djrapitops.plan.system.listeners.sponge;
|
package com.djrapitops.plan.system.listeners.sponge;
|
||||||
|
|
||||||
import com.djrapitops.plan.data.container.Session;
|
import com.djrapitops.plan.data.container.Session;
|
||||||
|
import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction;
|
||||||
import com.djrapitops.plan.db.access.transactions.events.WorldNameStoreTransaction;
|
import com.djrapitops.plan.db.access.transactions.events.WorldNameStoreTransaction;
|
||||||
|
import com.djrapitops.plan.system.cache.GeolocationCache;
|
||||||
import com.djrapitops.plan.system.cache.SessionCache;
|
import com.djrapitops.plan.system.cache.SessionCache;
|
||||||
import com.djrapitops.plan.system.database.DBSystem;
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.info.server.ServerInfo;
|
import com.djrapitops.plan.system.info.server.ServerInfo;
|
||||||
@ -58,10 +60,11 @@ public class SpongePlayerListener {
|
|||||||
private final Processing processing;
|
private final Processing processing;
|
||||||
private final ServerInfo serverInfo;
|
private final ServerInfo serverInfo;
|
||||||
private final DBSystem dbSystem;
|
private final DBSystem dbSystem;
|
||||||
private SessionCache sessionCache;
|
private final GeolocationCache geolocationCache;
|
||||||
|
private final SessionCache sessionCache;
|
||||||
private final Status status;
|
private final Status status;
|
||||||
private RunnableFactory runnableFactory;
|
private final RunnableFactory runnableFactory;
|
||||||
private ErrorHandler errorHandler;
|
private final ErrorHandler errorHandler;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SpongePlayerListener(
|
public SpongePlayerListener(
|
||||||
@ -70,6 +73,7 @@ public class SpongePlayerListener {
|
|||||||
Processing processing,
|
Processing processing,
|
||||||
ServerInfo serverInfo,
|
ServerInfo serverInfo,
|
||||||
DBSystem dbSystem,
|
DBSystem dbSystem,
|
||||||
|
GeolocationCache geolocationCache,
|
||||||
SessionCache sessionCache,
|
SessionCache sessionCache,
|
||||||
Status status,
|
Status status,
|
||||||
RunnableFactory runnableFactory,
|
RunnableFactory runnableFactory,
|
||||||
@ -80,6 +84,7 @@ public class SpongePlayerListener {
|
|||||||
this.processing = processing;
|
this.processing = processing;
|
||||||
this.serverInfo = serverInfo;
|
this.serverInfo = serverInfo;
|
||||||
this.dbSystem = dbSystem;
|
this.dbSystem = dbSystem;
|
||||||
|
this.geolocationCache = geolocationCache;
|
||||||
this.sessionCache = sessionCache;
|
this.sessionCache = sessionCache;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
this.runnableFactory = runnableFactory;
|
this.runnableFactory = runnableFactory;
|
||||||
@ -153,11 +158,15 @@ public class SpongePlayerListener {
|
|||||||
String displayName = player.getDisplayNameData().displayName().get().toPlain();
|
String displayName = player.getDisplayNameData().displayName().get().toPlain();
|
||||||
|
|
||||||
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
|
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
|
||||||
|
if (gatheringGeolocations) {
|
||||||
|
dbSystem.getDatabase().executeTransaction(
|
||||||
|
new GeoInfoStoreTransaction(uuid, address, time, geolocationCache::getCountry)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
processing.submitCritical(() -> sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, world, gm)));
|
processing.submitCritical(() -> sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, world, gm)));
|
||||||
runnableFactory.create("Player Register: " + uuid,
|
runnableFactory.create("Player Register: " + uuid,
|
||||||
processors.player().registerProcessor(uuid, () -> time, playerName,
|
processors.player().registerProcessor(uuid, () -> time, playerName,
|
||||||
gatheringGeolocations ? processors.player().ipUpdateProcessor(uuid, address, time) : null,
|
|
||||||
processors.player().nameProcessor(uuid, playerName, displayName),
|
processors.player().nameProcessor(uuid, playerName, displayName),
|
||||||
processors.info().playerPageUpdateProcessor(uuid)
|
processors.info().playerPageUpdateProcessor(uuid)
|
||||||
)
|
)
|
||||||
|
@ -17,7 +17,10 @@
|
|||||||
package com.djrapitops.plan.system.listeners.velocity;
|
package com.djrapitops.plan.system.listeners.velocity;
|
||||||
|
|
||||||
import com.djrapitops.plan.data.container.Session;
|
import com.djrapitops.plan.data.container.Session;
|
||||||
|
import com.djrapitops.plan.db.access.transactions.events.GeoInfoStoreTransaction;
|
||||||
|
import com.djrapitops.plan.system.cache.GeolocationCache;
|
||||||
import com.djrapitops.plan.system.cache.SessionCache;
|
import com.djrapitops.plan.system.cache.SessionCache;
|
||||||
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.info.server.ServerInfo;
|
import com.djrapitops.plan.system.info.server.ServerInfo;
|
||||||
import com.djrapitops.plan.system.processing.Processing;
|
import com.djrapitops.plan.system.processing.Processing;
|
||||||
import com.djrapitops.plan.system.processing.processors.Processors;
|
import com.djrapitops.plan.system.processing.processors.Processors;
|
||||||
@ -51,6 +54,8 @@ public class PlayerOnlineListener {
|
|||||||
private final PlanConfig config;
|
private final PlanConfig config;
|
||||||
private final Processors processors;
|
private final Processors processors;
|
||||||
private final Processing processing;
|
private final Processing processing;
|
||||||
|
private final DBSystem dbSystem;
|
||||||
|
private final GeolocationCache geolocationCache;
|
||||||
private final SessionCache sessionCache;
|
private final SessionCache sessionCache;
|
||||||
private final ServerInfo serverInfo;
|
private final ServerInfo serverInfo;
|
||||||
private final ErrorHandler errorHandler;
|
private final ErrorHandler errorHandler;
|
||||||
@ -60,6 +65,8 @@ public class PlayerOnlineListener {
|
|||||||
PlanConfig config,
|
PlanConfig config,
|
||||||
Processing processing,
|
Processing processing,
|
||||||
Processors processors,
|
Processors processors,
|
||||||
|
DBSystem dbSystem,
|
||||||
|
GeolocationCache geolocationCache,
|
||||||
SessionCache sessionCache,
|
SessionCache sessionCache,
|
||||||
ServerInfo serverInfo,
|
ServerInfo serverInfo,
|
||||||
ErrorHandler errorHandler
|
ErrorHandler errorHandler
|
||||||
@ -67,6 +74,8 @@ public class PlayerOnlineListener {
|
|||||||
this.config = config;
|
this.config = config;
|
||||||
this.processing = processing;
|
this.processing = processing;
|
||||||
this.processors = processors;
|
this.processors = processors;
|
||||||
|
this.dbSystem = dbSystem;
|
||||||
|
this.geolocationCache = geolocationCache;
|
||||||
this.sessionCache = sessionCache;
|
this.sessionCache = sessionCache;
|
||||||
this.serverInfo = serverInfo;
|
this.serverInfo = serverInfo;
|
||||||
this.errorHandler = errorHandler;
|
this.errorHandler = errorHandler;
|
||||||
@ -84,10 +93,13 @@ public class PlayerOnlineListener {
|
|||||||
sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, null, null));
|
sessionCache.cacheSession(uuid, new Session(uuid, serverInfo.getServerUUID(), time, null, null));
|
||||||
|
|
||||||
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
|
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
|
||||||
|
if (gatheringGeolocations) {
|
||||||
|
dbSystem.getDatabase().executeTransaction(
|
||||||
|
new GeoInfoStoreTransaction(uuid, address, time, geolocationCache::getCountry)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
processing.submit(processors.player().proxyRegisterProcessor(uuid, name, time,
|
processing.submit(processors.player().proxyRegisterProcessor(uuid, name, time));
|
||||||
gatheringGeolocations ? processors.player().ipUpdateProcessor(uuid, address, time) : null
|
|
||||||
));
|
|
||||||
processing.submit(processors.info().playerPageUpdateProcessor(uuid));
|
processing.submit(processors.info().playerPageUpdateProcessor(uuid));
|
||||||
ResponseCache.clearResponse(PageId.SERVER.of(serverInfo.getServerUUID()));
|
ResponseCache.clearResponse(PageId.SERVER.of(serverInfo.getServerUUID()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
Loading…
Reference in New Issue
Block a user