From 91516a899c8bfce2180dc08f85f78d9a870911c1 Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Fri, 2 Jun 2023 17:09:51 +0500 Subject: [PATCH] Add a responder for scheduled event start Signed-off-by: Octol1ttle --- EventResponders.cs | 126 ++++++++++++++++++++++++++++++++++--------- Messages.Designer.cs | 12 +++++ Messages.resx | 14 +++-- Messages.ru.resx | 16 ++++-- Messages.tt-ru.resx | 16 ++++-- 5 files changed, 146 insertions(+), 38 deletions(-) diff --git a/EventResponders.cs b/EventResponders.cs index af1be7d..d339469 100644 --- a/EventResponders.cs +++ b/EventResponders.cs @@ -1,4 +1,6 @@ using System.Drawing; +using System.Text; +using Boyfriend.Data; using Boyfriend.Data.Services; using DiffPlex; using DiffPlex.DiffBuilder; @@ -256,8 +258,11 @@ public class GuildScheduledEventCreateResponder : IResponder RespondAsync(IGuildScheduledEventCreate gatewayEvent, CancellationToken ct = default) { - var guildConfiguration = await _dataService.GetConfiguration(gatewayEvent.GuildID, ct); - if (guildConfiguration.EventNotificationChannel is 0) + var guildData = await _dataService.GetData(gatewayEvent.GuildID, ct); + guildData.ScheduledEvents.Add( + gatewayEvent.ID.Value, new ScheduledEventData(GuildScheduledEventStatus.Scheduled)); + + if (guildData.Configuration.EventNotificationChannel is 0) return Result.FromSuccess(); var currentUserResult = await _userApi.GetCurrentUserAsync(ct); @@ -268,7 +273,7 @@ public class GuildScheduledEventCreateResponder : IResponder { private readonly IDiscordRestChannelAPI _channelApi; private readonly GuildDataService _dataService; + private readonly IDiscordRestGuildScheduledEventAPI _eventApi; - public GuildScheduledEventUpdateResponder(IDiscordRestChannelAPI channelApi, GuildDataService dataService) { + public GuildScheduledEventUpdateResponder( + IDiscordRestChannelAPI channelApi, GuildDataService dataService, IDiscordRestGuildScheduledEventAPI eventApi) { _channelApi = channelApi; _dataService = dataService; + _eventApi = eventApi; } public async Task RespondAsync(IGuildScheduledEventUpdate gatewayEvent, CancellationToken ct = default) { - if (gatewayEvent.Status is not GuildScheduledEventStatus.Completed) return Result.FromSuccess(); + var guildData = await _dataService.GetData(gatewayEvent.GuildID, ct); + if (gatewayEvent.Status == guildData.ScheduledEvents[gatewayEvent.ID.Value].Status + || guildData.Configuration.EventNotificationChannel is 0) return Result.FromSuccess(); - var guildConfiguration = await _dataService.GetConfiguration(gatewayEvent.GuildID, ct); - if (guildConfiguration.EventNotificationChannel is 0) - return Result.FromSuccess(); + guildData.ScheduledEvents[gatewayEvent.ID.Value].Status = gatewayEvent.Status; - var embed = new EmbedBuilder().WithTitle(string.Format(Messages.EventCompleted, gatewayEvent.Name)) - .WithDescription( - string.Format( - Messages.EventDuration, - DateTimeOffset.UtcNow.Subtract(gatewayEvent.ScheduledStartTime))) - .WithColour(Color.Black) - .WithCurrentTimestamp() - .Build(); + var embed = new EmbedBuilder(); + StringBuilder? content = null; + switch (gatewayEvent.Status) { + case GuildScheduledEventStatus.Active: + guildData.ScheduledEvents[gatewayEvent.ID.Value].ActualStartTime = DateTimeOffset.UtcNow; - if (!embed.IsDefined(out var built)) return Result.FromError(embed); + string embedDescription; // what the fuck is this + switch (gatewayEvent.EntityType) { + case GuildScheduledEventEntityType.StageInstance or GuildScheduledEventEntityType.Voice: + if (!gatewayEvent.ChannelID.AsOptional().IsDefined(out var channelId)) + return Result.FromError(new ArgumentNullError(nameof(gatewayEvent.ChannelID))); + + embedDescription = string.Format( + Messages.LocalEventStartedDescription, + Mention.Channel(channelId) + ); + break; + case GuildScheduledEventEntityType.External: + if (!gatewayEvent.EntityMetadata.AsOptional().IsDefined(out var metadata)) + return Result.FromError(new ArgumentNullError(nameof(gatewayEvent.EntityMetadata))); + if (!gatewayEvent.ScheduledEndTime.AsOptional().IsDefined(out var endTime)) + return Result.FromError(new ArgumentNullError(nameof(gatewayEvent.ScheduledEndTime))); + if (!metadata.Location.IsDefined(out var location)) + return Result.FromError(new ArgumentNullError(nameof(metadata.Location))); + + embedDescription = string.Format( + Messages.ExternalEventStartedDescription, + Markdown.InlineCode(location), + Markdown.Timestamp(endTime) + ); + break; + default: + return Result.FromError(new ArgumentOutOfRangeError(nameof(gatewayEvent.EntityType))); + } + + content = new StringBuilder(); + var receivers = guildData.Configuration.EventStartedReceivers; + var role = guildData.Configuration.EventNotificationRole.ToDiscordSnowflake(); + var usersResult = await _eventApi.GetGuildScheduledEventUsersAsync( + gatewayEvent.GuildID, gatewayEvent.ID, withMember: true, ct: ct); + if (!usersResult.IsDefined(out var users)) return Result.FromError(usersResult); + + if (receivers.Contains(NotificationReceiver.Role) && role.Value is not 0) + content.Append($"{Mention.Role(role)} "); + if (receivers.Contains(NotificationReceiver.Interested)) + content = users.Where( + user => { + if (!user.GuildMember.IsDefined(out var member)) return true; + return !member.Roles.Contains(role); + }) + .Aggregate(content, (current, user) => current.Append($"{Mention.User(user.User)} ")); + + embed.WithTitle(string.Format(Messages.EventStarted, gatewayEvent.Name)) + .WithDescription(embedDescription) + .WithCurrentTimestamp() + .WithColour(Color.LawnGreen); + break; + case GuildScheduledEventStatus.Completed: + embed.WithTitle(string.Format(Messages.EventCompleted, gatewayEvent.Name)) + .WithDescription( + string.Format( + Messages.EventDuration, + DateTimeOffset.UtcNow.Subtract( + guildData.ScheduledEvents[gatewayEvent.ID.Value].ActualStartTime + ?? gatewayEvent.ScheduledStartTime))) + .WithColour(Color.Black); + + guildData.ScheduledEvents.Remove(gatewayEvent.ID.Value); + break; + case GuildScheduledEventStatus.Canceled: + case GuildScheduledEventStatus.Scheduled: + default: return Result.FromError(new ArgumentOutOfRangeError(nameof(gatewayEvent.Status))); + } + + var result = embed.WithCurrentTimestamp().Build(); + + if (!result.IsDefined(out var built)) return Result.FromError(result); return (Result)await _channelApi.CreateMessageAsync( - guildConfiguration.EventNotificationChannel.ToDiscordSnowflake(), embeds: new[] { built }, ct: ct); + guildData.Configuration.EventNotificationChannel.ToDiscordSnowflake(), + content?.ToString() ?? default(Optional), embeds: new[] { built }, ct: ct); } } @@ -377,8 +453,10 @@ public class GuildScheduledEventResponder : IResponder RespondAsync(IGuildScheduledEventDelete gatewayEvent, CancellationToken ct = default) { - var guildConfiguration = await _dataService.GetConfiguration(gatewayEvent.GuildID, ct); - if (guildConfiguration.EventNotificationChannel is 0) + var guildData = await _dataService.GetData(gatewayEvent.GuildID, ct); + guildData.ScheduledEvents.Remove(gatewayEvent.ID.Value); + + if (guildData.Configuration.EventNotificationChannel is 0) return Result.FromSuccess(); var embed = new EmbedBuilder() @@ -391,6 +469,6 @@ public class GuildScheduledEventResponder : IResponder {0} has created event {1}! It will take place in {2} and will start <t:{3}:R>! \n {4} - + Role for event creation notifications - + Channel for event notifications Event start notifications receivers - {0}Event {1} is starting at {2}! - + Event "{0}" started + :( @@ -480,4 +480,10 @@ The event has lasted for `{0}` + + The event is happening at {0} + + + The event is happening at {0} until {1} + diff --git a/Messages.ru.resx b/Messages.ru.resx index 854d23a..ccea52b 100644 --- a/Messages.ru.resx +++ b/Messages.ru.resx @@ -241,8 +241,8 @@ Получатели уведомлений о начале событий - {0}Событие {1} начинается в {2}! - + Событие "{0}" началось + :( @@ -471,13 +471,19 @@ Событие пройдёт {0} в канале {1} - + Событие пройдёт с {0} до {1} в {2} - + Подробнее о событии - + Событие длилось `{0}` + + Событие происходит в {0} + + + Событие происходит в {0} до {1} + diff --git a/Messages.tt-ru.resx b/Messages.tt-ru.resx index c04779f..9913b00 100644 --- a/Messages.tt-ru.resx +++ b/Messages.tt-ru.resx @@ -241,8 +241,8 @@ получатели уведомлений о начале движух - {0}движуха {1} начинается в {2}! - + движуха "{0}" начинается + оъмъомоъемъъео(((( @@ -471,13 +471,19 @@ движуха произойдет {0} в канале {1} - + движуха будет происходить с {0} до {1} в {2} - + побольше о движухе - + все это длилось `{0}` + + движуха происходит в {0} + + + движуха происходит в {0} до {1} +