Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
1package com.legacyminecraft.poseidon;
2
3import com.legacyminecraft.poseidon.utility.PoseidonVersionChecker;
4import com.legacyminecraft.poseidon.watchdog.WatchDogThread;
5import com.projectposeidon.johnymuffin.UUIDManager;
6import net.minecraft.server.MinecraftServer;
7import net.minecraft.server.NetServerHandler;
8import org.bukkit.Bukkit;
9import org.bukkit.craftbukkit.CraftServer;
10
11import java.io.IOException;
12import java.io.InputStream;
13import java.util.ArrayList;
14import java.util.Arrays;
15import java.util.List;
16import java.util.Properties;
17import java.util.logging.Logger;
18
19public final class PoseidonServer {
20 private final MinecraftServer server;
21 private final CraftServer craftServer;
22
23 private final List<String> hiddenCommands = new ArrayList<>();
24 private final Properties versionProperties = new Properties();
25
26 private boolean serverInitialized = false;
27
28 private PoseidonVersionChecker poseidonVersionChecker;
29 private WatchDogThread watchDogThread;
30
31 public PoseidonServer(MinecraftServer server, CraftServer craftServer) {
32 this.server = server;
33 this.craftServer = craftServer;
34
35 loadVersionProperties();
36
37 addHiddenCommands(Arrays.asList("login", "l", "register", "reg", "unregister", "changepassword", "changepw"));
38 }
39
40 private void loadVersionProperties() {
41 try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("version.properties")) {
42 if (inputStream != null) {
43 versionProperties.load(inputStream);
44 }
45 } catch (IOException e) {
46 getLogger().warning("Failed to load version.properties: " + e.getMessage());
47 }
48 }
49
50 public void initializeServer() {
51 if (serverInitialized) {
52 throw new UnsupportedOperationException("Server already initialized");
53 }
54
55 getLogger().info("[Poseidon] Starting Project Poseidon Modules!");
56
57 PoseidonConfig.getInstance();
58 UUIDManager.getInstance();
59
60 initializeUpdateChecker();
61
62 //Start Watchdog
63 watchDogThread = new WatchDogThread(Thread.currentThread());
64 if (PoseidonConfig.getInstance().getBoolean("settings.enable-watchdog", true)) {
65 getLogger().info("[Poseidon] Starting Watchdog to detect any server hangs!");
66 watchDogThread.start();
67 watchDogThread.tickUpdate();
68 }
69
70 serverInitialized = true;
71 getLogger().info("[Poseidon] Finished loading Project Poseidon Modules!");
72 }
73
74 private void initializeUpdateChecker() {
75 if (!PoseidonConfig.getInstance().getConfigBoolean("settings.update-checker.enabled", true)) {
76 getLogger().info("[Poseidon] Version checker disabled. The server will not check for updates.");
77 return;
78 }
79
80 String releaseVersion = getReleaseVersion();
81
82 if (releaseVersion == null) {
83 getLogger().warning("[Poseidon] Version checker is disabled as no version.properties file was found.");
84 return;
85 }
86
87 if (!getBuildType().equalsIgnoreCase("production")) {
88 getLogger().warning("[Poseidon] Version checker is disabled as this is a " + getBuildType() + " build. The updater will only check for updates on production builds.");
89 return;
90 }
91
92 poseidonVersionChecker = new PoseidonVersionChecker(craftServer, releaseVersion);
93
94 getLogger().info("[Poseidon] Version checker enabled. The server will check for updates every hour.");
95 // Run the version checker in a separate thread every hour
96 Bukkit.getScheduler().scheduleSyncRepeatingTask(new PoseidonPlugin(), new Runnable() {
97 @Override
98 public void run() {
99 poseidonVersionChecker.fetchLatestVersion();
100 }
101 }, 0, 20 * 60 * 60);
102 }
103
104 public void shutdownServer() {
105 if (!serverInitialized) {
106 throw new UnsupportedOperationException("Server not initialized");
107 }
108
109 getLogger().info("[Poseidon] Stopping Project Poseidon Modules!");
110
111 UUIDManager.getInstance().saveJsonArray();
112
113 if (watchDogThread != null) {
114 getLogger().info("[Poseidon] Stopping Watchdog!");
115 watchDogThread.interrupt();
116 }
117
118 serverInitialized = false;
119 getLogger().info("[Poseidon] Finished unloading Project Poseidon Modules!");
120 }
121
122 public Logger getLogger() {
123 return MinecraftServer.log;
124 }
125
126 public String getAppName() {
127 return versionProperties.getProperty("app_name", "Unknown");
128 }
129
130 public String getReleaseVersion() {
131 return versionProperties.getProperty("release_version", "Unknown");
132 }
133
134 public String getMavenVersion() {
135 return versionProperties.getProperty("maven_version", "Unknown");
136 }
137
138 public String getBuildTimestamp() {
139 return versionProperties.getProperty("build_timestamp", "Unknown");
140 }
141
142 public String getGitCommit() {
143 return versionProperties.getProperty("git_commit", "Unknown");
144 }
145
146 public String getBuildType() {
147 return versionProperties.getProperty("build_type", "Unknown");
148 }
149
150 public boolean isUpdateAvailable() {
151 return poseidonVersionChecker != null && poseidonVersionChecker.isUpdateAvailable();
152 }
153
154 public String getNewestVersion() {
155 return poseidonVersionChecker == null ? "Unknown" : poseidonVersionChecker.getLatestVersion();
156 }
157
158 public WatchDogThread getWatchDogThread() {
159 return watchDogThread;
160 }
161
162 /**
163 * Returns the current hide state of the command from param (Hide from console)
164 *
165 * @param cmdName Command name
166 * @return True if the command from param is hidden and false otherwise
167 */
168 public boolean isCommandHidden(String cmdName) {
169 return hiddenCommands.contains(cmdName.toLowerCase());
170 }
171
172
173 /**
174 * Hides the command from param from being logged to server console
175 *
176 * @param cmd Command name
177 */
178 public void addHiddenCommand(String cmd) {
179 cmd = cmd.toLowerCase();
180
181 if (hiddenCommands.contains(cmd)) {
182 Logger.getLogger(NetServerHandler.class.getName()).warning("List of Hidden commands already contains " + cmd);
183 return;
184 }
185
186 hiddenCommands.add(cmd);
187 }
188
189 /**
190 * Hides the commands from param from being logged to server console
191 *
192 * @param commands List of command names
193 */
194 public void addHiddenCommands(List<String> commands) {
195 for (String cmd : commands) {
196 addHiddenCommand(cmd);
197 }
198 }
199
200}