Compare commits

..

9 Commits

24 changed files with 1245 additions and 5 deletions

26
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/CFCoreAPI.Tests/bin/Debug/net6.0/CFCoreAPI.Tests.dll",
"args": [],
"cwd": "${workspaceFolder}/CFCoreAPI.Tests",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"cSpell.words": [
"Minecraft"
]
}

41
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,41 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/CFCoreAPI.Tests/CFCoreAPI.Tests.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/CFCoreAPI.Tests/CFCoreAPI.Tests.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/CFCoreAPI.Tests/CFCoreAPI.Tests.csproj"
],
"problemMatcher": "$msCompile"
}
]
}

44
CFCoreAPI/CFCore.cs Normal file
View File

@ -0,0 +1,44 @@
using System.Net.Http;
using CFCoreAPI.Endpoints.Categories;
using CFCoreAPI.Endpoints.Files;
using CFCoreAPI.Endpoints.Fingerprints;
using CFCoreAPI.Endpoints.Games;
using CFCoreAPI.Endpoints.Minecraft;
using CFCoreAPI.Endpoints.Mods;
namespace CFCoreAPI
{
public class CFCore
{
private readonly string _apiKey;
public HttpClient HttpClient { get; private set; }
public CFCore(string key)
{
this._apiKey = key;
this.HttpClient = new HttpClient();
this.HttpClient.BaseAddress = new Uri("https://api.curseforge.com");
this.HttpClient.DefaultRequestHeaders.Add("x-api-key", _apiKey);
this._gamesAPI = new Lazy<GamesAPI>(() => new GamesAPI(HttpClient));
this._categoriesAPI = new Lazy<CategoriesAPI>(() => new CategoriesAPI(HttpClient));
this._modsAPI = new Lazy<ModsAPI>(() => new ModsAPI(HttpClient));
this._filesAPI = new Lazy<FilesAPI>(() => new FilesAPI(HttpClient));
this._fingerprintAPI = new Lazy<FingerprintsAPI>(() => new FingerprintsAPI(HttpClient));
this._minecraftAPI = new Lazy<MinecraftAPI>(() => new MinecraftAPI(HttpClient));
}
private Lazy<GamesAPI> _gamesAPI;
public GamesAPI Games => this._gamesAPI.Value;
private Lazy<CategoriesAPI> _categoriesAPI;
public CategoriesAPI Categories => this._categoriesAPI.Value;
private Lazy<ModsAPI> _modsAPI;
public ModsAPI Mods => this._modsAPI.Value;
private Lazy<FilesAPI> _filesAPI;
public FilesAPI Files => this._filesAPI.Value;
private Lazy<FingerprintsAPI> _fingerprintAPI;
public FingerprintsAPI Fingerprints => this._fingerprintAPI.Value;
private Lazy<MinecraftAPI> _minecraftAPI;
public MinecraftAPI Minecraft => this._minecraftAPI.Value;
}
}

View File

@ -6,4 +6,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
</ItemGroup>
</Project> </Project>

View File

@ -1,5 +0,0 @@
namespace CFCoreAPI;
public class Class1
{
}

View File

@ -0,0 +1,13 @@
using System.Diagnostics;
using System.Net.Http;
namespace CFCoreAPI.Endpoints
{
public abstract class APIBase
{
protected HttpClient httpClient;
public APIBase(HttpClient httpClient)
{
this.httpClient = httpClient;
}
}
}

View File

@ -0,0 +1,28 @@
using System.Text.Json;
using CFCoreAPI.Endpoints.Categories.Responses;
using Microsoft.AspNetCore.WebUtilities;
namespace CFCoreAPI.Endpoints.Categories
{
public class CategoriesAPI : APIBase
{
public CategoriesAPI(HttpClient httpClient) : base(httpClient)
{
}
public async Task<CategoriesResponse> GetCategories(int gameId, int? classId)
{
string url = "/v1/categories";
url = QueryHelpers.AddQueryString(url, "gameId", gameId.ToString());
if (classId != null) url = QueryHelpers.AddQueryString(url, "classId", classId.ToString());
HttpResponseMessage response = await httpClient.GetAsync(url);
CategoriesResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = (await JsonSerializer.DeserializeAsync<CategoriesResponse>(contentStream))!;
}
return result;
}
}
}

