3
0
Mirror von https://github.com/PaperMC/Velocity.git synchronisiert 2024-11-16 21:10:30 +01:00

Make DisconnectEvent more sane

This is a step towards fixing #289 and removing some less-than-optimal behavior in plugins I maintain internally.
Dieser Commit ist enthalten in:
Andrew Steinborn 2020-06-29 11:17:08 -04:00
Ursprung 7fd76962f2
Commit 1938013ab2
4 geänderte Dateien mit 51 neuen und 9 gelöschten Zeilen

Datei anzeigen

@ -1,5 +1,8 @@
package com.velocitypowered.api.event.connection;
import static com.velocitypowered.api.event.connection.DisconnectEvent.LoginStatus.CANCELLED_BY_PROXY;
import static com.velocitypowered.api.event.connection.DisconnectEvent.LoginStatus.SUCCESSFUL_LOGIN;
import com.google.common.base.Preconditions;
import com.velocitypowered.api.proxy.Player;
@ -10,31 +13,50 @@ import com.velocitypowered.api.proxy.Player;
public final class DisconnectEvent {
private final Player player;
private final boolean disconnectedDuringLogin;
private final LoginStatus loginStatus;
@Deprecated
public DisconnectEvent(Player player) {
this(player, false);
}
@Deprecated
public DisconnectEvent(Player player,
boolean disconnectedDuringLogin) {
this(player, disconnectedDuringLogin ? CANCELLED_BY_PROXY : SUCCESSFUL_LOGIN);
}
public DisconnectEvent(Player player, LoginStatus loginStatus) {
this.player = Preconditions.checkNotNull(player, "player");
this.disconnectedDuringLogin = disconnectedDuringLogin;
this.loginStatus = Preconditions.checkNotNull(loginStatus, "loginStatus");
}
public Player getPlayer() {
return player;
}
@Deprecated
public boolean disconnectedDuringLogin() {
return this.disconnectedDuringLogin;
return this.loginStatus == CANCELLED_BY_PROXY;
}
public LoginStatus getLoginStatus() {
return loginStatus;
}
@Override
public String toString() {
return "DisconnectEvent{"
+ "player=" + player + ", "
+ "disconnectedDuringLogin=" + disconnectedDuringLogin
+ "loginStatus=" + loginStatus
+ '}';
}
public enum LoginStatus {
SUCCESSFUL_LOGIN,
CONFLICTING_LOGIN,
CANCELLED_BY_USER,
CANCELLED_BY_PROXY
}
}

Datei anzeigen

@ -271,6 +271,10 @@ public class MinecraftConnection extends ChannelInboundHandlerAdapter {
return channel.config().isAutoRead();
}
public boolean isKnownDisconnect() {
return knownDisconnect;
}
/**
* Determines whether or not the channel should continue reading data automaticaly.
* @param autoReading whether or not we should read data automatically

Datei anzeigen

@ -6,6 +6,7 @@ import static java.util.concurrent.CompletableFuture.completedFuture;
import com.google.common.base.Preconditions;
import com.google.gson.JsonObject;
import com.velocitypowered.api.event.connection.DisconnectEvent;
import com.velocitypowered.api.event.connection.DisconnectEvent.LoginStatus;
import com.velocitypowered.api.event.player.KickedFromServerEvent;
import com.velocitypowered.api.event.player.KickedFromServerEvent.DisconnectPlayer;
import com.velocitypowered.api.event.player.KickedFromServerEvent.Notify;
@ -586,10 +587,21 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
if (connectedServer != null) {
connectedServer.disconnect();
}
boolean isConnected = server.getPlayer(this.getUniqueId()).isPresent();
Optional<Player> connectedPlayer = server.getPlayer(this.getUniqueId());
server.unregisterConnection(this);
server.getEventManager().fire(new DisconnectEvent(this, !isConnected))
.thenRun(() -> this.teardownFuture.complete(null));
DisconnectEvent.LoginStatus status;
if (connectedPlayer.isPresent()) {
status = connectedPlayer.get() == this ? LoginStatus.SUCCESSFUL_LOGIN
: LoginStatus.CONFLICTING_LOGIN;
} else {
status = connection.isKnownDisconnect() ? LoginStatus.CANCELLED_BY_PROXY :
LoginStatus.CANCELLED_BY_USER;
}
DisconnectEvent event = new DisconnectEvent(this, status);
server.getEventManager().fire(event).thenRun(() -> this.teardownFuture.complete(null));
}
public CompletableFuture<Void> getTeardownFuture() {

Datei anzeigen

@ -202,10 +202,14 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
onlineMode);
server.getEventManager().fire(profileRequestEvent).thenCompose(profileEvent -> {
if (mcConnection.isClosed()) {
// The player disconnected after we authenticated them.
return CompletableFuture.completedFuture(null);
}
// Initiate a regular connection and move over to it.
ConnectedPlayer player = new ConnectedPlayer(server, profileEvent.getGameProfile(),
mcConnection,
inbound.getVirtualHost().orElse(null), onlineMode);
mcConnection, inbound.getVirtualHost().orElse(null), onlineMode);
this.connectedPlayer = player;
if (!server.canRegisterConnection(player)) {
player.disconnect0(VelocityMessages.ALREADY_CONNECTED, true);