protected async Task StartActionWithoutConfirm(Message message, string actionName, Func <IDigitalOceanClient, int, Task <DigitalOcean.API.Models.Responses.Action> > func) { try { var digitalOceanApi = _digitalOceanClientFactory.GetInstance(message.From.Id); var session = _sessionRepo.Get(message.From.Id); var dropletId = session.Data.CastObject <int>(); var action = await func(digitalOceanApi, dropletId).ConfigureAwait(false); await _telegramBotClient.SendTextMessageAsync(message.Chat.Id, $"\U0001F4C0 {actionName}..."); _sessionRepo.Update(message.From.Id, session => { session.State = SessionState.WaitAction; }); var cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource.CancelAfter(TimeSpan.FromMinutes(3)); var resultStatus = await CheckActionStatus(dropletId, action.Id, digitalOceanApi, cancellationTokenSource.Token).ConfigureAwait(false); if (resultStatus) { await _telegramBotClient.SendTextMessageAsync(message.Chat.Id, "Done \U00002705", replyMarkup : Keyboards.GetSelectedDropletsMenuKeyboard()); } else { await _telegramBotClient.SendTextMessageAsync(message.Chat.Id, "Error \U0000274C", replyMarkup : Keyboards.GetSelectedDropletsMenuKeyboard()); } _sessionRepo.Update(message.From.Id, session => { session.State = SessionState.SelectedDroplet; }); } catch (ApiException ex) { _logger.LogError($"UserId={message.From.Id.ToString()}, Error={ex.Message}"); await _telegramBotClient.SendTextMessageAsync(message.Chat.Id, $"DigitalOcean API Error: {ex.Message}"); } catch (OperationCanceledException) { _logger.LogError($"UserId={message.From.Id.ToString()}, ChatId={message.Chat.Id.ToString()}, Error=Operation CheckActionStatus was auto-canceled after 3 minutes"); await _telegramBotClient.SendTextMessageAsync(message.Chat.Id, "Sorry, check action status operation was auto-canceled after 3 minutes \U0001F628", replyMarkup : Keyboards.GetSelectedDropletsMenuKeyboard()); } catch (Exception ex) { _logger.LogError($"UserId={message.From.Id.ToString()}, ChatId={message.Chat.Id.ToString()}, Error={ex.Message}, StackTrace={ex.StackTrace}"); await _telegramBotClient.SendTextMessageAsync(message.Chat.Id, "Sorry, аn error has occurred \U0001F628", replyMarkup : Keyboards.GetSelectedDropletsMenuKeyboard()); } }