View File

@ -0,0 +1,62 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Categories.Responses
{
public class CategoriesResponse
{
[JsonConstructor]
public CategoriesResponse(
List<DataModel> data
)
{
this.Data = data;
}
public IReadOnlyList<DataModel> Data { get; }
public class DataModel
{
[JsonConstructor]
public DataModel(
int id,
int gameId,
string name,
string slug,
string url,
string iconUrl,
DateTime dateModified,
bool isClass,
int classId,
int parentCategoryId,
int displayIndex
)
{
this.Id = id;
this.GameId = gameId;
this.Name = name;
this.Slug = slug;
this.Url = url;
this.IconUrl = iconUrl;
this.DateModified = dateModified;
this.IsClass = isClass;
this.ClassId = classId;
this.ParentCategoryId = parentCategoryId;
this.DisplayIndex = displayIndex;
}
public int Id { get; }
public int GameId { get; }
public string Name { get; }
public string Slug { get; }
public string Url { get; }
public string IconUrl { get; }
public DateTime DateModified { get; }
public bool IsClass { get; }
public int ClassId { get; }
public int ParentCategoryId { get; }
public int DisplayIndex { get; }
}
}
}

View File

@ -0,0 +1,89 @@
using System.Text.Json;
using CFCoreAPI.Endpoints.Files.Requests;
using CFCoreAPI.Endpoints.Files.Responses;
using Microsoft.AspNetCore.WebUtilities;
namespace CFCoreAPI.Endpoints.Files
{
public class FilesAPI : APIBase
{
public FilesAPI(HttpClient httpClient) : base(httpClient)
{
}
public async Task<ModFileResponse> GetModFileAsync(int modId, int fileId)
{
string url = "/v1/mods/{0}/files/{1}";
string.Format(url, modId, fileId);
HttpResponseMessage response = await httpClient.GetAsync(url);
ModFileResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = await JsonSerializer.DeserializeAsync<ModFileResponse>(contentStream);
}
return result;
}
public async Task<ModFilesResponse> GetModFilesAsync(int modId, string? gameVersion = null, ModLoaderType? modLoaderType = null, int? gameVersionTypeId = null, int? index = null, int? pageSize = null)
{
string url = "/v1/mods/{0}/files";
string.Format(url, modId);
if (gameVersion != null) QueryHelpers.AddQueryString(url, "gameVersion", gameVersion);
if (modLoaderType != null) QueryHelpers.AddQueryString(url, "modLoaderType", ((int)modLoaderType.Value).ToString());
if (gameVersionTypeId != null) QueryHelpers.AddQueryString(url, "gameVersionTypeId", gameVersionTypeId.ToString());
if (index != null) QueryHelpers.AddQueryString(url, "index", index.ToString());
if (pageSize != null) QueryHelpers.AddQueryString(url, "pageSize", pageSize.ToString());
HttpResponseMessage response = await httpClient.GetAsync(url);
ModFilesResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = await JsonSerializer.DeserializeAsync<ModFilesResponse>(contentStream);
}
return result;
}
public async Task<FileResponse> GetFilesAsync(ModFilesRequest request)
{
string url = "/v1/mods/files";
HttpContent content = new StringContent(JsonSerializer.Serialize(request));
HttpResponseMessage response = await httpClient.PostAsync(url, content);
FileResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = await JsonSerializer.DeserializeAsync<FileResponse>(contentStream);
}
return result;
}
public async Task<StringResponse> GetModFileChangelog(int modId, int field)
{
string url = "/v1/mods/{0}/files/{1}/changelog";
string.Format(url, modId, field);
HttpResponseMessage response = await httpClient.GetAsync(url);
StringResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = await JsonSerializer.DeserializeAsync<StringResponse>(contentStream);
}
return result;
}
public async Task<StringResponse> GetModFileDownloadURL(int modId, int field)
{
string url = "/v1/mods/{0}/files/{1}/download-url";
string.Format(url, modId, field);
HttpResponseMessage response = await httpClient.GetAsync(url);
StringResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = await JsonSerializer.DeserializeAsync<StringResponse>(contentStream);
}
return result;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Files.Requests
{
public class ModFilesRequest
{
[JsonConstructor]
public ModFilesRequest(
List<int> modIds
)
{
this.ModIds = modIds;
}
public IReadOnlyList<int> ModIds { get; }
}
}

