Beispiel #1
0
        /// <summary>
        /// This thing has exactly 2 obligations:
        ///    1: Cancel old callback
        ///    2: Create new callback
        /// </summary>
        /// <param name="dbWorkshop"></param>
        /// <param name="eventDate"></param>
        /// <param name="incomingWorkshop"></param>
        /// <returns></returns>
        public async Task ScheduleCallback(Workshop dbWorkshop, string eventDate, Workshop incomingWorkshop)
        {
            if (dbWorkshop != null && !WorkshopHelpers.TimeHasChanged(dbWorkshop, incomingWorkshop))
            {
                var callbackExits = dbWorkshop.callbackMessageSequenceNumber != null;
                if (callbackExits)
                {
                    // No time has changed; Nothing to do here ¯\_(ツ)_/¯
                    return;
                }
            }

            var beginDate = ParseTime(eventDate, incomingWorkshop.begintime).ToUniversalTime();
            var scheduledEnqueueTimeUtc = beginDate.AddMinutes(-15);

            if (beginDate < DateTime.UtcNow || scheduledEnqueueTimeUtc < DateTime.UtcNow)
            {
                // Guess someone edited an old workshop
                _logger.LogInformation("Time was in the past");
                return;
            }

            var topicClient = new TopicClient(_serviceBusConnection, "wakeuptimer", RetryPolicy.Default);

            if (dbWorkshop?.callbackMessageSequenceNumber is { } oldSequenceNumber)
            {
                try
                {
                    await topicClient.CancelScheduledMessageAsync(oldSequenceNumber);
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Error while trying to cancel event");
                }
            }

            incomingWorkshop.uniqueStateId = Guid.NewGuid();
            var msg = new Message
            {
                ScheduledEnqueueTimeUtc = scheduledEnqueueTimeUtc.DateTime,
                Body = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(new CallbackMessage
                {
                    UniqueStateId = incomingWorkshop.uniqueStateId,
                    Date          = beginDate.DateTime
                }))
            };

            var seq = await topicClient.ScheduleMessageAsync(msg, scheduledEnqueueTimeUtc);

            incomingWorkshop.callbackMessageSequenceNumber = seq;
            _logger.LogInformation($"Enqueued new callback message at {scheduledEnqueueTimeUtc}");
        }
Beispiel #2
0
        private async Task ResetReactionsIfNecessary(Workshop currentWorkshop, Emoji thumbsUpEmote, Workshop dbWorkshop, IUserMessage message)
        {
            if (dbWorkshop == null)
            {
                return;
            }

            if (!WorkshopHelpers.TimeHasChanged(dbWorkshop, currentWorkshop))
            {
                return;
            }

            var hadOneUser = false;

            var reactedUsers = message.GetReactionUsersAsync(thumbsUpEmote, 1000)
                               .SelectMany(x => x.ToAsyncEnumerable())
                               .Where(x => !x.IsBot && x.Id != _discordClient.CurrentUser.Id);

            await foreach (var reactedUser in reactedUsers)
            {
                hadOneUser = true;
                // Notify user that time has changed
                var affectedTimes = new string[]
                {
                    !WorkshopHelpers.BeginTimeChanged(dbWorkshop, currentWorkshop) ? string.Empty : "Startzeit",
                    !WorkshopHelpers.EndTimeChanged(dbWorkshop, currentWorkshop) ? string.Empty : "Endzeit"
                }.Where(x => !string.IsNullOrEmpty(x));

                var affectedTimeString = string.Join(" und ", affectedTimes);
                try
                {
                    await reactedUser.SendMessageAsync
                    (
                        $"Die {affectedTimeString} vom Workshop **{currentWorkshop.title}** wurde geändert. \n" +
                        $"Er beginnt um **{currentWorkshop.begintime}** und endet um {currentWorkshop.endtime}.:alarm_clock:\n" +
                        $"Deshalb wurde deine Benachrichtigung deaktiviert. Bitte reagiere erneut mit \U0001F44D auf die Nachricht am Server, damit du rechtzeitig erinnert wirst!"
                    );
                }
                catch (Exception)
                {
                    //Ignore
                }
            }

            if (hadOneUser)
            {
                await message.RemoveAllReactionsAsync();

                await message.AddReactionAsync(thumbsUpEmote);
            }
        }
Beispiel #3
0
 public bool WorkshopChanged(Workshop wsFromDB, Workshop currentWS, Meeting existingMeeting)
 {
     return(WorkshopHelpers.WorkshopChanged(wsFromDB, currentWS) ||
            currentWS.status == "Scheduled" && existingMeeting == null);
 }