/// <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}"); }
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); } }