diff --git a/CHANGELOG.md b/CHANGELOG.md index 10e3310335..07abde9f1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ -### 若更新后可以连接,但完全没反应,请进入 `设置` - `连接设置` - `强制替换 ADB` -### If you can connect, but stuck at all, please go to `MAA Settings` - `Connection settings` - `Forced replacement of ADB` +## v4.7.1 + +- 修复 强制替换 ADB 进程被占用时失败的问题 @MistEO +- 修复 macOS 启动卡住的问题 @hguandl +- 修复 干员名识别错误 @cenfusheng +- 新增 界面 触控相关提示,~~再问紫砂!~~ @MistEO +- 新增 检查更新 镜像 API @tangge233 + +### For Overseas clients + +- Fix the stuck in the encounter in IS @MistEO +- Update documentation @wallsman + +## v4.7.0 - 新增并全面启用 minitouch,大幅优化所有操作速度 @MistEO @zzyyyl @horror-proton @hguandl - 新增 兼容触控模式,请进入设置 - 连接设置中启用。不推荐开启,仅建议在 minitouch 无法工作时使用 @MistEO diff --git a/README_ja-JP.md b/README_ja-JP.md index 91c2e581ea..f6fbf9d80e 100644 --- a/README_ja-JP.md +++ b/README_ja-JP.md @@ -32,10 +32,10 @@ MAAは、MAA Assistant Arknightsです。 ## 機能一覧 -- 自動作戦、ドロップ認識および[PenguinStats](https://penguin-stats.io/)へデータアップロード(ドロップ認識はJPも対応予定) -- 自動基地シフト、オペレーター効率計算、単一設備内に最適なソリューション(現在JPは未対応) +- 自動作戦、ドロップ認識および[PenguinStats](https://penguin-stats.io/)へデータアップロード +- 自動基地シフト、オペレーター効率計算、単一設備内に最適なソリューション - 自動公開求人、緊急招集票を使う、使い切るのもサポート。[PenguinStats](https://penguin-stats.io/result/stage/recruit/recruit)と[Yituliu](https://yituliu.site/maarecruitdata)へ公開求人データのアップロード -- 戦友訪問、FP収集、買い物、デイリーリワード収集、ワンクリックして全自動操作!(現在JPは未対応) +- 戦友訪問、FP収集、買い物、デイリーリワード収集、ワンクリックして全自動操作! - 統合戦略自動作戦、オペレーターとレベルの自動認識、源石錐とキャンドルの自動収集!(現在JPはベータ対応) - 作業JSONファイルをインポートし、自動操作も可能! [ビデオデモ](https://www.bilibili.com/video/BV1H841177Fk/)(現在JP未対応/中文) - **新機能!倉庫のアイテム認識機能(アルファ)** [Arkplanner](https://penguin-stats.io/planner)/[ARK-NIGHTS.com](https://ark-nights.com/settings)と[アークナイツ ツールボックス](https://arkn.lolicon.app/#/material)へ出力可能!使用方法はツール内文章を参照してください。 @@ -76,7 +76,7 @@ UIを見れば使い方もすぐ分かる! 作戦、戦友訪問、FP交換所、レワード収集、統合戦略(ベータ版)、公開求人認識の機能がサポートされている。 サポート内容については[README](resource/global/YoStarEN/readme.md)を参照してください。 - 日本サーバー - 作戦、自動基建、自動公開求人、戦友訪問、FP交換所、レワード収集、統合戦略(ベータ版)、公開求人認識の機能がサポートされている。 + 作戦、自動基地、自動公開求人、戦友訪問、FP交換所、レワード収集、統合戦略(ベータ版)、公開求人認識の機能がサポートされている。 サポート内容については[README](resource/global/YoStarJP/readme.md)を参照してください。 - 韓国サーバー 基本的な作戦機能のみサポートされている。 diff --git a/docs/ja-jp/1.1-詳細説明.md b/docs/ja-jp/1.1-詳細説明.md index 1d1ee69f01..54c40027f4 100644 --- a/docs/ja-jp/1.1-詳細説明.md +++ b/docs/ja-jp/1.1-詳細説明.md @@ -2,29 +2,48 @@ ## 詳細な説明 -### ステージのクリア +### ワンクリックで周回:理性を有効活用 -- 欲しいステージがオプションに表示されていない場合は、**青い行動開始**のある画面に手動で入って、オプションで `現在/前回` を選んでください。 -- スタート画面の `理性剤使用数`、`割る源石の数`、`周回数指定` の3つのオプションはショートスイッチですので、3つのオプションのいずれかが満たされた場合、それはタスクの完了と見なされます。 - - 例1:`理性剤使用数` : `999`、`割る源石の数` : `10`、`周回数指定` : `1` を設定すると、**一回**クリアした後、`周回数指定` : `1` という条件を満たしたので、タスクの完了と見なされます。 - - 例2:`理性剤使用数` と `割る源石の数` のチェックを外し、`周回数指定` を `100` に設定すると、現在使用可能な理性がすべて使い切った後、`回復剤使う` `源石使う` という条件がないため、タスクの完了となります。 - - 例3:`理性剤使用数` : `999`、`割る源石の数` : `10`に設定すれば、手持ちの理性回復剤と純正源石10個を消費し、理性が不足するまでタスクを実行します。 +- MAAで`現在/前回`を選択し、**任務開始**と**自動指揮**がゲーム画面に存在することを確認し、ゲーム内で手動でステージを選択します。 +- ステージ選択画面でない場合は、`現在/前回`で自動的に最後に戦ったステージ(端末のトップページの右下に記録されている)に移動することができます。 - `設定` - `UI設定` で`ステージ名を入力する` をチェックした場合, メインストーリーの全ステージ, ドロップダウンのリスト(`1-7`, `S3-2`, `CE-6` など)を選択できます。 +
画面例 + +![画面例](https://user-images.githubusercontent.com/63186641/203410007-ef9c1cab-10f3-4d7c-8048-a3e11cdadb75.png) + +
+ +- スタート画面の `理性剤使用数`、`割る源石の数`、`周回数指定`、`素材を限定` の4つのオプションはショートスイッチですので、**4つのオプションのいずれかを達成した場合**、それはタスクの完了と見なされます。 + - 以下のうち: + - `理性剤使用数` 理性剤を飲む**回数**(普通は毎回 1 個使用しますが、理性が不足した際にデフォルトで選ばれる理性剤が選択されます(試供回復材など理性回復量が少ない場合もあるため、自分でも数を把握するようにしてください)) + - `割る源石の数` 源石を割る回数を指定(1回につき 1 個) + - `周回数指定` ステージを何回周回するか指定(例“15 周 で停止”) + - `素材を限定` 特定の素材のドロップ数が手に入るまで周回(例“5 個 初級源岩獲得で停止”) + +| 例 | 理性剤使用数 | 割る源石の数 | 周回数指定 | 素材を限定 | 結果 | +|:--:|:--------:|:------:|:--------:|:---------:|-----------------------------------------------------------------------------------------------------------------------------------------------| +| A | 999 | 10 | 1 | ✖ | 理性材/純正源石を**1回**以上摂取し、`周回数:1`回の条件を完了すると、即座に停止。理性不足の状態で純正源石か理性剤が不足している場合は摂取せずに自動的に終了します。 | +| B | ✖ | ✖ | 100 | ✖ | 100回ステージを実行しようとしますが、現在使用可能な理性を消費後(おそらく数回)に、`理性剤`、`純正源石`なしの条件が達成されるため、理性を消費できず、タスクは完了されます。 | +| C | 1 | ✖ | 100 | ✖ | 100回ステージを実行しようとしますが、理性剤を 1 個消費した後に理性が不足した場合、`理性剤使用数:1`、`割る源石の数0`の条件を達成したためタスクは完了します。 | +| D | 999 | ✖ | 100 | 3個初級源岩 | 100回ステージを実行しようとし、最大 999 の理性剤を消費しようとしますが、実行中に3個の初級源岩を獲得した場合、`素材を限定:3個の初級源岩`の条件を達成するため、その時点でタスクを完了し停止します。 | - クリアした後[penguin-stats](https://penguin-stats.io/)に自動的にアップロードすることができます。 - penguin-statsのIDはカスタマイズ可能です。 -- `素材を限定` と `ステージ` は別のオプションです: `素材を限定` 「中級源岩が5回落ちたらやめる」など。 目標ステージへの誘導などには使えません。(現在JPは後の対応予定) -- 回線が落ちると、自動的に再接続されてステージのクリアが続けられます。 +- `素材を限定` と `ステージ` は別のオプションです: `素材を限定` 「中級源岩のドロップ数を5」に指定したとしても、対象ステージへ自動的に移動はしません。 +- 回線が落ちると、自動的に再接続されてステージのクリアが続けられます。 - 午前4時にリセットされた場合も、自動的に再接続されてステージのクリアを続けます。 - 殲滅作戦もサポートしています。 - クリアした後にドクターレベルがアップした場合でもサポートされています。 - 自動指揮に失敗した場合は、その作戦を自動的に放棄して待機画面へ戻ります。 +- 完全な理性消費をサポートします。 + - メインタスクを完了後、自動的に指定したステージに移動し“余剰”理性を消費します。(例:余剰理性を 1-7 に指定した場合) + - 実行に必要な理性がない場合(例 1-7 を指定し、理性が6未満の場合)即座にタスクを停止します。 ### 基地のシフトの切り替え #### ストラテジー **単一施設内での最適解**を自動的に計算して選択した上で全てのスキルとスキルの組み合わせをサポートしています。 - 作戦記録・純金・源石の欠片・SoCに対応したオペレーターの組み合わせを変えて配置することをサポートします!(現在JP未対応) + 作戦記録・純金・源石の欠片・SoCに対応したオペレーターの組み合わせを変えて配置することをサポートします! #### 基地で働く体力をパーセントで指定可能 @@ -35,13 +54,13 @@ - 基地のシフトは現時点では単一施設内での最適解ですが、施設全体の最適解ではありません。 例えば、`シャマレ+テキーラ`、`ヴァーミル+シーン` などの組み合わせは認識され、通常どおり使用できます;`ロスモンティス`、`レッドパイン騎士団(フレイムテイル/ファートゥース/ワイルドメイン/アッシュロック)` などの多くの施設間で連携する組合せは一時的にサポートできません。(現在JP未対応) -- `ドローンの使用` で `貿易所-龍門幣` を選択した場合。 `シャマレの組合せ` があるかどうかを識別し、最初に使用します。(現在JP未対応) +- `ドローンの使用` で `貿易所-龍門幣` を選択した場合。 `シャマレの組合せ` があるかどうかを識別し、最初に使用します。 -- 応接室の手がかりが1つだけ欠けている場合は、該当するスキルのあるオペレーターが選ばれ、そうでない場合は一般オペレーターが選ばれます。(現在JP未対応) +- 応接室の手がかりが1つだけ欠けている場合は、該当するスキルのあるオペレーターが選ばれ、そうでない場合は一般オペレーターが選ばれます。 - 応接室は自分の手がかりが溢れた際、手がかり3つのみを譲り渡します。必要な場合、`resource/tasks.json` の `SelectClue` - `maxTimes` フィールドを変更して、譲渡する数をカスタマイズできます。 -- 訓練所を使用していない場合 `Irene` などのオペレーターを宿舎に移動させたくない場合は、設定で `作業中のオペレーターを宿舎に移動しない` にチェックしてください。 ただし、この場合、疲労が蓄積していないオペレータも宿舎に入れなくなる可能性があります。(現在JP未対応) -- 制御中枢のストラテジーが複雑すぎるため。現在では `アーミヤ` `スワイヤー` `ケルシー` `レインボー小隊` および体力値が+0.05のスキルのオペレーターのみが考慮されており、今後徐々に最適化される予定です。(現在JP未対応) -- 一部の異格オペレーターは基地で競合します。スタート画面の右側のプロンプトに `オペレーターが競合した` と表示されていないか注意してください。表示されている場合、基地のシフトを手動で確認してください(該当する施設に誰もいない可能性があります)。(現在JP未対応) +- 訓練所を使用していない場合 `アイリーニ` などのオペレーターを宿舎に移動させたくない場合は、設定で `作業中のオペレーターを宿舎に移動しない` にチェックしてください。 ただし、この場合、疲労が蓄積していないオペレータも宿舎に入れなくなる可能性があります。 +- 制御中枢のストラテジーが複雑すぎるため。現在では `アーミヤ` `スワイヤー` `ケルシー` `レインボー小隊` および体力値が+0.05のスキルのオペレーターのみが考慮されており、今後徐々に最適化される予定です。 +- 一部の異格オペレーターは基地で競合します。スタート画面の右側のプロンプトに `オペレーターが競合した` と表示されていないか注意してください。表示されている場合、基地のシフトを手動で確認してください(該当する施設に誰もいない可能性があります)。 ### 公開求人認識 @@ -51,15 +70,24 @@ - `スタート画面の公開求人` 中に[PenguinStats](https://penguin-stats.io/)と[Yituliu](https://yituliu.site/)へ公開求人データを自動的にアップロードすることができます。 ### 自動統合戦略(ローグライク) +![image]() - 設定で選択できるオプション - - キャンドルを集めて、できるだけクリアする:キャンドルを集めるために、できるだけ多くのステージをクリアする。 - - 源石錐を集めて、1階旅商人に出会った後止める:源石錐を集めるための最も効率的なモードです。 `EASY` モードを手動で選択することをお勧めします。 - + - MAA設定で「ファントム/ミヅキ」を選択し、ゲーム内で対応するテーマを「PIN UP」しないと、デフォルトで最新のテーマが表示されるため、不具合が発生する可能性があります。 + - 固定しない場合は、現在の画面がテーマのロビーページ(「探索を始める」/「探索を続ける」ボタンがある)であることを確認してから、この機能を起動してください。 + - 対象外の条件がある場合(例:MAAでミヅキをプレイする予定だが、未達のファントムのセーブがある)、その場合は手動で終了させてください。 +
固定方法(グローバル版はミヅキ追加後) -- 統合戦略はオペレーターと昇進/レベルの自動識別をサポートしており、最適なオペレーターとスキルを自動的に選択することができます。 -- 回線が落ちた場合や午前4時にリセットされた場合は、自動的に再接続されて続きから始めます。 +![固定方法](https://user-images.githubusercontent.com/63186641/203422504-22aa0ed9-0f64-4c9f-abca-665e247d13a0.png) + +
+ +- 設定は分隊、最初の職業選択(最初に指定するオペレーター)等を設定できます。 +- オペレーターや昇進レベルを自動認識し、最適なオペレーターやスキルを自動選択。 +- ショップアイテムの識別と、より強力な秘宝の購入の優先順位のサポート。 +- 午前4時のアップデート後、ドロップ後の再接続と周回の継続に対応。 +- 5分経っても戦闘が終わらない場合は、すべての地上部隊が自動的に退却。6分経つと自動的に戦闘放棄し、無限ループを防ぎます。 - アプリがバグで立ち往生した場合は、現在の冒険を自動的に放棄して再試行します。しかし、どこかで行き詰まって放棄してしまい、効率に深刻な影響を与えることが多い場合は、issueを提出してフィードバックをお寄せください。 ### 自動戦闘(現在JP未対応) @@ -104,7 +132,7 @@ JSONスキーマとの連携をご希望の方は、お気軽にお問い合わ - スタートと設定画面で変更された構成は、「*」でマークされたオプションを除いて、自動的に保存されます。 - すべてのクリック操作は、ボタン内のランダムな位置でのクリックであり、ポアソン分布をシミュレートします(ボタンの中心がクリックされる確率が高く、中心から離れるほどクリックされる確率が小さくなります)。 - 基礎となるアルゴリズムは純粋なC++で開発され、CPUとメモリの使用を最小限に抑えるように複数のキャッシュテクで設計されています。 -- アプリは自動敵に更新がサポートされます✿✿ヽ(°▽°)ノ✿、気にならないユーザーはベータ版の使用をお勧めします(更新も速く、バグもほとんどありません)。 +- アプリは自動更新がサポートされています✿✿ヽ(°▽°)ノ✿、気にならないユーザーはベータ版の使用をお勧めします(更新も速く、バグもほとんどありません)。 - 新しいバージョンの自動ダウンロードが失敗した場合は、パッケージを手動でダウンロードして同じディレクトリに配置すると、自動的に更新されます。 ## その他の機能 diff --git a/resource/config.json b/resource/config.json index 8c8f5c774c..495ad341d0 100644 --- a/resource/config.json +++ b/resource/config.json @@ -238,7 +238,7 @@ "display": "[Adb] -s [AdbSerial] shell dumpsys window displays | grep -o -E cur=+[^\\ ]+ | grep -o -E [0-9]+", "displayFormat": "%d%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", - "ncAddress": "[Adb] -s [AdbSerial] shell \" cat /proc/net/arp | grep : \"", + "ncAddress": "[Adb] -s [AdbSerial] shell \"cat /proc/net/arp | grep : | sort\"", "ncPort": 6723, "screencapRawWithGzip": "", "screencapEncode": "[Adb] -s [AdbSerial] exec-out screencap -p", diff --git a/resource/tasks.json b/resource/tasks.json index f59f6de26c..7354faaf45 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -2207,7 +2207,7 @@ "特米米" ], [ - "一岁", + "^一岁$", "夕" ], [ @@ -2289,6 +2289,18 @@ [ "克克洛丝", "克洛丝" + ], + [ + "^影$", + "傀影" + ], + [ + "^桑芸$", + "桑葚" + ], + [ + "^罪$", + "斥罪" ] ] }, @@ -8521,7 +8533,9 @@ "Phantom@Roguelike@StageEncounterOptionFree", "Phantom@Roguelike@StageEncounterOptionLeave", "Phantom@Roguelike@StageEncounterOptionUnknown", - "Phantom@Roguelike@ChooseOperFlag" + "Phantom@Roguelike@ChooseOperFlag", + "Phantom@Roguelike@StageEmergencyDpsEnter", + "Phantom@Roguelike@StageCambatDpsEnter" ] }, "Phantom@Roguelike@StageEncounterSpecialClose": {}, @@ -8960,7 +8974,9 @@ "Mizuki@Roguelike@StageEncounterOptionLeave", "Mizuki@Roguelike@StageEncounterOptionUnknown", "Mizuki@Roguelike@StageEncounterOptionWonderland", - "Mizuki@Roguelike@ChooseOperFlag" + "Mizuki@Roguelike@ChooseOperFlag", + "Mizuki@Roguelike@StageEmergencyDpsEnter", + "Mizuki@Roguelike@StageCambatDpsEnter" ] }, "Mizuki@Roguelike@StageEncounterSpecialClose": {}, diff --git a/src/MeoAsstGui/Resources/Localizations/en-us.xaml b/src/MeoAsstGui/Resources/Localizations/en-us.xaml index 609b6ab0c2..99800e578e 100644 --- a/src/MeoAsstGui/Resources/Localizations/en-us.xaml +++ b/src/MeoAsstGui/Resources/Localizations/en-us.xaml @@ -297,6 +297,7 @@ Connecting to emulator... Unselected task Running... + If all stuck, plz go to Settings - Connection Settings - Forced Replace ADB File, or turn on Compatibility Touch Mode Stopping... Has stopped Unknown error occurred diff --git a/src/MeoAsstGui/Resources/Localizations/zh-cn.xaml b/src/MeoAsstGui/Resources/Localizations/zh-cn.xaml index 68a323b8cb..26d59fc0f7 100644 --- a/src/MeoAsstGui/Resources/Localizations/zh-cn.xaml +++ b/src/MeoAsstGui/Resources/Localizations/zh-cn.xaml @@ -298,6 +298,7 @@ 正在连接模拟器…… 未选择任务 正在运行中…… + 如果任务完全没有反应,请使用 设置 - 连接设置 - 强制替换 ADB,或打开 兼容性触控模式 正在停止…… 已停止 出现未知错误 diff --git a/src/MeoAsstGui/ViewModels/ErrorView.xaml.cs b/src/MeoAsstGui/ViewModels/ErrorView.xaml.cs index b8b1749967..655ee639fe 100644 --- a/src/MeoAsstGui/ViewModels/ErrorView.xaml.cs +++ b/src/MeoAsstGui/ViewModels/ErrorView.xaml.cs @@ -50,7 +50,7 @@ namespace MeoAsstGui.Views { return Localization.GetString("ErrorSolutionCrash"); } - else if (details.Contains("SettingsViewModel.") && details.Contains("System.IO.File")) + else if (details.Contains("SettingsViewModel.")) { return Localization.GetString("ErrorSolutionReplaceADB"); } diff --git a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs index cf9d3bdcb3..4c59a035b8 100644 --- a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs +++ b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs @@ -1895,22 +1895,30 @@ namespace MeoAsstGui } } - const string UnzipDir = "adb_unzip"; - if (Directory.Exists(UnzipDir)) - { - Directory.Delete(UnzipDir, true); - } - var procTask = Task.Run(() => { // ErrorView.xaml.cs里有个报错的逻辑,这里如果改的话那边也要对应改一下 - System.IO.Compression.ZipFile.ExtractToDirectory(GoogleAdbFilename, UnzipDir); + foreach (var process in Process.GetProcessesByName(Path.GetFileName(AdbPath))) + { + process.Kill(); + } + File.Copy(AdbPath, AdbPath + ".bak", true); + + const string UnzipDir = "adb_unzip"; + if (Directory.Exists(UnzipDir)) + { + Directory.Delete(UnzipDir, true); + } + + System.IO.Compression.ZipFile.ExtractToDirectory(GoogleAdbFilename, UnzipDir); File.Copy(UnzipDir + "/platform-tools/adb.exe", AdbPath, true); Directory.Delete(UnzipDir, true); }); await procTask; + AdbReplaced = true; + ViewStatusStorage.Set("Connect.AdbReplaced", true.ToString()); Execute.OnUIThread(() => { using (var toast = new ToastNotification(Localization.GetString("SuccessfullyReplacedADB"))) @@ -1920,6 +1928,8 @@ namespace MeoAsstGui }); } + public bool AdbReplaced { get; set; } = Convert.ToBoolean(ViewStatusStorage.Get("Connect.AdbReplaced", false.ToString())); + /* 界面设置 */ /// diff --git a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs index 76827ebcb7..715fb494ca 100644 --- a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs +++ b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs @@ -742,6 +742,11 @@ namespace MeoAsstGui if (ret) { AddLog(Localization.GetString("Running")); + var settingsModel = _container.Get(); + if (!settingsModel.AdbReplaced && !settingsModel.UseAdbTouchMode) + { + AddLog(Localization.GetString("AdbReplacementTips"), UILogColor.Info); + } } else { diff --git a/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs b/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs index 9e6a610907..82bcff191c 100644 --- a/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs +++ b/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs @@ -139,10 +139,11 @@ namespace MeoAsstGui } } - private const string RequestUrl = "https://api.github.com/repos/MaaAssistantArknights/MaaRelease/releases"; - private const string StableRequestUrl = "https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/releases/latest"; - private const string MaaReleaseRequestUrlByTag = "https://api.github.com/repos/MaaAssistantArknights/MaaRelease/releases/tags/"; - private const string InfoRequestUrl = "https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/releases/tags/"; + private const string RequestUrl = "repos/MaaAssistantArknights/MaaRelease/releases"; + private const string StableRequestUrl = "repos/MaaAssistantArknights/MaaAssistantArknights/releases/latest"; + private const string MaaReleaseRequestUrlByTag = "repos/MaaAssistantArknights/MaaRelease/releases/tags/"; + private const string InfoRequestUrl = "repos/MaaAssistantArknights/MaaAssistantArknights/releases/tags/"; + private const string RequestUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.76"; private JObject _latestJson; private JObject _assetsObject; @@ -482,20 +483,20 @@ namespace MeoAsstGui return CheckUpdateRetT.NoNeedToUpdate; } - // 开发版不检查更新 - if (!(settings.UpdateNightly && !isDebugVersion()) && !isStdVersion()) + // 调试版不检查更新 + if (isDebugVersion()) { - return CheckUpdateRetT.NoNeedToUpdate; + return CheckUpdateRetT.FailedToGetInfo; } - const int RequestRetryMaxTimes = 5; + const int RequestRetryMaxTimes = 2; try { if (!settings.UpdateBeta && !settings.UpdateNightly) { // 稳定版更新使用主仓库 /latest 接口 // 直接使用 MaaRelease 的话,30 个可能会找不到稳定版,因为有可能 Nightly 发了很多 - var stableResponse = RequestApi(StableRequestUrl, RequestRetryMaxTimes); + var stableResponse = RequestGithubApi(StableRequestUrl, RequestRetryMaxTimes); if (stableResponse.Length == 0) { return CheckUpdateRetT.NetworkError; @@ -503,7 +504,7 @@ namespace MeoAsstGui _latestJson = JsonConvert.DeserializeObject(stableResponse) as JObject; _latestVersion = _latestJson["tag_name"].ToString(); - stableResponse = RequestApi(MaaReleaseRequestUrlByTag + _latestVersion, RequestRetryMaxTimes); + stableResponse = RequestGithubApi(MaaReleaseRequestUrlByTag + _latestVersion, RequestRetryMaxTimes); // 主仓库能找到版,但是 MaaRelease 找不到,说明 MaaRelease 还没有同步(一般过个十分钟就同步好了) if (stableResponse.Length == 0) @@ -516,7 +517,7 @@ namespace MeoAsstGui else { // 非稳定版更新使用 MaaRelease/releases 接口 - var response = RequestApi(RequestUrl, RequestRetryMaxTimes); + var response = RequestGithubApi(RequestUrl, RequestRetryMaxTimes); if (response.Length == 0) { return CheckUpdateRetT.NetworkError; @@ -573,7 +574,7 @@ namespace MeoAsstGui // 非稳定版本是 Nightly 下载的,主仓库没有它的更新信息,不必请求 if (isStdVersion(_latestVersion)) { - var infoResponse = RequestApi(InfoRequestUrl + _latestVersion, RequestRetryMaxTimes); + var infoResponse = RequestGithubApi(InfoRequestUrl + _latestVersion, RequestRetryMaxTimes); if (infoResponse.Length == 0) { return CheckUpdateRetT.FailedToGetInfo; @@ -616,12 +617,17 @@ namespace MeoAsstGui httpWebRequest.UserAgent = RequestUserAgent; httpWebRequest.Accept = "application/vnd.github.v3+json"; var settings = _container.Get(); - if (settings.Proxy.Length > 0) + if (!string.IsNullOrWhiteSpace(settings.Proxy)) { httpWebRequest.Proxy = new WebProxy(settings.Proxy); } var httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse; + if (httpWebResponse.StatusCode != HttpStatusCode.OK) + { + return null; + } + var streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8); var responseContent = streamReader.ReadToEnd(); streamReader.Close(); @@ -631,18 +637,26 @@ namespace MeoAsstGui catch (Exception info) { Console.WriteLine(info.Message); - return string.Empty; + return null; } } - private string RequestApi(string url, int retryTimes) + private string RequestGithubApi(string url, int retryTimes) { - string response; + string response = string.Empty; + string[] requestSource = { "https://api.github.com/", "https://api.kgithub.com/" }; do { - response = RequestApi(url); + for (var i = 0; i < requestSource.Length; i++) + { + response = RequestApi(requestSource[i] + url); + if (!string.IsNullOrEmpty(response)) + { + break; + } + } } - while (response.Length == 0 && retryTimes-- > 0); + while (string.IsNullOrEmpty(response) && retryTimes-- > 0); return response; } diff --git a/src/MeoAsstMac b/src/MeoAsstMac index 9509c01076..3d3cd78dd5 160000 --- a/src/MeoAsstMac +++ b/src/MeoAsstMac @@ -1 +1 @@ -Subproject commit 9509c0107646a315fc3514bcf2f829b0ffcff161 +Subproject commit 3d3cd78dd5523bf503aebf0ebde225f6d4628f2a