ServerListPingEvent

An implementation of what could be done to make this event - not perfect in my opinion.
This commit is contained in:
thiccaxe 2021-04-08 14:19:32 -07:00
parent 159ff3f646
commit cd27d1d6c7
6 changed files with 88 additions and 68 deletions

View File

@ -1,50 +0,0 @@
package net.minestom.server.event.server;
import net.minestom.server.event.Event;
import net.minestom.server.network.player.PlayerConnection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Called by a HandshakePacket.
*/
public class HandshakeEvent extends Event {
private final String serverAddress;
private final int serverPort;
private final int protocolVersion;
private final PlayerConnection connection;
public HandshakeEvent(@Nullable String serverAddress, int serverPort, int protocolVersion, @NotNull PlayerConnection connection) {
this.serverAddress = serverAddress;
this.serverPort = serverPort;
this.protocolVersion = protocolVersion;
this.connection = connection;
}
/**
* @return the server address a client used to connect to the server
*/
public @Nullable String getServerAddress() {
return serverAddress;
}
/**
* @return the server port a client used to connect to the server
*/
public int getServerPort() {
return serverPort;
}
/**
* @return the protocol version a client used when connecting to the server
*/
public int getProtocolVersion() {
return protocolVersion;
}
/**
* @return the player connection
*/
public @NotNull PlayerConnection getConnection() {
return connection;
}
}

View File

@ -1,29 +1,23 @@
package net.minestom.server.event.server;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.minestom.server.entity.Player;
import net.minestom.server.event.CancellableEvent;
import net.minestom.server.event.Event;
import net.minestom.server.network.player.PlayerConnection;
import net.minestom.server.ping.HandshakeData;
import net.minestom.server.ping.ResponseData;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
/**
* Called by a StatusRequestPacket.
* Can be used to modify the {@link ResponseData} response data.
*/
public class StatusRequestEvent extends Event implements CancellableEvent {
public class ServerListPingEvent extends Event implements CancellableEvent {
private boolean cancelled = false;
private final ResponseData responseData;
private final PlayerConnection connection;
private boolean cancelled;
public StatusRequestEvent(@NotNull ResponseData responseData, @NotNull PlayerConnection connection) {
public ServerListPingEvent(ResponseData responseData, PlayerConnection connection) {
this.responseData = responseData;
this.connection = connection;
}
@ -37,6 +31,16 @@ public class StatusRequestEvent extends Event implements CancellableEvent {
return responseData;
}
/**
* HandshakeData of previous handshake packet
*
* equivalent to {@link #getConnection()#getHandshakeData()}
* @return
*/
public HandshakeData getHandshakeData() {
return connection.getHandshakeData();
}
/**
* PlayerConnection of received packet.
*
@ -156,4 +160,6 @@ public class StatusRequestEvent extends Event implements CancellableEvent {
public void setFavicon(String favicon) {
responseData.setFavicon(favicon);
}
}

View File

@ -4,13 +4,13 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.PlayerSkin;
import net.minestom.server.event.server.HandshakeEvent;
import net.minestom.server.extras.bungee.BungeeCordProxy;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.packet.client.ClientPreplayPacket;
import net.minestom.server.network.packet.server.login.LoginDisconnectPacket;
import net.minestom.server.network.player.NettyPlayerConnection;
import net.minestom.server.network.player.PlayerConnection;
import net.minestom.server.ping.HandshakeData;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -88,15 +88,15 @@ public class HandshakePacket implements ClientPreplayPacket {
return;
}
} else {
// Happen when a client ping the server, trigger HandshakeEvent
MinecraftServer.getGlobalEventHandler().callEvent(HandshakeEvent.class, new HandshakeEvent(null, serverPort, protocolVersion, connection));
// Happen when a client ping the server, ignore
return;
}
}
connection.setHandshakeData(new HandshakeData(
serverAddress, serverPort, protocolVersion
));
switch (nextState) {
case 1:
MinecraftServer.getGlobalEventHandler().callEvent(HandshakeEvent.class, new HandshakeEvent(serverAddress, serverPort, protocolVersion, connection));
connection.setConnectionState(ConnectionState.STATUS);
break;
case 2:

View File

@ -2,7 +2,7 @@ package net.minestom.server.network.packet.client.status;
import net.kyori.adventure.text.Component;
import net.minestom.server.MinecraftServer;
import net.minestom.server.event.server.StatusRequestEvent;
import net.minestom.server.event.server.ServerListPingEvent;
import net.minestom.server.network.packet.client.ClientPreplayPacket;
import net.minestom.server.network.packet.server.handshake.ResponsePacket;
import net.minestom.server.network.player.PlayerConnection;
@ -31,8 +31,8 @@ public class StatusRequestPacket implements ClientPreplayPacket {
consumer.accept(connection, responseData);
// Call event
StatusRequestEvent statusRequestEvent = new StatusRequestEvent(responseData, connection);
MinecraftServer.getGlobalEventHandler().callEvent(StatusRequestEvent.class, statusRequestEvent);
ServerListPingEvent statusRequestEvent = new ServerListPingEvent(responseData, connection);
MinecraftServer.getGlobalEventHandler().callEvent(ServerListPingEvent.class, statusRequestEvent);
// Send packet only if event has not been cancelled
if (!statusRequestEvent.isCancelled()) {

View File

@ -9,6 +9,7 @@ import net.minestom.server.listener.manager.ServerPacketConsumer;
import net.minestom.server.network.ConnectionManager;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.ping.HandshakeData;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -26,6 +27,7 @@ public abstract class PlayerConnection {
private Player player;
private volatile ConnectionState connectionState;
private HandshakeData handshakeData;
private boolean online;
// Text used to kick client sending too many packets
@ -170,6 +172,23 @@ public abstract class PlayerConnection {
return connectionState;
}
/**
* Gets the HandshakeData from the most recent HandshakePacket.
*
* @return the most recent HandshakeData
*/
@Nullable
public HandshakeData getHandshakeData() {
return handshakeData;
}
/**
* Sets the HandshakeData - usually from a HandshakePacket
*/
public void setHandshakeData(HandshakeData handshakeData) {
this.handshakeData = handshakeData;
}
/**
* Gets the number of packet the client sent over the last second.
*

View File

@ -0,0 +1,45 @@
package net.minestom.server.ping;
import org.jetbrains.annotations.Nullable;
public final class HandshakeData {
private final @Nullable String serverAddress;
private final int serverPort;
private final int protocolVersion;
public HandshakeData(@Nullable String serverAddress, int serverPort, int protocolVersion) {
this.serverAddress = serverAddress;
this.serverPort = serverPort;
this.protocolVersion = protocolVersion;
}
/**
* Get the server address a client used to connect.
* may be null
* @return the server address
*/
public @Nullable String getServerAddress() {
return serverAddress;
}
/**
* Get the server port a client used to connect.
*
* @return the server port
*/
public int getServerPort() {
return serverPort;
}
/**
* Get the protocol version a client used to connect.
*
* @return the protocol version
*/
public int getProtocolVersion() {
return protocolVersion;
}
}