Skip to content

Commit 5dfcd6e

Browse files
committed
aquamai install mirror
1 parent 89cc944 commit 5dfcd6e

File tree

8 files changed

+55
-25
lines changed

8 files changed

+55
-25
lines changed

AquaMai

MaiChartManager/Controllers/ModController.cs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ private static bool VerifyBinary(byte[] data, string sign, string key)
313313
return ecdsa.VerifyData(data, signature, HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence);
314314
}
315315

316-
public record InstallAquaMaiOnlineDto(string Url, string Type, string Sign);
316+
public record InstallAquaMaiOnlineDto(string[] Urls, string Type, string Sign);
317317

318318
[HttpPost]
319319
public async Task InstallAquaMaiOnline(InstallAquaMaiOnlineDto req)
@@ -326,16 +326,32 @@ public async Task InstallAquaMaiOnline(InstallAquaMaiOnlineDto req)
326326
};
327327
// Download from url
328328
using var client = new HttpClient();
329-
var data = await client.GetByteArrayAsync(req.Url);
330-
331-
if (!VerifyBinary(data, req.Sign, key))
329+
client.Timeout = TimeSpan.FromSeconds(15);
330+
Exception? lastException = null;
331+
foreach (var url in req.Urls)
332332
{
333-
throw new InvalidOperationException("Invalid signature");
334-
}
333+
byte[] data;
334+
try
335+
{
336+
data = await client.GetByteArrayAsync(url);
335337

336-
// Save to Mods folder
337-
var dest = Path.Combine(StaticSettings.GamePath, @"Mods\AquaMai.dll");
338-
Directory.CreateDirectory(Path.GetDirectoryName(dest));
339-
await System.IO.File.WriteAllBytesAsync(dest, data);
338+
if (!VerifyBinary(data, req.Sign, key))
339+
{
340+
throw new InvalidOperationException("Invalid signature");
341+
}
342+
}
343+
catch (Exception e)
344+
{
345+
logger.LogError(e, "Failed to download AquaMai from {Url}", url);
346+
lastException = e;
347+
continue;
348+
}
349+
// Save to Mods folder
350+
var dest = Path.Combine(StaticSettings.GamePath, @"Mods\AquaMai.dll");
351+
Directory.CreateDirectory(Path.GetDirectoryName(dest));
352+
await System.IO.File.WriteAllBytesAsync(dest, data);
353+
return;
354+
}
355+
throw new InvalidOperationException("Failed to download AquaMai from all urls", lastException);
340356
}
341357
}

MaiChartManager/Front/src/client/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export default (new Api({
1616
})).maiChartManagerServlet
1717

1818
export const aquaMaiVersionConfig = new AquaMaiVersionConfigApi({
19-
baseUrl: 'https://aquamai-version-config.init.ink',
19+
baseUrl: 'https://aquamai-version-config.mumur.net',
2020
baseApiParams: {
2121
headers: {
2222
accept: 'application/json',

MaiChartManager/Front/src/client/apiGen.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ export interface ImportChartResult {
208208
}
209209

210210
export interface InstallAquaMaiOnlineDto {
211-
url?: string | null;
211+
urls?: string[] | null;
212212
type?: string | null;
213213
sign?: string | null;
214214
}

MaiChartManager/Front/src/client/aquaMaiVersionConfigApiGen.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
241241
type: "builtin" | "release" | "ci";
242242
/** @format uri */
243243
url?: string;
244+
/** @format uri */
245+
url2?: string;
244246
sign?: string;
245247
/** @default false */
246248
default?: boolean;
@@ -270,6 +272,8 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
270272
type: "builtin" | "release" | "ci";
271273
/** @format uri */
272274
url?: string;
275+
/** @format uri */
276+
url2?: string;
273277
sign?: string;
274278
/** @default false */
275279
default?: boolean;

MaiChartManager/Front/src/components/ModManager/ModInstallDropdown.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@ export default defineComponent({
2424
if (!version) {
2525
throw new Error('未找到对应版本');
2626
}
27+
const urls = [version.url!];
28+
if (version.url2) {
29+
urls.push(version.url2);
30+
}
2731
await api.InstallAquaMaiOnline({
2832
type,
29-
url: version.url,
33+
urls,
3034
sign: version.sign,
3135
});
3236
}

MaiChartManager/Front/src/components/ModManager/sectionPanelOverride/GameSettings.TouchSensitivity/TouchSensitivityDisplay.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
import { computed, defineComponent, PropType } from "vue";
2-
import { AquaMaiTouchSensitivityConfig } from "@/client/apiGen";
32
import styles from "./TouchSensitivityDisplay.module.sass";
43

54
const CLASS_NOT_SELECTED = styles.region;
65
const CLASS_SELECTED = `${styles.region} ${styles.selected}`;
76
export default defineComponent({
87
props: {
9-
currentSelected: String as PropType<keyof AquaMaiTouchSensitivityConfig>,
10-
config: {type: Object as PropType<AquaMaiTouchSensitivityConfig>, required: true},
8+
currentSelected: String,
9+
config: {type: Object, required: true},
1110
},
1211
setup(props, {emit}) {
1312
const currentSelected = computed({
1413
get: () => props.currentSelected,
1514
set: (val) => emit('update:currentSelected', val)
1615
})
17-
const onRegionClick = (region: keyof AquaMaiTouchSensitivityConfig) => {
16+
const onRegionClick = (region: string) => {
1817
currentSelected.value = region
1918
}
20-
const regionClick = (region: keyof AquaMaiTouchSensitivityConfig) => () => onRegionClick(region)
19+
const regionClick = (region: string) => () => onRegionClick(region)
2120
return () => <svg
2221
width="30em"
2322
height="30em"

MaiChartManager/Front/src/store/refs.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,19 @@ export const updateModInfo = async () => {
8888

8989
export const updateModUpdateInfo = async () => {
9090
try {
91-
const ret = await aquaMaiVersionConfig.getGetConfig();
92-
if (ret.error) {
93-
console.error('Failed to get mod update info:', ret.error);
94-
return;
95-
}
96-
modUpdateInfo.value = ret.data;
91+
modUpdateInfo.value = await Promise.any([
92+
(async () => {
93+
const res = await aquaMaiVersionConfig.getGetConfig();
94+
return res.data;
95+
})(),
96+
(async () => {
97+
const res = await fetch('https://munet-version-config-1251600285.cos.ap-shanghai.myqcloud.com/aquamai.json');
98+
if (!res.ok) {
99+
throw new Error(`Failed to fetch mod update info: ${res.status} ${res.statusText}`);
100+
}
101+
return await res.json();
102+
})(),
103+
]);
97104
} catch (e) {
98105
console.error('Failed to get mod update info:', e);
99106
}

0 commit comments

Comments
 (0)