Server.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package me.km;
  2. import me.hammerle.snuviscript.code.ISnuviLogger;
  3. import me.hammerle.snuviscript.config.SnuviConfig;
  4. import me.kcm.Hooks;
  5. import me.km.databank.DataBank;
  6. import me.km.events.CustomEventCaller;
  7. import me.km.permissions.ModCommandManager;
  8. import me.km.permissions.Permissions;
  9. import me.km.playerbank.DummyPlayerBank;
  10. import me.km.playerbank.IPlayerBank;
  11. import me.km.playerbank.PlayerBank;
  12. import me.km.playerbank.PlayerManager;
  13. import me.km.plots.ProtectionEvents;
  14. import me.km.plots.WorldPlotMap;
  15. import me.km.scheduler.SnuviScheduler;
  16. import me.km.snuviscript.SnuviLogger;
  17. import me.km.utils.ReflectionUtils;
  18. import net.minecraft.server.dedicated.DedicatedServer;
  19. import net.minecraftforge.api.distmarker.Dist;
  20. import net.minecraftforge.api.distmarker.OnlyIn;
  21. import net.minecraftforge.common.MinecraftForge;
  22. import me.km.snuviscript.CommandScript;
  23. import me.km.snuviscript.MinecraftFunctions;
  24. import me.km.snuviscript.ScriptEvents;
  25. import me.km.snuviscript.Scripts;
  26. import java.io.InputStream;
  27. import java.net.ServerSocket;
  28. import java.net.Socket;
  29. import java.security.InvalidKeyException;
  30. import java.security.KeyFactory;
  31. import java.security.NoSuchAlgorithmException;
  32. import java.security.PrivateKey;
  33. import java.security.spec.PKCS8EncodedKeySpec;
  34. import java.util.Base64;
  35. import javax.crypto.BadPaddingException;
  36. import javax.crypto.Cipher;
  37. import javax.crypto.IllegalBlockSizeException;
  38. import javax.crypto.NoSuchPaddingException;
  39. import org.lwjgl.system.CallbackI.S;
  40. @OnlyIn(Dist.DEDICATED_SERVER)
  41. public class Server {
  42. private static SnuviLogger logger;
  43. private static ModCommandManager commands;
  44. private static DedicatedServer server;
  45. private static SnuviScheduler scheduler;
  46. private static DataBank databank;
  47. private static Scripts scripts;
  48. public static ScriptEvents scriptEvents;
  49. private static WorldPlotMap plotMap;
  50. private static volatile boolean isRunning = true;
  51. private static ServerSocket votifierSocket = null;
  52. private static Thread votifierAccept = null;
  53. private static PrivateKey privateKey = null;
  54. public static PrivateKey getPrivateKey(String base64) {
  55. try {
  56. PKCS8EncodedKeySpec keySpec =
  57. new PKCS8EncodedKeySpec(Base64.getDecoder().decode(base64.getBytes()));;
  58. return KeyFactory.getInstance("RSA").generatePrivate(keySpec);
  59. } catch(Exception e) {
  60. e.printStackTrace();
  61. }
  62. return null;
  63. }
  64. public static String decrypt(byte[] data, PrivateKey privateKey) throws Exception {
  65. Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
  66. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  67. return new String(cipher.doFinal(data));
  68. }
  69. private static void startVotifier(String pKey) {
  70. privateKey = getPrivateKey(pKey);
  71. if(privateKey == null) {
  72. return;
  73. }
  74. try {
  75. votifierSocket = new ServerSocket(12345);
  76. votifierAccept = new Thread(() -> {
  77. while(isRunning) {
  78. try {
  79. Socket client = votifierSocket.accept();
  80. InputStream in = client.getInputStream();
  81. byte[] data = new byte[256];
  82. for(int i = 0; i < 256; i++) {
  83. data[i] = (byte) in.read();
  84. }
  85. String[] s = decrypt(data, privateKey).split("\n");
  86. scheduler.scheduleTask(() -> {
  87. scriptEvents.onVote(s);
  88. });
  89. } catch(Exception ex) {
  90. if(!votifierSocket.isClosed()) {
  91. ex.printStackTrace();
  92. }
  93. }
  94. }
  95. });
  96. votifierAccept.start();
  97. logger.print("votifier started");
  98. } catch(Exception ex) {
  99. logger.print("------------------------------------------------");
  100. logger.print("cannot start votifier socket");
  101. logger.print("------------------------------------------------");
  102. ex.printStackTrace();
  103. }
  104. }
  105. public static void onStart(DedicatedServer serverIn) {
  106. server = serverIn;
  107. logger = new SnuviLogger();
  108. SnuviConfig conf = new SnuviConfig("", "config");
  109. if(conf.exists()) {
  110. conf.load(null);
  111. }
  112. boolean debug = conf.getBoolean(null, "debug", false);
  113. // permissions
  114. Permissions perms = new Permissions(debug);
  115. logger.setPlayerLoggingData(server, perms);
  116. if(debug) {
  117. logger.print("------------------------------------------------");
  118. logger.print("Starting server in debug mode");
  119. logger.print("------------------------------------------------");
  120. }
  121. // scheduler
  122. scheduler = new SnuviScheduler(logger);
  123. // scripts
  124. scripts = new Scripts(logger, scheduler);
  125. scriptEvents = new ScriptEvents(scripts, server);
  126. Hooks.setBlockHarvest(scriptEvents);
  127. Hooks.setCraft(scriptEvents);
  128. MinecraftForge.EVENT_BUS.register(scriptEvents);
  129. // command manager
  130. commands = new ModCommandManager(perms, scriptEvents, scripts, scheduler);
  131. ReflectionUtils.setCommandManager(server, commands);
  132. commands.registerCommand(new CommandScript(scripts));
  133. // data base connection
  134. databank = new DataBank(logger, conf.getString(null, "user", "root"),
  135. conf.getString(null, "password", ""));
  136. if(!databank.openDataBankConnection()) {
  137. logger.print("------------------------------------------------");
  138. logger.print("Starting server with dummy databank");
  139. logger.print("------------------------------------------------");
  140. }
  141. databank.startReconnecting(scheduler);
  142. // protections
  143. plotMap = new WorldPlotMap();
  144. scheduler.scheduleTask(() -> plotMap.read(server, logger));
  145. long time = 20 * 60 * 30; // all 30 minutes
  146. scheduler.scheduleRepeatingTask(() -> plotMap.save(), time, time);
  147. // block protections / player manager
  148. IPlayerBank playerBank;
  149. if(databank.isDummyDatabank()) {
  150. playerBank = new DummyPlayerBank();
  151. } else {
  152. playerBank = new PlayerBank(databank);
  153. }
  154. MinecraftForge.EVENT_BUS.register(new ProtectionEvents(plotMap, perms));
  155. PlayerManager playerManager = new PlayerManager(logger, playerBank);
  156. MinecraftForge.EVENT_BUS.register(playerManager);
  157. CustomEventCaller customEventCaller = new CustomEventCaller(server, scheduler);
  158. scripts.setCustomEventCaller(customEventCaller);
  159. MinecraftForge.EVENT_BUS.register(customEventCaller);
  160. // scripts
  161. MinecraftFunctions.registerFunctions(scripts.getScriptManager(), scripts, perms, scheduler,
  162. server, playerBank, customEventCaller, databank, plotMap, commands);
  163. scheduler.scheduleTask(() -> scripts.startScript(null, "startscript"));
  164. startVotifier(conf.getString(null, "pkey"));
  165. }
  166. public static void onStop() {
  167. scripts.startScript("endscript");
  168. scheduler.stop();
  169. databank.closeDataBankConnection();
  170. isRunning = false;
  171. try {
  172. if(votifierSocket != null) {
  173. votifierSocket.close();
  174. votifierAccept.join(1000);
  175. }
  176. } catch(Exception ex) {
  177. ex.printStackTrace();
  178. }
  179. }
  180. public static ISnuviLogger getLogger() {
  181. return logger;
  182. }
  183. }