SHARE
TWEET

Untitled

a guest Aug 22nd, 2019 86 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  *
  3.  * *
  4.  *  *
  5.  *  * © Stelch Games 2019, distribution is strictly prohibited
  6.  *  *
  7.  *  * Changes to this file must be documented on push.
  8.  *  * Unauthorised changes to this file are prohibited.
  9.  *  *
  10.  *  * @author Ryan Wood
  11.  *  * @since 14/7/2019
  12.  *
  13.  */
  14.  
  15. package com.stelch.games2.core;
  16.  
  17. import com.stelch.games2.core.Commands.bungee.hub;
  18. import com.stelch.games2.core.Commands.bungee.servers;
  19. import com.stelch.games2.core.Events.bungee.*;
  20. import com.stelch.games2.core.Utils.JedisUtils;
  21. import net.md_5.bungee.api.ProxyServer;
  22. import net.md_5.bungee.api.config.ServerInfo;
  23. import net.md_5.bungee.api.plugin.Plugin;
  24. import net.md_5.bungee.api.plugin.PluginManager;
  25. import redis.clients.jedis.Jedis;
  26. import redis.clients.jedis.JedisPool;
  27.  
  28. import java.net.InetSocketAddress;
  29. import java.util.*;
  30. import java.util.concurrent.TimeUnit;
  31.  
  32. public class BungeeCore extends Plugin {
  33.  
  34.     public static JedisPool pool;
  35.  
  36.     public static HashMap<String, GameServer> servers=new HashMap<>();
  37.     public static HashMap<String, HashMap<Integer,String>> category_servers = new HashMap<>();
  38.  
  39.     @Override
  40.     public void onEnable() {
  41.          /*
  42.          * Define Plugin Manager
  43.          */
  44.         PluginManager pm = getProxy().getPluginManager();
  45.  
  46.         /*
  47.          * Register commands
  48.          */
  49.         pm.registerCommand(this,new servers());
  50.         pm.registerCommand(this,new hub());
  51.  
  52.         /*
  53.          * Register BungeeCord Events
  54.          */
  55.  
  56.         getProxy().getPluginManager().registerListener(this,new playerChangeServer());
  57.         getProxy().getPluginManager().registerListener(this,new playerJoin());
  58.         getProxy().getPluginManager().registerListener(this,new playerKick());
  59.         getProxy().getPluginManager().registerListener(this,new playerLeave());
  60.         getProxy().getPluginManager().registerListener(this,new proxyPing());
  61.  
  62.         /**
  63.          * Connect Jedis client to Redis server
  64.          */
  65.         JedisUtils.init(pool,this);
  66.  
  67.         /**
  68.          * Start BungeeServer handler
  69.          */
  70.         servers();
  71.     }
  72.  
  73.     private void servers() {
  74.         getProxy().getScheduler().schedule(this, new Runnable() {
  75.             @Override
  76.             public void run() {
  77.                 ArrayList<String> new_uuid = new ArrayList<>();
  78.                 for(Map.Entry<String,GameServer> serverPayload : getServers().entrySet()){
  79.                     new_uuid.add(serverPayload.getValue().uuid);
  80.                     GameServer server = serverPayload.getValue();
  81.                     if(server.ip==null)continue;
  82.                     if(servers.containsKey(server.uuid)){
  83.                         if((Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis()-server.lastPoll)>6000||server.lastPoll==0){
  84.                             try(Jedis jedis = pool.getResource()){
  85.                                 System.out.println(String.format("REMOVED DEAD SERVER [NAME %s]",server.name));
  86.                                 jedis.del(String.format("SERVER|%s|name",server.uuid));
  87.                                 jedis.del(String.format("SERVER|%s|ipport",server.uuid));
  88.                                 jedis.del(String.format("SERVER|%s|playercount",server.uuid));
  89.                                 jedis.del(String.format("SERVER|%s|game",server.uuid));
  90.                                 jedis.del(String.format("SERVER|%s|state",server.uuid));
  91.                                 jedis.del(String.format("SERVER|%s|last_poll",server.uuid));
  92.                                 category_servers.get(server.type).remove(server.id);
  93.                                 ProxyServer.getInstance().getServers().remove(server.getName());
  94.                                 servers.remove(server.uuid);
  95.                             }
  96.                         }
  97.                         continue;
  98.                     }
  99.  
  100.                     int server_id = getLowestIdOfGroup(server.getType());
  101.                     if(!(category_servers.get(server.getType()).containsValue(server.uuid))){
  102.                         category_servers.get(server.getType()).put(server_id,server.uuid);
  103.                     }
  104.                     String name = server.getType()+server_id;
  105.                     System.out.println(String.format("ADDED NEW SERVER [NAME %s]",name));
  106.                     try(Jedis jedis = pool.getResource()){
  107.                         jedis.set(String.format("SERVER|%s|name",server.uuid),name);
  108.                     }
  109.                     server.setId(server_id);
  110.                     server.setName(name);
  111.                     ProxyServer.getInstance().getServers().put(name,server.build());
  112.                     servers.put(server.uuid,server);
  113.                 }
  114.                 for(GameServer server : servers.values()){
  115.                     System.out.println(new_uuid);
  116.                     if(!(new_uuid.contains(server.uuid))){
  117.                         System.out.println(String.format("REMOVED DEAD SERVER [NAME %s]",server.name));
  118.                         category_servers.get(server.type).remove(server.id);
  119.                         ProxyServer.getInstance().getServers().remove(server.getName());
  120.                         servers.remove(server.uuid);
  121.                     }
  122.                 }
  123.  
  124.             }
  125.         },1,2, TimeUnit.SECONDS);
  126.     }
  127.  
  128.     /**
  129.      *
  130.      * @return UUID, GameServer object
  131.      */
  132.     private HashMap<String, GameServer> getServers() {
  133.         HashMap<String, GameServer> gameServers = new HashMap<>();
  134.  
  135.         try (Jedis jedis = pool.getResource()){
  136.             Set<String> servers = jedis.keys("SERVER|*");
  137.             Iterator<String> iterator = servers.iterator();
  138.             while(iterator.hasNext()){
  139.                 String argument = iterator.next();
  140.                 String[] args = argument.split("[|]");
  141.                 String uuid = args[1];
  142.                 String field = args[2];
  143.                 String data = jedis.get(argument);
  144.                 GameServer server;
  145.                 if(gameServers.containsKey(uuid)){server=gameServers.get(uuid);}else{server=new GameServer(uuid);gameServers.put(uuid,server);}
  146.  
  147.                 switch(field.toUpperCase()){
  148.                     case "NAME":
  149.                         server.setName(data.toUpperCase());
  150.                         break;
  151.                     case "IPPORT":
  152.                         String[] i = data.split("[:]");
  153.                         server.setIp(i[0]);
  154.                         server.setPort(Integer.parseInt(i[1]));
  155.                         break;
  156.                     case "GAME":
  157.                         server.setGame(data);
  158.                         break;
  159.                     case "TYPE":
  160.                         addCategoryIfDoesntExist(data.toUpperCase());
  161.                         server.setType(data.toUpperCase());
  162.                         break;
  163.                     case "PLAYERCOUNT":
  164.                         server.setPlayercount(Integer.valueOf(data));
  165.                         break;
  166.                     case "LAST_POLL":
  167.                         server.setLastPoll(data);
  168.                         break;
  169.                 }
  170.                 gameServers.put(uuid,server);
  171.             }
  172.         }
  173.         return gameServers;
  174.     }
  175.  
  176.     private int getLowestIdOfGroup(String group){
  177.         if(category_servers.containsKey(group.toUpperCase())){
  178.             ArrayList<Integer> server_ids = new ArrayList<>();
  179.             for(Map.Entry<Integer, String> payload : category_servers.get(group.toUpperCase()).entrySet()) server_ids.add(payload.getKey());
  180.             for(int i=1;i<99;i++)
  181.                 if(!(server_ids.contains(i)))return i;
  182.             return 0;
  183.         }else
  184.             return 0;
  185.     }
  186.  
  187.     private void addCategoryIfDoesntExist(String catName){
  188.         if(!(category_servers.containsKey(catName))){
  189.             category_servers.put(catName,new HashMap<>());
  190.         }
  191.     }
  192.  
  193.     public class GameServer {
  194.         private String uuid;
  195.         private String name = null;
  196.         private String state;
  197.         private String type;
  198.         private String game;
  199.         private String ip;
  200.         private long lastPoll=0;
  201.         private ServerInfo serverInfo=null;
  202.         private int id;
  203.         private int port;
  204.         private int playercount;
  205.  
  206.         public GameServer(String uuid) {
  207.             this.uuid = uuid;
  208.         }
  209.  
  210.         public void setLastPoll(String pollTime){
  211.             this.lastPoll=Long.valueOf(pollTime);
  212.         }
  213.  
  214.         public void setGame(String game) {
  215.             this.game = game;
  216.         }
  217.  
  218.         public void setType(String type) {
  219.             if (!category_servers.containsKey(type.toUpperCase())) {
  220.                 category_servers.put(type.toUpperCase(), new HashMap<>());
  221.             }
  222.             this.type = type;
  223.         }
  224.  
  225.         public String getType() {
  226.             return type != null ? type : "undefined";
  227.         }
  228.  
  229.         public void setPlayercount(int playercount) {
  230.             this.playercount = playercount;
  231.         }
  232.  
  233.         public void setName(String name) {
  234.             this.name = name;
  235.         }
  236.  
  237.         public void setIp(String ip) {
  238.             this.ip = ip;
  239.         }
  240.  
  241.         public void setPort(int port) {
  242.             this.port = port;
  243.         }
  244.  
  245.         public void setState(String state) {
  246.             this.state = state;
  247.         }
  248.  
  249.         public String getUuid() {
  250.             return uuid;
  251.         }
  252.  
  253.         public String getName() {
  254.             return name;
  255.         }
  256.  
  257.         public String getIp() {
  258.             return ip;
  259.         }
  260.  
  261.         public long getLastPoll() {
  262.             return lastPoll;
  263.         }
  264.  
  265.         public String getState() {
  266.             return state;
  267.         }
  268.  
  269.         public String getGame() {
  270.             return game;
  271.         }
  272.  
  273.         public int getId() {
  274.             return id;
  275.         }
  276.  
  277.         public void setId(int id) {
  278.             this.id = id;
  279.         }
  280.  
  281.         public ServerInfo getServerInfo() {
  282.             return serverInfo;
  283.         }
  284.  
  285.         public ServerInfo build() {
  286.             if (this.ip == null) {
  287.                 System.out.println("FAILED BUILDING BUNGEE SERVER [NoIP]");
  288.                 return null;
  289.             }
  290.             this.serverInfo=((this.serverInfo==null)?ProxyServer.getInstance().constructServerInfo(this.name, InetSocketAddress.createUnresolved(this.ip, this.port), this.game, false):this.serverInfo);
  291.             return this.serverInfo;
  292.         }
  293.     }
  294.  
  295. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top