Grasscutter.java 5.3 KB
Newer Older
Melledy's avatar
Melledy committed
1
2
3
4
5
6
7
8
package emu.grasscutter;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
9
import java.util.Calendar;
Melledy's avatar
Melledy committed
10

Jaida Wu's avatar
Jaida Wu committed
11
import emu.grasscutter.command.CommandMap;
KingRainbow44's avatar
KingRainbow44 committed
12
import emu.grasscutter.plugin.PluginManager;
KingRainbow44's avatar
KingRainbow44 committed
13
import emu.grasscutter.plugin.api.ServerHook;
14
import emu.grasscutter.scripts.ScriptLoader;
KingRainbow44's avatar
KingRainbow44 committed
15
import emu.grasscutter.utils.Utils;
Melledy's avatar
Melledy committed
16
import org.reflections.Reflections;
Melledy's avatar
Melledy committed
17
18
19
20
21
22
23
24
25
26
27
28
29
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import ch.qos.logback.classic.Logger;
import emu.grasscutter.data.ResourceLoader;
import emu.grasscutter.database.DatabaseManager;
import emu.grasscutter.server.dispatch.DispatchServer;
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.tools.Tools;
import emu.grasscutter.utils.Crypto;

KingRainbow44's avatar
KingRainbow44 committed
30
31
public final class Grasscutter {
	private static final Logger log = (Logger) LoggerFactory.getLogger(Grasscutter.class);
Melledy's avatar
Melledy committed
32
33
	private static Config config;
	
KingRainbow44's avatar
KingRainbow44 committed
34
35
	private static final Gson gson = new GsonBuilder().setPrettyPrinting().create();
	private static final File configFile = new File("./config.json");
Melledy's avatar
Melledy committed
36
	
37
38
	private static int day; // Current day of week
	
Melledy's avatar
Melledy committed
39
40
	private static DispatchServer dispatchServer;
	private static GameServer gameServer;
KingRainbow44's avatar
KingRainbow44 committed
41
	private static PluginManager pluginManager;
Melledy's avatar
Melledy committed
42
	
KingRainbow44's avatar
KingRainbow44 committed
43
	public static final Reflections reflector = new Reflections("emu.grasscutter");
Melledy's avatar
Melledy committed
44
	
KingRainbow44's avatar
KingRainbow44 committed
45
	static {
Melledy's avatar
Melledy committed
46
47
48
49
		// Declare logback configuration.
		System.setProperty("logback.configurationFile", "src/main/resources/logback.xml");
		
		// Load server configuration.
KingRainbow44's avatar
KingRainbow44 committed
50
		Grasscutter.loadConfig();
51
		
KingRainbow44's avatar
KingRainbow44 committed
52
53
54
55
		// Check server structure.
		Utils.startupCheck();
	}
	
Melledy's avatar
Melledy committed
56
57
58
59
60
    public static void main(String[] args) throws Exception {
    	Crypto.loadKeys();
    	
		for (String arg : args) {
			switch (arg.toLowerCase()) {
KingRainbow44's avatar
KingRainbow44 committed
61
62
63
				case "-handbook" -> {
					Tools.createGmHandbook(); return;
				}
64
65
66
				case "-gachamap" -> {
					Tools.createGachaMapping(); return;
				}
Melledy's avatar
Melledy committed
67
68
69
			}
		}
		
KingRainbow44's avatar
KingRainbow44 committed
70
71
		// Initialize server.
		Grasscutter.getLogger().info("Starting Grasscutter...");
Melledy's avatar
Melledy committed
72
		
KingRainbow44's avatar
KingRainbow44 committed
73
		// Load all resources.
74
		Grasscutter.updateDayOfWeek();
Melledy's avatar
Melledy committed
75
		ResourceLoader.loadAll();
76
		ScriptLoader.init();
77
		
Melledy's avatar
Melledy committed
78
79
		// Database
		DatabaseManager.initialize();
KingRainbow44's avatar
KingRainbow44 committed
80

KingRainbow44's avatar
KingRainbow44 committed
81
82
83
		// Create plugin manager instance.
		pluginManager = new PluginManager();
		
KingRainbow44's avatar
KingRainbow44 committed
84
85
86
		// Create server instances.
		dispatchServer = new DispatchServer();
		gameServer = new GameServer(new InetSocketAddress(getConfig().getGameServerOptions().Ip, getConfig().getGameServerOptions().Port));
KingRainbow44's avatar
KingRainbow44 committed
87
88
		// Create a server hook instance with both servers.
		new ServerHook(gameServer, dispatchServer);
KingRainbow44's avatar
KingRainbow44 committed
89
		
KingRainbow44's avatar
KingRainbow44 committed
90
		// Start servers.
91
		if (getConfig().RunMode == ServerRunMode.HYBRID) {
92
93
			dispatchServer.start();
			gameServer.start();
94
		} else if (getConfig().RunMode == ServerRunMode.DISPATCH_ONLY) {
95
			dispatchServer.start();
96
		} else if (getConfig().RunMode == ServerRunMode.GAME_ONLY) {
97
98
99
100
101
102
103
			gameServer.start();
		} else {
			getLogger().error("Invalid server run mode. " + getConfig().RunMode);
			getLogger().error("Server run mode must be 'HYBRID', 'DISPATCH_ONLY', or 'GAME_ONLY'. Unable to start Grasscutter...");
			getLogger().error("Shutting down...");
			System.exit(1);
		}
KingRainbow44's avatar
KingRainbow44 committed
104
105
106
		
		// Enable all plugins.
		pluginManager.enablePlugins();
Melledy's avatar
Melledy committed
107
		
KingRainbow44's avatar
KingRainbow44 committed
108
		// Open console.
Melledy's avatar
Melledy committed
109
		startConsole();
KingRainbow44's avatar
KingRainbow44 committed
110
111
		// Hook into shutdown event.
		Runtime.getRuntime().addShutdownHook(new Thread(Grasscutter::onShutdown));
Melledy's avatar
Melledy committed
112
    }
KingRainbow44's avatar
KingRainbow44 committed
113
114
115
116
117
118
119
120

