< Summary

Information
Class: TeleFlow.Telegram.Internal.Handlers.TelegramMarkerFilterSpec
Assembly: TeleFlow.Framework
File(s): /_/src/TeleFlow.Framework/Internal/Handlers/TelegramFilterFacts.cs
Line coverage
100%
Covered lines: 4
Uncovered lines: 0
Coverable lines: 4
Total lines: 120
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%

File(s)

/_/src/TeleFlow.Framework/Internal/Handlers/TelegramFilterFacts.cs

#LineLine coverage
 1using System.Reflection;
 2using TeleFlow.Annotations;
 3
 4namespace TeleFlow.Telegram.Internal.Handlers;
 5
 6internal enum TelegramFilterTarget
 7{
 8    Message,
 9    Callback,
 10    Chat,
 11    MessageThread,
 12    SenderUser,
 13    SenderChat
 14}
 15
 16internal enum TelegramMarkerFilterGroup
 17{
 18    MessageContent,
 19    MessageSender,
 20    SenderUser,
 21    SharedMetadata
 22}
 23
 2024internal sealed record TelegramMarkerFilterSpec(
 2025    Type AttributeType,
 2026    TelegramFilterKind Kind,
 2027    TelegramMarkerFilterGroup Group);
 28
 29internal static class TelegramFilterFacts
 30{
 31    public static IReadOnlyList<TelegramMarkerFilterSpec> MarkerFilters { get; } = new TelegramMarkerFilterSpec[]
 32    {
 33        new(typeof(HasTextAttribute), TelegramFilterKind.HasText, TelegramMarkerFilterGroup.MessageContent),
 34        new(typeof(HasPhotoAttribute), TelegramFilterKind.HasPhoto, TelegramMarkerFilterGroup.MessageContent),
 35        new(typeof(HasDocumentAttribute), TelegramFilterKind.HasDocument, TelegramMarkerFilterGroup.MessageContent),
 36        new(typeof(HasCaptionAttribute), TelegramFilterKind.HasCaption, TelegramMarkerFilterGroup.MessageContent),
 37        new(typeof(HasVideoAttribute), TelegramFilterKind.HasVideo, TelegramMarkerFilterGroup.MessageContent),
 38        new(typeof(HasAnimationAttribute), TelegramFilterKind.HasAnimation, TelegramMarkerFilterGroup.MessageContent),
 39        new(typeof(HasAudioAttribute), TelegramFilterKind.HasAudio, TelegramMarkerFilterGroup.MessageContent),
 40        new(typeof(HasVoiceAttribute), TelegramFilterKind.HasVoice, TelegramMarkerFilterGroup.MessageContent),
 41        new(typeof(HasVideoNoteAttribute), TelegramFilterKind.HasVideoNote, TelegramMarkerFilterGroup.MessageContent),
 42        new(typeof(HasStickerAttribute), TelegramFilterKind.HasSticker, TelegramMarkerFilterGroup.MessageContent),
 43        new(typeof(HasContactAttribute), TelegramFilterKind.HasContact, TelegramMarkerFilterGroup.MessageContent),
 44        new(typeof(HasLocationAttribute), TelegramFilterKind.HasLocation, TelegramMarkerFilterGroup.MessageContent),
 45        new(typeof(HasVenueAttribute), TelegramFilterKind.HasVenue, TelegramMarkerFilterGroup.MessageContent),
 46        new(typeof(HasPollAttribute), TelegramFilterKind.HasPoll, TelegramMarkerFilterGroup.MessageContent),
 47        new(typeof(HasDiceAttribute), TelegramFilterKind.HasDice, TelegramMarkerFilterGroup.MessageContent),
 48        new(typeof(FromPremiumUserAttribute), TelegramFilterKind.FromPremiumUser, TelegramMarkerFilterGroup.SenderUser),
 49        new(typeof(IsReplyAttribute), TelegramFilterKind.IsReply, TelegramMarkerFilterGroup.MessageSender),
 50        new(typeof(ReplyToBotAttribute), TelegramFilterKind.ReplyToBot, TelegramMarkerFilterGroup.MessageSender),
 51        new(typeof(HasMessageThreadAttribute), TelegramFilterKind.HasMessageThread, TelegramMarkerFilterGroup.SharedMeta
 52        new(typeof(HasCallbackDataAttribute), TelegramFilterKind.HasCallbackData, TelegramMarkerFilterGroup.SharedMetada
 53    };
 54
 55    public static IEnumerable<TelegramMarkerFilterSpec> GetMarkerFilters(TelegramMarkerFilterGroup group)
 56    {
 57        return MarkerFilters.Where(spec => spec.Group == group);
 58    }
 59
 60    public static TelegramFilterTarget GetTarget(TelegramFilterKind kind)
 61    {
 62        return kind switch
 63        {
 64            TelegramFilterKind.ChatType or
 65                TelegramFilterKind.ChatId or
 66                TelegramFilterKind.ChatUsername => TelegramFilterTarget.Chat,
 67
 68            TelegramFilterKind.MessageThreadId or
 69                TelegramFilterKind.HasMessageThread => TelegramFilterTarget.MessageThread,
 70
 71            TelegramFilterKind.HasCallbackData or
 72                TelegramFilterKind.CallbackDataPrefix => TelegramFilterTarget.Callback,
 73
 74            TelegramFilterKind.FromUser or
 75                TelegramFilterKind.FromBot or
 76                TelegramFilterKind.FromPremiumUser => TelegramFilterTarget.SenderUser,
 77
 78            TelegramFilterKind.SenderChatType => TelegramFilterTarget.SenderChat,
 79
 80            TelegramFilterKind.HasText or
 81                TelegramFilterKind.HasPhoto or
 82                TelegramFilterKind.HasDocument or
 83                TelegramFilterKind.HasCaption or
 84                TelegramFilterKind.HasVideo or
 85                TelegramFilterKind.HasAnimation or
 86                TelegramFilterKind.HasAudio or
 87                TelegramFilterKind.HasVoice or
 88                TelegramFilterKind.HasVideoNote or
 89                TelegramFilterKind.HasSticker or
 90                TelegramFilterKind.HasContact or
 91                TelegramFilterKind.HasLocation or
 92                TelegramFilterKind.HasVenue or
 93                TelegramFilterKind.HasPoll or
 94                TelegramFilterKind.HasDice or
 95                TelegramFilterKind.IsReply or
 96                TelegramFilterKind.ReplyToBot => TelegramFilterTarget.Message,
 97
 98            _ => throw new InvalidOperationException($"Unsupported Telegram filter kind '{kind}'.")
 99        };
 100    }
 101
 102    public static string MapChatType(TelegramChatType chatType)
 103    {
 104        return chatType switch
 105        {
 106            TelegramChatType.Private => "private",
 107            TelegramChatType.Group => "group",
 108            TelegramChatType.Supergroup => "supergroup",
 109            TelegramChatType.Channel => "channel",
 110            _ => throw new InvalidOperationException($"Unsupported Telegram chat type '{chatType}'.")
 111        };
 112    }
 113
 114    public static bool HasMarkerFilter(
 115        MemberInfo member,
 116        TelegramMarkerFilterSpec spec)
 117    {
 118        return member.GetCustomAttribute(spec.AttributeType, inherit: true) is not null;
 119    }
 120}