Merge pull request #2873 from MaaAssistantArknights/dev

Release v4.7.1
This commit is contained in:
MistEO
2022-11-23 23:30:00 +08:00
committed by GitHub
12 changed files with 144 additions and 57 deletions

View File

@@ -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

View File

@@ -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)を参照してください。
- 韓国サーバー
基本的な作戦機能のみサポートされている。

View File

@@ -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` など)を選択できます。
<details><summary>画面例</summary>
![画面例](https://user-images.githubusercontent.com/63186641/203410007-ef9c1cab-10f3-4d7c-8048-a3e11cdadb75.png)
</details>
- スタート画面の `理性剤使用数``割る源石の数``周回数指定``素材を限定` の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は後の対応予定<!-- UIの都合で10章対応予定 -->
- 回線が落ちると、自動的に再接続されてステージのクリアが続けられます。<!-- Wakeup未対応だったような・・・ -->
- `素材を限定``ステージ` は別のオプションです: `素材を限定` 「中級源岩のドロップ数を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でミヅキをプレイする予定だが、未達のファントムのセーブがある、その場合は手動で終了させてください。
<details><summary>固定方法(グローバル版はミヅキ追加後)</summary>
- 統合戦略はオペレーターと昇進/レベルの自動識別をサポートしており、最適なオペレーターとスキルを自動的に選択することができます。
- 回線が落ちた場合や午前4時にリセットされた場合は、自動的に再接続されて続きから始めます。
![固定方法](https://user-images.githubusercontent.com/63186641/203422504-22aa0ed9-0f64-4c9f-abca-665e247d13a0.png)
</details>
- 設定は分隊、最初の職業選択(最初に指定するオペレーター)等を設定できます。
- オペレーターや昇進レベルを自動認識し、最適なオペレーターやスキルを自動選択。
- ショップアイテムの識別と、より強力な秘宝の購入の優先順位のサポート。
- 午前4時のアップデート後、ドロップ後の再接続と周回の継続に対応。
- 5分経っても戦闘が終わらない場合は、すべての地上部隊が自動的に退却。6分経つと自動的に戦闘放棄し、無限ループを防ぎます。
- アプリがバグで立ち往生した場合は、現在の冒険を自動的に放棄して再試行します。しかし、どこかで行き詰まって放棄してしまい、効率に深刻な影響を与えることが多い場合は、issueを提出してフィードバックをお寄せください。
### 自動戦闘現在JP未対応
@@ -104,7 +132,7 @@ JSONスキーマとの連携をご希望の方は、お気軽にお問い合わ
- スタートと設定画面で変更された構成は、「*」でマークされたオプションを除いて、自動的に保存されます。
- すべてのクリック操作は、ボタン内のランダムな位置でのクリックであり、ポアソン分布をシミュレートします(ボタンの中心がクリックされる確率が高く、中心から離れるほどクリックされる確率が小さくなります)。
- 基礎となるアルゴリズムは純粋なC++で開発され、CPUとメモリの使用を最小限に抑えるように複数のキャッシュテクで設計されています。
- アプリは自動敵に更新がサポートされます✿✿ヽ(°▽°)ノ✿、気にならないユーザーはベータ版の使用をお勧めします(更新も速く、バグもほとんどありません)。
- アプリは自動更新がサポートされています✿✿ヽ(°▽°)ノ✿、気にならないユーザーはベータ版の使用をお勧めします(更新も速く、バグもほとんどありません)。
- 新しいバージョンの自動ダウンロードが失敗した場合は、パッケージを手動でダウンロードして同じディレクトリに配置すると、自動的に更新されます。
## その他の機能

View File

@@ -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",

View File

@@ -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": {},

View File

@@ -297,6 +297,7 @@
<system:String x:Key="ConnectingToEmulator">Connecting to emulator...</system:String>
<system:String x:Key="UnselectedTask">Unselected task</system:String>
<system:String x:Key="Running">Running...</system:String>
<system:String x:Key="AdbReplacementTips">If all stuck, plz go to Settings - Connection Settings - Forced Replace ADB File, or turn on Compatibility Touch Mode</system:String>
<system:String x:Key="Stopping">Stopping...</system:String>
<system:String x:Key="Stopped">Has stopped</system:String>
<system:String x:Key="UnknownErrorOccurs">Unknown error occurred</system:String>

View File

@@ -298,6 +298,7 @@
<system:String x:Key="ConnectingToEmulator">正在连接模拟器……</system:String>
<system:String x:Key="UnselectedTask">未选择任务</system:String>
<system:String x:Key="Running">正在运行中……</system:String>
<system:String x:Key="AdbReplacementTips">如果任务完全没有反应,请使用 设置 - 连接设置 - 强制替换 ADB或打开 兼容性触控模式</system:String>
<system:String x:Key="Stopping">正在停止……</system:String>
<system:String x:Key="Stopped">已停止</system:String>
<system:String x:Key="UnknownErrorOccurs">出现未知错误</system:String>

View File

@@ -50,7 +50,7 @@ namespace MeoAsstGui.Views
{
return Localization.GetString("ErrorSolutionCrash");
}
else if (details.Contains("SettingsViewModel.<ReplaceADB>") && details.Contains("System.IO.File"))
else if (details.Contains("SettingsViewModel.<ReplaceADB>"))
{
return Localization.GetString("ErrorSolutionReplaceADB");
}

View File

@@ -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()));
/* 界面设置 */
/// <summary>

View File

@@ -742,6 +742,11 @@ namespace MeoAsstGui
if (ret)
{
AddLog(Localization.GetString("Running"));
var settingsModel = _container.Get<SettingsViewModel>();
if (!settingsModel.AdbReplaced && !settingsModel.UseAdbTouchMode)
{
AddLog(Localization.GetString("AdbReplacementTips"), UILogColor.Info);
}
}
else
{

View File

@@ -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<SettingsViewModel>();
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;
}