Files
ajQueue/src/main/java/us/ajg0702/queue/Main.java
T
2020-06-29 09:29:51 -07:00

254 lines
8.0 KiB
Java

package us.ajg0702.queue;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.concurrent.Callable;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.api.event.ServerKickEvent;
import net.md_5.bungee.api.event.ServerSwitchEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.event.EventHandler;
import us.ajg0702.queue.commands.LeaveCommand;
import us.ajg0702.queue.commands.ManageCommand;
import us.ajg0702.queue.commands.MoveCommand;
import us.ajg0702.queue.utils.BungeeConfig;
import us.ajg0702.queue.utils.BungeeMessages;
import us.ajg0702.queue.utils.BungeeStats;
import us.ajg0702.queue.utils.BungeeUtils;
public class Main extends Plugin implements Listener {
static Main plugin = null;
public int timeBetweenPlayers = 5;
BungeeStats metrics;
BungeeMessages msgs;
BungeeConfig config;
Manager man;
boolean isp;
@Override
public void onEnable() {
plugin = this;
/*LinkedHashMap<String, String> d = new LinkedHashMap<>();
d.put("status.offline.base", "&cThe server you are queued for is {STATUS}. &7You are in position &f{POS}&7 of &f{LEN}&7.");
d.put("status.offline.offline", "offline");
d.put("status.offline.restarting", "restarting");
d.put("status.offline.full", "full");
d.put("status.online.base", "&7You are in position &f{POS}&7 of &f{LEN}&7. Estimated time: {TIME}");
d.put("status.left-last-queue", "&aYou left the last queue you were in.");
d.put("status.now-in-queue", "&aYou are now queued for {SERVER}! &7You are in position &f{POS}&7 of &f{LEN}&7.\n&7Type &f/leavequeue&7 to leave the queue!");
d.put("status.now-in-empty-queue", "");
d.put("status.sending-now", "&aSending you to &f{SERVER} &anow..");
d.put("errors.server-not-exist", "&cThat server does not exist!");
d.put("errors.already-queued", "&cYou are already queued for that server!");
d.put("errors.player-only", "&cThis command can only be executed as a player!");
d.put("errors.already-connected", "&cYou are already connected to this server!");
d.put("commands.leave-queue", "&aYou left the queue!");
d.put("commands.reload", "&aConfig and messages reloaded successfully!");
d.put("noperm", "&cYou do not have permission to do this!");
d.put("format.time.mins", "{m}m {s}s");
d.put("format.time.secs", "{s} seconds");
d.put("list.format", "&b{SERVER} &7({COUNT}): {LIST}");
d.put("list.playerlist", "&9{NAME}&7, ");
d.put("list.total", "&7Total players in queues: &f{TOTAL}");
d.put("list.none", "&7None");
d.put("spigot.actionbar.online", "&7You are queued for &f{SERVER}&7. You are in position &f{POS}&7 of &f{LEN}&7. Estimated time: {TIME}");
d.put("spigot.actionbar.offline", "&7You are queued for &f{SERVER}&7. &7You are in position &f{POS}&7 of &f{LEN}&7.");
d.put("send", "&aAdded &f{PLAYER}&a to the queue for &f{SERVER}");
d.put("placeholders.queued.none", "None");
d.put("placeholders.position.none", "None");
msgs = BungeeMessages.getInstance(this, d);*/
msgs = BungeeMessages.getInstance(this);
config = new BungeeConfig(this);
checkConfig();
this.getProxy().getPluginManager().registerCommand(this, new MoveCommand(this));
this.getProxy().getPluginManager().registerCommand(this, new ManageCommand(this));
this.getProxy().getPluginManager().registerCommand(this, new LeaveCommand(this));
this.getProxy().getPluginManager().registerListener(this, this);
getProxy().registerChannel("ajqueue:tospigot");
getProxy().registerChannel("ajqueue:tobungee");
timeBetweenPlayers = config.getInt("wait-time");
try {
Class.forName("us.ajg0702.queue.Logic");
isp = true;
} catch(ClassNotFoundException e) {
isp = false;
}
man = Manager.getInstance(this);
metrics = new BungeeStats(this, 7404);
metrics.addCustomChart(new BungeeStats.SimplePie("premium", new Callable<String>() {
@Override
public String call() throws Exception {
return isp+"";
}
}));
}
public boolean isp() {
return isp;
}
public void checkConfig() {
List<String> svs = getConfig().getStringList("queue-servers");
for(String s : svs) {
if(!s.contains(":")) {
getLogger().warning("The queue-servers section in the config has been set up incorrectly! Please read the comment above the setting and make sure you have a queue server and a destination server separated by a colon (:)");
break;
}
}
}
public BungeeConfig getConfig() {
return config;
}
public static BaseComponent[] formatMessage(String text) {
return TextComponent.fromLegacyText(net.md_5.bungee.api.ChatColor.translateAlternateColorCodes('&', text));
}
@EventHandler
public void moveServer(ServerSwitchEvent e) {
ProxiedPlayer p = e.getPlayer();
Server alreadyqueued = man.findPlayerInQueue(p);
if(alreadyqueued != null) {
List<ProxiedPlayer> queue = alreadyqueued.getQueue();
int pos = queue.indexOf(p);
if(pos == 0) {
queue.remove(p);
} else if(config.getBoolean("remove-player-on-server-switch")) {
queue.remove(p);
}
}
String servername = e.getPlayer().getServer().getInfo().getName();
List<String> svs = config.getStringList("queue-servers");
for(String s : svs) {
if(!s.contains(":")) continue;
String[] parts = s.split("\\:");
String from = parts[0];
String to = parts[1];
if(from.equalsIgnoreCase(servername)) {
man.addToQueue(p, to);
}
}
}
@EventHandler
public void onLeave(PlayerDisconnectEvent e) {
ProxiedPlayer p = e.getPlayer();
Server server = man.findPlayerInQueue(p);
if(server != null) {
server.getQueue().remove(p);
}
}
@EventHandler
public void onFailedMove(ServerKickEvent e) {
ProxiedPlayer p = e.getPlayer();
Server server = man.findPlayerInQueue(p);
if(server == null) return;
if(!(e.getKickedFrom().equals(server.getInfo()))) return;
if(server.getQueue().indexOf(p) != 0) return;
List<String> kickreasons = config.getStringList("kick-reasons");
boolean hasReason = false;
//getLogger().info(e.getKickReasonComponent());
for(String reason : kickreasons) {
for(BaseComponent b : e.getKickReasonComponent()) {
if(b.toPlainText().toLowerCase().contains(reason)) {
hasReason = true;
break;
}
}
if(hasReason) break;
}
if(!hasReason) return;
server.getQueue().remove(p);
}
@EventHandler
public void onMessage(PluginMessageEvent e) {
//getLogger().info("Recieved message of "+e.getTag());
if(!e.getTag().equals("ajqueue:tobungee")) return;
DataInputStream in = new DataInputStream(new ByteArrayInputStream(e.getData()));
try {
String subchannel = in.readUTF();
ProxiedPlayer player = (ProxiedPlayer) e.getReceiver();
if(subchannel.equals("queue")) {
String data = in.readUTF();
man.addToQueue(player, data);
}
if(subchannel.equals("queuename")) {
BungeeUtils.sendCustomData(player, "queuename", man.getQueuedName(player));
}
if(subchannel.equals("position")) {
Server server = man.findPlayerInQueue(player);
String pos = msgs.get("placeholders.position.none");
if(server != null) {
pos = server.getQueue().indexOf(player)+1+"";
}
BungeeUtils.sendCustomData(player, "position", pos);
}
if(subchannel.equals("positionof")) {
Server server = man.findPlayerInQueue(player);
String pos = msgs.get("placeholders.position.none");
if(server != null) {
pos = server.getQueue().size()+"";
}
BungeeUtils.sendCustomData(player, "positionof", pos);
}
if(subchannel.equals("inqueue")) {
Server server = man.findPlayerInQueue(player);
BungeeUtils.sendCustomData(player, "inqueue", (server != null)+"");
}
} catch (IOException e1) {
getLogger().warning("An error occured while reading data from spigot side:");
e1.printStackTrace();
}
}
}