View File

@ -0,0 +1,172 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Files.Responses
{
public struct FileResponse
{
[JsonConstructor]
public FileResponse(
List<DataModel> data
)
{
this.Data = data;
}
public IReadOnlyList<DataModel> Data { get; }
public struct DataModel
{
[JsonConstructor]
public DataModel(
int id,
int gameId,
int modId,
bool isAvailable,
string displayName,
string fileName,
int releaseType,
int fileStatus,
List<HashModel> hashes,
DateTime fileDate,
int fileLength,
int downloadCount,
string downloadUrl,
List<string> gameVersions,
List<SortableGameVersion> sortableGameVersions,
List<DependencyModel> dependencies,
bool exposeAsAlternative,
int parentProjectFileId,
int alternateFileId,
bool isServerPack,
int serverPackFileId,
int fileFingerprint,
List<ModuleModel> modules
)
{
this.Id = id;
this.GameId = gameId;
this.ModId = modId;
this.IsAvailable = isAvailable;
this.DisplayName = displayName;
this.FileName = fileName;
this.ReleaseType = releaseType;
this.FileStatus = fileStatus;
this.Hashes = hashes;
this.FileDate = fileDate;
this.FileLength = fileLength;
this.DownloadCount = downloadCount;
this.DownloadUrl = downloadUrl;
this.GameVersions = gameVersions;
this.SortableGameVersions = sortableGameVersions;
this.Dependencies = dependencies;
this.ExposeAsAlternative = exposeAsAlternative;
this.ParentProjectFileId = parentProjectFileId;
this.AlternateFileId = alternateFileId;
this.IsServerPack = isServerPack;
this.ServerPackFileId = serverPackFileId;
this.FileFingerprint = fileFingerprint;
this.Modules = modules;
}
public int Id { get; }
public int GameId { get; }
public int ModId { get; }
public bool IsAvailable { get; }
public string DisplayName { get; }
public string FileName { get; }
public int ReleaseType { get; }
public int FileStatus { get; }
public IReadOnlyList<HashModel> Hashes { get; }
public DateTime FileDate { get; }
public int FileLength { get; }
public int DownloadCount { get; }
public string DownloadUrl { get; }
public IReadOnlyList<string> GameVersions { get; }
public IReadOnlyList<SortableGameVersion> SortableGameVersions { get; }
public IReadOnlyList<DependencyModel> Dependencies { get; }
public bool ExposeAsAlternative { get; }
public int ParentProjectFileId { get; }
public int AlternateFileId { get; }
public bool IsServerPack { get; }
public int ServerPackFileId { get; }
public int FileFingerprint { get; }
public IReadOnlyList<ModuleModel> Modules { get; }
}
public struct DependencyModel
{
[JsonConstructor]
public DependencyModel(
int modId,
int relationType
)
{
this.ModId = modId;
this.RelationType = relationType;
}
public int ModId { get; }
public int RelationType { get; }
}
public struct HashModel
{
[JsonConstructor]
public HashModel(
string value,
int algo
)
{
this.Value = value;
this.Algo = algo;
}
public string Value { get; }
public int Algo { get; }
}
public struct ModuleModel
{
[JsonConstructor]
public ModuleModel(
string name,
int fingerprint
)
{
this.Name = name;
this.Fingerprint = fingerprint;
}
public string Name { get; }
public int Fingerprint { get; }
}
public struct SortableGameVersion
{
[JsonConstructor]
public SortableGameVersion(
string gameVersionName,
string gameVersionPadded,
string gameVersion,
DateTime gameVersionReleaseDate,
int gameVersionTypeId
)
{
this.GameVersionName = gameVersionName;
this.GameVersionPadded = gameVersionPadded;
this.GameVersion = gameVersion;
this.GameVersionReleaseDate = gameVersionReleaseDate;
this.GameVersionTypeId = gameVersionTypeId;
}
public string GameVersionName { get; }
public string GameVersionPadded { get; }
public string GameVersion { get; }
public DateTime GameVersionReleaseDate { get; }
public int GameVersionTypeId { get; }
}
}
}

