fix(multiplayer): show friendly message when cato file not found.

This commit is contained in:
huanghongxun
2021-10-12 21:08:49 +08:00
parent 3433e88bb8
commit 948d64237e
5 changed files with 36 additions and 16 deletions

View File

@@ -87,14 +87,14 @@ public final class MultiplayerManager {
throw new IncompatibleCatoVersionException(version, CATO_VERSION); throw new IncompatibleCatoVersionException(version, CATO_VERSION);
} }
Path exe = getCatoExecutable();
if (!Files.isRegularFile(exe)) {
throw new IllegalStateException("Cato file not found");
}
LOG.info(String.format("Joining session (token=%s,version=%s,sessionName=%s,peer=%s,mode=%s,remotePort=%d,localPort=%d)", token, version, sessionName, peer, mode, remotePort, localPort)); LOG.info(String.format("Joining session (token=%s,version=%s,sessionName=%s,peer=%s,mode=%s,remotePort=%d,localPort=%d)", token, version, sessionName, peer, mode, remotePort, localPort));
return CompletableFuture.completedFuture(null).thenComposeAsync(unused -> { return CompletableFuture.completedFuture(null).thenComposeAsync(unused -> {
Path exe = getCatoExecutable();
if (!Files.isRegularFile(exe)) {
throw new CatoNotExistsException(exe);
}
if (!isPortAvailable(3478)) { if (!isPortAvailable(3478)) {
throw new CatoAlreadyStartedException(); throw new CatoAlreadyStartedException();
} }
@@ -478,4 +478,16 @@ public final class MultiplayerManager {
public static class ConnectionErrorException extends RuntimeException { public static class ConnectionErrorException extends RuntimeException {
} }
public static class CatoNotExistsException extends RuntimeException {
private final Path file;
public CatoNotExistsException(Path file) {
this.file = file;
}
public Path getFile() {
return file;
}
}
} }

View File

@@ -213,6 +213,7 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP
Controllers.dialog(new CreateMultiplayerRoomDialog((result, resolve, reject) -> { Controllers.dialog(new CreateMultiplayerRoomDialog((result, resolve, reject) -> {
int gamePort = result.getServer().getAd(); int gamePort = result.getServer().getAd();
boolean isStaticToken = StringUtils.isNotBlank(globalConfig().getMultiplayerToken());
try { try {
MultiplayerManager.CatoSession session = MultiplayerManager.createSession(globalConfig().getMultiplayerToken(), result.getServer().getMotd(), gamePort, result.isAllowAllJoinRequests()); MultiplayerManager.CatoSession session = MultiplayerManager.createSession(globalConfig().getMultiplayerToken(), result.getServer().getMotd(), gamePort, result.isAllowAllJoinRequests());
session.getServer().setOnClientAdding((client, resolveClient, rejectClient) -> { session.getServer().setOnClientAdding((client, resolveClient, rejectClient) -> {
@@ -238,13 +239,17 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP
LOG.log(Level.WARNING, "Cato already started", e); LOG.log(Level.WARNING, "Cato already started", e);
reject.accept(i18n("multiplayer.session.error.already_started")); reject.accept(i18n("multiplayer.session.error.already_started"));
return; return;
} catch (FileNotFoundException e) { } catch (MultiplayerManager.CatoNotExistsException e) {
LOG.log(Level.WARNING, "Cato not found", e); LOG.log(Level.WARNING, "Cato not found " + e.getFile(), e);
reject.accept(i18n("multiplayer.session.error.file_not_found")); reject.accept(i18n("multiplayer.session.error.file_not_found"));
return; return;
} catch (Exception e) { } catch (Exception e) {
LOG.log(Level.WARNING, "Failed to create session", e); LOG.log(Level.WARNING, "Failed to create session", e);
reject.accept(i18n("multiplayer.session.create.error") + e.getLocalizedMessage()); if (isStaticToken) {
reject.accept(i18n("multiplayer.session.create.error.static_token") + e.getLocalizedMessage());
} else {
reject.accept(i18n("multiplayer.session.create.error.dynamic_token") + e.getLocalizedMessage());
}
return; return;
} }
@@ -333,8 +338,8 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP
LOG.info("Cato already started"); LOG.info("Cato already started");
reject.accept(i18n("multiplayer.session.error.already_started")); reject.accept(i18n("multiplayer.session.error.already_started"));
return null; return null;
} else if (resolved instanceof FileNotFoundException) { } else if (throwable instanceof MultiplayerManager.CatoNotExistsException) {
LOG.log(Level.WARNING, "Cato not found", resolved); LOG.log(Level.WARNING, "Cato not found " + ((MultiplayerManager.CatoNotExistsException) throwable).getFile(), throwable);
reject.accept(i18n("multiplayer.session.error.file_not_found")); reject.accept(i18n("multiplayer.session.error.file_not_found"));
return null; return null;
} else if (resolved instanceof MultiplayerManager.JoinRequestTimeoutException) { } else if (resolved instanceof MultiplayerManager.JoinRequestTimeoutException) {

View File

@@ -651,7 +651,8 @@ multiplayer.session.close=Close Room
multiplayer.session.close.warning=After closing room, all players joined the room will lost connection. Continue? multiplayer.session.close.warning=After closing room, all players joined the room will lost connection. Continue?
multiplayer.session.copy_room_code=Copy Invitation Code multiplayer.session.copy_room_code=Copy Invitation Code
multiplayer.session.create=Create Session multiplayer.session.create=Create Session
multiplayer.session.create.error=Failed to create multiplayer session. multiplayer.session.create.error.dynamic_token=Failed to create multiplayer session. Please try again later.
multiplayer.session.create.error.static_token=Failed to create multiplayer session. You can try again with dynamic token.
multiplayer.session.create.hint=Before creating multiplayer session, you must click "Open LAN Server" in running game, and type the port displayed in game in the blank below. multiplayer.session.create.hint=Before creating multiplayer session, you must click "Open LAN Server" in running game, and type the port displayed in game in the blank below.
multiplayer.session.create.join=Connection request multiplayer.session.create.join=Connection request
multiplayer.session.create.join.allow=Accepts all join requests (When disabled, you need to accept join requests manually, so you can prevent from attacks.) multiplayer.session.create.join.allow=Accepts all join requests (When disabled, you need to accept join requests manually, so you can prevent from attacks.)
@@ -666,7 +667,7 @@ multiplayer.session.create.token=Token
multiplayer.session.create.token.apply=Apply for static token multiplayer.session.create.token.apply=Apply for static token
multiplayer.session.create.token.prompt=Default randomized. You can apply for your own token at noin.cn (Chinese website). multiplayer.session.create.token.prompt=Default randomized. You can apply for your own token at noin.cn (Chinese website).
multiplayer.session.error.already_started=Cato service has already started locally. Please check whether there are other multiplayer services served or not. Or you can kill cato process in task manager. multiplayer.session.error.already_started=Cato service has already started locally. Please check whether there are other multiplayer services served or not. Or you can kill cato process in task manager.
multiplayer.session.error.file_not_found=Cannot found cato. Please check if anti-virus software blocked our functionality. multiplayer.session.error.file_not_found=Cannot find cato executable. This file should be downloaded when entering this page. Please check if your anti-virus software has isolated the file. If true, please rollback.
multiplayer.session.expired=Multiplayer session has expired. You should re-create or re-join a room to continue. multiplayer.session.expired=Multiplayer session has expired. You should re-create or re-join a room to continue.
multiplayer.session.hint=You must click "Open LAN Server" in game in order to enable multiplayer functionality. multiplayer.session.hint=You must click "Open LAN Server" in game in order to enable multiplayer functionality.
multiplayer.session.join=Join Session multiplayer.session.join=Join Session

View File

@@ -651,7 +651,8 @@ multiplayer.session.close=關閉房間
multiplayer.session.close.warning=關閉房間後,已經加入聯機房間的玩家將會斷開連接,是否繼續? multiplayer.session.close.warning=關閉房間後,已經加入聯機房間的玩家將會斷開連接,是否繼續?
multiplayer.session.copy_room_code=複製邀請碼 multiplayer.session.copy_room_code=複製邀請碼
multiplayer.session.create=創建房間 multiplayer.session.create=創建房間
multiplayer.session.create.error=創建聯機房間失敗。 multiplayer.session.create.error.dynamic_token=創建聯機房間失敗,請稍後再試
multiplayer.session.create.error.static_token=創建聯機房間失敗,你可以使用動態 Token 再試。
multiplayer.session.create.hint=創建聯機房間前,你需要先在正在運行的遊戲內的遊戲菜單中選擇 對區域網路開放 選項,然後在下方的輸入框中輸入遊戲內提示的埠號(通常是 5 位的數字) multiplayer.session.create.hint=創建聯機房間前,你需要先在正在運行的遊戲內的遊戲菜單中選擇 對區域網路開放 選項,然後在下方的輸入框中輸入遊戲內提示的埠號(通常是 5 位的數字)
multiplayer.session.create.join=連接申請 multiplayer.session.create.join=連接申請
multiplayer.session.create.join.allow=自動接受所有連接申請(不啟用此選項時,你需要手動同意申請,以避免不相關人士誤連你的伺服器) multiplayer.session.create.join.allow=自動接受所有連接申請(不啟用此選項時,你需要手動同意申請,以避免不相關人士誤連你的伺服器)
@@ -666,7 +667,7 @@ multiplayer.session.create.token=Token
multiplayer.session.create.token.apply=申請靜態 Token multiplayer.session.create.token.apply=申請靜態 Token
multiplayer.session.create.token.prompt=預設為臨時 Token。你可以在 noin.cn 上申請靜態 Token 並填寫至此處 multiplayer.session.create.token.prompt=預設為臨時 Token。你可以在 noin.cn 上申請靜態 Token 並填寫至此處
multiplayer.session.error.already_started=本地已經開啟 cato 服務,請檢查是否有其他 HMCL 正在運行聯機服務。或者你可以在任務管理器裡殺掉 cato 進程以繼續。 multiplayer.session.error.already_started=本地已經開啟 cato 服務,請檢查是否有其他 HMCL 正在運行聯機服務。或者你可以在任務管理器裡殺掉 cato 進程以繼續。
multiplayer.session.error.file_not_found=找不到 cato。請檢查防毒軟體是否攔截了 HMCL 的多人聯機服務cato如果被攔截請取消攔截後重啟 HMCL multiplayer.session.error.file_not_found=找不到 cato 程序。該程序應該在進入多人聯機頁面時完成下載。請檢查你電腦的防毒軟體是否將 cato 標記為病毒,如果是,請恢復 cato
multiplayer.session.expired=聯機會話連續使用時間超過了 3 小時,你需要重新創建/加入房間以繼續聯機。 multiplayer.session.expired=聯機會話連續使用時間超過了 3 小時,你需要重新創建/加入房間以繼續聯機。
multiplayer.session.join=加入房間 multiplayer.session.join=加入房間
multiplayer.session.join.error=加入房間失敗 multiplayer.session.join.error=加入房間失敗

View File

@@ -652,7 +652,8 @@ multiplayer.session.close=关闭房间
multiplayer.session.close.warning=关闭房间后,已经加入联机房间的玩家将会断开连接,是否继续? multiplayer.session.close.warning=关闭房间后,已经加入联机房间的玩家将会断开连接,是否继续?
multiplayer.session.copy_room_code=复制邀请码 multiplayer.session.copy_room_code=复制邀请码
multiplayer.session.create=创建房间 multiplayer.session.create=创建房间
multiplayer.session.create.error=创建联机房间失败。 multiplayer.session.create.error.dynamic_token=创建联机房间失败,请稍后再试
multiplayer.session.create.error.static_token=创建联机房间失败,你可以使用动态 Token 再试。
multiplayer.session.create.hint=创建联机房间前,你需要先在正在运行的游戏内的游戏菜单中选择 对局域网开放 选项,然后在下方的输入框中确认游戏内提示的端口号(通常是 5 位的数字) multiplayer.session.create.hint=创建联机房间前,你需要先在正在运行的游戏内的游戏菜单中选择 对局域网开放 选项,然后在下方的输入框中确认游戏内提示的端口号(通常是 5 位的数字)
multiplayer.session.create.join=连接申请 multiplayer.session.create.join=连接申请
multiplayer.session.create.join.allow=自动接受所有连接申请(不启用此选项时,你需要手动同意申请,以避免不相关人士误连你的服务器) multiplayer.session.create.join.allow=自动接受所有连接申请(不启用此选项时,你需要手动同意申请,以避免不相关人士误连你的服务器)
@@ -667,7 +668,7 @@ multiplayer.session.create.token=Token
multiplayer.session.create.token.apply=申请静态 Token multiplayer.session.create.token.apply=申请静态 Token
multiplayer.session.create.token.prompt=默认为临时 Token。你可以在 noin.cn 上申请静态 Token 并填写至此处 multiplayer.session.create.token.prompt=默认为临时 Token。你可以在 noin.cn 上申请静态 Token 并填写至此处
multiplayer.session.error.already_started=本地已经开启 cato 服务,请检查是否有其他 HMCL 正在运行联机服务。或者你可以在任务管理器里杀掉 cato 进程以继续。 multiplayer.session.error.already_started=本地已经开启 cato 服务,请检查是否有其他 HMCL 正在运行联机服务。或者你可以在任务管理器里杀掉 cato 进程以继续。
multiplayer.session.error.file_not_found=找不到 cato。请检查杀毒软件是否拦截了 HMCL 的多人联机服务cato如果被拦截请取消拦截后重启 HMCL multiplayer.session.error.file_not_found=找不到 cato 程序。该程序应该在进入多人联机页面时完成下载。请检查你电脑的杀毒软件是否将 cato 标记为病毒,如果是,请恢复 cato
multiplayer.session.expired=联机会话连续使用时间超过了 3 小时,你需要重新创建/加入房间以继续联机。 multiplayer.session.expired=联机会话连续使用时间超过了 3 小时,你需要重新创建/加入房间以继续联机。
multiplayer.session.join=加入房间 multiplayer.session.join=加入房间
multiplayer.session.join.error=加入房间失败。如果你或对方的网络类型是差(对称型),可能无法使用联机功能。 multiplayer.session.join.error=加入房间失败。如果你或对方的网络类型是差(对称型),可能无法使用联机功能。