using NPinyin; using System; using System.Collections.Generic; namespace AnotherReplayReader { class PinyinReplayData { public Replay Replay { get; } public string Name { get; } public string Map { get; } public string Mod { get; } public List Players { get; } = new List(); public List RealNames { get; } = new List(); public List Factions { get; } = new List(); public PinyinReplayData(Replay replay, PlayerIdentity playerIdentity) { Replay = replay; Name = replay.FileName.ToPinyin(); Map = replay.MapName.ToPinyin(); Mod = replay.Mod.ModName.ToPinyin(); foreach (var player in replay.Players) { void AddIfNotEmpty(List target, string s) { s = s.ToPinyin(); if (!string.IsNullOrEmpty(s)) { target.Add(s); } } AddIfNotEmpty(Players, player.PlayerName); AddIfNotEmpty(RealNames, playerIdentity.GetRealName(player.PlayerIP)); AddIfNotEmpty(Factions, ModData.GetFaction(replay.Mod, player.FactionID).Name); } } public bool MatchPinyin(string pinyin) { return Name.ContainsIgnoreCase(pinyin) || Players.FindIndex(s => s.ContainsIgnoreCase(pinyin)) != -1 || RealNames.FindIndex(s => s.ContainsIgnoreCase(pinyin)) != -1 || Map.ContainsIgnoreCase(pinyin) || Mod.ContainsIgnoreCase(pinyin) || Factions.FindIndex(s => s.ContainsIgnoreCase(pinyin)) != -1; } } static class PinyinExtensions { public static bool ContainsIgnoreCase(this string self, string s) { return s != null && self.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) != -1; } public static string ToPinyin(this string self) { string pinyin; try { pinyin = Pinyin.GetPinyin(self); } catch { return null; } return pinyin.Replace(" ", ""); } public static PinyinReplayData ToPinyin(this Replay replay, PlayerIdentity playerIdentity) { return new PinyinReplayData(replay, playerIdentity); } } }