View File

@ -0,0 +1,173 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Files.Responses
{
public struct ModFileResponse
{
[JsonConstructor]
public ModFileResponse(
DataModel data
)
{
this.Data = data;
}
public DataModel Data { get; }
public struct DataModel
{
[JsonConstructor]
public DataModel(
int id,
int gameId,
int modId,
bool isAvailable,
string displayName,
string fileName,
int releaseType,
int fileStatus,
List<HashModel> hashes,
DateTime fileDate,
int fileLength,
int downloadCount,
string downloadUrl,
List<string> gameVersions,
List<SortableGameVersionModel> sortableGameVersions,
List<DependencyModel> dependencies,
bool exposeAsAlternative,
int parentProjectFileId,
int alternateFileId,
bool isServerPack,
int serverPackFileId,
int fileFingerprint,
List<ModuleModel> modules
)
{
this.Id = id;
this.GameId = gameId;
this.ModId = modId;
this.IsAvailable = isAvailable;
this.DisplayName = displayName;
this.FileName = fileName;
this.ReleaseType = releaseType;
this.FileStatus = fileStatus;
this.Hashes = hashes;
this.FileDate = fileDate;
this.FileLength = fileLength;
this.DownloadCount = downloadCount;
this.DownloadUrl = downloadUrl;
this.GameVersions = gameVersions;
this.SortableGameVersions = sortableGameVersions;
this.Dependencies = dependencies;
this.ExposeAsAlternative = exposeAsAlternative;
this.ParentProjectFileId = parentProjectFileId;
this.AlternateFileId = alternateFileId;
this.IsServerPack = isServerPack;
this.ServerPackFileId = serverPackFileId;
this.FileFingerprint = fileFingerprint;
this.Modules = modules;
}
public int Id { get; }
public int GameId { get; }
public int ModId { get; }
public bool IsAvailable { get; }
public string DisplayName { get; }
public string FileName { get; }
public int ReleaseType { get; }
public int FileStatus { get; }
public IReadOnlyList<HashModel> Hashes { get; }
public DateTime FileDate { get; }
public int FileLength { get; }
public int DownloadCount { get; }
public string DownloadUrl { get; }
public IReadOnlyList<string> GameVersions { get; }
public IReadOnlyList<SortableGameVersionModel> SortableGameVersions { get; }
public IReadOnlyList<DependencyModel> Dependencies { get; }
public bool ExposeAsAlternative { get; }
public int ParentProjectFileId { get; }
public int AlternateFileId { get; }
public bool IsServerPack { get; }
public int ServerPackFileId { get; }
public int FileFingerprint { get; }
public IReadOnlyList<ModuleModel> Modules { get; }
}
public struct DependencyModel
{
[JsonConstructor]
public DependencyModel(
int modId,
int relationType
)
{
this.ModId = modId;
this.RelationType = relationType;
}
public int ModId { get; }
public int RelationType { get; }
}
public struct HashModel
{
[JsonConstructor]
public HashModel(
string value,
int algo
)
{
this.Value = value;
this.Algo = algo;
}
public string Value { get; }
public int Algo { get; }
}
public struct ModuleModel
{
[JsonConstructor]
public ModuleModel(
string name,
int fingerprint
)
{
this.Name = name;
this.Fingerprint = fingerprint;
}
public string Name { get; }
public int Fingerprint { get; }
}
public struct SortableGameVersionModel
{
[JsonConstructor]
public SortableGameVersionModel(
string gameVersionName,
string gameVersionPadded,
string gameVersion,
DateTime gameVersionReleaseDate,
int gameVersionTypeId
)
{
this.GameVersionName = gameVersionName;
this.GameVersionPadded = gameVersionPadded;
this.GameVersion = gameVersion;
this.GameVersionReleaseDate = gameVersionReleaseDate;
this.GameVersionTypeId = gameVersionTypeId;
}
public string GameVersionName { get; }
public string GameVersionPadded { get; }
public string GameVersion { get; }
public DateTime GameVersionReleaseDate { get; }
public int GameVersionTypeId { get; }
}
}
}

