using Serilog; using System.Net; using System.Text.Json; using Myriad.Serialization; using Myriad.Types; namespace Myriad.Cache; public class HttpDiscordCache: IDiscordCache { private readonly ILogger _logger; private readonly HttpClient _client; private readonly string _cacheEndpoint; private readonly ulong _ownUserId; private readonly JsonSerializerOptions _jsonSerializerOptions; public HttpDiscordCache(ILogger logger, HttpClient client, string cacheEndpoint, ulong ownUserId) { _logger = logger; _client = client; _cacheEndpoint = cacheEndpoint; _ownUserId = ownUserId; _jsonSerializerOptions = new JsonSerializerOptions().ConfigureForMyriad(); } public ValueTask SaveGuild(Guild guild) => default; public ValueTask SaveChannel(Channel channel) => default; public ValueTask SaveUser(User user) => default; public ValueTask SaveSelfMember(ulong guildId, GuildMemberPartial member) => default; public ValueTask SaveRole(ulong guildId, Myriad.Types.Role role) => default; public ValueTask SaveDmChannelStub(ulong channelId) => default; public ValueTask RemoveGuild(ulong guildId) => default; public ValueTask RemoveChannel(ulong channelId) => default; public ValueTask RemoveUser(ulong userId) => default; public ValueTask RemoveRole(ulong guildId, ulong roleId) => default; public ulong GetOwnUser() => _ownUserId; // todo: cluster private async Task QueryCache(string endpoint) { var response = await _client.GetAsync($"{_cacheEndpoint}{endpoint}"); if (response.StatusCode == HttpStatusCode.NotFound) return default; if (response.StatusCode != HttpStatusCode.Found) throw new Exception($"failed to query http cache: {response.StatusCode}"); var plaintext = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(plaintext, _jsonSerializerOptions); } public Task TryGetGuild(ulong guildId) => QueryCache($"/guilds/{guildId}"); public Task TryGetChannel(ulong guildId, ulong channelId) => QueryCache($"/guilds/{guildId}/channels/{channelId}"); // this should be a GetUserCached method on nirn-proxy (it's always called as GetOrFetchUser) // so just return nothing public Task TryGetUser(ulong userId) => Task.FromResult(null); public Task TryGetSelfMember(ulong guildId) => QueryCache($"/guilds/{guildId}/members/@me"); public Task BotPermissions(ulong guildId, ulong channelId) => QueryCache($"/guilds/{guildId}/channels/{channelId}/permissions/@me"); public Task> GetGuildChannels(ulong guildId) => QueryCache>($"/guilds/{guildId}/channels"); }