using System; using System.Collections.Generic; using System.IO; using System.Linq; using Discord.WebSocket; using Serilog; using StackExchange.Redis; namespace Geekbot.net.Lib { public class TranslationHandler : ITranslationHandler { private readonly ILogger _logger; private readonly IDatabase _redis; private Dictionary>> _translations; private Dictionary _serverLanguages; public List _supportedLanguages; public TranslationHandler(IReadOnlyCollection clientGuilds, IDatabase redis, ILogger logger) { _logger = logger; _redis = redis; _logger.Information("[Geekbot] Loading Translations"); LoadTranslations(); CheckSupportedLanguages(); LoadServerLanguages(clientGuilds); } private void LoadTranslations() { try { var translations = File.ReadAllText(Path.GetFullPath("./Storage/Translations.json")); _translations = Utf8Json.JsonSerializer.Deserialize>>>( translations); } catch (Exception e) { _logger.Fatal(e, "Failed to load Translations"); Environment.Exit(110); } } private void CheckSupportedLanguages() { try { _supportedLanguages = new List(); foreach (var lang in _translations.First().Value.First().Value) { _supportedLanguages.Add(lang.Key); } } catch (Exception e) { _logger.Fatal(e, "Failed to load Translations"); Environment.Exit(110); } } private void LoadServerLanguages(IReadOnlyCollection clientGuilds) { _serverLanguages = new Dictionary(); foreach (var guild in clientGuilds) { var language = _redis.HashGet($"{guild.Id}:Settings", "Language"); if (string.IsNullOrEmpty(language) || !_supportedLanguages.Contains(language)) { _serverLanguages[guild.Id] = "EN"; } else { _serverLanguages[guild.Id] = language.ToString(); } } } public string GetString(ulong guildId, string command, string stringName) { var translation = _translations[command][stringName][_serverLanguages[guildId]]; if (!string.IsNullOrWhiteSpace(translation)) return translation; translation = _translations[command][stringName]["EN"]; if (string.IsNullOrWhiteSpace(translation)) { _logger.Warning($"No translation found for {command} - {stringName}"); } return translation; } public bool SetLanguage(ulong guildId, string language) { try { if (!_supportedLanguages.Contains(language)) return false; _redis.HashSet($"{guildId}:Settings", new HashEntry[]{ new HashEntry("Language", language), }); _serverLanguages[guildId] = language; return true; } catch (Exception e) { _logger.Error(e, "[Geekbot] Error while changing language"); return false; } } public List GetSupportedLanguages() { return _supportedLanguages; } } public interface ITranslationHandler { string GetString(ulong guildId, string command, string stringName); bool SetLanguage(ulong guildId, string language); List GetSupportedLanguages(); } }