Fix not being able to parse message filters that share common prefix with one of the named filters

Related to #909
pull/925/head
Oleksii Holub 2 years ago
parent f48af53d72
commit 92cf886eab

@ -32,6 +32,7 @@ internal static class FilterGrammar
private static readonly TextParser<MessageFilter> FromFilter = private static readonly TextParser<MessageFilter> FromFilter =
Span Span
.EqualToIgnoreCase("from:") .EqualToIgnoreCase("from:")
.Try()
.IgnoreThen(String) .IgnoreThen(String)
.Select(v => (MessageFilter)new FromMessageFilter(v)) .Select(v => (MessageFilter)new FromMessageFilter(v))
.Named("from:<value>"); .Named("from:<value>");
@ -39,6 +40,7 @@ internal static class FilterGrammar
private static readonly TextParser<MessageFilter> MentionsFilter = private static readonly TextParser<MessageFilter> MentionsFilter =
Span Span
.EqualToIgnoreCase("mentions:") .EqualToIgnoreCase("mentions:")
.Try()
.IgnoreThen(String) .IgnoreThen(String)
.Select(v => (MessageFilter)new MentionsMessageFilter(v)) .Select(v => (MessageFilter)new MentionsMessageFilter(v))
.Named("mentions:<value>"); .Named("mentions:<value>");
@ -46,6 +48,7 @@ internal static class FilterGrammar
private static readonly TextParser<MessageFilter> ReactionFilter = private static readonly TextParser<MessageFilter> ReactionFilter =
Span Span
.EqualToIgnoreCase("reaction:") .EqualToIgnoreCase("reaction:")
.Try()
.IgnoreThen(String) .IgnoreThen(String)
.Select(v => (MessageFilter)new ReactionMessageFilter(v)) .Select(v => (MessageFilter)new ReactionMessageFilter(v))
.Named("reaction:<value>"); .Named("reaction:<value>");
@ -53,6 +56,7 @@ internal static class FilterGrammar
private static readonly TextParser<MessageFilter> HasFilter = private static readonly TextParser<MessageFilter> HasFilter =
Span Span
.EqualToIgnoreCase("has:") .EqualToIgnoreCase("has:")
.Try()
.IgnoreThen(Parse.OneOf( .IgnoreThen(Parse.OneOf(
Span.EqualToIgnoreCase("link").IgnoreThen(Parse.Return(MessageContentMatchKind.Link)), Span.EqualToIgnoreCase("link").IgnoreThen(Parse.Return(MessageContentMatchKind.Link)),
Span.EqualToIgnoreCase("embed").IgnoreThen(Parse.Return(MessageContentMatchKind.Embed)), Span.EqualToIgnoreCase("embed").IgnoreThen(Parse.Return(MessageContentMatchKind.Embed)),
@ -65,6 +69,8 @@ internal static class FilterGrammar
.Select(k => (MessageFilter)new HasMessageFilter(k)) .Select(k => (MessageFilter)new HasMessageFilter(k))
.Named("has:<value>"); .Named("has:<value>");
// Make sure that property-based filters like 'has:link' don't prevent text like 'hello' from being parsed.
// https://github.com/Tyrrrz/DiscordChatExporter/issues/909
private static readonly TextParser<MessageFilter> PrimitiveFilter = private static readonly TextParser<MessageFilter> PrimitiveFilter =
Parse.OneOf( Parse.OneOf(
FromFilter, FromFilter,

Loading…
Cancel
Save