Move Floodgate conflict chechking to core

The FloodgateApi is the same for Bukkit and Bungee, so the Floodgate
related code could be used in a future Bungee implementation too.

Currently, Bungee will report Floodgate disabled to core, so the
upstream Floodgate implementation will be used there.
If enough code will be moved to core, I might consider enabling these
features to BungeeCord too.
This commit is contained in:
Smart123s
2021-05-09 11:01:36 +02:00
parent 25254b2393
commit b0ef1a59ac
6 changed files with 61 additions and 24 deletions

View File

@ -40,8 +40,6 @@ import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.geysermc.floodgate.api.FloodgateApi;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
public class NameCheckTask extends JoinManagement<Player, CommandSender, ProtocolLibLoginSource>
implements Runnable {
@ -70,13 +68,8 @@ public class NameCheckTask extends JoinManagement<Player, CommandSender, Protoco
@Override
public void run() {
try {
// check if the player is connecting through Geyser
if (!plugin.getCore().getConfig().get("allowFloodgateNameConflict").toString().equalsIgnoreCase("false")
&& getFloodgatePlayer(username) != null) {
plugin.getLog().info("Skipping name conflict checking for player {}", username);
return;
}
super.onLogin(username, new ProtocolLibLoginSource(packetEvent, player, random, publicKey));
boolean floodgateAvailable = Bukkit.getServer().getPluginManager().isPluginEnabled("floodgate");
super.onLogin(username, new ProtocolLibLoginSource(packetEvent, player, random, publicKey), floodgateAvailable);
} finally {
ProtocolLibrary.getProtocolManager().getAsynchronousManager().signalPacketTransmission(packetEvent);
}
@ -121,15 +114,4 @@ public class NameCheckTask extends JoinManagement<Player, CommandSender, Protoco
plugin.putSession(player.getAddress(), loginSession);
}
private static FloodgatePlayer getFloodgatePlayer(String username) {
if (Bukkit.getServer().getPluginManager().isPluginEnabled("floodgate")) {
// the Floodgate API requires UUID, which is inaccessible at NameCheckTask.java
for (FloodgatePlayer floodgatePlayer : FloodgateApi.getInstance().getPlayers()) {
if (floodgatePlayer.getUsername().equals(username)) {
return floodgatePlayer;
}
}
}
return null;
}
}

View File

@ -75,7 +75,7 @@ public class ProtocolSupportListener extends JoinManagement<Player, CommandSende
//remove old data every time on a new login in order to keep the session only for one person
plugin.removeSession(address);
super.onLogin(username, new ProtocolLoginSource(loginStartEvent));
super.onLogin(username, new ProtocolLoginSource(loginStartEvent), false);
}
@EventHandler

View File

@ -136,7 +136,7 @@
<!-- Version 2.0 -->
<dependency>
<groupId>org.geysermc.floodgate</groupId>
<artifactId>bungee</artifactId>
<artifactId>api</artifactId>
<version>2.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>

View File

@ -62,7 +62,7 @@ public class AsyncPremiumCheck extends JoinManagement<ProxiedPlayer, CommandSend
plugin.getSession().remove(connection);
try {
super.onLogin(username, new BungeeLoginSource(connection, preLoginEvent));
super.onLogin(username, new BungeeLoginSource(connection, preLoginEvent), false);
} finally {
preLoginEvent.completeIntent(plugin);
}

View File

@ -53,6 +53,12 @@
<id>codemc-repo</id>
<url>https://repo.codemc.io/repository/maven-public/</url>
</repository>
<!-- Floodgate -->
<repository>
<id>nukkitx-snapshot</id>
<url>https://repo.nukkitx.com/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
@ -92,6 +98,14 @@
<version>0.4</version>
</dependency>
<!--Floodgate for Xbox Live Authentication-->
<dependency>
<groupId>org.geysermc.floodgate</groupId>
<artifactId>api</artifactId>
<version>2.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- APIs we can use because they are available in all platforms (Spigot, Bungee) -->
<dependency>
<groupId>com.google.guava</groupId>

View File

@ -33,6 +33,9 @@ import com.github.games647.fastlogin.core.shared.event.FastLoginPreLoginEvent;
import java.util.Optional;
import org.geysermc.floodgate.api.FloodgateApi;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
import net.md_5.bungee.config.Configuration;
public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
@ -45,8 +48,28 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
this.authHook = authHook;
}
public void onLogin(String username, S source) {
public void onLogin(String username, S source, boolean floodgateAvailable) {
core.getPlugin().getLog().info("Handling player {}", username);
// check if the player is connecting through Geyser
if (floodgateAvailable && getFloodgatePlayer(username) != null) {
if (core.getConfig().get("allowFloodgateNameConflict").toString().equalsIgnoreCase("false")) {
core.getPlugin().getLog().info(
"Bedrock Player {}'s name conflits an existing Java Premium Player's name",
username);
try {
source.kick("Your name conflits an existing Java Premium Player's name");
} catch (Exception e) {
e.printStackTrace();
core.getPlugin().getLog().error("Could not kick Player {}", username);
}
} else {
core.getPlugin().getLog().info("Skipping name conflict checking for player {}", username);
return;
}
}
StoredProfile profile = core.getStorage().loadProfile(username);
if (profile == null) {
return;
@ -130,6 +153,24 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
return false;
}
/**
* Get a FloodgatePlayyer by their name.
* This is not supported by FloodgateApi.
* <br>
* <b>WARNING: This method does not check if the floodgate plugin is actually installed on the server!</b>
* @param username the name of the player
* @return FloodgatePlayer if found, null if the player is not online
*/
protected static FloodgatePlayer getFloodgatePlayer(String username) {
// the Floodgate API requires UUID, which is inaccessible at NameCheckTask.java
for (FloodgatePlayer floodgatePlayer : FloodgateApi.getInstance().getPlayers()) {
if (floodgatePlayer.getUsername().equals(username)) {
return floodgatePlayer;
}
}
return null;
}
public abstract FastLoginPreLoginEvent callFastLoginPreLoginEvent(String username, S source, StoredProfile profile);