Initial split of the modules
This commit is contained in:
NadekoBot.Core
Common
AsyncLazy.cs
Attributes
BotConfigEditType.csCREmbed.csCollections
CommandData.csModuleBehaviors
IEarlyBlocker.csIEarlyBlockingExecutor.csIEarlyExecutor.csIINputTransformer.csILateBlocker.csILateBlockingExecutor.csILateExecutor.cs
NadekoModule.csNadekoModuleExtensions.csNadekoRandom.csNoPublicBotPrecondition.csPlatformHelper.csReplacements
Shard0Precondition.csShardCom
SocketMessageEventWrapper.csTypeReaders
Migrations
20161011200458_first.Designer.cs20161011200458_first.cs20161015005020_CurrencyTransaction.Designer.cs20161015005020_CurrencyTransaction.cs20161015102407_coc.Designer.cs20161015102407_coc.cs20161019055137_MuteRoleName.Designer.cs20161019055137_MuteRoleName.cs20161107213222_Cleverbot.Designer.cs20161107213222_Cleverbot.cs20161122100602_Greet and bye improved.Designer.cs20161122100602_Greet and bye improved.cs20161127233843_PokeGame.Designer.cs20161127233843_PokeGame.cs20161213025624_mutedusers.Designer.cs20161213025624_mutedusers.cs20161224032833_logsettings.Designer.cs20161224032833_logsettings.cs20170110111159_repeater-drop.Designer.cs20170110111159_repeater-drop.cs20170110111302_repeater-new.Designer.cs20170110111302_repeater-new.cs20170110180534_protection.Designer.cs20170110180534_protection.cs20170112185538_currency-modifications.Designer.cs20170112185538_currency-modifications.cs20170118202307_ok-error-colors.Designer.cs20170118202307_ok-error-colors.cs20170122044958_waifus.Designer.cs20170122044958_waifus.cs20170213164350_guild-timezone-and-locale.Designer.cs20170213164350_guild-timezone-and-locale.cs20170222162505_dateadded.Designer.cs20170222162505_dateadded.cs20170308033058_permsv2.Designer.cs20170308033058_permsv2.cs20170310210952_unmute-timers.Designer.cs20170310210952_unmute-timers.cs20170311054632_vcrole.Designer.cs20170311054632_vcrole.cs20170318190018_crad-and-crdm.Designer.cs20170318190018_crad-and-crdm.cs20170320090138_command-aliasing.Designer.cs20170320090138_command-aliasing.cs20170330000613_warning-commands.Designer.cs20170330000613_warning-commands.cs20170331093025_startup-commands.Designer.cs20170331093025_startup-commands.cs20170401161600_slowmode-whitelist.Designer.cs20170401161600_slowmode-whitelist.cs20170401205753_patreon-rewards.Designer.cs20170401205753_patreon-rewards.cs20170405161814_flower-shop.Designer.cs20170405161814_flower-shop.cs20170408162851_game-voice-channel.Designer.cs20170408162851_game-voice-channel.cs20170409193757_gmod-and-cmod.Designer.cs20170409193757_gmod-and-cmod.cs20170501103455_patreon-id.Designer.cs20170501103455_patreon-id.cs20170528001839_permissions-version.Designer.cs20170528001839_permissions-version.cs20170530033406_guild-prefixes.Designer.cs20170530033406_guild-prefixes.cs20170612094138_verbose-errors.Designer.cs20170612094138_verbose-errors.cs20170612234751_repeat time of day.Designer.cs20170612234751_repeat time of day.cs20170613231358_maxdropamount.Designer.cs20170613231358_maxdropamount.cs20170616154106_crstartswith.Designer.cs20170616154106_crstartswith.cs20170714021615_stream-role.Designer.cs20170714021615_stream-role.cs20170719023924_streamrole-kw-bl-wl.Designer.cs20170719023924_streamrole-kw-bl-wl.cs20170721004230_nsfw-blacklist.Designer.cs20170721004230_nsfw-blacklist.cs20170722074959_cr-ca.Designer.cs20170722074959_cr-ca.cs20170814044636_waifu-items.Designer.cs20170814044636_waifu-items.cs20170815222316_mute-time-antispam.Designer.cs20170815222316_mute-time-antispam.cs20170908230730_xp-and-clubs.Designer.cs20170908230730_xp-and-clubs.cs20170911200031_lastXpGain.Designer.cs20170911200031_lastXpGain.cs20170913022654_total-xp.Designer.cs20170913022654_total-xp.cs20170915034808_club-admins.Designer.cs20170915034808_club-admins.cs20170921185313_feeds.Designer.cs20170921185313_feeds.cs20170923002439_xprr-fix.Designer.cs20170923002439_xprr-fix.csMigrationQueries.csNadekoSqliteContextModelSnapshot.cs
Modules
Administration
Administration.csAutoAssignRoleCommands.cs
Common
GameChannelCommands.csLocalizationCommands.csLogCommands.csMigrationCommands.csMuteCommands.csPlayingRotateCommands.csPrefixCommands.csProtectionCommands.csPruneCommands.csRatelimitCommands.csSelfAssignedRolesCommands.csSelfCommands.csServerGreetCommands.csServices
AdministrationService.csAutoAssignRoleService.csGameVoiceChannelService.csGuildTimezoneService.csLogCommandService.csMuteService.csPlayingRotateService.csProtectionService.csPruneService.csRatelimitService.csSelfService.csUserPunishService.csVcRoleService.csVplusTService.cs
TimeZoneCommands.csUserPunishCommands.csVcRoleCommands.csVoicePlusTextCommands.csHelp
Permissions
Services
CommandHandler.csCurrencyService.cs
Database
IUnitOfWork.cs
DbService.csGreetSettingsService.csIBotConfigProvider.csIBotCredentials.csIDataCache.csIGoogleApiService.csIImagesService.csILocalization.csINService.csIStatsService.csModels
AntiProtection.csBotConfig.csClashCaller.csClashWar.csClubInfo.csCommandCooldown.csCommandCost.csCommandPrice.csConvertUnit.csCurrency.csCurrencyTransaction.csCustomReaction.csDbEntity.csDiscordUser.csDonator.csFeedSub.csFollowedStream.csGuildConfig.csIgnoredLogChannel.csLogSetting.csMusicPlaylist.csPermission.csPlaylistSong.csPokeType.csQuote.csReminder.csRepeater.csRewardedUser.csSelfAssignableRole.csShopEntry.csStreamRoleSettings.csUserXpStats.csVoicePresenceChannel.csWaifu.csWaifuItem.csWaifuUpdate.csWarning.csXpSettings.cs
NadekoContext.csRepositories
IBotConfigRepository.csIClashOfClansRepository.csIClubRepository.csICurrencyRepository.csICurrencyTransactionsRepository.csICustomReactionRepository.csIDiscordUserRepository.csIDonatorsRepository.csIGuildConfigRepository.csIMusicPlaylistRepository.csIPokeGameRepository.csIQuoteRepository.csIReminderRepository.csIRepository.csISelfAssignedRolesRepository.csIUnitConverterRepository.csIWaifuRepository.csIWarningsRepository.csIXpRepository.cs
UnitOfWork.csImpl
BotConfigRepository.csClashOfClansRepository.csClubRepository.csCurrencyRepository.csCurrencyTransactionsRepository.csCustomReactionRepository.csDiscordUserRepository.csDonatorsRepository.csGuildConfigRepository.csMusicPlaylistRepository.csPokeGameRepository.csQuoteRepository.csReminderRepository.csRepository.csSelfAssignedRolesRepository.csUnitCOnverterRepository.csWaifuRepository.csWarningsRepository.csXpRepository.cs
Impl
BotConfigProvider.csBotCredentials.csGoogleApiService.csImagesService.csLocalization.csNadekoStrings.csRedisCache.csSoundCloudApiService.csStartingGuildsListService.csStatsService.csSyncPreconditionService.csYtdl.cs
LogSetup.csNadekoBot.csServiceProvider.csShardsCoordinator.cs_Extensions
Extensions.csIEnumerableExtensions.csIMessageChannelExtensions.csIUserExtensions.csMusicExtensions.csNumberExtensions.csStringExtensions.cs
_libs
_strings
ResponseStrings.ar.jsonResponseStrings.cs-CZ.jsonResponseStrings.da-DK.jsonResponseStrings.de-DE.jsonResponseStrings.en-US.jsonResponseStrings.es-ES.jsonResponseStrings.fr-FR.jsonResponseStrings.he-IL.jsonResponseStrings.id-ID.jsonResponseStrings.it-IT.jsonResponseStrings.ja-JP.jsonResponseStrings.ko-KR.jsonResponseStrings.nb-NO.jsonResponseStrings.nl-NL.jsonResponseStrings.pl-PL.jsonResponseStrings.pt-BR.jsonResponseStrings.ro-RO.jsonResponseStrings.ru-RU.jsonResponseStrings.sr-cyrl-rs.jsonResponseStrings.sv-SE.jsonResponseStrings.tr-TR.jsonResponseStrings.zh-CN.jsonResponseStrings.zh-TW.json
NadekoBot.Module.Searches
AnimeSearchCommands.cs
Common
AnimeResult.csDefineModel.cs
FeedCommands.csJokeCommands.csLoLCommands.csMemegenCommands.csNadekoBot.Modules.Searches.csprojOsuCommands.csOverwatchCommands.csPlaceCommands.csPokemonSearchCommands.csSearches.csExceptions
GoogleSearchResult.csMagicItem.csMangaResult.csOmdbProvider.csOverwatchApiModel.csSearchImageCacher.csSearchPokemon.csStreamResponses.csTimeModels.csWeatherModels.csWikipediaApiModel.csWoWJoke.csServices
StreamNotificationCommands.csTranslatorCommands.csXkcdCommands.csNadekoBot.Modules.CustomReactions
NadekoBot.Modules.Gambling
AnimalRacingCommands.cs
Common
CurrencyEventsCommands.csDiceRollCommands.csDrawCommands.csFlipCoinCommands.csFlowerShopCommands.csGambling.csNadekoBot.Modules.Gambling.csprojSlotCommands.csWaifuClaimCommands.csWheelOfFortuneCommands.csNadekoBot.Modules.Games
AcropobiaCommands.csCleverBotCommands.csConnect4Commands.csGames.csHangmanCommands.csLeetCommands.csNadekoBot.Modules.Games.csprojNunchiCommands.csPlantAndPickCommands.csPollCommands.cs
Common
Acrophobia
ChatterBot
ChatterBotResponse.csChatterBotSession.csCleverbotResponse.csIChatterBotSession.csOfficialCleverbotSession.cs
Connect4
GirlRating.csHangman
Nunchi
Poll.csTrivia
TypingArticle.csTypingGame.csServices
SpeedTypingCommands.csTicTacToeCommands.csTriviaCommands.csNadekoBot.Modules.Music
Common
Extensions
Music.csNadekoBot.Modules.Music.csprojServices
NadekoBot.Modules.Nsfw
NadekoBot.Modules.Pokemon
NadekoBot.Modules.Utility
BotConfigCommands.csCalcCommands.csCommandMapCommands.cs
Common
Extensions
InfoCommands.csNadekoBot.Modules.Utility.csprojPatreonCommands.csQuoteCommands.csRemindCommands.csRepeatCommands.csServices
CommandMapService.csConverterService.csMessageRepeaterService.csPatreonRewardsService.csRemindService.csStreamRoleService.csVerboseErrorsService.cs
StreamRoleCommands.csUnitConversionCommands.csUtility.csVerboseErrorCommands.csNadekoBot.Modules.Xp
NadekoBot.slndocs
src/NadekoBot
124
NadekoBot.Core/Services/Impl/NadekoStrings.cs
Normal file
124
NadekoBot.Core/Services/Impl/NadekoStrings.cs
Normal file
@ -0,0 +1,124 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
|
||||
namespace NadekoBot.Services.Impl
|
||||
{
|
||||
public class NadekoStrings : INService
|
||||
{
|
||||
public const string stringsPath = @"_strings/";
|
||||
|
||||
private readonly ImmutableDictionary<string, ImmutableDictionary<string, string>> responseStrings;
|
||||
private readonly Logger _log;
|
||||
/// <summary>
|
||||
/// Used as failsafe in case response key doesn't exist in the selected or default language.
|
||||
/// </summary>
|
||||
private readonly CultureInfo _usCultureInfo = new CultureInfo("en-US");
|
||||
private readonly ILocalization _localization;
|
||||
|
||||
private readonly Regex formatFinder = new Regex(@"{\d}", RegexOptions.Compiled);
|
||||
|
||||
public NadekoStrings(ILocalization loc)
|
||||
{
|
||||
_log = LogManager.GetCurrentClassLogger();
|
||||
_localization = loc;
|
||||
|
||||
var sw = Stopwatch.StartNew();
|
||||
var allLangsDict = new Dictionary<string, ImmutableDictionary<string, string>>(); // lang:(name:value)
|
||||
foreach (var file in Directory.GetFiles(stringsPath))
|
||||
{
|
||||
var langDict = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(file));
|
||||
|
||||
allLangsDict.Add(GetLocaleName(file).ToLowerInvariant(), langDict.ToImmutableDictionary());
|
||||
}
|
||||
|
||||
responseStrings = allLangsDict.ToImmutableDictionary();
|
||||
sw.Stop();
|
||||
|
||||
_log.Info("Loaded {0} languages in {1:F2}s",
|
||||
responseStrings.Count,
|
||||
//string.Join(",", responseStrings.Keys),
|
||||
sw.Elapsed.TotalSeconds);
|
||||
|
||||
////improper string format checks
|
||||
//var compareTo = responseStrings["en-us"]
|
||||
// .Select(x =>
|
||||
// {
|
||||
// return (StringKey: x.Key, Placeholders: formatFinder.Matches(x.Value).Cast<Match>().Select(y => y.Value).ToArray());
|
||||
// })
|
||||
// .ToDictionary(x => x.StringKey, x => x.Placeholders);
|
||||
|
||||
//var errors = responseStrings
|
||||
// .Select(a => (a.Key, a.Value.Select(x =>
|
||||
// {
|
||||
// if (!compareTo.ContainsKey(x.Key))
|
||||
// return (StringKey: x.Key, Placeholders: new HashSet<string>(), Missing: true);
|
||||
// var hs = new HashSet<string>(compareTo[x.Key]);
|
||||
// hs.SymmetricExceptWith(formatFinder.Matches(x.Value).Cast<Match>().Select(y => y.Value).ToArray());
|
||||
// return (StringKey: x.Key, Placeholders: hs, Missing: false);
|
||||
// })
|
||||
// .Where(x => x.Placeholders.Any() || x.Missing)))
|
||||
// .Where(x => x.Item2.Any());
|
||||
|
||||
//var str = string.Join("\n", errors.Select(x => $"------{x.Item1}------\n" +
|
||||
// string.Join("\n", x.Item2.Select(y =>
|
||||
// y.StringKey + ": " + (y.Missing ? "MISSING" : string.Join(", ", y.Placeholders))))));
|
||||
//if (!string.IsNullOrWhiteSpace(str))
|
||||
// _log.Warn($"Improperly Formatted strings:\n{str}");
|
||||
}
|
||||
|
||||
private string GetLocaleName(string fileName)
|
||||
{
|
||||
var dotIndex = fileName.IndexOf('.') + 1;
|
||||
var secondDotINdex = fileName.LastIndexOf('.');
|
||||
return fileName.Substring(dotIndex, secondDotINdex - dotIndex);
|
||||
}
|
||||
|
||||
private string GetString(string text, CultureInfo cultureInfo)
|
||||
{
|
||||
if (!responseStrings.TryGetValue(cultureInfo.Name.ToLowerInvariant(), out ImmutableDictionary<string, string> strings))
|
||||
return null;
|
||||
|
||||
strings.TryGetValue(text, out string val);
|
||||
return val;
|
||||
}
|
||||
|
||||
public string GetText(string key, ulong? guildId, string lowerModuleTypeName, params object[] replacements) =>
|
||||
GetText(key, _localization.GetCultureInfo(guildId), lowerModuleTypeName, replacements);
|
||||
|
||||
public string GetText(string key, CultureInfo cultureInfo, string lowerModuleTypeName)
|
||||
{
|
||||
var text = GetString(lowerModuleTypeName + "_" + key, cultureInfo);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(text))
|
||||
{
|
||||
LogManager.GetCurrentClassLogger().Warn(lowerModuleTypeName + "_" + key + " key is missing from " + cultureInfo + " response strings. PLEASE REPORT THIS.");
|
||||
text = GetString(lowerModuleTypeName + "_" + key, _usCultureInfo) ?? $"Error: dkey {lowerModuleTypeName + "_" + key} not found!";
|
||||
if (string.IsNullOrWhiteSpace(text))
|
||||
return "I can't tell you if the command is executed, because there was an error printing out the response. Key '" +
|
||||
lowerModuleTypeName + "_" + key + "' " + "is missing from resources. Please report this.";
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
public string GetText(string key, CultureInfo cultureInfo, string lowerModuleTypeName,
|
||||
params object[] replacements)
|
||||
{
|
||||
try
|
||||
{
|
||||
return string.Format(GetText(key, cultureInfo, lowerModuleTypeName), replacements);
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
return "I can't tell you if the command is executed, because there was an error printing out the response. Key '" +
|
||||
lowerModuleTypeName + "_" + key + "' " + "is not properly formatted. Please report this.";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user