using System.Net.Mime; using DiscordBotCore.Logging; using DiscordBotCore.PluginManagement.Models; using DiscordBotCore.Utilities; using Microsoft.AspNetCore.Http.Extensions; namespace DiscordBotCore.PluginManagement.Helpers; public class PluginRepository : IPluginRepository { private readonly IPluginRepositoryConfiguration _pluginRepositoryConfiguration; private readonly HttpClient _httpClient; private readonly ILogger _logger; public PluginRepository(IPluginRepositoryConfiguration pluginRepositoryConfiguration, ILogger logger) { _pluginRepositoryConfiguration = pluginRepositoryConfiguration; _httpClient = new HttpClient(); _httpClient.BaseAddress = new Uri(_pluginRepositoryConfiguration.BaseUrl); _logger = logger; } public async Task> GetAllPlugins(int operatingSystem, bool includeNotApproved) { string url = CreateUrlWithQueryParams(_pluginRepositoryConfiguration.PluginRepositoryLocation, "get-all-plugins", new Dictionary { { "operatingSystem", operatingSystem.ToString() }, { "includeNotApproved", includeNotApproved.ToString() } }); try { HttpResponseMessage response = await _httpClient.GetAsync(url); if (!response.IsSuccessStatusCode) { return []; } string content = await response.Content.ReadAsStringAsync(); List plugins = await JsonManager.ConvertFromJson>(content); return plugins; } catch (HttpRequestException exception) { _logger.LogException(exception,this); return []; } } public async Task GetPluginById(int pluginId) { string url = CreateUrlWithQueryParams(_pluginRepositoryConfiguration.PluginRepositoryLocation, "get-by-id", new Dictionary { { "pluginId", pluginId.ToString() }, { "includeNotApproved", "false" } }); try { HttpResponseMessage response = await _httpClient.GetAsync(url); if (!response.IsSuccessStatusCode) { return null; } string content = await response.Content.ReadAsStringAsync(); OnlinePlugin plugin = await JsonManager.ConvertFromJson(content); return plugin; } catch (HttpRequestException exception) { _logger.LogException(exception, this); return null; } } public async Task GetPluginByName(string pluginName, int operatingSystem, bool includeNotApproved) { string url = CreateUrlWithQueryParams(_pluginRepositoryConfiguration.PluginRepositoryLocation, "get-by-name", new Dictionary { { "pluginName", pluginName }, { "operatingSystem", operatingSystem.ToString() }, { "includeNotApproved", includeNotApproved.ToString() } }); try { HttpResponseMessage response = await _httpClient.GetAsync(url); if (!response.IsSuccessStatusCode) { _logger.Log($"Plugin {pluginName} not found"); return null; } string content = await response.Content.ReadAsStringAsync(); OnlinePlugin plugin = await JsonManager.ConvertFromJson(content); return plugin; } catch (HttpRequestException exception) { _logger.LogException(exception, this); return null; } } public async Task> GetDependenciesForPlugin(int pluginId) { string url = CreateUrlWithQueryParams(_pluginRepositoryConfiguration.DependenciesRepositoryLocation, "get-by-plugin-id", new Dictionary { { "pluginId", pluginId.ToString() } }); try { HttpResponseMessage response = await _httpClient.GetAsync(url); if(!response.IsSuccessStatusCode) { _logger.Log($"Failed to get dependencies for plugin with ID {pluginId}"); return []; } string content = await response.Content.ReadAsStringAsync(); List dependencies = await JsonManager.ConvertFromJson>(content); return dependencies; } catch(HttpRequestException exception) { _logger.LogException(exception, this); return []; } } private string CreateUrlWithQueryParams(string baseUrl, string endpoint, Dictionary queryParams) { QueryBuilder queryBuilder = new QueryBuilder(); foreach (var(key,value) in queryParams) { queryBuilder.Add(key, value); } string queryString = queryBuilder.ToQueryString().ToString(); string url = baseUrl + endpoint + queryString; return url; } }