From bd52e374540c25efc20a2e5e3d91ed9cc08f00c6 Mon Sep 17 00:00:00 2001 From: Eveldee Date: Thu, 23 Mar 2023 22:49:49 +0100 Subject: [PATCH] [Activity] Add thread creation and start message --- .../Modules/Activities/ActivityFormatter.cs | 20 ++-- Cocotte/Modules/Activities/ActivityModule.cs | 112 ++++++++++++++---- .../Modules/Activities/ActivityModuleDebug.cs | 4 +- .../Activities/ActivityModuleThread.cs | 43 +++++++ .../Activities/Models/ActivitiesRepository.cs | 13 +- Cocotte/Modules/Activities/Models/Activity.cs | 17 ++- .../Activities/Models/ActivityPlayer.cs | 7 +- Cocotte/Utils/ChannelUtils.cs | 16 +++ 8 files changed, 184 insertions(+), 48 deletions(-) create mode 100644 Cocotte/Modules/Activities/ActivityModuleThread.cs create mode 100644 Cocotte/Utils/ChannelUtils.cs diff --git a/Cocotte/Modules/Activities/ActivityFormatter.cs b/Cocotte/Modules/Activities/ActivityFormatter.cs index 9940b73..f5733b4 100644 --- a/Cocotte/Modules/Activities/ActivityFormatter.cs +++ b/Cocotte/Modules/Activities/ActivityFormatter.cs @@ -18,7 +18,7 @@ public class ActivityFormatter _options = options.Value; } - public static string FormatActivityName(ActivityName activityName) + public string FormatActivityName(ActivityName activityName) { return activityName switch { @@ -38,7 +38,7 @@ public class ActivityFormatter }; } - public static string GetActivityBanner(ActivityName activityName) + public string GetActivityBanner(ActivityName activityName) { return CdnUtils.GetAsset($"banner/{GetActivityCode(activityName)}.webp"); } @@ -66,9 +66,15 @@ public class ActivityFormatter $"{FormatActivityName(activity.Name)} ({players.Count}/{activity.MaxPlayers})" }; - string description = string.IsNullOrWhiteSpace(activity.Description) - ? $"Rejoignez l'activité de {MentionUtils.MentionUser(activity.CreatorDiscordId)}" - : activity.Description; + var descriptionBuilder = new StringBuilder(); + descriptionBuilder.AppendLine( + string.IsNullOrWhiteSpace(activity.Description) + ? $"Rejoignez l'activité de {MentionUtils.MentionUser(activity.CreatorUserId)}" + : activity.Description + ); + + descriptionBuilder.AppendLine(); + descriptionBuilder.Append($"**[Fil associé]({ChannelUtils.GetChannelLink(activity.GuildId, activity.ThreadId)})**"); string bannerUrl = GetActivityBanner(activity.Name); @@ -77,7 +83,7 @@ public class ActivityFormatter var builder = new EmbedBuilder() .WithColor(color) .WithTitle(title) - .WithDescription(description) + .WithDescription(descriptionBuilder.ToString()) .WithImageUrl(bannerUrl) .WithFields(playersField); @@ -90,7 +96,7 @@ public class ActivityFormatter return builder; } - private static string GetActivityCode(ActivityName activityName) => activityName switch + private string GetActivityCode(ActivityName activityName) => activityName switch { ActivityName.Abyss => "VA", ActivityName.OriginsOfWar => "OOW", diff --git a/Cocotte/Modules/Activities/ActivityModule.cs b/Cocotte/Modules/Activities/ActivityModule.cs index 0fe013a..789bcee 100644 --- a/Cocotte/Modules/Activities/ActivityModule.cs +++ b/Cocotte/Modules/Activities/ActivityModule.cs @@ -33,6 +33,7 @@ public partial class ActivityModule : InteractionModuleBase *Création de l'activité en cours...*"); + await RespondAsync("> ***Création de l'activité en cours...***"); var response = await GetOriginalResponseAsync(); + // Create associated thread + var threadId = await CreateThread(activityName, user.DisplayName); + var activityType = ActivityHelper.ActivityNameToType(activityName); maxPlayers ??= ActivityHelper.ActivityTypeToMaxPlayers(activityType); Activity activity; @@ -147,8 +156,10 @@ public partial class ActivityModule : InteractionModuleBase + $""" + **― Bienvenue ―** + Bienvenue sur le thread lié à l'activité **{_activityFormatter.FormatActivityName(activityName)}** de **{creatorName}** + + Ici, vous pouvez **discuter** de l'activité, mais aussi **gérer** cette activité à l'aide de diverses **commandes**. + + **― Commandes ―** + - `/activite ajouter ` - **Ajoute un joueur** à cette activité + - `/activite supprimer ` - **Supprime un joueur** de cette activité + - `/activite ping` - **Ping les joueurs** inscrits à cette activité + - `/activite description` - **Modifie la description** de l'activité + - `/activite etage` - Pour l'abîme du néant et l'origine de la guerre, **modifie l'étage** de l'activité + """; + + private async Task CreateThread(ActivityName activityName, string creatorName) + { + var channel = (SocketTextChannel) Context.Channel; + var message = await GetOriginalResponseAsync(); + + // Create thread + var thread = await channel.CreateThreadAsync( + $"{_activityFormatter.FormatActivityName(activityName)} - {creatorName}", ThreadType.PublicThread, + ThreadArchiveDuration.OneHour, + message, true + ); + + // Send management message + await thread.SendMessageAsync(GetStartMessage(activityName, creatorName)); + + // Add activity creator + await thread.AddUserAsync((IGuildUser) Context.User); + + return thread.Id; + } +} \ No newline at end of file diff --git a/Cocotte/Modules/Activities/Models/ActivitiesRepository.cs b/Cocotte/Modules/Activities/Models/ActivitiesRepository.cs index 207358e..4c8e7a6 100644 --- a/Cocotte/Modules/Activities/Models/ActivitiesRepository.cs +++ b/Cocotte/Modules/Activities/Models/ActivitiesRepository.cs @@ -12,14 +12,14 @@ public class ActivitiesRepository _cocotteDbContext = cocotteDbContext; } - public async Task FindActivity(ulong activityId) + public async Task FindActivity(ulong guildId, ulong activityId) { - return await _cocotteDbContext.Activities.FindAsync(activityId); + return await _cocotteDbContext.Activities.FindAsync(guildId, activityId); } - public async Task FindActivityPlayer(ulong activityId, ulong playerId) + public async Task FindActivityPlayer(ulong guildId, ulong activityId, ulong playerId) { - return await _cocotteDbContext.ActivityPlayers.FindAsync(activityId, playerId); + return await _cocotteDbContext.ActivityPlayers.FindAsync(guildId, activityId, playerId); } public async Task ActivityPlayerCount(Activity activity) => @@ -44,4 +44,9 @@ public class ActivitiesRepository { await _cocotteDbContext.SaveChangesAsync(); } + + public void DeleteActivity(Activity activity) + { + _cocotteDbContext.Activities.Remove(activity); + } } \ No newline at end of file diff --git a/Cocotte/Modules/Activities/Models/Activity.cs b/Cocotte/Modules/Activities/Models/Activity.cs index 4397b86..cf12d98 100644 --- a/Cocotte/Modules/Activities/Models/Activity.cs +++ b/Cocotte/Modules/Activities/Models/Activity.cs @@ -1,16 +1,21 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; namespace Cocotte.Modules.Activities.Models; +[PrimaryKey(nameof(GuildId), nameof(ActivityId))] public class Activity { - [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] - public required ulong ActivityId { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public required ulong GuildId { get; init; } + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public required ulong ActivityId { get; init; } - public required ulong CreatorDiscordId { get; init; } - public required string CreatorDiscordName { get; set; } - public string? Description { get; init; } + public required ulong ThreadId { get; init; } + public required ulong CreatorUserId { get; init; } + public required string CreatorDisplayName { get; init; } + public string? Description { get; set; } public required ActivityType Type { get; init; } public required ActivityName Name { get; init; } public required bool AreRolesEnabled { get; init; } @@ -20,6 +25,6 @@ public class Activity public override string ToString() { - return $"{nameof(ActivityId)}: {ActivityId}, {nameof(CreatorDiscordId)}: {CreatorDiscordId}, {nameof(Description)}: {Description}, {nameof(Type)}: {Type}, {nameof(Name)}: {Name}, {nameof(MaxPlayers)}: {MaxPlayers}"; + return $"{nameof(ActivityId)}: {ActivityId}, {nameof(CreatorUserId)}: {CreatorUserId}, {nameof(Description)}: {Description}, {nameof(Type)}: {Type}, {nameof(Name)}: {Name}, {nameof(MaxPlayers)}: {MaxPlayers}"; } } \ No newline at end of file diff --git a/Cocotte/Modules/Activities/Models/ActivityPlayer.cs b/Cocotte/Modules/Activities/Models/ActivityPlayer.cs index b9fe0ad..0c627d2 100644 --- a/Cocotte/Modules/Activities/Models/ActivityPlayer.cs +++ b/Cocotte/Modules/Activities/Models/ActivityPlayer.cs @@ -3,19 +3,20 @@ using Microsoft.EntityFrameworkCore; namespace Cocotte.Modules.Activities.Models; -[PrimaryKey(nameof(ActivityId), nameof(DiscordId))] +[PrimaryKey(nameof(GuildId), nameof(ActivityId), nameof(UserId))] public class ActivityPlayer { [DatabaseGenerated(DatabaseGeneratedOption.None)] - public required ulong DiscordId { get; init; } + public required ulong UserId { get; init; } public required string Name { get; init; } + public ulong GuildId { get; set; } public ulong ActivityId { get; init; } public required Activity Activity { get; init; } public override string ToString() { - return $"{nameof(DiscordId)}: {DiscordId}, {nameof(Name)}: {Name}"; + return $"{nameof(UserId)}: {UserId}, {nameof(Name)}: {Name}"; } } \ No newline at end of file diff --git a/Cocotte/Utils/ChannelUtils.cs b/Cocotte/Utils/ChannelUtils.cs new file mode 100644 index 0000000..5bc6771 --- /dev/null +++ b/Cocotte/Utils/ChannelUtils.cs @@ -0,0 +1,16 @@ +using Discord; + +namespace Cocotte.Utils; + +public class ChannelUtils +{ + public static string GetChannelLink(IGuildChannel guildChannel) + { + return GetChannelLink(guildChannel.GuildId, guildChannel.Id); + } + + public static string GetChannelLink(ulong guildId, ulong channelId) + { + return $"https://discord.com/channels/{guildId}/{channelId}"; + } +} \ No newline at end of file