Skip to content

Commit f1ee203

Browse files
committed
feat:add support for custom thirdparty API root
1 parent b7523c1 commit f1ee203

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed

ProjBobcat/ProjBobcat/Class/Helper/CurseForgeAPIHelper.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public static class CurseForgeAPIHelper
4040
{
4141
const string BaseUrl = "https://api.curseforge.com/v1";
4242

43+
public static string? ApiBaseUrl { get; set; }
44+
4345
static string ApiKey { get; set; } = null!;
4446
static HttpClient Client => HttpClientHelper.DefaultClient;
4547

@@ -51,6 +53,7 @@ static HttpRequestMessage Req(HttpMethod method, string url)
5153
var req = new HttpRequestMessage(method, url);
5254

5355
req.Headers.Add("x-api-key", ApiKey);
56+
req.Headers.Add("User-Agent", HttpClientHelper.Ua);
5457

5558
return req;
5659
}
@@ -62,7 +65,7 @@ public static void SetApiKey(string apiKey)
6265

6366
public static async Task<DataModelWithPagination<CurseForgeAddonInfo[]>?> SearchAddons(SearchOptions options, CancellationToken ct)
6467
{
65-
var reqUrl = $"{BaseUrl}/mods/search{options}";
68+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/mods/search{options}";
6669

6770
using var req = Req(HttpMethod.Get, reqUrl);
6871
using var res = await Client.SendAsync(req, ct);
@@ -73,7 +76,7 @@ public static void SetApiKey(string apiKey)
7376

7477
public static async Task<CurseForgeAddonInfo?> GetAddon(long addonId)
7578
{
76-
var reqUrl = $"{BaseUrl}/mods/{addonId}";
79+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/mods/{addonId}";
7780

7881
using var req = Req(HttpMethod.Get, reqUrl);
7982
using var res = await Client.SendAsync(req);
@@ -84,7 +87,7 @@ public static void SetApiKey(string apiKey)
8487

8588
public static async Task<CurseForgeAddonInfo[]?> GetAddons(IEnumerable<long> addonIds)
8689
{
87-
const string reqUrl = $"{BaseUrl}/mods";
90+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/mods";
8891
var data = JsonSerializer.Serialize(new AddonInfoReqModel(addonIds),
8992
CurseForgeModelContext.Default.AddonInfoReqModel);
9093

@@ -101,7 +104,7 @@ public static void SetApiKey(string apiKey)
101104

102105
public static async Task<CurseForgeLatestFileModel[]?> GetAddonFiles(long addonId)
103106
{
104-
var reqUrl = $"{BaseUrl}/mods/{addonId}/files";
107+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/mods/{addonId}/files";
105108

106109
using var req = Req(HttpMethod.Get, reqUrl);
107110
using var res = await Client.SendAsync(req);
@@ -114,7 +117,7 @@ public static void SetApiKey(string apiKey)
114117

115118
public static async Task<CurseForgeLatestFileModel[]?> GetFiles(IEnumerable<long> fileIds)
116119
{
117-
const string reqUrl = $"{BaseUrl}/mods/files";
120+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/mods/files";
118121
var data = JsonSerializer.Serialize(new FileInfoReqModel(fileIds),
119122
CurseForgeModelContext.Default.FileInfoReqModel);
120123

@@ -131,7 +134,7 @@ public static void SetApiKey(string apiKey)
131134

132135
public static async Task<CurseForgeSearchCategoryModel[]?> GetCategories(int gameId = 432)
133136
{
134-
var reqUrl = $"{BaseUrl}/categories?gameId={gameId}";
137+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/categories?gameId={gameId}";
135138

136139
using var req = Req(HttpMethod.Get, reqUrl);
137140
using var res = await Client.SendAsync(req);
@@ -157,7 +160,7 @@ public static void SetApiKey(string apiKey)
157160

158161
public static async Task<string?> GetAddonDownloadUrl(long addonId, long fileId)
159162
{
160-
var reqUrl = $"{BaseUrl}/mods/{addonId}/files/{fileId}/download-url";
163+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/mods/{addonId}/files/{fileId}/download-url";
161164

162165
using var req = Req(HttpMethod.Get, reqUrl);
163166
using var res = await Client.SendAsync(req);
@@ -170,7 +173,7 @@ public static void SetApiKey(string apiKey)
170173

171174
public static async Task<string?> GetAddonDescriptionHtml(long addonId)
172175
{
173-
var reqUrl = $"{BaseUrl}/mods/{addonId}/description";
176+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/mods/{addonId}/description";
174177

175178
using var req = Req(HttpMethod.Get, reqUrl);
176179
using var res = await Client.SendAsync(req);
@@ -182,7 +185,7 @@ public static void SetApiKey(string apiKey)
182185
public static async Task<CurseForgeFuzzySearchResponseModel?> TryFuzzySearchFile(long[] fingerprint,
183186
int gameId = 432)
184187
{
185-
var reqUrl = $"{BaseUrl}/fingerprints/{gameId}";
188+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/fingerprints/{gameId}";
186189

187190
var data = JsonSerializer.Serialize(new FuzzyFingerPrintReqModel(fingerprint),
188191
CurseForgeModelContext.Default.FuzzyFingerPrintReqModel);

ProjBobcat/ProjBobcat/Class/Helper/ModrinthAPIHelper.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public static class ModrinthAPIHelper
2424
{
2525
const string BaseUrl = "https://api.modrinth.com/v2";
2626

27+
public static string? ApiBaseUrl { get; set; }
28+
2729
static async Task<HttpResponseMessage> Get(string reqUrl, CancellationToken ct = default)
2830
{
2931
var req = await HttpHelper.Get(reqUrl, ct: ct);
@@ -34,7 +36,7 @@ static async Task<HttpResponseMessage> Get(string reqUrl, CancellationToken ct =
3436

3537
public static async Task<ModrinthCategoryInfo[]?> GetCategories()
3638
{
37-
const string reqUrl = $"{BaseUrl}/tag/category";
39+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/tag/category";
3840

3941
using var res = await Get(reqUrl);
4042
var resModel =
@@ -45,7 +47,7 @@ static async Task<HttpResponseMessage> Get(string reqUrl, CancellationToken ct =
4547

4648
public static async Task<ModrinthProjectDependencyInfo?> GetProjectDependenciesInfo(string projectId)
4749
{
48-
var reqUrl = $"{BaseUrl}/project/{projectId}/dependencies";
50+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/project/{projectId}/dependencies";
4951

5052
using var res = await Get(reqUrl);
5153
var resModel =
@@ -57,7 +59,7 @@ await res.Content.ReadFromJsonAsync(ModrinthProjectDependencyInfoContext.Default
5759

5860
public static async Task<ModrinthProjectInfo?> GetProject(string projectId, CancellationToken ct)
5961
{
60-
var reqUrl = $"{BaseUrl}/project/{projectId}";
62+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/project/{projectId}";
6163

6264
using var res = await Get(reqUrl, ct);
6365
var resModel = await res.Content.ReadFromJsonAsync(ModrinthProjectInfoContext.Default.ModrinthProjectInfo, ct);
@@ -67,7 +69,7 @@ await res.Content.ReadFromJsonAsync(ModrinthProjectDependencyInfoContext.Default
6769

6870
public static async Task<ModrinthSearchResult?> GetFeaturedMods()
6971
{
70-
const string reqUrl = $"{BaseUrl}/search";
72+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/search";
7173

7274
using var res = await Get(reqUrl);
7375
var resModel = await res.Content.ReadFromJsonAsync(ModrinthSearchResultContext.Default.ModrinthSearchResult);
@@ -77,7 +79,7 @@ await res.Content.ReadFromJsonAsync(ModrinthProjectDependencyInfoContext.Default
7779

7880
public static async Task<ModrinthSearchResult?> SearchMod(ModrinthSearchOptions searchOptions, CancellationToken ct)
7981
{
80-
var reqUrl = $"{BaseUrl}/search{searchOptions}";
82+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/search{searchOptions}";
8183

8284
using var res = await Get(reqUrl, ct);
8385
var resModel = await res.Content.ReadFromJsonAsync(ModrinthSearchResultContext.Default.ModrinthSearchResult, ct);
@@ -87,7 +89,7 @@ await res.Content.ReadFromJsonAsync(ModrinthProjectDependencyInfoContext.Default
8789

8890
public static async Task<ModrinthVersionInfo[]?> GetProjectVersions(string projectId)
8991
{
90-
var reqUrl = $"{BaseUrl}/project/{projectId}/version";
92+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/project/{projectId}/version";
9193

9294
using var res = await Get(reqUrl);
9395
var resModel = await res.Content.ReadFromJsonAsync(ModrinthVersionInfoContext.Default.ModrinthVersionInfoArray);
@@ -105,7 +107,7 @@ await res.Content.ReadFromJsonAsync(ModrinthProjectDependencyInfoContext.Default
105107
HashType.SHA512 => "?algorithm=sha512",
106108
_ => throw new ArgumentOutOfRangeException(nameof(hashType), hashType, null)
107109
};
108-
var reqUrl = $"{BaseUrl}/version_file/{hash}{para}";
110+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/version_file/{hash}{para}";
109111

110112
using var res = await Get(reqUrl);
111113
var resModel = await res.Content.ReadFromJsonAsync(ModrinthVersionInfoContext.Default.ModrinthVersionInfo);
@@ -115,7 +117,7 @@ await res.Content.ReadFromJsonAsync(ModrinthProjectDependencyInfoContext.Default
115117

116118
public static async Task<ModrinthVersionInfo?> GetVersionInfo(string projectId, string versionId)
117119
{
118-
var reqUrl = $"{BaseUrl}/project/{projectId}/version/{versionId}";
120+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/project/{projectId}/version/{versionId}";
119121

120122
using var res = await Get(reqUrl);
121123
var resModel = await res.Content.ReadFromJsonAsync(ModrinthVersionInfoContext.Default.ModrinthVersionInfo);
@@ -125,7 +127,7 @@ await res.Content.ReadFromJsonAsync(ModrinthProjectDependencyInfoContext.Default
125127

126128
public static async Task<ModrinthVersionInfo?> GetVersionInfo(string versionId)
127129
{
128-
var reqUrl = $"{BaseUrl}/version/{versionId}";
130+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/version/{versionId}";
129131

130132
using var res = await Get(reqUrl);
131133
var resModel = await res.Content.ReadFromJsonAsync(ModrinthVersionInfoContext.Default.ModrinthVersionInfo);
@@ -139,7 +141,7 @@ await res.Content.ReadFromJsonAsync(ModrinthProjectDependencyInfoContext.Default
139141
string[] loaders,
140142
string[] gameVersions)
141143
{
142-
const string reqUrl = $"{BaseUrl}/version_files/update";
144+
var reqUrl = $"{ApiBaseUrl ?? BaseUrl}/version_files/update";
143145

144146
var data = JsonSerializer.Serialize(new FileMatchRequestModel(hashes, algorithm, loaders, gameVersions),
145147
ModrinthModelContext.Default.FileMatchRequestModel);

0 commit comments

Comments
 (0)