diff --git a/DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs b/DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs index d17c823..34c4bda 100644 --- a/DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs +++ b/DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs @@ -44,6 +44,12 @@ internal static class FilterGrammar .Select(v => (MessageFilter) new MentionsMessageFilter(v)) .Named("mentions:"); + private static readonly TextParser ReactionFilter = Span + .EqualToIgnoreCase("reaction:") + .IgnoreThen(String) + .Select(v => (MessageFilter) new ReactionMessageFilter(v)) + .Named("reaction:"); + private static readonly TextParser HasFilter = Span .EqualToIgnoreCase("has:") .IgnoreThen(Parse.OneOf( @@ -72,6 +78,7 @@ internal static class FilterGrammar GroupedFilter, FromFilter, MentionsFilter, + ReactionFilter, HasFilter, ContainsFilter ); diff --git a/DiscordChatExporter.Core/Exporting/Filtering/ReactionMessageFilter.cs b/DiscordChatExporter.Core/Exporting/Filtering/ReactionMessageFilter.cs new file mode 100644 index 0000000..2de3938 --- /dev/null +++ b/DiscordChatExporter.Core/Exporting/Filtering/ReactionMessageFilter.cs @@ -0,0 +1,18 @@ +using System; +using System.Linq; +using DiscordChatExporter.Core.Discord.Data; + +namespace DiscordChatExporter.Core.Exporting.Filtering; + +internal class ReactionMessageFilter : MessageFilter +{ + private readonly string _value; + + public ReactionMessageFilter(string value) => _value = value; + + public override bool IsMatch(Message message) => message.Reactions.Any(r => + string.Equals(_value, r.Emoji.Id?.ToString(), StringComparison.OrdinalIgnoreCase) || + string.Equals(_value, r.Emoji.Name, StringComparison.OrdinalIgnoreCase) || + string.Equals(_value, r.Emoji.Code, StringComparison.OrdinalIgnoreCase) + ); +} \ No newline at end of file