< Summary

Information
Class: TeleFlow.Telegram.ChatActions
Assembly: TeleFlow.Framework
File(s): /_/src/TeleFlow.Framework/ChatActions.cs
Line coverage
67%
Covered lines: 47
Uncovered lines: 23
Coverable lines: 70
Total lines: 147
Line coverage: 67.1%
Branch coverage
46%
Covered branches: 14
Total branches: 30
Branch coverage: 46.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor(...)100%11100%
ActionAsync()75%44100%
SendChatActionAsync(...)100%11100%
TryResolveTarget(...)35.71%481444%
CreateMessageTarget(...)100%11100%
TryResolveCallbackTarget(...)40%281043.75%
ResolveCancellationToken(...)100%22100%

File(s)

/_/src/TeleFlow.Framework/ChatActions.cs

#LineLine coverage
 1using Microsoft.Extensions.DependencyInjection;
 2using TeleFlow.Telegram.Schema.Abstractions;
 3using TeleFlow.Telegram.Schema.Types;
 4
 5namespace TeleFlow.Telegram;
 6
 7public sealed class ChatActions
 8{
 19    private static readonly TimeSpan DefaultRepeatDelay = TimeSpan.FromSeconds(4);
 10
 11    private readonly TelegramUpdateContext _context;
 12
 13    internal ChatActions(TelegramUpdateContext context)
 14    {
 81515        _context = context;
 81516    }
 17
 18    public async ValueTask<ChatActionLease> ActionAsync(
 19        ChatAction action,
 20        CancellationToken cancellationToken = default)
 21    {
 1222        if (!TryResolveTarget(out var target))
 23        {
 124            throw new InvalidOperationException(
 125                "The current Telegram update does not expose a Telegram chat target for chat actions.");
 26        }
 27
 1128        var effectiveToken = ResolveCancellationToken(cancellationToken);
 1129        await SendChatActionAsync(_context.Bot, target, action, effectiveToken).ConfigureAwait(false);
 30
 931        var timeProvider = _context.Services.GetService<TimeProvider>() ?? TimeProvider.System;
 932        return new ChatActionLease(
 933            _context.Bot,
 934            target,
 935            action,
 936            timeProvider,
 937            DefaultRepeatDelay,
 938            effectiveToken);
 939    }
 40
 41    internal static Task<bool> SendChatActionAsync(
 42        ITelegramClient bot,
 43        TelegramChatActionTarget target,
 44        ChatAction action,
 45        CancellationToken cancellationToken)
 46    {
 1347        ArgumentException.ThrowIfNullOrWhiteSpace(action.Value, nameof(action));
 48
 1249        return bot.SendChatActionAsync(
 1250            IntegerString.From(target.ChatId),
 1251            action.Value,
 1252            businessConnectionId: target.BusinessConnectionId,
 1253            messageThreadId: target.MessageThreadId,
 1254            cancellationToken: cancellationToken);
 55    }
 56
 57    private bool TryResolveTarget(out TelegramChatActionTarget target)
 58    {
 1259        if (_context is MessageContext messageContext)
 60        {
 961            target = CreateMessageTarget(messageContext.TelegramMessage);
 962            return true;
 63        }
 64
 365        if (_context is CallbackQueryContext callbackContext)
 66        {
 267            return TryResolveCallbackTarget(callbackContext.TelegramCallbackQuery, out target);
 68        }
 69
 170        if (_context is ChatMemberUpdatedContext chatMemberContext)
 71        {
 172            target = new TelegramChatActionTarget(
 173                chatMemberContext.TelegramChat.Id,
 174                BusinessConnectionId: null,
 175                MessageThreadId: null);
 176            return true;
 77        }
 78
 079        if (_context.Update.Message is { } message)
 80        {
 081            target = CreateMessageTarget(message);
 082            return true;
 83        }
 84
 085        if (_context.Update.CallbackQuery is { } callbackQuery)
 86        {
 087            return TryResolveCallbackTarget(callbackQuery, out target);
 88        }
 89
 090        var chatMemberUpdated = _context.Update.ChatMember ?? _context.Update.MyChatMember;
 091        if (chatMemberUpdated is not null)
 92        {
 093            target = new TelegramChatActionTarget(
 094                chatMemberUpdated.Chat.Id,
 095                BusinessConnectionId: null,
 096                MessageThreadId: null);
 097            return true;
 98        }
 99
 0100        target = default;
 0101        return false;
 102    }
 103
 104    private static TelegramChatActionTarget CreateMessageTarget(Message message)
 105    {
 10106        return new TelegramChatActionTarget(
 10107            message.Chat.Id,
 10108            message.BusinessConnectionId,
 10109            message.MessageThreadId);
 110    }
 111
 112    private static bool TryResolveCallbackTarget(
 113        CallbackQuery callbackQuery,
 114        out TelegramChatActionTarget target)
 115    {
 2116        if (callbackQuery.Message is null)
 117        {
 1118            target = default;
 1119            return false;
 120        }
 121
 1122        if (callbackQuery.Message.TryGetMessage(out var accessibleMessage) &&
 1123            accessibleMessage is not null)
 124        {
 1125            target = CreateMessageTarget(accessibleMessage);
 1126            return true;
 127        }
 128
 0129        if (callbackQuery.Message.TryGetInaccessibleMessage(out var inaccessibleMessage) &&
 0130            inaccessibleMessage is not null)
 131        {
 0132            target = new TelegramChatActionTarget(
 0133                inaccessibleMessage.Chat.Id,
 0134                BusinessConnectionId: null,
 0135                MessageThreadId: null);
 0136            return true;
 137        }
 138
 0139        target = default;
 0140        return false;
 141    }
 142
 143    private CancellationToken ResolveCancellationToken(CancellationToken cancellationToken)
 144    {
 11145        return cancellationToken.CanBeCanceled ? cancellationToken : _context.CancellationToken;
 146    }
 147}