This commit is contained in:
ajgeiss0702
2021-07-23 11:46:29 -05:00
parent 5bd770da9c
commit 696e7c126d
17 changed files with 146 additions and 49 deletions
@@ -3,5 +3,10 @@ package us.ajg0702.queue.api;
import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.AdaptedPlayer;
public interface EventHandler { public interface EventHandler {
void handleMessage(AdaptedPlayer reciever, byte[] data); void handleMessage(AdaptedPlayer reciever, byte[] data);
void onPlayerJoin(AdaptedPlayer player);
void onPlayerLeave(AdaptedPlayer player);
} }
@@ -19,4 +19,11 @@ public interface Logic {
* @param player The player that is being queued * @param player The player that is being queued
*/ */
QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player); QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player);
/**
* The logic for checking if a player has been disconnected for too long
* @param player The player to check
* @return true if the player has been disconnected for too long and should be removed from the queue
*/
boolean playerDisconnectedTooLong(QueuePlayer player);
} }
@@ -9,14 +9,6 @@ import us.ajg0702.queue.api.queues.QueueServer;
import java.util.List; import java.util.List;
public interface PlatformMethods { public interface PlatformMethods {
/**
* BungeeUtils.sendCustomData(p, "position", pos+"");
* BungeeUtils.sendCustomData(p, "positionof", len+"");
* BungeeUtils.sendCustomData(p, "queuename", pl.aliases.getAlias(s));
* BungeeUtils.sendCustomData(p, "inqueue", "true");
* BungeeUtils.sendCustomData(p, "inqueueevent", "true");
*/
void sendJoinQueueChannelMessages(QueueServer queueServer, QueuePlayer queuePlayer);
/** /**
* Sends a plugin message on the plugin messaging channel * Sends a plugin message on the plugin messaging channel
@@ -56,4 +56,10 @@ public interface QueuePlayer {
* @return the player's username * @return the player's username
*/ */
String getName(); String getName();
/**
* Returns the number of miliseconds since this player was online
* @return The number of miliseconds since this player was online
*/
long getTimeSinceOnline();
} }
@@ -198,6 +198,12 @@ public interface QueueServer {
*/ */
QueuePlayer findPlayer(AdaptedPlayer player); QueuePlayer findPlayer(AdaptedPlayer player);
/**
* Finds the player with this uuid in this queue and returns the representative QueuePlayer
* @return The QueuePlayer representing the player, null if not found
*/
QueuePlayer findPlayer(UUID uuid);
/** /**
* Gets the most ideal server in this group to join * Gets the most ideal server in this group to join
@@ -23,6 +23,6 @@ public class PlayerSender implements ICommandSender {
@Override @Override
public AdaptedPlayer getHandle() { public AdaptedPlayer getHandle() {
return null; return handle;
} }
} }
@@ -49,13 +49,10 @@ public class LeaveCommand extends BaseCommand {
@Override @Override
public void execute(ICommandSender sender, String[] args) { public void execute(ICommandSender sender, String[] args) {
System.out.println("leave command");
if(!sender.isPlayer()) { if(!sender.isPlayer()) {
System.out.println("not player");
sender.sendMessage(getMessages().getComponent("errors.player-only")); sender.sendMessage(getMessages().getComponent("errors.player-only"));
return; return;
} }
System.out.println("player");
AdaptedPlayer player = main.getPlatformMethods().senderToPlayer(sender); AdaptedPlayer player = main.getPlatformMethods().senderToPlayer(sender);
List<QueueServer> servers = main.getQueueManager().getPlayerQueues(player); List<QueueServer> servers = main.getQueueManager().getPlayerQueues(player);
@@ -64,7 +61,6 @@ public class LeaveCommand extends BaseCommand {
return; return;
} }
System.out.println("0");
if(servers.size() == 1) { if(servers.size() == 1) {
servers.get(0).removePlayer(player); servers.get(0).removePlayer(player);
@@ -72,7 +68,6 @@ public class LeaveCommand extends BaseCommand {
return; return;
} }
System.out.println("1");
if(args.length <= 0) { if(args.length <= 0) {
sender.sendMessage(getMessages().getComponent("commands.leave.more-args", "QUEUES:"+getQueueList(servers))); sender.sendMessage(getMessages().getComponent("commands.leave.more-args", "QUEUES:"+getQueueList(servers)));
@@ -91,7 +86,6 @@ public class LeaveCommand extends BaseCommand {
return; return;
} }
System.out.println("2");
leavingServer.removePlayer(queuePlayer); leavingServer.removePlayer(queuePlayer);
sender.sendMessage(getMessages().getComponent("commands.leave-queue", "SERVER:"+leavingServer.getAlias())); sender.sendMessage(getMessages().getComponent("commands.leave-queue", "SERVER:"+leavingServer.getAlias()));
@@ -1,10 +1,13 @@
package us.ajg0702.queue.common; package us.ajg0702.queue.common;
import com.google.common.collect.ImmutableList;
import us.ajg0702.queue.api.EventHandler; import us.ajg0702.queue.api.EventHandler;
import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.IBaseCommand;
import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.players.QueuePlayer;
import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.queues.QueueServer;
import us.ajg0702.queue.commands.commands.PlayerSender; import us.ajg0702.queue.commands.commands.PlayerSender;
import us.ajg0702.queue.common.players.QueuePlayerImpl;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.DataInputStream; import java.io.DataInputStream;
@@ -30,8 +33,6 @@ public class EventHandlerImpl implements EventHandler {
String[] args = new String[1]; String[] args = new String[1];
args[0] = rawData; args[0] = rawData;
moveCommand.execute(new PlayerSender(recievingPlayer), args); moveCommand.execute(new PlayerSender(recievingPlayer), args);
//man.addToQueue(player, data);
} }
if(subchannel.equals("massqueue")) { if(subchannel.equals("massqueue")) {
String inData = in.readUTF(); String inData = in.readUTF();
@@ -89,4 +90,24 @@ public class EventHandlerImpl implements EventHandler {
e1.printStackTrace(); e1.printStackTrace();
} }
} }
@Override
public void onPlayerJoin(AdaptedPlayer player) {
ImmutableList<QueuePlayer> queues = main.getQueueManager().findPlayerInQueues(player);
for(QueuePlayer queuePlayer : queues) {
queuePlayer.setPlayer(player);
}
if(queues.size() > 0) {
main.getQueueManager().sendMessage(main.getQueueManager().getSingleServer(player).findPlayer(player));
}
}
@Override
public void onPlayerLeave(AdaptedPlayer player) {
ImmutableList<QueuePlayer> queues = main.getQueueManager().findPlayerInQueues(player);
for(QueuePlayer queuePlayer : queues) {
((QueuePlayerImpl) queuePlayer).setLeaveTime(System.currentTimeMillis());
}
}
} }
@@ -96,6 +96,11 @@ public class QueueMain {
} }
public void shutdown() {
taskManager.shutdown();
}
private final File dataFolder; private final File dataFolder;
@@ -8,6 +8,7 @@ import us.ajg0702.queue.api.queues.QueueServer;
import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.AdaptedServer;
import us.ajg0702.queue.api.server.ServerBuilder; import us.ajg0702.queue.api.server.ServerBuilder;
import us.ajg0702.queue.common.players.QueuePlayerImpl; import us.ajg0702.queue.common.players.QueuePlayerImpl;
import us.ajg0702.utils.bungee.BungeeUtils;
import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.Messages;
import us.ajg0702.utils.common.TimeUtils; import us.ajg0702.utils.common.TimeUtils;
@@ -131,7 +132,11 @@ public class QueueManagerImpl implements QueueManager {
if(!server.isJoinable(player)) { if(!server.isJoinable(player)) {
sendMessage(queuePlayer); sendMessage(queuePlayer);
} }
main.getPlatformMethods().sendJoinQueueChannelMessages(server, queuePlayer); main.getPlatformMethods().sendPluginMessage(player, "position", pos+"");
main.getPlatformMethods().sendPluginMessage(player, "positionof", len+"");
main.getPlatformMethods().sendPluginMessage(player, "queuename", server.getAlias());
main.getPlatformMethods().sendPluginMessage(player, "inqueue", "true");
main.getPlatformMethods().sendPluginMessage(player, "inqueueevent", "true");
return true; return true;
} }
@@ -232,7 +237,6 @@ public class QueueManagerImpl implements QueueManager {
for(QueueServer server : servers) { for(QueueServer server : servers) {
String status = server.getStatusString(); String status = server.getStatusString();
for(QueuePlayer queuePlayer : server.getQueue()) { for(QueuePlayer queuePlayer : server.getQueue()) {
if(!getSingleServer(queuePlayer.getPlayer()).equals(server)) continue;
int pos = queuePlayer.getPosition(); int pos = queuePlayer.getPosition();
if(pos == 0) { if(pos == 0) {
@@ -243,6 +247,8 @@ public class QueueManagerImpl implements QueueManager {
AdaptedPlayer player = queuePlayer.getPlayer(); AdaptedPlayer player = queuePlayer.getPlayer();
if(player == null) continue; if(player == null) continue;
if(!getSingleServer(player).equals(server)) continue;
if(!server.isJoinable(player)) { if(!server.isJoinable(player)) {
queuePlayer.getPlayer().sendActionBar(msgs.getComponent("spigot.actionbar.offline", queuePlayer.getPlayer().sendActionBar(msgs.getComponent("spigot.actionbar.offline",
"POS:"+pos, "POS:"+pos,
@@ -9,6 +9,7 @@ import java.util.concurrent.TimeUnit;
public class TaskManager { public class TaskManager {
final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
final ScheduledExecutorService updateExecutor = Executors.newScheduledThreadPool(1); final ScheduledExecutorService updateExecutor = Executors.newScheduledThreadPool(1);
@@ -17,6 +18,11 @@ public class TaskManager {
this.main = main; this.main = main;
} }
public void shutdown() {
executor.shutdown();
updateExecutor.shutdown();
}
public String taskStatus() { public String taskStatus() {
List<ScheduledFuture<?>> tasks = Arrays.asList(sendTask, updateTask, messageTask, actionBarTask, queueEventTask, reloadServerTask); List<ScheduledFuture<?>> tasks = Arrays.asList(sendTask, updateTask, messageTask, actionBarTask, queueEventTask, reloadServerTask);
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@@ -47,7 +47,7 @@ public class QueuePlayerImpl implements QueuePlayer {
@Nullable @Nullable
@Override @Override
public AdaptedPlayer getPlayer() { public AdaptedPlayer getPlayer() {
if(!player.isConnected()) return null; if(player != null && !player.isConnected()) player = null;
return player; return player;
} }
@@ -73,4 +73,20 @@ public class QueuePlayerImpl implements QueuePlayer {
public String getName() { public String getName() {
return name; return name;
} }
@Override
public long getTimeSinceOnline() {
if(player != null && player.isConnected()) {
return 0;
}
return System.currentTimeMillis()-leaveTime;
}
private long leaveTime = 0;
public void setLeaveTime(long leaveTime) {
this.leaveTime = leaveTime;
}
} }
@@ -304,18 +304,13 @@ public class QueueServerImpl implements QueueServer {
} }
@Override @Override
public synchronized QueuePlayer findPlayer(AdaptedPlayer player) { public QueuePlayer findPlayer(AdaptedPlayer player) {
return findPlayer(player.getUniqueId());
}
@Override
public synchronized QueuePlayer findPlayer(UUID uuid) {
for(QueuePlayer queuePlayer : queue) { for(QueuePlayer queuePlayer : queue) {
AdaptedPlayer queuedPlayer = queuePlayer.getPlayer(); if(queuePlayer.getUniqueId().toString().equals(uuid.toString())) {
if(queuedPlayer == null) continue;
if(
queuedPlayer
.getUniqueId()
.equals(
player
.getUniqueId()
)
) {
return queuePlayer; return queuePlayer;
} }
} }
@@ -15,4 +15,9 @@ public class FreeLogic implements Logic {
public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) { public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) {
return null; return null;
} }
@Override
public boolean playerDisconnectedTooLong(QueuePlayer player) {
return true;
}
} }
@@ -15,6 +15,7 @@ import us.ajg0702.queue.api.commands.ICommandSender;
import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.players.QueuePlayer;
import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.queues.QueueServer;
import us.ajg0702.queue.commands.commands.PlayerSender;
import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer;
import java.util.ArrayList; import java.util.ArrayList;
@@ -23,25 +24,18 @@ import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import java.util.logging.Logger; import java.util.logging.Logger;
public class PlatformMethodsImpl implements PlatformMethods { public class VelocityMethods implements PlatformMethods {
final ProxyServer proxyServer; final ProxyServer proxyServer;
final Logger logger; final Logger logger;
final VelocityQueue plugin; final VelocityQueue plugin;
public PlatformMethodsImpl(VelocityQueue plugin, ProxyServer proxyServer, Logger logger) { public VelocityMethods(VelocityQueue plugin, ProxyServer proxyServer, Logger logger) {
this.proxyServer = proxyServer; this.proxyServer = proxyServer;
this.logger = logger; this.logger = logger;
this.plugin = plugin; this.plugin = plugin;
} }
@Override
public void sendJoinQueueChannelMessages(QueueServer queueServer, QueuePlayer queuePlayer) {
AdaptedPlayer player = queuePlayer.getPlayer();
if(player == null) return;
player.sendMessage(Component.text());
}
@Override @Override
public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) { public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) {
if(player == null) return; if(player == null) return;
@@ -58,6 +52,9 @@ public class PlatformMethodsImpl implements PlatformMethods {
@Override @Override
public AdaptedPlayer senderToPlayer(ICommandSender sender) { public AdaptedPlayer senderToPlayer(ICommandSender sender) {
if(sender instanceof PlayerSender) {
return ((PlayerSender) sender).getHandle();
}
return new VelocityPlayer((Player) sender.getHandle()); return new VelocityPlayer((Player) sender.getHandle());
} }
@@ -2,14 +2,18 @@ package us.ajg0702.queue.platforms.velocity;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.velocitypowered.api.command.CommandManager; import com.velocitypowered.api.command.CommandManager;
import com.velocitypowered.api.event.ResultedEvent;
import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.connection.DisconnectEvent;
import com.velocitypowered.api.event.connection.PluginMessageEvent; import com.velocitypowered.api.event.connection.PluginMessageEvent;
import com.velocitypowered.api.event.player.ServerPostConnectEvent;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.plugin.annotation.DataDirectory;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
import net.kyori.adventure.text.Component;
import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.IBaseCommand;
import us.ajg0702.queue.commands.BaseCommand; import us.ajg0702.queue.commands.BaseCommand;
import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand;
@@ -58,7 +62,7 @@ public class VelocityQueue {
public void onProxyInit(ProxyInitializeEvent e) { public void onProxyInit(ProxyInitializeEvent e) {
main = new QueueMain( main = new QueueMain(
logger, logger,
new PlatformMethodsImpl(this, proxyServer, logger), new VelocityMethods(this, proxyServer, logger),
dataFolder dataFolder
); );
main.setServerBuilder(new ServerBuilderImpl(main, proxyServer)); main.setServerBuilder(new ServerBuilderImpl(main, proxyServer));
@@ -73,6 +77,10 @@ public class VelocityQueue {
CommandManager commandManager = proxyServer.getCommandManager(); CommandManager commandManager = proxyServer.getCommandManager();
proxyServer.getChannelRegistrar().register(MinecraftChannelIdentifier.from("ajqueue:tospigot"));
proxyServer.getChannelRegistrar().register(MinecraftChannelIdentifier.from("ajqueue:toproxy"));
for(IBaseCommand command : commands) { for(IBaseCommand command : commands) {
commandManager.register( commandManager.register(
commandManager.metaBuilder(command.getName()) commandManager.metaBuilder(command.getName())
@@ -83,18 +91,41 @@ public class VelocityQueue {
} }
} }
@Subscribe
public void onProxyShutdown(ProxyShutdownEvent e) {
main.shutdown();
}
@Subscribe @Subscribe
public void onPluginMessage(PluginMessageEvent e) { public void onPluginMessage(PluginMessageEvent e) {
System.out.println("Recieved message: "+e.getIdentifier().getId());
if(e.getIdentifier().getId().equals("ajqueue:tospigot")) { if(e.getIdentifier().getId().equals("ajqueue:tospigot")) {
e.setResult(PluginMessageEvent.ForwardResult.handled()); e.setResult(PluginMessageEvent.ForwardResult.handled());
System.out.println("Skipping message: "+e.getIdentifier().getId());
return;
}
if(!e.getIdentifier().getId().equals("ajqueue:toproxy")) {
System.out.println("Skipping message: "+e.getIdentifier().getId());
return; return;
} }
if(!e.getIdentifier().getId().equals("ajqueue:toproxy")) return;
e.setResult(PluginMessageEvent.ForwardResult.handled()); e.setResult(PluginMessageEvent.ForwardResult.handled());
System.out.println("Processing message: "+e.getIdentifier().getId());
if(!(e.getTarget() instanceof Player)) return; if(!(e.getTarget() instanceof Player)) return;
main.getEventHandler().handleMessage(new VelocityPlayer((Player) e.getTarget()), e.getData()); main.getEventHandler().handleMessage(new VelocityPlayer((Player) e.getTarget()), e.getData());
} }
@SuppressWarnings("UnstableApiUsage")
@Subscribe
public void onJoin(ServerPostConnectEvent e) {
if(e.getPreviousServer() != null) return; // only run if the player just joined
main.getEventHandler().onPlayerJoin(new VelocityPlayer(e.getPlayer()));
}
@Subscribe
public void onLeave(DisconnectEvent e) {
main.getEventHandler().onPlayerLeave(new VelocityPlayer(e.getPlayer()));
}
} }
@@ -10,6 +10,7 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.PluginMessageListener; import org.bukkit.plugin.messaging.PluginMessageListener;
import org.jetbrains.annotations.NotNull;
import us.ajg0702.queue.spigot.utils.VersionSupport; import us.ajg0702.queue.spigot.utils.VersionSupport;
import java.util.HashMap; import java.util.HashMap;
@@ -23,7 +24,7 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener {
public void onEnable() { public void onEnable() {
getServer().getMessenger().registerIncomingPluginChannel(this, "ajqueue:tospigot", this); getServer().getMessenger().registerIncomingPluginChannel(this, "ajqueue:tospigot", this);
getServer().getMessenger().registerOutgoingPluginChannel(this, "ajqueue:tobungee"); getServer().getMessenger().registerOutgoingPluginChannel(this, "ajqueue:toproxy");
this.getCommand("move").setExecutor(new Commands(this)); this.getCommand("move").setExecutor(new Commands(this));
this.getCommand("leavequeue").setExecutor(new Commands(this)); this.getCommand("leavequeue").setExecutor(new Commands(this));
@@ -62,8 +63,12 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener {
HashMap<Player, String> queuebatch = new HashMap<>(); HashMap<Player, String> queuebatch = new HashMap<>();
@Override @Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) { public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] message) {
if (!channel.equals("ajqueue:tospigot")) return; if (!channel.equals("ajqueue:tospigot")) {
getLogger().info("Skipping message: "+channel);
return;
}
getLogger().info("Processing message: "+channel);
ByteArrayDataInput in = ByteStreams.newDataInput(message); ByteArrayDataInput in = ByteStreams.newDataInput(message);
@@ -161,7 +166,7 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener {
out.writeUTF(subchannel); out.writeUTF(subchannel);
out.writeUTF(data); out.writeUTF(data);
player.sendPluginMessage(this, "ajqueue:tobungee", out.toByteArray()); player.sendPluginMessage(this, "ajqueue:toproxy", out.toByteArray());
} }
public void sendMessage(String subchannel, String data) { public void sendMessage(String subchannel, String data) {
@@ -170,7 +175,7 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener {
out.writeUTF(data); out.writeUTF(data);
Bukkit.getOnlinePlayers().iterator().next() Bukkit.getOnlinePlayers().iterator().next()
.sendPluginMessage(this, "ajqueue:tobungee", out.toByteArray()); .sendPluginMessage(this, "ajqueue:toproxy", out.toByteArray());
} }
@EventHandler @EventHandler