namespace WxAgent.Core; public static class WechatDerivedText { // Only consume new text inside the bound message, never an entire window or an unbound OCR popup. public static string? AddedText(IReadOnlyList before, IReadOnlyList after) { var remaining = before.Where(value => !string.IsNullOrWhiteSpace(value)) .GroupBy(value => value, StringComparer.Ordinal).ToDictionary(group => group.Key, group => group.Count(), StringComparer.Ordinal); var added = new List(); foreach (var value in after.Where(value => !string.IsNullOrWhiteSpace(value))) { if (remaining.GetValueOrDefault(value) > 0) remaining[value]--; else added.Add(value); } if (remaining.Values.Any(count => count > 0) || added.Count == 0) return null; if (added.Any(value => value.Contains("识别中", StringComparison.Ordinal) || value.Contains("转换中", StringComparison.Ordinal) || value.Contains("转换失败", StringComparison.Ordinal) || value.Contains("识别失败", StringComparison.Ordinal) || value.Contains("未识别到", StringComparison.Ordinal) || value.Contains("无法转换", StringComparison.Ordinal))) return null; return string.Join(Environment.NewLine, added); } }