	/**
	 * Server shutdown event.
	 */
	private static void onShutdown() {
		// Disable all plugins.
		pluginManager.disablePlugins();
	}
Melledy's avatar
Melledy committed
121
122
123
124
	
	public static void loadConfig() {
		try (FileReader file = new FileReader(configFile)) {
			config = gson.fromJson(file, Config.class);
125
			saveConfig();
Melledy's avatar
Melledy committed
126
		} catch (Exception e) {
127
128
			Grasscutter.config = new Config(); 
			saveConfig();
Melledy's avatar
Melledy committed
129
130
131
132
133
134
135
		}
	}
	
	public static void saveConfig() {
		try (FileWriter file = new FileWriter(configFile)) {
			file.write(gson.toJson(config));
		} catch (Exception e) {
KingRainbow44's avatar
KingRainbow44 committed
136
			Grasscutter.getLogger().error("Unable to save config file.");
Melledy's avatar
Melledy committed
137
138
139
140
141
		}
	}
	
	public static void startConsole() {
		String input;
Jaida Wu's avatar
Jaida Wu committed
142
		getLogger().info("Done! For help, type \"help\"");
Melledy's avatar
Melledy committed
143
144
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
			while ((input = br.readLine()) != null) {
Melledy's avatar
Melledy committed
145
				try {
146
					if (getConfig().RunMode == ServerRunMode.DISPATCH_ONLY) {
KingRainbow44's avatar
KingRainbow44 committed
147
						getLogger().error("Commands are not supported in dispatch only mode.");
148
149
						return;
					}
KingRainbow44's avatar
KingRainbow44 committed
150
					
Melledy's avatar
Melledy committed
151
152
					CommandMap.getInstance().invoke(null, input);
				} catch (Exception e) {
KingRainbow44's avatar
KingRainbow44 committed
153
					Grasscutter.getLogger().error("Command error:", e);
Melledy's avatar
Melledy committed
154
				}
Melledy's avatar
Melledy committed
155
156
			}
		} catch (Exception e) {
KingRainbow44's avatar
KingRainbow44 committed
157
			Grasscutter.getLogger().error("An error occurred.", e);
Melledy's avatar
Melledy committed
158
159
		}
	}
KingRainbow44's avatar
KingRainbow44 committed
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179

	public static Config getConfig() {
		return config;
	}

	public static Logger getLogger() {
		return log;
	}

	public static Gson getGsonFactory() {
		return gson;
	}

	public static DispatchServer getDispatchServer() {
		return dispatchServer;
	}

	public static GameServer getGameServer() {
		return gameServer;
	}
KingRainbow44's avatar
KingRainbow44 committed
180
181
182
183
	
	public static PluginManager getPluginManager() {
		return pluginManager;
	}
184
185
186
187
188
189
190
191
192
	
	public static void updateDayOfWeek() {
		Calendar calendar = Calendar.getInstance();
		day = calendar.get(Calendar.DAY_OF_WEEK); 
	}

	public static int getCurrentDayOfWeek() {
		return day;
	}
193
194
195
196
197
198
199
200
	
	public enum ServerRunMode {
		HYBRID, DISPATCH_ONLY, GAME_ONLY
	}
	
	public enum ServerDebugMode {
		ALL, MISSING, NONE
	}
Melledy's avatar
Melledy committed
201
}