View File

@ -0,0 +1,197 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Files.Responses
{
public struct ModFilesResponse
{
[JsonConstructor]
public ModFilesResponse(
List<DataModel> data,
PaginationModel pagination
)
{
this.Data = data;
this.Pagination = pagination;
}
public IReadOnlyList<DataModel> Data { get; }
public PaginationModel Pagination { get; }
public struct DataModel
{
[JsonConstructor]
public DataModel(
int id,
int gameId,
int modId,
bool isAvailable,
string displayName,
string fileName,
int releaseType,
int fileStatus,
List<HashModel> hashes,
DateTime fileDate,
int fileLength,
int downloadCount,
string downloadUrl,
List<string> gameVersions,
List<SortableGameVersionModel> sortableGameVersions,
List<DependencyModel> dependencies,
bool exposeAsAlternative,
int parentProjectFileId,
int alternateFileId,
bool isServerPack,
int serverPackFileId,
int fileFingerprint,
List<ModuleModel> modules
)
{
this.Id = id;
this.GameId = gameId;
this.ModId = modId;
this.IsAvailable = isAvailable;
this.DisplayName = displayName;
this.FileName = fileName;
this.ReleaseType = releaseType;
this.FileStatus = fileStatus;
this.Hashes = hashes;
this.FileDate = fileDate;
this.FileLength = fileLength;
this.DownloadCount = downloadCount;
this.DownloadUrl = downloadUrl;
this.GameVersions = gameVersions;
this.SortableGameVersions = sortableGameVersions;
this.Dependencies = dependencies;
this.ExposeAsAlternative = exposeAsAlternative;
this.ParentProjectFileId = parentProjectFileId;
this.AlternateFileId = alternateFileId;
this.IsServerPack = isServerPack;
this.ServerPackFileId = serverPackFileId;
this.FileFingerprint = fileFingerprint;
this.Modules = modules;
}
public int Id { get; }
public int GameId { get; }
public int ModId { get; }
public bool IsAvailable { get; }
public string DisplayName { get; }
public string FileName { get; }
public int ReleaseType { get; }
public int FileStatus { get; }
public IReadOnlyList<HashModel> Hashes { get; }
public DateTime FileDate { get; }
public int FileLength { get; }
public int DownloadCount { get; }
public string DownloadUrl { get; }
public IReadOnlyList<string> GameVersions { get; }
public IReadOnlyList<SortableGameVersionModel> SortableGameVersions { get; }
public IReadOnlyList<DependencyModel> Dependencies { get; }
public bool ExposeAsAlternative { get; }
public int ParentProjectFileId { get; }
public int AlternateFileId { get; }
public bool IsServerPack { get; }
public int ServerPackFileId { get; }
public int FileFingerprint { get; }
public IReadOnlyList<ModuleModel> Modules { get; }
}
public struct DependencyModel
{
[JsonConstructor]
public DependencyModel(
int modId,
int relationType
)
{
this.ModId = modId;
this.RelationType = relationType;
}
public int ModId { get; }
public int RelationType { get; }
}
public struct HashModel
{
[JsonConstructor]
public HashModel(
string value,
int algo
)
{
this.Value = value;
this.Algo = algo;
}
public string Value { get; }
public int Algo { get; }
}
public struct ModuleModel
{
[JsonConstructor]
public ModuleModel(
string name,
int fingerprint
)
{
this.Name = name;
this.Fingerprint = fingerprint;
}
public string Name { get; }
public int Fingerprint { get; }
}
public struct PaginationModel
{
[JsonConstructor]
public PaginationModel(
int index,
int pageSize,
int resultCount,
int totalCount
)
{
this.Index = index;
this.PageSize = pageSize;
this.ResultCount = resultCount;
this.TotalCount = totalCount;
}
public int Index { get; }
public int PageSize { get; }
public int ResultCount { get; }
public int TotalCount { get; }
}
public struct SortableGameVersionModel
{
[JsonConstructor]
public SortableGameVersionModel(
string gameVersionName,
string gameVersionPadded,
string gameVersion,
DateTime gameVersionReleaseDate,
int gameVersionTypeId
)
{
this.GameVersionName = gameVersionName;
this.GameVersionPadded = gameVersionPadded;
this.GameVersion = gameVersion;
this.GameVersionReleaseDate = gameVersionReleaseDate;
this.GameVersionTypeId = gameVersionTypeId;
}
public string GameVersionName { get; }
public string GameVersionPadded { get; }
public string GameVersion { get; }
public DateTime GameVersionReleaseDate { get; }
public int GameVersionTypeId { get; }
}
}
}

View File

@ -0,0 +1,11 @@
namespace CFCoreAPI
{
public enum ModLoaderType : int
{
Any = 0,
Forge = 1,
Cauldron = 2,
LiteLoader = 3,
Fabric = 4
}
}

View File

@ -0,0 +1,10 @@
namespace CFCoreAPI.Endpoints.Fingerprints
{
public class FingerprintsAPI : APIBase
{
public FingerprintsAPI(HttpClient httpClient) : base(httpClient)
{
throw new System.NotImplementedException();
}
}
}

View File

@ -0,0 +1,73 @@
using System.Net.Http;
using CFCoreAPI.Endpoints;
using Microsoft.AspNetCore.WebUtilities;
using CFCoreAPI.Endpoints.Games.Responses;
using System.Text.Json;
namespace CFCoreAPI.Endpoints.Games
{
public class GamesAPI : APIBase
{
public GamesAPI(HttpClient httpClient) : base(httpClient)
{
}
// TODO: Likely should move generic calls to extension method or private helper method.
public async Task<GamesResponse> GetGamesAsync(int? index = null, int? pageSize = null)
{
string url = "/v1/games";
if (index != null) url = QueryHelpers.AddQueryString(url, "index", index.ToString());
if (pageSize != null) url = QueryHelpers.AddQueryString(url, "pageSize", pageSize.ToString());
HttpResponseMessage response = await httpClient.GetAsync(url);
GamesResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = await JsonSerializer.DeserializeAsync<GamesResponse>(contentStream);
}
return result;
}
public async Task<GameResponse> GetGameAsync(string gameId)
{
string url = "/v1/games/{0}";
string.Format(url, gameId);
HttpResponseMessage response = await httpClient.GetAsync(url);
GameResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = await JsonSerializer.DeserializeAsync<GameResponse>(contentStream);
}
return result;
}
public async Task<VersionsResponse> GetVersionsAsync(string gameId)
{
string url = "/v1/games/{0}/versions";
string.Format(url, gameId);
HttpResponseMessage response = await httpClient.GetAsync(url);
VersionsResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = (await JsonSerializer.DeserializeAsync<VersionsResponse>(contentStream))!;
}
return result;
}
public async Task<VersionTypesResponse> GetVersionTypesAsync(string gameId)
{
string url = "/v1/games/{0}/version-types";
string.Format(url, gameId);
HttpResponseMessage response = await httpClient.GetAsync(url);
VersionTypesResponse result;
using (Stream contentStream = await response.Content.ReadAsStreamAsync())
{
result = (await JsonSerializer.DeserializeAsync<VersionTypesResponse>(contentStream))!;
}
return result;
}
}
}

View File

@ -0,0 +1,69 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Games.Responses
{
public struct GameResponse
{
[JsonConstructor]
public GameResponse(
DataModel data
)
{
this.Data = data;
}
public DataModel Data { get; }
public struct AssetsModel
{
[JsonConstructor]
public AssetsModel(
string iconUrl,
string tileUrl,
string coverUrl
)
{
this.IconUrl = iconUrl;
this.TileUrl = tileUrl;
this.CoverUrl = coverUrl;
}
public string IconUrl { get; }
public string TileUrl { get; }
public string CoverUrl { get; }
}
public struct DataModel
{
[JsonConstructor]
public DataModel(
int id,
string name,
string slug,
DateTime dateModified,
AssetsModel assets,
int status,
int apiStatus
)
{
this.Id = id;
this.Name = name;
this.Slug = slug;
this.DateModified = dateModified;
this.Assets = assets;
this.Status = status;
this.ApiStatus = apiStatus;
}
public int Id { get; }
public string Name { get; }
public string Slug { get; }
public DateTime DateModified { get; }
public AssetsModel Assets { get; }
public int Status { get; }
public int ApiStatus { get; }
}
}
}

View File

@ -0,0 +1,95 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Games.Responses
{
public struct GamesResponse
{
[JsonConstructor]
public GamesResponse(
List<DataModel> data,
PaginationModel pagination
)
{
this.Data = data;
this.Pagination = pagination;
}
public IReadOnlyList<DataModel> Data { get; }
public PaginationModel Pagination { get; }
public struct AssetsModel
{
[JsonConstructor]
public AssetsModel(
string iconUrl,
string tileUrl,
string coverUrl
)
{
this.IconUrl = iconUrl;
this.TileUrl = tileUrl;
this.CoverUrl = coverUrl;
}
public string IconUrl { get; }
public string TileUrl { get; }
public string CoverUrl { get; }
}
public struct DataModel
{
[JsonConstructor]
public DataModel(
int id,
string name,
string slug,
DateTime dateModified,
AssetsModel assets,
int status,
int apiStatus
)
{
this.Id = id;
this.Name = name;
this.Slug = slug;
this.DateModified = dateModified;
this.Assets = assets;
this.Status = status;
this.ApiStatus = apiStatus;
}
public int Id { get; }
public string Name { get; }
public string Slug { get; }
public DateTime DateModified { get; }
public AssetsModel Assets { get; }
public int Status { get; }
public int ApiStatus { get; }
}
public struct PaginationModel
{
[JsonConstructor]
public PaginationModel(
int index,
int pageSize,
int resultCount,
int totalCount
)
{
this.Index = index;
this.PageSize = pageSize;
this.ResultCount = resultCount;
this.TotalCount = totalCount;
}
public int Index { get; }
public int PageSize { get; }
public int ResultCount { get; }
public int TotalCount { get; }
}
}
}

View File

@ -0,0 +1,42 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Games.Responses
{
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class VersionTypesResponse
{
[JsonConstructor]
public VersionTypesResponse(
List<DataModel> data
)
{
this.Data = data;
}
public IReadOnlyList<DataModel> Data { get; }
public class DataModel
{
[JsonConstructor]
public DataModel(
int id,
int gameId,
string name,
string slug
)
{
this.Id = id;
this.GameId = gameId;
this.Name = name;
this.Slug = slug;
}
public int Id { get; }
public int GameId { get; }
public string Name { get; }
public string Slug { get; }
}
}
}

View File

@ -0,0 +1,35 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Games.Responses
{
public class VersionsResponse
{
[JsonConstructor]
public VersionsResponse(
List<DataModel> data
)
{
this.Data = data;
}
public IReadOnlyList<DataModel> Data { get; }
public class DataModel
{
[JsonConstructor]
public DataModel(
int type,
List<string> versions
)
{
this.Type = type;
this.Versions = versions;
}
public int Type { get; }
public IReadOnlyList<string> Versions { get; }
}
}
}

View File

@ -0,0 +1,10 @@
namespace CFCoreAPI.Endpoints.Minecraft
{
public class MinecraftAPI : APIBase
{
public MinecraftAPI(HttpClient httpClient) : base(httpClient)
{
throw new System.NotImplementedException();
}
}
}

View File

@ -0,0 +1,10 @@
namespace CFCoreAPI.Endpoints.Mods
{
public class ModsAPI : APIBase
{
public ModsAPI(HttpClient httpClient) : base(httpClient)
{
throw new System.NotImplementedException();
}
}
}

View File

@ -0,0 +1,17 @@
using System.Text.Json.Serialization;
namespace CFCoreAPI.Endpoints.Files.Responses
{
public struct StringResponse
{
[JsonConstructor]
public StringResponse(
string data
)
{
this.Data = data;
}
public string Data { get; }
}
}