Skip to content

Commit e4b1f37

Browse files
committed
代码细节优化
1 parent 2db95b8 commit e4b1f37

File tree

32 files changed

+258
-325
lines changed

32 files changed

+258
-325
lines changed

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/LifeCycle.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
import me.dreamvoid.miraimc.internal.database.SQLite;
99
import me.dreamvoid.miraimc.internal.webapi.Info;
1010
import net.mamoe.mirai.utils.BotConfiguration;
11-
import org.xml.sax.SAXException;
1211

13-
import javax.xml.parsers.ParserConfigurationException;
1412
import java.io.File;
1513
import java.io.IOException;
1614
import java.util.List;
@@ -52,7 +50,7 @@ public void startUp(Logger logger) {
5250
/**
5351
* 此方法应在插件各项准备工作均已完成时调用。此时插件已经准备就绪,可以开始初始化配置文件,加载 mirai 核心。
5452
*/
55-
public void preLoad() throws IOException, ParserConfigurationException, SAXException {
53+
public void preLoad() throws IOException {
5654
logger = platform.getPluginLogger();
5755
Utils.setLogger(logger);
5856
Utils.setClassLoader(platform.getPluginClassLoader());

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/api/MiraiBot.java

-1
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,6 @@ private static void loginCore(long account, byte[] password, BotConfiguration.Mi
368368
bot.login();
369369
logger.info(bot.getNick()+"("+bot.getId()+") 登录成功");
370370
} catch (Exception e){
371-
if(Utils.isDeveloperMode()) e.printStackTrace();
372371
logger.warning("登录机器人时出现异常,原因: " + e.getLocalizedMessage());
373372
}
374373
}

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/commands/MiraiCommand.java

-40
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import me.dreamvoid.miraimc.api.MiraiBot;
66
import me.dreamvoid.miraimc.httpapi.MiraiHttpAPI;
77
import me.dreamvoid.miraimc.httpapi.exception.AbnormalStatusException;
8-
import me.dreamvoid.miraimc.internal.MiraiLoader;
98
import me.dreamvoid.miraimc.internal.Utils;
109
import me.dreamvoid.miraimc.internal.config.PluginConfig;
1110
import net.mamoe.mirai.Bot;
@@ -25,7 +24,6 @@ public class MiraiCommand implements ICommandExecutor {
2524
public boolean onCommand(ICommandSender sender, String[] args) {
2625
if (args.length == 0) {
2726
sender.sendMessage("This server is running "+ LifeCycle.getPlatform().getPluginName() +" version "+ LifeCycle.getPlatform().getPluginVersion()+" by "+ LifeCycle.getPlatform().getAuthors().toString().replace("[","").replace("]",""));
28-
if(Utils.isDeveloperMode()) sender.sendMessage("Developer mode is on.");
2927
return false;
3028
}
3129

@@ -295,44 +293,6 @@ public boolean onCommand(ICommandSender sender, String[] args) {
295293
}
296294
break;
297295
}
298-
case "dev":{
299-
if(Utils.isDeveloperMode()) {
300-
if (args.length == 1) {
301-
sender.sendMessage("&6&lMiraiMC&r &b开发者模式已启用");
302-
break;
303-
}
304-
switch (args[1].toLowerCase()){
305-
case "load":{
306-
MiraiLoader.loadMiraiCore();
307-
break;
308-
}
309-
case "unload":{
310-
/*try {
311-
JarLoader.unloadJar();
312-
} catch (IOException e) {
313-
throw new RuntimeException(e);
314-
}*/
315-
break;
316-
}
317-
case "testclass":{
318-
try {
319-
Class.forName("net.mamoe.mirai.utils.BotConfiguration");
320-
sender.sendMessage("Success");
321-
} catch (ClassNotFoundException e) {
322-
throw new RuntimeException(e);
323-
}
324-
break;
325-
}
326-
case "change":{
327-
//JarLoader.unloadJar();
328-
MiraiLoader.loadMiraiCore(args[2]);
329-
sender.sendMessage("Success");
330-
break;
331-
}
332-
}
333-
}
334-
break;
335-
}
336296
default:{
337297
sender.sendMessage("&c未知或不完整的命令,请输入 /mirai help 查看帮助!");
338298
break;

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/commands/MiraiMcCommand.java

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ public class MiraiMcCommand implements ICommandExecutor {
1414
public boolean onCommand(ICommandSender sender, String[] args) {
1515
if (args.length == 0) {
1616
sender.sendMessage("This server is running "+ LifeCycle.getPlatform().getPluginName() +" version "+ LifeCycle.getPlatform().getPluginVersion()+" by "+ LifeCycle.getPlatform().getAuthors().toString().replace("[","").replace("]",""));
17-
if(Utils.isDeveloperMode()) sender.sendMessage("Developer mode is on.");
1817
return false;
1918
}
2019

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/internal/MiraiEncryptServiceFactory.java

-15
Original file line numberDiff line numberDiff line change
@@ -81,21 +81,6 @@ public EncryptService createForBot(@NotNull EncryptServiceContext context, @NotN
8181

8282
return new UnidbgFetchQsign(server.base, server.key, scope.getCoroutineContext());
8383
}
84-
case "kiliokuara/magic-signer-guide": case "kiliokuara": case "magic-signer-guide": case "vivo50":{
85-
/*try {
86-
String about = Utils.Http.get(server.base);
87-
logger.info("magic-signer-guide by "+server.base+" about \n" + about);
88-
if(about.trim().equals("void")){
89-
logger.warning("请更新 magic-signer-guide 的 docker 镜像");
90-
}
91-
if(!about.contains(version)){
92-
throw new IllegalStateException("magic-signer-guide by "+server.base+" 与 "+protocol+"("+version+") 似乎不匹配");
93-
}
94-
} catch (IOException cause) {
95-
throw new RuntimeException("请检查 magic-signer-guide by "+server.base+" 的可用性", cause);
96-
}*/
97-
throw new UnsupportedOperationException(server.type); // 部署困难,不打算支持
98-
}
9984
default:throw new UnsupportedOperationException(server.type);
10085
}
10186
}

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/internal/MiraiLoginSolver.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ public Object onSolveDeviceVerification(@NotNull Bot bot, @NotNull DeviceVerific
220220
@NotNull
221221
@Override
222222
public CoroutineContext getContext() {
223-
return (CoroutineContext) Dispatchers.getIO();
223+
return Dispatchers.getIO();
224224
}
225225

226226
@Override

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/internal/Utils.java

+21-57
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,17 @@
1212
import org.jetbrains.annotations.NotNull;
1313

1414
import java.io.*;
15-
import java.math.BigInteger;
1615
import java.net.HttpURLConnection;
1716
import java.net.URL;
1817
import java.nio.charset.StandardCharsets;
1918
import java.nio.file.Files;
2019
import java.nio.file.StandardCopyOption;
21-
import java.security.MessageDigest;
22-
import java.security.NoSuchAlgorithmException;
2320
import java.util.Arrays;
2421
import java.util.logging.Logger;
2522

2623
public final class Utils {
2724
static {
25+
Logger logger = Logger.getLogger("MiraiMC Preload Checker");
2826
// 此处放置插件自检代码
2927
if (!Boolean.getBoolean("MiraiMC.StandWithNpp") && System.getProperty("os.name").toLowerCase().contains("windows") && findProcess("notepad++.exe")) {
3028
Arrays.asList("========================================",
@@ -33,26 +31,20 @@ public final class Utils {
3331
"Sublime: https://www.sublimetext.com/",
3432
"不要向MiraiMC作者寻求任何帮助。",
3533
"进程将在20秒后继续运行",
36-
"========================================").forEach(s -> Logger.getLogger("MiraiMC Preload Checker").severe(s));
34+
"========================================").forEach(logger::severe);
3735
try {
3836
Thread.sleep(20000);
3937
} catch (InterruptedException ignored) {}
4038
}
4139
if(Boolean.getBoolean("MiraiMC.StandWithNpp")){
42-
Logger.getLogger("MiraiMC Preload Checker").severe("不要向MiraiMC作者寻求任何帮助。");
40+
logger.severe("不要向MiraiMC作者寻求任何帮助。");
4341
}
4442

4543
if(findClass("cpw.mods.modlauncher.Launcher") || findClass("net.minecraftforge.server.console.TerminalHandler")) { // 抛弃Forge用户,别问为什么
46-
Logger.getLogger("MiraiMC Preload Checker").severe("任何Forge服务端均不受MiraiMC支持,请尽量更换其他服务端使用!");
47-
Logger.getLogger("MiraiMC Preload Checker").severe("作者不会处理任何使用了Forge服务端导致的问题。");
48-
Logger.getLogger("MiraiMC Preload Checker").severe("兼容性报告: https://docs.miraimc.dreamvoid.me/troubleshoot/compatibility-report");
44+
logger.severe("任何Forge服务端均不受MiraiMC支持,请尽量更换其他服务端使用!");
45+
logger.severe("作者不会处理任何使用了Forge服务端导致的问题。");
46+
logger.severe("兼容性报告: https://docs.miraimc.dreamvoid.me/troubleshoot/compatibility-report");
4947
}
50-
51-
if(Boolean.getBoolean("MiraiMC.DeveloperMode")){
52-
developerMode = true;
53-
Logger.getLogger("MiraiMC Preload Checker").warning("MiraiMC 开发者模式已启用!");
54-
Logger.getLogger("MiraiMC Preload Checker").warning("除非你知道你正在做什么,否则请不要启用开发者模式。");
55-
} else developerMode = false;
5648
}
5749

5850
private static boolean findProcess(String processName) {
@@ -89,7 +81,6 @@ public static boolean findClass(String className){
8981

9082
private static Logger logger;
9183
private static ClassLoader classLoader;
92-
private static final boolean developerMode;
9384

9485
public static void setLogger(Logger logger){
9586
Utils.logger = logger;
@@ -107,10 +98,6 @@ public static ClassLoader getClassLoader(){
10798
return classLoader;
10899
}
109100

110-
public static boolean isDeveloperMode(){
111-
return developerMode;
112-
}
113-
114101
/**
115102
* Http 相关实用类
116103
*/
@@ -193,52 +180,29 @@ public static void download(String url, File saveFile){
193180
logger.severe(String.format("Failed to download %s, reason: %s", url, e));
194181
}
195182
}
196-
197-
/**
198-
* 测试链接可用性
199-
* @param url 链接
200-
* @return 服务器是否返回 HTTP 200 OK 状态码
201-
* @throws IOException 连接出现任何异常时抛出
202-
*/
203-
public static boolean test(String url) throws IOException {
204-
URL obj = new URL(url.replace(" ", "%20"));
205-
StringBuilder sb = new StringBuilder();
206-
HttpURLConnection httpUrlConn = (HttpURLConnection) obj.openConnection();
207-
208-
httpUrlConn.setDoInput(true);
209-
httpUrlConn.setRequestMethod("GET");
210-
httpUrlConn.setRequestProperty("User-Agent", "Mozilla/5.0 DreamVoid MiraiMC");
211-
httpUrlConn.setConnectTimeout(5000);
212-
httpUrlConn.setReadTimeout(10000);
213-
214-
return httpUrlConn.getResponseCode() == HttpURLConnection.HTTP_OK;
215-
}
216183
}
217184

218185
@NotNull
219186
public static File getMiraiDir(){
220187
return PluginConfig.General.MiraiWorkingDir.equals("default") ? new File(PluginConfig.PluginDir,"MiraiBot") : new File(PluginConfig.General.MiraiWorkingDir);
221188
}
222189

223-
public static String getFileSha1(File file){
224-
try(FileInputStream fis = new FileInputStream(file)){
225-
byte[] buffer = new byte[1024];
226-
MessageDigest digest = MessageDigest.getInstance("SHA");
227-
int numRead;
190+
public static void resolveException(Exception exception, Logger logger, String reason) {
191+
if(!reason.isEmpty()) logger.severe(reason);
192+
logger.severe("如果你确信这是 MiraiMC 的错误,前往 GitHub 报告 issue 并附上完整服务器日志。");
193+
logger.severe(exception.toString());
228194

229-
do {
230-
numRead = fis.read(buffer);
231-
if (numRead > 0) {
232-
digest.update(buffer, 0, numRead);
233-
}
234-
} while (numRead != -1);
235-
236-
fis.close();
237-
byte[] bytes = digest.digest();
238-
BigInteger b = new BigInteger(1, bytes);
239-
return String.format("%0" + (bytes.length << 1) + "x", b);
240-
} catch (NoSuchAlgorithmException | IOException e) {
241-
return null;
195+
Throwable t = exception;
196+
while(t != null){
197+
if(t != exception){
198+
logger.severe("Caused by: " + t);
199+
}
200+
201+
for(StackTraceElement element : t.getStackTrace()){
202+
getLogger().severe(String.format("\tat %s.%s(%s:%d)", element.getClassName(), element.getMethodName(), element.getFileName(), element.getLineNumber()));
203+
}
204+
205+
t = t.getCause();
242206
}
243207
}
244208
}

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/internal/database/MySQL.java

-16
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,6 @@ public class MySQL implements Database {
1313

1414
@Override
1515
public void initialize() throws ClassNotFoundException {
16-
/*
17-
try {
18-
Class<HikariDataSource> clazz = HikariDataSource.class;
19-
Field field = clazz.getDeclaredField("LOGGER");
20-
field.setAccessible(true);
21-
22-
Field modifiersField = Field.class.getDeclaredField("modifiers");
23-
modifiersField.setAccessible(true);
24-
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
25-
26-
field.set(ds, Utils.getLogger());
27-
} catch (Exception e){
28-
e.printStackTrace();
29-
}
30-
*/
31-
3216
String driver;
3317
if (Utils.findClass("com.mysql.cj.jdbc.Driver")){
3418
driver = "com.mysql.cj.jdbc.Driver";

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/internal/database/SQLite.java

+1-17
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,7 @@ public class SQLite implements Database {
1414
private static HikariDataSource ds; // SQLite
1515

1616
@Override
17-
public void initialize() throws ClassNotFoundException {
18-
/*
19-
try {
20-
Class<HikariDataSource> clazz = HikariDataSource.class;
21-
Field field = clazz.getDeclaredField("LOGGER");
22-
field.setAccessible(true);
23-
24-
Field modifiersField = Field.class.getDeclaredField("modifiers");
25-
modifiersField.setAccessible(true);
26-
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
27-
28-
field.set(ds, Utils.getLogger());
29-
} catch (Exception e){
30-
e.printStackTrace();
31-
}
32-
*/
33-
17+
public void initialize() {
3418
String driver;
3519
if(Utils.findClass("org.sqlite.JDBC")){
3620
driver = "org.sqlite.JDBC";

MiraiMC-Base/src/main/java/me/dreamvoid/miraimc/internal/loader/LibraryLoader.java

+30-4
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,18 @@
99
import org.xml.sax.InputSource;
1010
import org.xml.sax.SAXException;
1111

12-
import javax.annotation.Nullable;
1312
import javax.xml.XMLConstants;
1413
import javax.xml.parsers.DocumentBuilderFactory;
1514
import javax.xml.parsers.ParserConfigurationException;
1615
import java.io.*;
16+
import java.math.BigInteger;
1717
import java.net.MalformedURLException;
1818
import java.net.URL;
1919
import java.net.URLClassLoader;
2020
import java.nio.file.Files;
2121
import java.nio.file.Path;
22+
import java.security.MessageDigest;
23+
import java.security.NoSuchAlgorithmException;
2224
import java.util.HashMap;
2325
import java.util.TreeMap;
2426
import java.util.function.Supplier;
@@ -96,15 +98,15 @@ public void loadLibraryMaven(String groupId, String artifactId, String version,
9698
Files.write(savePath.resolve(sha1Filename), os.toByteArray()); // 写入sha1文件
9799
String checksum = os.toString().trim().replace(" ", "").toLowerCase();
98100

99-
needDownload = !Utils.getFileSha1(file).equals(checksum);
101+
needDownload = !checksum.equals(getFileSha1(file));
100102
} catch (IOException e) {
101103
logger.warning("Failed to check file's checksum, reason: " + e);
102104
needDownload = false; // 由于文件已经存在,无法检测完整性只可能是网络问题,所以继续下载也不可能成功,不如直接不下载
103105
}
104106
}
105107

106108
if(needDownload){
107-
file.getParentFile().mkdirs();
109+
if (!file.getParentFile().mkdirs()) logger.warning("Failed to create folder " + file.getParent());
108110
Utils.Http.download(url, file);
109111
}
110112

@@ -146,7 +148,6 @@ public String getLibraryVersion(String groupId, String artifactId, String repo){
146148
return data.getElementsByTagName("release").item(0).getTextContent();
147149
}
148150

149-
@Nullable
150151
private static Document fetchMavenMetadata(String groupId, String artifactId, String repo) {
151152
try {
152153
String content = Utils.Http.get(repo + "/" + groupId.replace(".", "/") + "/" + artifactId + "/maven-metadata.xml");
@@ -198,4 +199,29 @@ public static String findNodeValue(NodeList nodes, String name, String defValue)
198199
}
199200
return defValue;
200201
}
202+
203+
private String getFileSha1(File file){
204+
try(FileInputStream fis = new FileInputStream(file)){
205+
byte[] buffer = new byte[1024];
206+
MessageDigest digest = MessageDigest.getInstance("SHA");
207+
int numRead;
208+
209+
do {
210+
numRead = fis.read(buffer);
211+
if (numRead > 0) {
212+
digest.update(buffer, 0, numRead);
213+
}
214+
} while (numRead != -1);
215+
216+
fis.close();
217+
byte[] bytes = digest.digest();
218+
BigInteger b = new BigInteger(1, bytes);
219+
return String.format("%0" + (bytes.length << 1) + "x", b);
220+
} catch (NoSuchAlgorithmException e) {
221+
return null;
222+
} catch (IOException e) {
223+
Utils.resolveException(e, logger, "读取 sha1 文件时出现异常!");
224+
return null;
225+
}
226+
}
201227
}

0 commit comments

Comments
 (0)