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