36 lines
1.9 KiB
C#
36 lines
1.9 KiB
C#
namespace WxAgent.Core;
|
|
|
|
public static class WechatSendConfirmation
|
|
{
|
|
public static bool IsMentionToken(string text) => text.TrimEnd() == "\uFFFC";
|
|
|
|
public static bool IsNewOccurrence(string fingerprint,
|
|
IReadOnlyDictionary<string, int> baselineCounts, IReadOnlyDictionary<string, int> currentCounts) =>
|
|
currentCounts.TryGetValue(fingerprint, out var currentCount)
|
|
&& currentCount > (baselineCounts.TryGetValue(fingerprint, out var baselineCount) ? baselineCount : 0);
|
|
|
|
public static bool MatchesMention(ChatMessageSnapshot message,
|
|
IReadOnlyDictionary<string, int> baselineCounts, IReadOnlyDictionary<string, int> currentCounts,
|
|
string memberName, string? body)
|
|
{
|
|
if (!IsNewOccurrence(message.Fingerprint, baselineCounts, currentCounts) || message.Type != ChatMessageType.Text) return false;
|
|
var expected = "@" + memberName + (string.IsNullOrEmpty(body) ? "" : " " + body);
|
|
return string.Equals(NormalizeWhitespace(message.Text), NormalizeWhitespace(expected), StringComparison.Ordinal);
|
|
}
|
|
|
|
private static string NormalizeWhitespace(string text) =>
|
|
string.Join(' ', text.Split((char[]?)null, StringSplitOptions.RemoveEmptyEntries));
|
|
|
|
// UIA proves only a fresh matching visible row, not delivery or sender identity.
|
|
public static bool Matches(ChatMessageSnapshot message,
|
|
IReadOnlyDictionary<string, int> baselineCounts, IReadOnlyDictionary<string, int> currentCounts,
|
|
ChatMessageType type, string? expectedText)
|
|
{
|
|
if (!IsNewOccurrence(message.Fingerprint, baselineCounts, currentCounts) || message.Type != type) return false;
|
|
if (expectedText is null) return true;
|
|
return type == ChatMessageType.File
|
|
? message.Text.Split('\n').Any(line => string.Equals(line.TrimEnd('\r'), expectedText, StringComparison.Ordinal))
|
|
: string.Equals(message.Text, expectedText, StringComparison.Ordinal);
|
|
}
|
|
}
|