ON_HANDSHAKE = EventFactory.createArrayBacked(OnClientHandshake.class, callbacks -> packet -> {
+ for (OnClientHandshake callback : callbacks) {
+ callback.onHandshake(packet);
+ }
+ });
+
/**
* Called when Plan is enabled.
*
@@ -169,6 +176,16 @@ public class PlanFabricEvents {
void onLogin(SocketAddress address, GameProfile profile, Text reason);
}
+ @FunctionalInterface
+ public interface OnClientHandshake {
+ /**
+ * Called when a player attempts to login
+ *
+ * @param packet Handshake packet
+ */
+ void onHandshake(HandshakeC2SPacket packet);
+ }
+
@FunctionalInterface
public interface OnEnable {
void onEnable(PlanFabric plugin);
diff --git a/Plan/fabric/src/main/java/net/playeranalytics/plan/gathering/listeners/events/mixin/ClientToServerHandshakePacketMixin.java b/Plan/fabric/src/main/java/net/playeranalytics/plan/gathering/listeners/events/mixin/ClientToServerHandshakePacketMixin.java
new file mode 100644
index 000000000..370179447
--- /dev/null
+++ b/Plan/fabric/src/main/java/net/playeranalytics/plan/gathering/listeners/events/mixin/ClientToServerHandshakePacketMixin.java
@@ -0,0 +1,39 @@
+/*
+ * 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 net.playeranalytics.plan.gathering.listeners.events.mixin;
+
+import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket;
+import net.minecraft.server.network.LocalServerHandshakeNetworkHandler;
+import net.minecraft.server.network.ServerHandshakeNetworkHandler;
+import net.playeranalytics.plan.gathering.listeners.events.PlanFabricEvents;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+
+@Mixin({ServerHandshakeNetworkHandler.class, LocalServerHandshakeNetworkHandler.class})
+public class ClientToServerHandshakePacketMixin {
+
+ @Inject(method = "onHandshake", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerHandshakeNetworkHandler;onHandshake(Lnet/minecraft/network/packet/c2s/handshake/HandshakeC2SPacket;)V"))
+ public static void onClientHandshakeFromNetwork(HandshakeC2SPacket packet) {
+ PlanFabricEvents.ON_HANDSHAKE.invoker().onHandshake(packet);
+ }
+
+ @Inject(method = "onHandshake", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/LocalServerHandshakeNetworkHandler;onHandshake(Lnet/minecraft/network/packet/c2s/handshake/HandshakeC2SPacket;)V"))
+ public static void onClienthandshakeFromLocal(HandshakeC2SPacket packet) {
+ PlanFabricEvents.ON_HANDSHAKE.invoker().onHandshake(packet);
+ }
+}
diff --git a/Plan/fabric/src/main/java/net/playeranalytics/plan/gathering/listeners/fabric/PlayerOnlineListener.java b/Plan/fabric/src/main/java/net/playeranalytics/plan/gathering/listeners/fabric/PlayerOnlineListener.java
index 36efa61c3..215638765 100644
--- a/Plan/fabric/src/main/java/net/playeranalytics/plan/gathering/listeners/fabric/PlayerOnlineListener.java
+++ b/Plan/fabric/src/main/java/net/playeranalytics/plan/gathering/listeners/fabric/PlayerOnlineListener.java
@@ -16,91 +16,65 @@
*/
package net.playeranalytics.plan.gathering.listeners.fabric;
-import com.djrapitops.plan.delivery.domain.Nickname;
-import com.djrapitops.plan.delivery.domain.PlayerName;
-import com.djrapitops.plan.delivery.domain.ServerName;
-import com.djrapitops.plan.delivery.export.Exporter;
-import com.djrapitops.plan.extension.CallEvents;
-import com.djrapitops.plan.extension.ExtensionSvc;
-import com.djrapitops.plan.gathering.cache.NicknameCache;
-import com.djrapitops.plan.gathering.cache.SessionCache;
-import com.djrapitops.plan.gathering.domain.ActiveSession;
-import com.djrapitops.plan.gathering.domain.event.JoinAddress;
-import com.djrapitops.plan.gathering.geolocation.GeolocationCache;
+import com.djrapitops.plan.gathering.cache.JoinAddressCache;
+import com.djrapitops.plan.gathering.domain.event.PlayerJoin;
+import com.djrapitops.plan.gathering.domain.event.PlayerLeave;
+import com.djrapitops.plan.gathering.events.PlayerJoinEventConsumer;
+import com.djrapitops.plan.gathering.events.PlayerLeaveEventConsumer;
import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.identification.ServerUUID;
-import com.djrapitops.plan.processing.Processing;
-import com.djrapitops.plan.settings.config.PlanConfig;
-import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
-import com.djrapitops.plan.settings.config.paths.ExportSettings;
import com.djrapitops.plan.storage.database.DBSystem;
-import com.djrapitops.plan.storage.database.Database;
-import com.djrapitops.plan.storage.database.transactions.events.*;
+import com.djrapitops.plan.storage.database.transactions.events.BanStatusTransaction;
+import com.djrapitops.plan.storage.database.transactions.events.KickStoreTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
-import com.google.common.net.InetAddresses;
import com.mojang.authlib.GameProfile;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
+import net.minecraft.network.NetworkState;
+import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket;
import net.minecraft.server.dedicated.MinecraftDedicatedServer;
import net.minecraft.server.network.ServerPlayerEntity;
import net.playeranalytics.plan.gathering.FabricPlayerPositionTracker;
+import net.playeranalytics.plan.gathering.domain.FabricPlayerData;
import net.playeranalytics.plan.gathering.listeners.FabricListener;
import net.playeranalytics.plan.gathering.listeners.events.PlanFabricEvents;
import javax.inject.Inject;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
import java.net.SocketAddress;
-import java.util.HashMap;
-import java.util.Map;
import java.util.UUID;
-import java.util.function.Supplier;
+import java.util.concurrent.atomic.AtomicReference;
public class PlayerOnlineListener implements FabricListener {
- private final PlanConfig config;
- private final Processing processing;
+ private final PlayerJoinEventConsumer joinEventConsumer;
+ private final PlayerLeaveEventConsumer leaveEventConsumer;
+ private final JoinAddressCache joinAddressCache;
+
private final ServerInfo serverInfo;
private final DBSystem dbSystem;
- private final ExtensionSvc extensionService;
- private final Exporter exporter;
- private final GeolocationCache geolocationCache;
- private final NicknameCache nicknameCache;
- private final SessionCache sessionCache;
private final ErrorLogger errorLogger;
private final MinecraftDedicatedServer server;
- private final Map joinAddresses;
+ private final AtomicReference joinAddress = new AtomicReference<>();
private boolean isEnabled = false;
@Inject
public PlayerOnlineListener(
- PlanConfig config,
- Processing processing,
- ServerInfo serverInfo,
+ PlayerJoinEventConsumer joinEventConsumer,
+ PlayerLeaveEventConsumer leaveEventConsumer,
+ JoinAddressCache joinAddressCache, ServerInfo serverInfo,
DBSystem dbSystem,
- ExtensionSvc extensionService,
- Exporter exporter,
- GeolocationCache geolocationCache,
- NicknameCache nicknameCache,
- SessionCache sessionCache,
ErrorLogger errorLogger,
MinecraftDedicatedServer server
) {
- this.config = config;
- this.processing = processing;
+ this.joinEventConsumer = joinEventConsumer;
+ this.leaveEventConsumer = leaveEventConsumer;
+ this.joinAddressCache = joinAddressCache;
this.serverInfo = serverInfo;
this.dbSystem = dbSystem;
- this.extensionService = extensionService;
- this.exporter = exporter;
- this.geolocationCache = geolocationCache;
- this.nicknameCache = nicknameCache;
- this.sessionCache = sessionCache;
this.errorLogger = errorLogger;
this.server = server;
-
- joinAddresses = new HashMap<>();
}
@Override
@@ -115,6 +89,7 @@ public class PlayerOnlineListener implements FabricListener {
if (!this.isEnabled) {
return;
}
+ beforePlayerQuit(handler.player);
onPlayerQuit(handler.player);
});
PlanFabricEvents.ON_KICKED.register((source, targets, reason) -> {
@@ -131,20 +106,33 @@ public class PlayerOnlineListener implements FabricListener {
}
onPlayerLogin(address, profile, reason != null);
});
+ PlanFabricEvents.ON_HANDSHAKE.register(packet -> {
+ if (!this.isEnabled) {
+ return;
+ }
+ onHandshake(packet);
+ });
this.enable();
}
+ private void onHandshake(HandshakeC2SPacket packet) {
+ try {
+ if (packet.getIntendedState() == NetworkState.LOGIN) {
+ joinAddress.set(packet.getAddress());
+ }
+ } catch (Exception e) {
+ errorLogger.error(e, ErrorContext.builder().related(getClass(), "onHandshake").build());
+ }
+ }
+
public void onPlayerLogin(SocketAddress address, GameProfile profile, boolean banned) {
try {
UUID playerUUID = profile.getId();
ServerUUID serverUUID = serverInfo.getServerUUID();
- String joinAddress = address.toString();
- if (!joinAddress.isEmpty()) {
- joinAddress = joinAddress.substring(0, joinAddress.lastIndexOf(':'));
- joinAddresses.put(playerUUID, joinAddress);
- dbSystem.getDatabase().executeTransaction(new StoreJoinAddressTransaction(joinAddress));
- }
- dbSystem.getDatabase().executeTransaction(new BanStatusTransaction(playerUUID, serverUUID, () -> banned));
+
+ joinAddressCache.put(playerUUID, joinAddress.get());
+
+ dbSystem.getDatabase().executeTransaction(new BanStatusTransaction(playerUUID, serverUUID, banned));
} catch (Exception e) {
errorLogger.error(e, ErrorContext.builder().related(getClass(), address, profile, banned).build());
}
@@ -172,103 +160,46 @@ public class PlayerOnlineListener implements FabricListener {
}
private void actOnJoinEvent(ServerPlayerEntity player) {
-
UUID playerUUID = player.getUuid();
- ServerUUID serverUUID = serverInfo.getServerUUID();
long time = System.currentTimeMillis();
FabricAFKListener.afkTracker.performedAction(playerUUID, time);
- String world = player.getWorld().getRegistryKey().getValue().toString();
- String gm = player.interactionManager.getGameMode().name();
-
- Database database = dbSystem.getDatabase();
- database.executeTransaction(new WorldNameStoreTransaction(serverUUID, world));
-
- Supplier getHostName = () -> getHostname(player);
-
- String playerName = player.getEntityName();
- String displayName = player.getDisplayName().getString();
-
-
- database.executeTransaction(new PlayerServerRegisterTransaction(playerUUID,
- System::currentTimeMillis, playerName, serverUUID, getHostName))
- .thenRunAsync(() -> {
- boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
- if (gatheringGeolocations) {
- gatherGeolocation(player, playerUUID, time, database);
- }
-
- database.executeTransaction(new OperatorStatusTransaction(playerUUID, serverUUID, server.getPlayerManager().getOpList().get(player.getGameProfile()) != null));
-
- ActiveSession session = new ActiveSession(playerUUID, serverUUID, time, world, gm);
- session.getExtraData().put(PlayerName.class, new PlayerName(playerName));
- session.getExtraData().put(ServerName.class, new ServerName(serverInfo.getServer().getIdentifiableName()));
- session.getExtraData().put(JoinAddress.class, new JoinAddress(getHostName.get()));
- sessionCache.cacheSession(playerUUID, session)
- .ifPresent(previousSession -> database.executeTransaction(new StoreSessionTransaction(previousSession)));
-
- database.executeTransaction(new NicknameStoreTransaction(
- playerUUID, new Nickname(displayName, time, serverUUID),
- (uuid, name) -> nicknameCache.getDisplayName(playerUUID).map(name::equals).orElse(false)
- ));
-
- processing.submitNonCritical(() -> extensionService.updatePlayerValues(playerUUID, playerName, CallEvents.PLAYER_JOIN));
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
- });
- }
-
- private void gatherGeolocation(ServerPlayerEntity player, UUID playerUUID, long time, Database database) {
- InetSocketAddress socketAddress = (InetSocketAddress) player.networkHandler.connection.getAddress();
- if (socketAddress == null) return;
- InetAddress address = InetAddresses.forString(socketAddress.getAddress().toString().replace("/", ""));
- database.executeTransaction(
- new StoreGeoInfoTransaction(playerUUID, address, time, geolocationCache::getCountry)
- );
- }
-
- private String getHostname(ServerPlayerEntity player) {
- return joinAddresses.get(player.getUuid());
+ joinEventConsumer.onJoinGameServer(PlayerJoin.builder()
+ .server(serverInfo.getServer())
+ .player(new FabricPlayerData(player, server, joinAddressCache.getNullableString(playerUUID)))
+ .time(time)
+ .build());
}
// No event priorities on Fabric, so this has to be called with onPlayerQuit()
public void beforePlayerQuit(ServerPlayerEntity player) {
- UUID playerUUID = player.getUuid();
- String playerName = player.getEntityName();
- processing.submitNonCritical(() -> extensionService.updatePlayerValues(playerUUID, playerName, CallEvents.PLAYER_LEAVE));
+ leaveEventConsumer.beforeLeave(PlayerLeave.builder()
+ .server(serverInfo.getServer())
+ .player(new FabricPlayerData(player, server, null))
+ .time(System.currentTimeMillis())
+ .build());
}
public void onPlayerQuit(ServerPlayerEntity player) {
- beforePlayerQuit(player);
try {
actOnQuitEvent(player);
- FabricPlayerPositionTracker.removePlayer(player.getUuid());
} catch (Exception e) {
errorLogger.error(e, ErrorContext.builder().related(getClass(), player).build());
}
}
private void actOnQuitEvent(ServerPlayerEntity player) {
- long time = System.currentTimeMillis();
- String playerName = player.getEntityName();
UUID playerUUID = player.getUuid();
- ServerUUID serverUUID = serverInfo.getServerUUID();
-
+ long time = System.currentTimeMillis();
FabricAFKListener.afkTracker.loggedOut(playerUUID, time);
+ FabricPlayerPositionTracker.removePlayer(playerUUID);
- joinAddresses.remove(playerUUID);
- nicknameCache.removeDisplayName(playerUUID);
-
- dbSystem.getDatabase().executeTransaction(new BanStatusTransaction(playerUUID, serverUUID, () -> server.getPlayerManager().getUserBanList().contains(player.getGameProfile())));
-
- sessionCache.endSession(playerUUID, time)
- .ifPresent(endedSession -> dbSystem.getDatabase().executeTransaction(new StoreSessionTransaction(endedSession)));
-
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
+ leaveEventConsumer.onLeaveGameServer(PlayerLeave.builder()
+ .server(serverInfo.getServer())
+ .player(new FabricPlayerData(player, server, null))
+ .time(time)
+ .build());
}
@Override
@@ -285,6 +216,4 @@ public class PlayerOnlineListener implements FabricListener {
public void disable() {
this.isEnabled = false;
}
-
-
}
diff --git a/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/domain/NukkitPlayerData.java b/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/domain/NukkitPlayerData.java
new file mode 100644
index 000000000..071ef2431
--- /dev/null
+++ b/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/domain/NukkitPlayerData.java
@@ -0,0 +1,79 @@
+/*
+ * 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.gathering.domain;
+
+import cn.nukkit.Player;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+public class NukkitPlayerData implements PlatformPlayerData {
+
+ private final Player player;
+
+ public NukkitPlayerData(Player player) {
+ this.player = player;
+ }
+
+ @Override
+ public UUID getUUID() {
+ return player.getUniqueId();
+ }
+
+ @Override
+ public String getName() {
+ return player.getName();
+ }
+
+ @Override
+ public Optional getDisplayName() {
+ return Optional.of(player.getDisplayName());
+ }
+
+ @Override
+ public Optional isBanned() {
+ return Optional.of(player.isBanned());
+ }
+
+ @Override
+ public Optional isOperator() {
+ return Optional.of(player.isOp());
+ }
+
+ @Override
+ public Optional getCurrentWorld() {
+ return Optional.of(player.getLevel().getName());
+ }
+
+ @Override
+ public Optional getCurrentGameMode() {
+ return Optional.of(player.getGamemode()).map(GMTimes::magicNumberToGMName);
+ }
+
+ @Override
+ public Optional getRegisterDate() {
+ return Optional.of(TimeUnit.SECONDS.toMillis(player.getFirstPlayed()));
+ }
+
+ @Override
+ public Optional getIPAddress() {
+ return Optional.of(player.getSocketAddress()).map(InetSocketAddress::getAddress);
+ }
+}
diff --git a/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/listeners/nukkit/PlayerOnlineListener.java b/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/listeners/nukkit/PlayerOnlineListener.java
index ab54b4aa7..572240351 100644
--- a/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/listeners/nukkit/PlayerOnlineListener.java
+++ b/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/listeners/nukkit/PlayerOnlineListener.java
@@ -24,35 +24,22 @@ import cn.nukkit.event.player.PlayerJoinEvent;
import cn.nukkit.event.player.PlayerKickEvent;
import cn.nukkit.event.player.PlayerLoginEvent;
import cn.nukkit.event.player.PlayerQuitEvent;
-import com.djrapitops.plan.delivery.domain.Nickname;
-import com.djrapitops.plan.delivery.domain.PlayerName;
-import com.djrapitops.plan.delivery.domain.ServerName;
-import com.djrapitops.plan.delivery.export.Exporter;
-import com.djrapitops.plan.extension.CallEvents;
-import com.djrapitops.plan.extension.ExtensionSvc;
-import com.djrapitops.plan.gathering.cache.NicknameCache;
-import com.djrapitops.plan.gathering.cache.SessionCache;
-import com.djrapitops.plan.gathering.domain.ActiveSession;
-import com.djrapitops.plan.gathering.domain.GMTimes;
-import com.djrapitops.plan.gathering.geolocation.GeolocationCache;
+import com.djrapitops.plan.gathering.domain.NukkitPlayerData;
+import com.djrapitops.plan.gathering.domain.event.PlayerJoin;
+import com.djrapitops.plan.gathering.domain.event.PlayerLeave;
+import com.djrapitops.plan.gathering.events.PlayerJoinEventConsumer;
+import com.djrapitops.plan.gathering.events.PlayerLeaveEventConsumer;
import com.djrapitops.plan.gathering.listeners.Status;
import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.identification.ServerUUID;
-import com.djrapitops.plan.processing.Processing;
-import com.djrapitops.plan.settings.config.PlanConfig;
-import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
-import com.djrapitops.plan.settings.config.paths.ExportSettings;
import com.djrapitops.plan.storage.database.DBSystem;
-import com.djrapitops.plan.storage.database.Database;
-import com.djrapitops.plan.storage.database.transactions.events.*;
+import com.djrapitops.plan.storage.database.transactions.events.BanStatusTransaction;
+import com.djrapitops.plan.storage.database.transactions.events.KickStoreTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import javax.inject.Inject;
-import java.net.InetAddress;
import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
/**
* Event Listener for PlayerJoin, PlayerQuit and PlayerKickEvents.
@@ -61,41 +48,26 @@ import java.util.function.Supplier;
*/
public class PlayerOnlineListener implements Listener {
- private final PlanConfig config;
- private final Processing processing;
+ private final PlayerJoinEventConsumer joinEventConsumer;
+ private final PlayerLeaveEventConsumer leaveEventConsumer;
+
private final ServerInfo serverInfo;
private final DBSystem dbSystem;
- private final ExtensionSvc extensionService;
- private final Exporter exporter;
- private final GeolocationCache geolocationCache;
- private final NicknameCache nicknameCache;
- private final SessionCache sessionCache;
private final ErrorLogger errorLogger;
private final Status status;
@Inject
public PlayerOnlineListener(
- PlanConfig config,
- Processing processing,
+ PlayerJoinEventConsumer joinEventConsumer, PlayerLeaveEventConsumer leaveEventConsumer,
ServerInfo serverInfo,
DBSystem dbSystem,
- ExtensionSvc extensionService,
- Exporter exporter,
- GeolocationCache geolocationCache,
- NicknameCache nicknameCache,
- SessionCache sessionCache,
Status status,
ErrorLogger errorLogger
) {
- this.config = config;
- this.processing = processing;
+ this.joinEventConsumer = joinEventConsumer;
+ this.leaveEventConsumer = leaveEventConsumer;
this.serverInfo = serverInfo;
this.dbSystem = dbSystem;
- this.extensionService = extensionService;
- this.exporter = exporter;
- this.geolocationCache = geolocationCache;
- this.nicknameCache = nicknameCache;
- this.sessionCache = sessionCache;
this.status = status;
this.errorLogger = errorLogger;
}
@@ -147,64 +119,29 @@ public class PlayerOnlineListener implements Listener {
}
private void actOnJoinEvent(PlayerJoinEvent event) {
- Player player = event.getPlayer();
-
- UUID playerUUID = player.getUniqueId();
- ServerUUID serverUUID = serverInfo.getServerUUID();
long time = System.currentTimeMillis();
+ Player player = event.getPlayer();
+ UUID playerUUID = player.getUniqueId();
+ if (playerUUID == null) return; // Can be null when player is not signed in to xbox live
NukkitAFKListener.afkTracker.performedAction(playerUUID, time);
- String world = player.getLevel().getName();
- String gm = GMTimes.magicNumberToGMName(player.getGamemode());
-
- Database database = dbSystem.getDatabase();
- database.executeTransaction(new WorldNameStoreTransaction(serverUUID, world));
-
- InetAddress address = player.getSocketAddress().getAddress();
- Supplier getHostName = () -> null;
-
- String playerName = player.getName();
- String displayName = player.getDisplayName();
-
- long registerDate = TimeUnit.SECONDS.toMillis(player.getFirstPlayed());
- database.executeTransaction(new PlayerServerRegisterTransaction(playerUUID, () -> registerDate,
- playerName, serverUUID, getHostName))
- .thenRunAsync(() -> {
- boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
- if (gatheringGeolocations) {
- database.executeTransaction(
- new StoreGeoInfoTransaction(playerUUID, address, time, geolocationCache::getCountry)
- );
- }
-
- dbSystem.getDatabase().executeTransaction(new OperatorStatusTransaction(playerUUID, serverUUID, player.isOp()));
-
- ActiveSession session = new ActiveSession(playerUUID, serverUUID, time, world, gm);
- session.getExtraData().put(PlayerName.class, new PlayerName(playerName));
- session.getExtraData().put(ServerName.class, new ServerName(serverInfo.getServer().getIdentifiableName()));
- sessionCache.cacheSession(playerUUID, session)
- .map(StoreSessionTransaction::new)
- .ifPresent(database::executeTransaction);
-
- database.executeTransaction(new NicknameStoreTransaction(
- playerUUID, new Nickname(displayName, time, serverUUID),
- (uuid, name) -> nicknameCache.getDisplayName(playerUUID).map(name::equals).orElse(false)
- ));
-
- processing.submitNonCritical(() -> extensionService.updatePlayerValues(playerUUID, playerName, CallEvents.PLAYER_JOIN));
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
- });
+ joinEventConsumer.onJoinGameServer(PlayerJoin.builder()
+ .server(serverInfo.getServer())
+ .player(new NukkitPlayerData(player))
+ .time(time)
+ .build());
}
@EventHandler(priority = EventPriority.NORMAL)
public void beforePlayerQuit(PlayerQuitEvent event) {
- Player player = event.getPlayer();
- UUID playerUUID = player.getUniqueId();
- String playerName = player.getName();
- processing.submitNonCritical(() -> extensionService.updatePlayerValues(playerUUID, playerName, CallEvents.PLAYER_LEAVE));
+ if (event.getPlayer().getUniqueId() == null) return; // Can be null when player is not signed in to xbox live
+
+ leaveEventConsumer.beforeLeave(PlayerLeave.builder()
+ .server(serverInfo.getServer())
+ .player(new NukkitPlayerData(event.getPlayer()))
+ .time(System.currentTimeMillis())
+ .build());
}
@EventHandler(priority = EventPriority.MONITOR)
@@ -219,22 +156,15 @@ public class PlayerOnlineListener implements Listener {
private void actOnQuitEvent(PlayerQuitEvent event) {
long time = System.currentTimeMillis();
Player player = event.getPlayer();
- String playerName = player.getName();
UUID playerUUID = player.getUniqueId();
- ServerUUID serverUUID = serverInfo.getServerUUID();
if (playerUUID == null) return; // Can be null when player is not signed in to xbox live
NukkitAFKListener.afkTracker.loggedOut(playerUUID, time);
- nicknameCache.removeDisplayName(playerUUID);
-
- dbSystem.getDatabase().executeTransaction(new BanStatusTransaction(playerUUID, serverUUID, player::isBanned));
-
- sessionCache.endSession(playerUUID, time)
- .ifPresent(endedSession -> dbSystem.getDatabase().executeTransaction(new StoreSessionTransaction(endedSession)));
-
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
+ leaveEventConsumer.onLeaveGameServer(PlayerLeave.builder()
+ .server(serverInfo.getServer())
+ .player(new NukkitPlayerData(event.getPlayer()))
+ .time(System.currentTimeMillis())
+ .build());
}
}
diff --git a/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/domain/SpongePlayerData.java b/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/domain/SpongePlayerData.java
new file mode 100644
index 000000000..184532d24
--- /dev/null
+++ b/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/domain/SpongePlayerData.java
@@ -0,0 +1,89 @@
+/*
+ * 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.gathering.domain;
+
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
+import org.spongepowered.api.Sponge;
+import org.spongepowered.api.data.value.Value;
+import org.spongepowered.api.entity.living.player.gamemode.GameMode;
+import org.spongepowered.api.entity.living.player.server.ServerPlayer;
+import org.spongepowered.api.registry.RegistryTypes;
+import org.spongepowered.api.service.ban.BanService;
+
+import java.net.InetAddress;
+import java.time.Instant;
+import java.util.Optional;
+import java.util.UUID;
+
+public class SpongePlayerData implements PlatformPlayerData {
+
+ private final ServerPlayer player;
+
+ public SpongePlayerData(ServerPlayer player) {
+ this.player = player;
+ }
+
+ @Override
+ public UUID getUUID() {
+ return player.uniqueId();
+ }
+
+ @Override
+ public String getName() {
+ return player.name();
+ }
+
+ @Override
+ public Optional getDisplayName() {
+ return Optional.of(LegacyComponentSerializer.legacyAmpersand().serialize(player.displayName().get()));
+ }
+
+ @Override
+ public Optional isBanned() {
+ BanService banService = Sponge.server().serviceProvider().banService();
+ boolean banned = banService.find(player.profile()).join().isPresent();
+ return Optional.of(banned);
+ }
+
+ @Override
+ public Optional getJoinAddress() {
+ return Optional.of(player.connection().virtualHost().getHostString());
+ }
+
+ @Override
+ public Optional getCurrentWorld() {
+ return Sponge.game().server().worldManager().worldDirectory(player.world().key())
+ .map(path -> path.getFileName().toString());
+ }
+
+ @Override
+ public Optional getCurrentGameMode() {
+ GameMode gameMode = player.gameMode().get();
+ String gm = gameMode.key(RegistryTypes.GAME_MODE).value().toUpperCase();
+ return Optional.of(gm);
+ }
+
+ @Override
+ public Optional getRegisterDate() {
+ return player.firstJoined().map(Value::get).map(Instant::toEpochMilli);
+ }
+
+ @Override
+ public Optional getIPAddress() {
+ return Optional.of(player.connection().address().getAddress());
+ }
+}
diff --git a/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/listeners/sponge/PlayerOnlineListener.java b/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/listeners/sponge/PlayerOnlineListener.java
index c622a1f60..49ffca1bc 100644
--- a/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/listeners/sponge/PlayerOnlineListener.java
+++ b/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/listeners/sponge/PlayerOnlineListener.java
@@ -16,48 +16,33 @@
*/
package com.djrapitops.plan.gathering.listeners.sponge;
-import com.djrapitops.plan.delivery.domain.Nickname;
-import com.djrapitops.plan.delivery.domain.PlayerName;
-import com.djrapitops.plan.delivery.domain.ServerName;
-import com.djrapitops.plan.delivery.export.Exporter;
-import com.djrapitops.plan.extension.CallEvents;
-import com.djrapitops.plan.extension.ExtensionSvc;
-import com.djrapitops.plan.gathering.cache.NicknameCache;
-import com.djrapitops.plan.gathering.cache.SessionCache;
-import com.djrapitops.plan.gathering.domain.ActiveSession;
-import com.djrapitops.plan.gathering.domain.event.JoinAddress;
-import com.djrapitops.plan.gathering.geolocation.GeolocationCache;
+import com.djrapitops.plan.gathering.domain.SpongePlayerData;
+import com.djrapitops.plan.gathering.domain.event.PlayerJoin;
+import com.djrapitops.plan.gathering.domain.event.PlayerLeave;
+import com.djrapitops.plan.gathering.events.PlayerJoinEventConsumer;
+import com.djrapitops.plan.gathering.events.PlayerLeaveEventConsumer;
import com.djrapitops.plan.gathering.listeners.Status;
import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.identification.ServerUUID;
-import com.djrapitops.plan.processing.Processing;
-import com.djrapitops.plan.settings.config.PlanConfig;
-import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
-import com.djrapitops.plan.settings.config.paths.ExportSettings;
import com.djrapitops.plan.storage.database.DBSystem;
-import com.djrapitops.plan.storage.database.Database;
-import com.djrapitops.plan.storage.database.transactions.events.*;
+import com.djrapitops.plan.storage.database.transactions.events.BanStatusTransaction;
+import com.djrapitops.plan.storage.database.transactions.events.KickStoreTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
-import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.entity.living.player.Player;
-import org.spongepowered.api.entity.living.player.gamemode.GameMode;
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.entity.living.player.KickPlayerEvent;
import org.spongepowered.api.event.network.ServerSideConnectionEvent;
import org.spongepowered.api.profile.GameProfile;
-import org.spongepowered.api.registry.RegistryTypes;
import org.spongepowered.api.service.ban.Ban;
import org.spongepowered.api.service.ban.BanService;
import javax.inject.Inject;
-import java.net.InetAddress;
import java.util.Optional;
import java.util.UUID;
-import java.util.function.Supplier;
/**
* Listener for Player Join/Leave on Sponge.
@@ -66,40 +51,27 @@ import java.util.function.Supplier;
*/
public class PlayerOnlineListener {
- private final PlanConfig config;
- private final Processing processing;
+ private final PlayerJoinEventConsumer joinEventConsumer;
+ private final PlayerLeaveEventConsumer leaveEventConsumer;
+
private final ServerInfo serverInfo;
private final DBSystem dbSystem;
- private final ExtensionSvc extensionService;
- private final Exporter exporter;
- private final GeolocationCache geolocationCache;
- private final NicknameCache nicknameCache;
- private final SessionCache sessionCache;
private final Status status;
private final ErrorLogger errorLogger;
@Inject
public PlayerOnlineListener(
- PlanConfig config,
- Processing processing,
+ PlayerJoinEventConsumer joinEventConsumer,
+ PlayerLeaveEventConsumer leaveEventConsumer,
ServerInfo serverInfo,
DBSystem dbSystem,
- ExtensionSvc extensionService,
- Exporter exporter, GeolocationCache geolocationCache,
- NicknameCache nicknameCache,
- SessionCache sessionCache,
Status status,
ErrorLogger errorLogger
) {
- this.config = config;
- this.processing = processing;
+ this.joinEventConsumer = joinEventConsumer;
+ this.leaveEventConsumer = leaveEventConsumer;
this.serverInfo = serverInfo;
this.dbSystem = dbSystem;
- this.extensionService = extensionService;
- this.exporter = exporter;
- this.geolocationCache = geolocationCache;
- this.nicknameCache = nicknameCache;
- this.sessionCache = sessionCache;
this.status = status;
this.errorLogger = errorLogger;
}
@@ -149,65 +121,25 @@ public class PlayerOnlineListener {
}
private void actOnJoinEvent(ServerSideConnectionEvent.Join event) {
- ServerPlayer player = event.player();
-
- UUID playerUUID = player.uniqueId();
- ServerUUID serverUUID = serverInfo.getServerUUID();
long time = System.currentTimeMillis();
-
+ ServerPlayer player = event.player();
+ UUID playerUUID = player.uniqueId();
SpongeAFKListener.afkTracker.performedAction(playerUUID, time);
- String world = Sponge.game().server().worldManager().worldDirectory(player.world().key())
- .map(path -> path.getFileName().toString()).orElse("Unknown");
- GameMode gameMode = player.gameMode().get();
- String gm = gameMode.key(RegistryTypes.GAME_MODE).value().toUpperCase();
-
- Database database = dbSystem.getDatabase();
- database.executeTransaction(new WorldNameStoreTransaction(serverUUID, world));
-
- InetAddress address = player.connection().address().getAddress();
- Supplier getHostName = () -> player.connection().virtualHost().getHostString();
-
- String playerName = player.name();
- String displayName = LegacyComponentSerializer.legacyAmpersand().serialize(player.displayName().get());
-
- database.executeTransaction(new PlayerServerRegisterTransaction(playerUUID, () -> time,
- playerName, serverUUID, getHostName))
- .thenRunAsync(() -> {
- boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
- if (gatheringGeolocations) {
- database.executeTransaction(
- new StoreGeoInfoTransaction(playerUUID, address, time, geolocationCache::getCountry)
- );
- }
- database.executeTransaction(new StoreJoinAddressTransaction(getHostName));
-
- ActiveSession session = new ActiveSession(playerUUID, serverUUID, time, world, gm);
- session.getExtraData().put(PlayerName.class, new PlayerName(playerName));
- session.getExtraData().put(ServerName.class, new ServerName(serverInfo.getServer().getIdentifiableName()));
- session.getExtraData().put(JoinAddress.class, new JoinAddress(getHostName.get()));
- sessionCache.cacheSession(playerUUID, session)
- .map(StoreSessionTransaction::new)
- .ifPresent(database::executeTransaction);
-
- database.executeTransaction(new NicknameStoreTransaction(
- playerUUID, new Nickname(displayName, time, serverUUID),
- (uuid, name) -> nicknameCache.getDisplayName(playerUUID).map(name::equals).orElse(false)
- ));
-
- processing.submitNonCritical(() -> extensionService.updatePlayerValues(playerUUID, playerName, CallEvents.PLAYER_JOIN));
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
- });
+ joinEventConsumer.onJoinGameServer(PlayerJoin.builder()
+ .server(serverInfo.getServer())
+ .player(new SpongePlayerData(player))
+ .time(time)
+ .build());
}
@Listener(order = Order.DEFAULT)
public void beforeQuit(ServerSideConnectionEvent.Disconnect event) {
- Player player = event.player();
- UUID playerUUID = player.uniqueId();
- String playerName = player.name();
- processing.submitNonCritical(() -> extensionService.updatePlayerValues(playerUUID, playerName, CallEvents.PLAYER_LEAVE));
+ leaveEventConsumer.beforeLeave(PlayerLeave.builder()
+ .server(serverInfo.getServer())
+ .player(new SpongePlayerData(event.player()))
+ .time(System.currentTimeMillis())
+ .build());
}
@Listener(order = Order.POST)
@@ -222,21 +154,13 @@ public class PlayerOnlineListener {
private void actOnQuitEvent(ServerSideConnectionEvent.Disconnect event) {
long time = System.currentTimeMillis();
Player player = event.player();
- String playerName = player.name();
UUID playerUUID = player.uniqueId();
- ServerUUID serverUUID = serverInfo.getServerUUID();
SpongeAFKListener.afkTracker.loggedOut(playerUUID, time);
-
- nicknameCache.removeDisplayName(playerUUID);
-
- dbSystem.getDatabase().executeTransaction(new BanStatusTransaction(playerUUID, serverUUID, () -> isBanned(player.profile())));
-
- sessionCache.endSession(playerUUID, time)
- .ifPresent(endedSession -> dbSystem.getDatabase().executeTransaction(new StoreSessionTransaction(endedSession)));
-
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
+ leaveEventConsumer.onLeaveGameServer(PlayerLeave.builder()
+ .server(serverInfo.getServer())
+ .player(new SpongePlayerData(event.player()))
+ .time(System.currentTimeMillis())
+ .build());
}
}
diff --git a/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/domain/VelocityPlayerData.java b/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/domain/VelocityPlayerData.java
new file mode 100644
index 000000000..9deba9f6e
--- /dev/null
+++ b/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/domain/VelocityPlayerData.java
@@ -0,0 +1,53 @@
+/*
+ * 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.gathering.domain;
+
+import com.velocitypowered.api.proxy.Player;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.Optional;
+import java.util.UUID;
+
+public class VelocityPlayerData implements PlatformPlayerData {
+
+ private final Player player;
+
+ public VelocityPlayerData(Player player) {
+ this.player = player;
+ }
+
+ @Override
+ public UUID getUUID() {
+ return player.getUniqueId();
+ }
+
+ @Override
+ public String getName() {
+ return player.getUsername();
+ }
+
+ @Override
+ public Optional getIPAddress() {
+ return Optional.of(player.getRemoteAddress().getAddress());
+ }
+
+ @Override
+ public Optional getJoinAddress() {
+ return player.getVirtualHost().map(InetSocketAddress::getHostString);
+ }
+}
diff --git a/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/listeners/velocity/PlayerOnlineListener.java b/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/listeners/velocity/PlayerOnlineListener.java
index 829bcadd7..a7f11c7b0 100644
--- a/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/listeners/velocity/PlayerOnlineListener.java
+++ b/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/listeners/velocity/PlayerOnlineListener.java
@@ -16,23 +16,13 @@
*/
package com.djrapitops.plan.gathering.listeners.velocity;
-import com.djrapitops.plan.delivery.domain.PlayerName;
-import com.djrapitops.plan.delivery.domain.ServerName;
-import com.djrapitops.plan.delivery.export.Exporter;
-import com.djrapitops.plan.extension.CallEvents;
-import com.djrapitops.plan.extension.ExtensionSvc;
-import com.djrapitops.plan.gathering.cache.SessionCache;
-import com.djrapitops.plan.gathering.domain.ActiveSession;
-import com.djrapitops.plan.gathering.geolocation.GeolocationCache;
+import com.djrapitops.plan.gathering.domain.VelocityPlayerData;
+import com.djrapitops.plan.gathering.domain.event.PlayerJoin;
+import com.djrapitops.plan.gathering.domain.event.PlayerLeave;
+import com.djrapitops.plan.gathering.events.PlayerJoinEventConsumer;
+import com.djrapitops.plan.gathering.events.PlayerLeaveEventConsumer;
+import com.djrapitops.plan.gathering.events.PlayerSwitchServerEventConsumer;
import com.djrapitops.plan.identification.ServerInfo;
-import com.djrapitops.plan.processing.Processing;
-import com.djrapitops.plan.settings.config.PlanConfig;
-import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
-import com.djrapitops.plan.settings.config.paths.ExportSettings;
-import com.djrapitops.plan.storage.database.DBSystem;
-import com.djrapitops.plan.storage.database.Database;
-import com.djrapitops.plan.storage.database.transactions.events.PlayerRegisterTransaction;
-import com.djrapitops.plan.storage.database.transactions.events.StoreGeoInfoTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.velocitypowered.api.event.PostOrder;
@@ -44,8 +34,6 @@ import com.velocitypowered.api.proxy.Player;
import javax.inject.Inject;
import javax.inject.Singleton;
-import java.net.InetAddress;
-import java.util.UUID;
/**
* Player Join listener for Velocity.
@@ -57,35 +45,24 @@ import java.util.UUID;
@Singleton
public class PlayerOnlineListener {
- private final PlanConfig config;
- private final Processing processing;
- private final DBSystem dbSystem;
- private final ExtensionSvc extensionService;
- private final Exporter exporter;
- private final GeolocationCache geolocationCache;
- private final SessionCache sessionCache;
+ private final PlayerJoinEventConsumer joinEventConsumer;
+ private final PlayerLeaveEventConsumer leaveEventConsumer;
+ private final PlayerSwitchServerEventConsumer switchServerEventConsumer;
+
private final ServerInfo serverInfo;
private final ErrorLogger errorLogger;
@Inject
public PlayerOnlineListener(
- PlanConfig config,
- Processing processing,
- DBSystem dbSystem,
- ExtensionSvc extensionService,
- Exporter exporter,
- GeolocationCache geolocationCache,
- SessionCache sessionCache,
+ PlayerJoinEventConsumer joinEventConsumer,
+ PlayerLeaveEventConsumer leaveEventConsumer,
+ PlayerSwitchServerEventConsumer switchServerEventConsumer,
ServerInfo serverInfo,
ErrorLogger errorLogger
) {
- this.config = config;
- this.processing = processing;
- this.dbSystem = dbSystem;
- this.extensionService = extensionService;
- this.exporter = exporter;
- this.geolocationCache = geolocationCache;
- this.sessionCache = sessionCache;
+ this.joinEventConsumer = joinEventConsumer;
+ this.leaveEventConsumer = leaveEventConsumer;
+ this.switchServerEventConsumer = switchServerEventConsumer;
this.serverInfo = serverInfo;
this.errorLogger = errorLogger;
}
@@ -101,63 +78,37 @@ public class PlayerOnlineListener {
public void actOnLogin(PostLoginEvent event) {
Player player = event.getPlayer();
- UUID playerUUID = player.getUniqueId();
- String playerName = player.getUsername();
- InetAddress address = player.getRemoteAddress().getAddress();
long time = System.currentTimeMillis();
- ActiveSession session = new ActiveSession(playerUUID, serverInfo.getServerUUID(), time, null, null);
- session.getExtraData().put(PlayerName.class, new PlayerName(playerName));
- session.getExtraData().put(ServerName.class, new ServerName("Proxy Server"));
- sessionCache.cacheSession(playerUUID, session);
-
- Database database = dbSystem.getDatabase();
-
-
- database.executeTransaction(new PlayerRegisterTransaction(playerUUID, () -> time, playerName))
- .thenRunAsync(() -> {
- boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
- if (gatheringGeolocations) {
- database.executeTransaction(
- new StoreGeoInfoTransaction(playerUUID, address, time, geolocationCache::getCountry)
- );
- }
-
- processing.submitNonCritical(() -> extensionService.updatePlayerValues(playerUUID, playerName, CallEvents.PLAYER_JOIN));
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
- });
+ joinEventConsumer.onJoinProxyServer(PlayerJoin.builder()
+ .server(serverInfo.getServer())
+ .player(new VelocityPlayerData(player))
+ .time(time)
+ .build());
}
@Subscribe(order = PostOrder.NORMAL)
public void beforeLogout(DisconnectEvent event) {
- Player player = event.getPlayer();
- UUID playerUUID = player.getUniqueId();
- String playerName = player.getUsername();
- processing.submitNonCritical(() -> extensionService.updatePlayerValues(playerUUID, playerName, CallEvents.PLAYER_LEAVE));
+ leaveEventConsumer.beforeLeave(PlayerLeave.builder()
+ .server(serverInfo.getServer())
+ .player(new VelocityPlayerData(event.getPlayer()))
+ .time(System.currentTimeMillis())
+ .build());
}
@Subscribe(order = PostOrder.LAST)
public void onLogout(DisconnectEvent event) {
try {
- actOnLogout(event);
+ leaveEventConsumer.onLeaveProxyServer(PlayerLeave.builder()
+ .server(serverInfo.getServer())
+ .player(new VelocityPlayerData(event.getPlayer()))
+ .time(System.currentTimeMillis())
+ .build());
} catch (Exception e) {
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}
- public void actOnLogout(DisconnectEvent event) {
- Player player = event.getPlayer();
- String playerName = player.getUsername();
- UUID playerUUID = player.getUniqueId();
-
- sessionCache.endSession(playerUUID, System.currentTimeMillis());
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
- }
-
@Subscribe(order = PostOrder.LAST)
public void onServerSwitch(ServerConnectedEvent event) {
try {
@@ -169,18 +120,8 @@ public class PlayerOnlineListener {
public void actOnServerSwitch(ServerConnectedEvent event) {
Player player = event.getPlayer();
- String playerName = player.getUsername();
- UUID playerUUID = player.getUniqueId();
long time = System.currentTimeMillis();
- // Replaces the current session in the cache.
- ActiveSession session = new ActiveSession(playerUUID, serverInfo.getServerUUID(), time, null, null);
- session.getExtraData().put(PlayerName.class, new PlayerName(playerName));
- session.getExtraData().put(ServerName.class, new ServerName("Proxy Server"));
- sessionCache.cacheSession(playerUUID, session);
-
- if (config.isTrue(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE)) {
- processing.submitNonCritical(() -> exporter.exportPlayerPage(playerUUID, playerName));
- }
+ switchServerEventConsumer.onServerSwitch(new VelocityPlayerData(player), time);
}
}