47 lines
2.1 KiB
C#
47 lines
2.1 KiB
C#
using System.Text.Json;
|
|
using Discord.API.Rest.HttpClientWrapper;
|
|
using Serilog;
|
|
|
|
namespace Discord.API.Rest;
|
|
|
|
internal class RestClient{
|
|
|
|
private IHttpClientWrapper httpClient;
|
|
|
|
public RestClient(string base_url, string api_key)
|
|
: this(api_key, new HttpClientWrapper.HttpClientWrapper() {BaseAddress = new Uri(base_url)})
|
|
{ }
|
|
|
|
internal RestClient(string api_key, IHttpClientWrapper http_client){
|
|
Log.Debug("REST: Creating new rest client. Base url: {base_url}", http_client.BaseAddress?.AbsoluteUri);
|
|
httpClient = http_client;
|
|
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bot {api_key}");
|
|
httpClient.DefaultRequestHeaders.Add("User-Agent", $"DiscordBot ({StaticProperties.LibraryWebsite}, {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);
|
|
}
|
|
}
|
|
|
|
} |