< Summary

Information
Class: TeleFlow.Telegram.Internal.TelegramContextFactory
Assembly: TeleFlow.Framework
File(s): /_/src/TeleFlow.Framework/Internal/TelegramContextFactory.cs
Line coverage
98%
Covered lines: 63
Uncovered lines: 1
Coverable lines: 64
Total lines: 121
Line coverage: 98.4%
Branch coverage
92%
Covered branches: 24
Total branches: 26
Branch coverage: 92.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
CreateTelegramContext(...)100%44100%
CreateMessageContext(...)100%66100%
CreateCallbackQueryContext(...)100%66100%
CreateChatMemberUpdatedContext(...)87.5%88100%
GetPayload(...)50%2266.66%

File(s)

/_/src/TeleFlow.Framework/Internal/TelegramContextFactory.cs

#LineLine coverage
 1using Microsoft.Extensions.DependencyInjection;
 2using TeleFlow.Framework.Callbacks;
 3using TeleFlow.Framework.Updates;
 4
 5namespace TeleFlow.Telegram.Internal;
 6
 7internal sealed class TelegramContextFactory
 8{
 19    private static readonly object TelegramContextKey = new();
 110    private static readonly object MessageContextKey = new();
 111    private static readonly object CallbackQueryContextKey = new();
 112    private static readonly object ChatMemberUpdatedContextKey = new();
 13
 14    [System.Diagnostics.CodeAnalysis.SuppressMessage(
 15        "Performance",
 16        "CA1822:Mark members as static",
 17        Justification = "Context factory methods remain instance methods because the factory is resolved through DI as o
 18    public TelegramUpdateContext CreateTelegramContext(UpdateContext context)
 19    {
 41420        ArgumentNullException.ThrowIfNull(context);
 21
 41422        if (context.Items.TryGetValue(TelegramContextKey, out var cachedContext) &&
 41423            cachedContext is TelegramUpdateContext telegramContext)
 24        {
 225            return telegramContext;
 26        }
 27
 41228        var payload = GetPayload(context);
 41229        var rootBot = context.Services.GetRequiredService<ITelegramClient>();
 41230        var bot = new UpdateScopedTelegramClient(rootBot, context.CancellationToken);
 41231        var callbackData = context.Services.GetRequiredService<ICallbackDataSerializer>();
 41232        telegramContext = new TelegramUpdateContext(context, bot, callbackData, payload);
 41233        context.Items[TelegramContextKey] = telegramContext;
 41234        return telegramContext;
 35    }
 36
 37    public MessageContext CreateMessageContext(UpdateContext context)
 38    {
 30539        ArgumentNullException.ThrowIfNull(context);
 40
 30541        if (context.Items.TryGetValue(MessageContextKey, out var cachedContext) &&
 30542            cachedContext is MessageContext messageContext)
 43        {
 444            return messageContext;
 45        }
 46
 30147        var telegramContext = CreateTelegramContext(context);
 30148        var telegramMessage = telegramContext.Update.Message
 30149            ?? throw new InvalidOperationException("The current update does not contain a Telegram message.");
 50
 30051        messageContext = new MessageContext(
 30052            context,
 30053            telegramContext.Bot,
 30054            telegramContext.CallbackData,
 30055            telegramContext.Payload,
 30056            telegramMessage);
 30057        context.Items[MessageContextKey] = messageContext;
 30058        return messageContext;
 59    }
 60
 61    public CallbackQueryContext CreateCallbackQueryContext(UpdateContext context)
 62    {
 9163        ArgumentNullException.ThrowIfNull(context);
 64
 9165        if (context.Items.TryGetValue(CallbackQueryContextKey, out var cachedContext) &&
 9166            cachedContext is CallbackQueryContext callbackQueryContext)
 67        {
 268            return callbackQueryContext;
 69        }
 70
 8971        var telegramContext = CreateTelegramContext(context);
 8972        var telegramCallbackQuery = telegramContext.Update.CallbackQuery
 8973            ?? throw new InvalidOperationException("The current update does not contain a Telegram callback query.");
 74
 8875        callbackQueryContext = new CallbackQueryContext(
 8876            context,
 8877            telegramContext.Bot,
 8878            telegramContext.CallbackData,
 8879            telegramContext.Payload,
 8880            telegramCallbackQuery);
 81
 8882        context.Items[CallbackQueryContextKey] = callbackQueryContext;
 8883        return callbackQueryContext;
 84    }
 85
 86    public ChatMemberUpdatedContext CreateChatMemberUpdatedContext(UpdateContext context)
 87    {
 1888        ArgumentNullException.ThrowIfNull(context);
 89
 1890        if (context.Items.TryGetValue(ChatMemberUpdatedContextKey, out var cachedContext) &&
 1891            cachedContext is ChatMemberUpdatedContext chatMemberUpdatedContext)
 92        {
 393            return chatMemberUpdatedContext;
 94        }
 95
 1596        var telegramContext = CreateTelegramContext(context);
 1597        var telegramChatMemberUpdated = telegramContext.Update.ChatMember ??
 1598                                        telegramContext.Update.MyChatMember ??
 1599                                        throw new InvalidOperationException("The current update does not contain a Teleg
 100
 15101        chatMemberUpdatedContext = new ChatMemberUpdatedContext(
 15102            context,
 15103            telegramContext.Bot,
 15104            telegramContext.CallbackData,
 15105            telegramContext.Payload,
 15106            telegramChatMemberUpdated);
 107
 15108        context.Items[ChatMemberUpdatedContextKey] = chatMemberUpdatedContext;
 15109        return chatMemberUpdatedContext;
 110    }
 111
 112    private static TelegramUpdatePayload GetPayload(UpdateContext context)
 113    {
 412114        if (context.Payload is TelegramUpdatePayload payload)
 115        {
 412116            return payload;
 117        }
 118
 0119        throw new InvalidOperationException("The current update payload is not a Telegram update payload.");
 120    }
 121}