Exemplo n.º 1
0
        private async Task CreateAlertIfNeeded(Subscriber subscriber, ActiveTasksInfo activeTasksInfo, ILogger log)
        {
            if (subscriber.SnoozeAlertsUntil.GetValueOrDefault(DateTime.MinValue) > DateTime.UtcNow)
            {
                log.LogInformation($"Alert checks snoozed for subscriber {subscriber.Email} til {subscriber.SnoozeAlertsUntil:G}");
                return;
            }

            var now = DateTime.UtcNow.TimeOfDay;

            if (now > subscriber.StartWorkingHoursUtc && now < subscriber.EndWorkingHoursUtc &&
                IsWeekDay())
            {
                log.LogInformation($"It's working hours for {subscriber.Email}");
                if (!activeTasksInfo.HasActiveTasks)
                {
                    log.LogInformation($"No active tasks during working hours.");
                    if (DateTime.UtcNow - subscriber.LastNoActiveTasksAlert >= PauseBetweenAlerts)
                    {
                        subscriber.LastNoActiveTasksAlert = DateTime.UtcNow;
                        await _notifier.NoActiveTasksDuringWorkingHours(subscriber);
                    }
                }
            }
            else
            {
                log.LogInformation($"It's not working hours for {subscriber.Email}");
                if (activeTasksInfo.HasActiveTasks &&
                    DateTime.UtcNow - subscriber.LastActiveTaskOutsideOfWorkingHoursAlert >= PauseBetweenAlerts)
                {
                    log.LogWarning($"There is an active task outside of working hours.");
                    subscriber.LastActiveTaskOutsideOfWorkingHoursAlert = DateTime.UtcNow;
                    await _notifier.ActiveTaskOutsideOfWorkingHours(subscriber, activeTasksInfo);
                }
            }

            if (activeTasksInfo.ActiveTaskCount > 1 &&
                DateTime.UtcNow - subscriber.LastMoreThanSingleTaskIsActiveAlert >= PauseBetweenAlerts)
            {
                log.LogInformation(
                    $"{activeTasksInfo.ActiveTaskCount} active tasks at the same time.");
                subscriber.LastMoreThanSingleTaskIsActiveAlert = DateTime.UtcNow;
                await _notifier.MoreThanSingleTaskIsActive(subscriber);
            }

            await _dbAccessor.AddOrUpdateSubscriber(subscriber);
        }
Exemplo n.º 2
0
        public async Task Process(Update update, ILogger log)
        {
            if (update.Type != UpdateType.Message)
            {
                return;
            }

            var input = update.Message?.Text;

            if (string.IsNullOrWhiteSpace(input))
            {
                return;
            }

            var chatId = update.Message.Chat.Id.ToString();

            log.LogInformation($"Processing the command: {update.Message.Text}");
            await _notifier.Typing(update.Message.Chat.Id.ToString());

            var subscriber = await _dbAccessor.GetSubscriberById(update.Message.Chat.Id.ToString(), log);

            if (subscriber == null)
            {
                log.LogInformation($"Process: Subscriber is 'null'");
            }
            else
            {
                log.LogInformation($"TelegramId: {subscriber.TelegramId}{Environment.NewLine}" +
                                   $"VerificationAttempts: {subscriber.VerificationAttempts}{Environment.NewLine}" +
                                   $"PIN: {subscriber.Pin}{Environment.NewLine}" +
                                   $"Email: {subscriber.Email}{Environment.NewLine}" +
                                   $"Working hours (UTC): {subscriber.StartWorkingHoursUtc}-{subscriber.EndWorkingHoursUtc}{Environment.NewLine}" +
                                   $"Is account verified: {subscriber.IsVerified}{Environment.NewLine}" +
                                   $"Hours per day: {subscriber.HoursPerDay}{Environment.NewLine}" +
                                   $"LastNoActiveTasksAlert: {subscriber.LastNoActiveTasksAlert}{Environment.NewLine}" +
                                   $"LastMoreThanSingleTaskIsActiveAlert: {subscriber.LastMoreThanSingleTaskIsActiveAlert}{Environment.NewLine}" +
                                   $"LastActiveTaskOutsideOfWorkingHoursAlert: {subscriber.LastActiveTaskOutsideOfWorkingHoursAlert}{Environment.NewLine}");
            }

            if (subscriber == null)
            {
                subscriber = await NewUserFlow(log, chatId);
            }

            if (subscriber.ActiveWorkflow != null && !subscriber.ActiveWorkflow.IsExpired)
            {
                var result = await subscriber.ActiveWorkflow.Step(input, subscriber, update.Message.Chat.Id);

                if (result == WorkflowResult.Finished)
                {
                    subscriber.ActiveWorkflow = null;
                }
                await _dbAccessor.AddOrUpdateSubscriber(subscriber);

                return;
            }

            // todo: it would be good to use DI to create these instances
            var workflows = new CommandWorkflow[]
            {
                new SnoozeAlertWorkflow(),
                new SetSettingsWorkflow(),
                new ActiveWorkflow(),
                new StandupWorkflow(),
                new DayWorkflow(),
                new WeekWorkflow(),
                new MonthWorkflow(),
                new YearWorkflow(),
                new HealthcheckWorkflow(),
                new InfoWorkflow(),
                new AddTimeOff()
            };
            var commandWorkflow = ProcessInput(log, input, workflows);

            if (commandWorkflow != null)
            {
                var result = await commandWorkflow.Step(input, subscriber, update.Message.Chat.Id);

                subscriber.ActiveWorkflow = result == WorkflowResult.Finished ? null : commandWorkflow;
                await _dbAccessor.AddOrUpdateSubscriber(subscriber);

                return;
            }

            throw new InvalidOperationException($"The bot is lost and doesn't know what to do. chatId '{subscriber.TelegramId}'.");
        }