using System.Text.Json; using Serilog; 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 ({StaticProperties.LibraryWebsite}, {StaticProperties.LibraryVersion})"); } internal RestClient(string base_url, string api_key, HttpMessageHandler msg_handler){ Log.Debug("REST: Creating new rest client. Base url: {base_url}", base_url); httpClient = new HttpClient(msg_handler){ BaseAddress=new Uri(base_url) }; httpClient.DefaultRequestHeaders.Add("Authorization", $"Bot {api_key}"); httpClient.DefaultRequestHeaders.Add("User-Agent", $"DiscordBot ({StaticProperties.LibraryWebsite}, {StaticProperties.LibraryVersion})"); } public async Task> GetGateway() => await Get("gateway", s => JsonSerializer.Deserialize(s, SourceGenerationContext.Default.GetGatewayResponse)); private async Task> Get(string url, Func 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( 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( err, resp.StatusCode ); } }catch (Exception ex){ Log.Debug(ex, "REST: Get {url} failed.", url); return new RestFailResponse(ex); } } }