Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.07 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement