DiscordApi/Discord.API/Rest/RestClient.cs
2024-07-20 22:22:09 +02:00

45 lines
1.9 KiB
C#

using System.Text.Json;
using Serilog;
using Serilog.Core;
namespace Discord.API.Rest;
internal class RestClient{
private HttpClient httpClient;
public RestClient(string base_url, string api_key){
Log.Debug("REST: Creating new rest client. Base url: {base_url}", base_url);
httpClient = new HttpClient(){
BaseAddress=new Uri(base_url)
};
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bot {api_key}");
httpClient.DefaultRequestHeaders.Add("User-Agent", $"DiscordBot ({Discord.API.StaticProperties.LibraryWebsite}, {Discord.API.StaticProperties.LibraryVersion})");
}
public async Task<RestResponse<GetGatewayResponse>> GetGateway() =>
await Get("gateway", s => JsonSerializer.Deserialize(s, SourceGenerationContext.Default.GetGatewayResponse));
private async Task<RestResponse<T>> Get<T>(string url, Func<string, T> deserializer){
try{
HttpResponseMessage resp = await httpClient.GetAsync(url);
if(resp.IsSuccessStatusCode){
Log.Debug("REST: Get {url} successful, http status code: {http_code}", url, resp.StatusCode);
return new RestSuccessResponse<T>(
deserializer.Invoke(await resp.Content.ReadAsStringAsync()),
resp.StatusCode
);
}else{
RestError err = JsonSerializer.Deserialize(await resp.Content.ReadAsStringAsync(), SourceGenerationContext.Default.RestError);
Log.Debug("REST: Get {url} returned error: HTTP: {http_code}, ERR: {err_code}; {err_msg}", url, resp.StatusCode, err.Code, err.Message);
return new RestErrorResponse<T>(
err, resp.StatusCode
);
}
}catch (Exception ex){
Log.Debug(ex, "REST: Get {url} failed.", url);
return new RestFailResponse<T>(ex);
}
}
}