Added TextContainsWordAttribute
This commit is contained in:
@@ -44,4 +44,15 @@ namespace Telegrator.Annotations
|
|||||||
public class HasTextAttribute()
|
public class HasTextAttribute()
|
||||||
: MessageFilterAttribute(new TextNotNullOrEmptyFilter())
|
: MessageFilterAttribute(new TextNotNullOrEmptyFilter())
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attribute for filtering messages where the text contains a 'word'.
|
||||||
|
/// 'Word' must be a separate member of the text, and not have any alphabetic characters next to it.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="word"></param>
|
||||||
|
/// <param name="comparison"></param>
|
||||||
|
/// <param name="startIndex"></param>
|
||||||
|
public class TextContainsWordAttribute(string word, StringComparison comparison = StringComparison.InvariantCulture, int startIndex = 0)
|
||||||
|
: MessageFilterAttribute(new TextContainsWordFilter(word, comparison, startIndex))
|
||||||
|
{ }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Filters.Components;
|
using Telegrator.Filters.Components;
|
||||||
|
using static System.Net.Mime.MediaTypeNames;
|
||||||
|
|
||||||
namespace Telegrator.Filters
|
namespace Telegrator.Filters
|
||||||
{
|
{
|
||||||
@@ -155,4 +156,50 @@ namespace Telegrator.Filters
|
|||||||
protected override bool CanPassNext(FilterExecutionContext<Message> _)
|
protected override bool CanPassNext(FilterExecutionContext<Message> _)
|
||||||
=> !string.IsNullOrEmpty(Text);
|
=> !string.IsNullOrEmpty(Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Filter that checks if the message text contains a 'word'.
|
||||||
|
/// 'Word' must be a separate member of the text, and not have any alphabetic characters next to it.
|
||||||
|
/// </summary>
|
||||||
|
public class TextContainsWordFilter(string word, StringComparison comparison = StringComparison.InvariantCulture, int startIndex = 0) : MessageTextFilter
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The content to check if the message text equals.
|
||||||
|
/// </summary>
|
||||||
|
protected readonly string Word = word;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The string comparison type to use for the check.
|
||||||
|
/// </summary>
|
||||||
|
protected readonly StringComparison Comparison = comparison;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The search starting position.
|
||||||
|
/// </summary>
|
||||||
|
protected readonly int StartIndex = startIndex;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
protected override bool CanPassNext(FilterExecutionContext<Message> context)
|
||||||
|
{
|
||||||
|
int index = Text.IndexOf(Word, StartIndex, Comparison);
|
||||||
|
if (index == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (index > 0)
|
||||||
|
{
|
||||||
|
char prev = Text[index - 1];
|
||||||
|
if (char.IsLetter(prev))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index + Word.Length < Text.Length)
|
||||||
|
{
|
||||||
|
char post = Text[index + Word.Length];
|
||||||
|
if (char.IsLetter(post))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user