mirror of
https://github.com/CivMC/Civ.git
synced 2026-07-18 00:20:44 +00:00
make queue work
This commit is contained in:
@@ -11,4 +11,5 @@ dependencies {
|
||||
compileOnly(libs.luckperms.api)
|
||||
annotationProcessor(libs.velocity.api)
|
||||
api(project(":libraries:name-api"))
|
||||
compileOnly(project(":plugins:zorweth-velocity"))
|
||||
}
|
||||
|
||||
@@ -5,9 +5,11 @@ import com.velocitypowered.api.event.Subscribe;
|
||||
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
||||
import com.velocitypowered.api.plugin.Dependency;
|
||||
import com.velocitypowered.api.plugin.Plugin;
|
||||
import com.velocitypowered.api.plugin.PluginContainer;
|
||||
import com.velocitypowered.api.plugin.annotation.DataDirectory;
|
||||
import com.velocitypowered.api.proxy.ProxyServer;
|
||||
import com.zaxxer.hikari.HikariConfig;
|
||||
import java.util.Optional;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
@@ -15,11 +17,12 @@ import java.nio.file.Path;
|
||||
import javax.sql.DataSource;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import net.civmc.civproxy.renamer.PlayerRenamer;
|
||||
import net.civmc.zorweth.velocity.ZorwethVelocityPlugin;
|
||||
import org.slf4j.Logger;
|
||||
import org.spongepowered.configurate.CommentedConfigurationNode;
|
||||
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
|
||||
|
||||
@Plugin(id = "civproxy", name = "CivProxy", version = "1.0.0", authors = {"Okx"}, dependencies = {@Dependency(id = "ajqueue"), @Dependency(id = "luckperms")})
|
||||
@Plugin(id = "civproxy", name = "CivProxy", version = "1.0.0", authors = {"Okx"}, dependencies = {@Dependency(id = "ajqueue"), @Dependency(id = "luckperms"), @Dependency(id = "zorweth")})
|
||||
public class CivProxyPlugin {
|
||||
|
||||
private final ProxyServer server;
|
||||
@@ -46,7 +49,14 @@ public class CivProxyPlugin {
|
||||
new PlayerCount(this, server).start();
|
||||
new PlayerRenamer(this, server, source).start();
|
||||
if (server.getPluginManager().isLoaded("ajqueue")) {
|
||||
new QueueListener(this, server).start();
|
||||
final Optional<ZorwethVelocityPlugin> zorweth = server.getPluginManager().getPlugin("zorweth")
|
||||
.flatMap(PluginContainer::getInstance)
|
||||
.map(ZorwethVelocityPlugin.class::cast);
|
||||
if (zorweth.isPresent()) {
|
||||
new QueueListener(this, server, zorweth.get()).start();
|
||||
} else {
|
||||
this.logger.error("Zorweth is required for queue routing, but its plugin instance was not available");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,17 +9,22 @@ import com.velocitypowered.api.proxy.Player;
|
||||
import com.velocitypowered.api.proxy.ProxyServer;
|
||||
import com.velocitypowered.api.proxy.ServerConnection;
|
||||
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||
import java.sql.SQLException;
|
||||
import java.time.Instant;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import net.civmc.zorweth.velocity.ZorwethVelocityPlugin;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.luckperms.api.LuckPermsProvider;
|
||||
import net.luckperms.api.model.data.TemporaryNodeMergeStrategy;
|
||||
import net.luckperms.api.model.user.UserManager;
|
||||
import net.luckperms.api.node.types.PermissionNode;
|
||||
import us.ajg0702.queue.api.AjQueueAPI;
|
||||
import us.ajg0702.queue.api.QueueManager;
|
||||
import us.ajg0702.queue.api.events.PreConnectEvent;
|
||||
import us.ajg0702.queue.api.events.PreQueueEvent;
|
||||
import us.ajg0702.queue.api.players.AdaptedPlayer;
|
||||
|
||||
public class QueueListener {
|
||||
@@ -29,10 +34,12 @@ public class QueueListener {
|
||||
|
||||
private final CivProxyPlugin plugin;
|
||||
private final ProxyServer server;
|
||||
private final ZorwethVelocityPlugin zorweth;
|
||||
|
||||
public QueueListener(CivProxyPlugin plugin, ProxyServer server) {
|
||||
public QueueListener(CivProxyPlugin plugin, ProxyServer server, ZorwethVelocityPlugin zorweth) {
|
||||
this.plugin = plugin;
|
||||
this.server = server;
|
||||
this.zorweth = zorweth;
|
||||
}
|
||||
|
||||
record QueueRecord(Instant instant, String server) {
|
||||
@@ -45,6 +52,8 @@ public class QueueListener {
|
||||
|
||||
public void start() {
|
||||
server.getEventManager().register(plugin, this);
|
||||
AjQueueAPI.getInstance().listen(PreQueueEvent.class, this::onPreQueue);
|
||||
AjQueueAPI.getInstance().listen(PreConnectEvent.class, this::onPreQueueConnect);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@@ -93,22 +102,62 @@ public class QueueListener {
|
||||
if (event.getPreviousServer() != null) {
|
||||
return;
|
||||
}
|
||||
RegisteredServer mainServer = event.getOriginalServer();
|
||||
String name = mainServer.getServerInfo().getName();
|
||||
RegisteredServer requestedServer = event.getOriginalServer();
|
||||
String name = requestedServer.getServerInfo().getName();
|
||||
if (name.equals("pvp")) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mainServer.getPlayersConnected().size() >= 145 && !event.getPlayer().hasPermission("joinbypass.use")) {
|
||||
// RegisteredServer mini = server.getServer("mini").orElse(null);
|
||||
// if (mini != null && mini.getPlayersConnected().size() < 110) {
|
||||
// event.setResult(ServerPreConnectEvent.ServerResult.allowed(server.getServer("mini").get()));
|
||||
// } else {
|
||||
event.setResult(ServerPreConnectEvent.ServerResult.allowed(server.getServer("pvp").get()));
|
||||
// }
|
||||
|
||||
players.put(event.getPlayer(), new QueueRecord(Instant.now(), name));
|
||||
final RegisteredServer queueTarget;
|
||||
if (this.zorweth.isProtectedServer(name) && !this.zorweth.canBypass(event.getPlayer())) {
|
||||
final String expectedServer = getExpectedServer(event.getPlayer());
|
||||
if (expectedServer == null) {
|
||||
event.getPlayer().disconnect(Component.text("Unable to verify your rocket route. Please reconnect and try again.", NamedTextColor.RED));
|
||||
return;
|
||||
}
|
||||
queueTarget = this.server.getServer(expectedServer).orElse(null);
|
||||
if (queueTarget == null) {
|
||||
this.plugin.getLogger().error("Unable to find expected rocket route server {}", expectedServer);
|
||||
event.getPlayer().disconnect(Component.text("Unable to verify your rocket route. Please reconnect and try again.", NamedTextColor.RED));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
queueTarget = requestedServer;
|
||||
}
|
||||
|
||||
if (queueTarget.getPlayersConnected().size() >= 145 && !event.getPlayer().hasPermission("joinbypass.use")) {
|
||||
event.setResult(ServerPreConnectEvent.ServerResult.allowed(server.getServer("pvp").get()));
|
||||
|
||||
players.put(event.getPlayer(), new QueueRecord(Instant.now(), queueTarget.getServerInfo().getName()));
|
||||
} else if (queueTarget != requestedServer) {
|
||||
event.setResult(ServerPreConnectEvent.ServerResult.allowed(queueTarget));
|
||||
}
|
||||
}
|
||||
|
||||
private void onPreQueue(final PreQueueEvent event) {
|
||||
if (!this.zorweth.isProtectedServer(event.getTarget().getName()) || event.getPlayer().hasPermission("zorweth.admin")) {
|
||||
return;
|
||||
}
|
||||
final String expectedServer = getExpectedServer(event.getPlayer());
|
||||
if (expectedServer != null && event.getTarget().getName().equals(expectedServer)) {
|
||||
return;
|
||||
}
|
||||
event.setCancelled(true);
|
||||
event.getPlayer().sendMessage(Component.text("You cannot queue for that server unless your rocket route allows it.", NamedTextColor.RED));
|
||||
}
|
||||
|
||||
private void onPreQueueConnect(final PreConnectEvent event) {
|
||||
final String targetName = event.getTargetServer().getName();
|
||||
if (!this.zorweth.isProtectedServer(targetName) || event.getPlayer().getPlayer().hasPermission("zorweth.admin")) {
|
||||
return;
|
||||
}
|
||||
final String expectedServer = getExpectedServer(event.getPlayer().getPlayer());
|
||||
if (targetName.equals(expectedServer)) {
|
||||
return;
|
||||
}
|
||||
event.setCancelled(true);
|
||||
event.getPlayer().getPlayer().sendMessage(Component.text("Your rocket route changed. Please queue for "
|
||||
+ (expectedServer == null ? "the correct server" : expectedServer) + ".", NamedTextColor.RED));
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@@ -180,4 +229,22 @@ public class QueueListener {
|
||||
userManager.saveUser(user);
|
||||
});
|
||||
}
|
||||
|
||||
private String getExpectedServer(final Player player) {
|
||||
try {
|
||||
return this.zorweth.getExpectedServer(player.getUniqueId());
|
||||
} catch (final SQLException exception) {
|
||||
this.plugin.getLogger().error("Failed to look up rocket route for " + player.getUniqueId(), exception);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String getExpectedServer(final AdaptedPlayer player) {
|
||||
try {
|
||||
return this.zorweth.getExpectedServer(player.getUniqueId());
|
||||
} catch (final SQLException exception) {
|
||||
this.plugin.getLogger().error("Failed to look up rocket route for " + player.getUniqueId(), exception);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user