geforkt von Mirrors/Velocity
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:
Ursprung
7fd76962f2
Commit
1938013ab2
@ -1,5 +1,8 @@
|
|||||||
package com.velocitypowered.api.event.connection;
|
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.google.common.base.Preconditions;
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import com.velocitypowered.api.proxy.Player;
|
||||||
|
|
||||||
@ -10,31 +13,50 @@ import com.velocitypowered.api.proxy.Player;
|
|||||||
public final class DisconnectEvent {
|
public final class DisconnectEvent {
|
||||||
|
|
||||||
private final Player player;
|
private final Player player;
|
||||||
private final boolean disconnectedDuringLogin;
|
private final LoginStatus loginStatus;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public DisconnectEvent(Player player) {
|
public DisconnectEvent(Player player) {
|
||||||
this(player, false);
|
this(player, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public DisconnectEvent(Player player,
|
public DisconnectEvent(Player player,
|
||||||
boolean disconnectedDuringLogin) {
|
boolean disconnectedDuringLogin) {
|
||||||
|
this(player, disconnectedDuringLogin ? CANCELLED_BY_PROXY : SUCCESSFUL_LOGIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DisconnectEvent(Player player, LoginStatus loginStatus) {
|
||||||
this.player = Preconditions.checkNotNull(player, "player");
|
this.player = Preconditions.checkNotNull(player, "player");
|
||||||
this.disconnectedDuringLogin = disconnectedDuringLogin;
|
this.loginStatus = Preconditions.checkNotNull(loginStatus, "loginStatus");
|
||||||
}
|
}
|
||||||
|
|
||||||
public Player getPlayer() {
|
public Player getPlayer() {
|
||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public boolean disconnectedDuringLogin() {
|
public boolean disconnectedDuringLogin() {
|
||||||
return this.disconnectedDuringLogin;
|
return this.loginStatus == CANCELLED_BY_PROXY;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LoginStatus getLoginStatus() {
|
||||||
|
return loginStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "DisconnectEvent{"
|
return "DisconnectEvent{"
|
||||||
+ "player=" + player + ", "
|
+ "player=" + player + ", "
|
||||||
+ "disconnectedDuringLogin=" + disconnectedDuringLogin
|
+ "loginStatus=" + loginStatus
|
||||||
+ '}';
|
+ '}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum LoginStatus {
|
||||||
|
|
||||||
|
SUCCESSFUL_LOGIN,
|
||||||
|
CONFLICTING_LOGIN,
|
||||||
|
CANCELLED_BY_USER,
|
||||||
|
CANCELLED_BY_PROXY
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -271,6 +271,10 @@ public class MinecraftConnection extends ChannelInboundHandlerAdapter {
|
|||||||
return channel.config().isAutoRead();
|
return channel.config().isAutoRead();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isKnownDisconnect() {
|
||||||
|
return knownDisconnect;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines whether or not the channel should continue reading data automaticaly.
|
* Determines whether or not the channel should continue reading data automaticaly.
|
||||||
* @param autoReading whether or not we should read data automatically
|
* @param autoReading whether or not we should read data automatically
|
||||||
|
@ -6,6 +6,7 @@ import static java.util.concurrent.CompletableFuture.completedFuture;
|
|||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.velocitypowered.api.event.connection.DisconnectEvent;
|
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;
|
||||||
import com.velocitypowered.api.event.player.KickedFromServerEvent.DisconnectPlayer;
|
import com.velocitypowered.api.event.player.KickedFromServerEvent.DisconnectPlayer;
|
||||||
import com.velocitypowered.api.event.player.KickedFromServerEvent.Notify;
|
import com.velocitypowered.api.event.player.KickedFromServerEvent.Notify;
|
||||||
@ -586,10 +587,21 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
if (connectedServer != null) {
|
if (connectedServer != null) {
|
||||||
connectedServer.disconnect();
|
connectedServer.disconnect();
|
||||||
}
|
}
|
||||||
boolean isConnected = server.getPlayer(this.getUniqueId()).isPresent();
|
|
||||||
|
Optional<Player> connectedPlayer = server.getPlayer(this.getUniqueId());
|
||||||
server.unregisterConnection(this);
|
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() {
|
public CompletableFuture<Void> getTeardownFuture() {
|
||||||
|
@ -202,10 +202,14 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
onlineMode);
|
onlineMode);
|
||||||
|
|
||||||
server.getEventManager().fire(profileRequestEvent).thenCompose(profileEvent -> {
|
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.
|
// Initiate a regular connection and move over to it.
|
||||||
ConnectedPlayer player = new ConnectedPlayer(server, profileEvent.getGameProfile(),
|
ConnectedPlayer player = new ConnectedPlayer(server, profileEvent.getGameProfile(),
|
||||||
mcConnection,
|
mcConnection, inbound.getVirtualHost().orElse(null), onlineMode);
|
||||||
inbound.getVirtualHost().orElse(null), onlineMode);
|
|
||||||
this.connectedPlayer = player;
|
this.connectedPlayer = player;
|
||||||
if (!server.canRegisterConnection(player)) {
|
if (!server.canRegisterConnection(player)) {
|
||||||
player.disconnect0(VelocityMessages.ALREADY_CONNECTED, true);
|
player.disconnect0(VelocityMessages.ALREADY_CONNECTED, true);
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren