Advertisement
101dogg

Untitled

Feb 9th, 2017
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.24 KB | None | 0 0
  1. import com.google.common.collect.Lists;
  2. import com.google.common.collect.Maps;
  3. import me.catcoder.core.api.Bukkit;
  4. import me.catcoder.core.api.Bungee;
  5. import me.catcoder.core.api.CoreServer;
  6. import me.catcoder.core.api.Player;
  7. import me.catcoder.core.api.command.ConsoleCommandSender;
  8. import me.catcoder.core.api.event.PlayerLeaveEvent;
  9. import me.catcoder.core.api.event.PlayerLoginEvent;
  10. import me.catcoder.core.api.logger.CoreLogger;
  11. import me.catcoder.core.api.logger.LoggingOutputStream;
  12. import me.catcoder.core.api.plugin.Plugin;
  13. import me.catcoder.core.api.plugin.PluginManager;
  14. import me.catcoder.core.api.scheduler.CoreScheduler;
  15. import me.catcoder.core.api.service.ServiceManager;
  16. import me.catcoder.core.api.service.SimpleServiceManager;
  17. import me.catcoder.core.connection.PlayerImpl;
  18. import me.catcoder.core.network.ConnectionsListener;
  19. import me.catcoder.core.packets.bungee.PlayerConnect;
  20. import me.catcoder.core.util.NetUtils;
  21. import jline.console.ConsoleReader;
  22. import org.fusesource.jansi.AnsiConsole;
  23.  
  24. import javax.crypto.SecretKey;
  25. import java.io.File;
  26. import java.io.IOException;
  27. import java.io.PrintStream;
  28. import java.util.ArrayList;
  29. import java.util.Collection;
  30. import java.util.Map;
  31. import java.util.concurrent.TimeUnit;
  32. import java.util.concurrent.locks.ReadWriteLock;
  33. import java.util.concurrent.locks.ReentrantReadWriteLock;
  34. import java.util.logging.Handler;
  35. import java.util.logging.Level;
  36. import java.util.logging.Logger;
  37.  
  38. /**
  39. * Created by CatCoder on 04.01.2017 21:56.
  40. * Project: Cat
  41. */
  42. public class Core extends CoreServer {
  43.  
  44.  
  45. private final PluginManager pluginManager;
  46. private final File pluginsFolder = new File("plugins");
  47. private final CoreScheduler scheduler = new CoreScheduler();
  48. private final ConsoleCommandSender sender = new ConsoleCommandSender();
  49. private final ReadWriteLock connectionLock = new ReentrantReadWriteLock();
  50. private final ServiceManager serviceManager = new SimpleServiceManager();
  51. private Logger logger;
  52. private ConnectionsListener listener;
  53. private CoreConfiguration configuration;
  54. private SecretKey secretKey;
  55. private Map<String, Player> playerMap = Maps.newConcurrentMap();
  56. private ConsoleReader reader;
  57. private volatile boolean running;
  58.  
  59.  
  60. public Core() throws IOException {
  61. setInstance(this);
  62. this.reader = new ConsoleReader();
  63. this.reader.setExpandEvents(false);
  64. AnsiConsole.systemInstall();
  65.  
  66. this.logger = new CoreLogger(this);
  67.  
  68. System.setOut(new PrintStream(new LoggingOutputStream(this.logger, Level.INFO), true));
  69. System.setErr(new PrintStream(new LoggingOutputStream(this.logger, Level.SEVERE), true));
  70.  
  71. this.logger.info("Initializing Core version " + getVersion() + " by CatCoder");
  72.  
  73. this.configuration = new CoreConfiguration("config.yml");
  74.  
  75. //this.serviceManager.setProvider(DummyPlugin.INSTANCE, GroupService.class, new SimpleGroupProvider());
  76.  
  77. this.secretKey = NetUtils.generateKey();
  78. this.pluginManager = new PluginManager(this);
  79. this.listener = new ConnectionsListener(configuration.getPort(), configuration.getAddress(), configuration.getThreads());
  80. this.pluginsFolder.mkdir();
  81. this.pluginManager.registerNativeCommands();
  82. this.pluginManager.detectPlugins(this.getPluginsFolder());
  83. this.pluginManager.loadPlugins();
  84.  
  85. }
  86.  
  87. @Override
  88. public int getOnline() {
  89. int sum = 0;
  90. for (Bungee bungee : Bungee.getConnections().values()) {
  91. sum += bungee.getOnline();
  92. }
  93. return sum;
  94. }
  95.  
  96. @Override
  97. public String getVersion() {
  98. return "1.2";
  99. }
  100.  
  101. public ConsoleReader getReader() {
  102. return reader;
  103. }
  104.  
  105. @Override
  106. public PluginManager getPluginManager() {
  107. return this.pluginManager;
  108. }
  109.  
  110. @Override
  111. public Logger getLogger() {
  112. return logger;
  113. }
  114.  
  115. @Override
  116. public SecretKey getSecretKey() {
  117. return secretKey;
  118. }
  119.  
  120. @Override
  121. public boolean isRunning() {
  122. return this.running;
  123. }
  124.  
  125. @Override
  126. public String getName() {
  127. return "Core";
  128. }
  129.  
  130. @Override
  131. public void start() throws Exception {
  132. if (isRunning()) return;
  133.  
  134. this.pluginManager.enablePlugins();
  135. this.getLogger().info(String.format("[PluginManager] Plugins enabled (%s)", this.pluginManager.getPlugins().size()));
  136. this.running = true;
  137.  
  138. this.listener.bind();
  139. listener.getGroup().execute(() -> {
  140. String line;
  141. try {
  142. while (isRunning() && (line = reader.readLine("> ")) != null) {
  143. if (!getPluginManager().dispatchCommand(getConsole(), line)) {
  144. getConsole().sendMessage("Command not found.");
  145. }
  146. }
  147. } catch (IOException e) {
  148. e.printStackTrace();
  149. }
  150. });}
  151.  
  152. @Override
  153. public CoreConfiguration getConfiguration() {
  154. return configuration;
  155. }
  156.  
  157. public void addPlayer(PlayerConnect packet, Bungee bungee) {
  158. connectionLock.writeLock().lock();
  159. try {
  160. Player player = new PlayerImpl(288, packet.getName(), packet.getIp(), bungee);
  161. PlayerLoginEvent event = new PlayerLoginEvent(player);
  162. getPluginManager().callEvent(event);
  163. if (event.getResult() == PlayerLoginEvent.Result.DENIED) {
  164. player.kick(event.getReason() == null ? "Причина не указана." : event.getReason());
  165. return;
  166. }
  167. getLogger().info("Player connect -> " + player.getName());
  168. playerMap.put(player.getName(), player);
  169. } finally {
  170. connectionLock.writeLock().unlock();
  171. }
  172. }
  173.  
  174. public void removePlayer(String name) {
  175. connectionLock.writeLock().lock();
  176. try {
  177. getPluginManager().callEvent(new PlayerLeaveEvent(playerMap.get(name)));
  178. playerMap.remove(name);
  179. getLogger().info("Player disconnect -> " + name);
  180. } finally {
  181. connectionLock.writeLock().unlock();
  182. }
  183. }
  184.  
  185. @Override
  186. public Player getPlayer(String name) {
  187. connectionLock.readLock().lock();
  188. try {
  189. return playerMap.get(name);
  190. } finally {
  191. connectionLock.readLock().unlock();
  192. }
  193. }
  194.  
  195. @Override
  196. public Collection<Player> getPlayers() {
  197. connectionLock.readLock().lock();
  198. try {
  199. return playerMap.values();
  200. } finally {
  201. connectionLock.readLock().unlock();
  202. }
  203. }
  204.  
  205. @Override
  206. public void shutdown(String reason) {
  207. getLogger().info("Stopping: " + reason);
  208. new Thread("Shutdown thread") {
  209. @Override
  210. public void run() {
  211. Core.this.running = false;
  212. getLogger().info("Closing all player connections");
  213.  
  214. for (Player player : playerMap.values()) {
  215. player.kick(reason);
  216. }
  217. playerMap.clear();
  218.  
  219. closeListener();
  220.  
  221. getLogger().info("Closing IO threads");
  222. listener.getGroup().shutdownGracefully();
  223.  
  224. try {
  225. listener.getGroup().awaitTermination(2, TimeUnit.SECONDS);
  226. } catch (InterruptedException e) {
  227. }
  228.  
  229.  
  230. getLogger().info("Closing bukkit/bungee connections");
  231.  
  232. for (Bungee bungee : Bungee.getConnections().values()) bungee.getChannel().close();
  233. for (Bukkit bukkit : Bukkit.getConnections().values()) bukkit.getChannel().close();
  234.  
  235. getLogger().info("Disabling plugins");
  236.  
  237. for (Plugin plugin : Lists.reverse(new ArrayList<>(getPluginManager().getPlugins()))) {
  238. try {
  239. plugin.onDisable();
  240. for (Handler handler : plugin.getLogger().getHandlers()) handler.close();
  241. } catch (Throwable ex) {
  242. getLogger().log(Level.SEVERE, "Exception while disabling plugin " + plugin.getDescription().getName(),
  243. ex);
  244. }
  245. getScheduler().cancel(plugin);
  246. plugin.getExecutorService().shutdownNow();
  247. }
  248. getLogger().info("I'm killed. :(");
  249. for (Handler handler : getLogger().getHandlers()) handler.close();
  250. System.exit(0);
  251. }
  252. }.start();
  253. }
  254.  
  255.  
  256. private void closeListener() {
  257. this.listener.getSelf().close().syncUninterruptibly();
  258. getLogger().log(Level.INFO, "Closed listener {0}", listener.getSelf());
  259. }
  260.  
  261. @Override
  262. public CoreScheduler getScheduler() {
  263. return scheduler;
  264. }
  265.  
  266. @Override
  267. public File getPluginsFolder() {
  268. return this.pluginsFolder;
  269. }
  270.  
  271. @Override
  272. public ConsoleCommandSender getConsole() {
  273. return this.sender;
  274. }
  275.  
  276. @Override
  277. public ServiceManager getServiceManager() {
  278. return serviceManager;
  279. }
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement