[Activity] Update component style
- Add icons - Disable button when activity is full
This commit is contained in:
@@ -38,13 +38,16 @@ public class ActivityFormatter
|
|||||||
|
|
||||||
public EmbedBuilder ActivityEmbed(Activity activity, IReadOnlyCollection<ActivityPlayer> players)
|
public EmbedBuilder ActivityEmbed(Activity activity, IReadOnlyCollection<ActivityPlayer> players)
|
||||||
{
|
{
|
||||||
|
// Activity full
|
||||||
|
bool activityFull = players.Count >= activity.MaxPlayers;
|
||||||
|
|
||||||
// Compute padding using player with longest name
|
// Compute padding using player with longest name
|
||||||
var namePadding = players.Count > 0 ? players.Max(p => p.Name.Length) : 0;
|
var namePadding = players.Count > 0 ? players.Max(p => p.Name.Length) : 0;
|
||||||
|
|
||||||
// Players field
|
// Players field
|
||||||
var playersField = new EmbedFieldBuilder()
|
var playersField = new EmbedFieldBuilder()
|
||||||
.WithName("Joueurs inscrits")
|
.WithName("Joueurs inscrits")
|
||||||
.WithValue($"{(!players.Any() ? "*Aucun joueur inscrit*" : string.Join("\n\n", players.Select(p => FormatActivityPlayer(p, namePadding))))}");
|
.WithValue($"{(!players.Any() ? "*Aucun joueur inscrit*" : string.Join("\n", players.Select(p => FormatActivityPlayer(p, namePadding))))}");
|
||||||
|
|
||||||
var title = activity switch
|
var title = activity switch
|
||||||
{
|
{
|
||||||
@@ -59,8 +62,10 @@ public class ActivityFormatter
|
|||||||
|
|
||||||
string bannerUrl = $"https://sage.cdn.ilysix.fr/assets/Cocotte/banner/{GetActivityCode(activity.Name)}.webp";
|
string bannerUrl = $"https://sage.cdn.ilysix.fr/assets/Cocotte/banner/{GetActivityCode(activity.Name)}.webp";
|
||||||
|
|
||||||
|
var color = activityFull ? Colors.CocotteOrange : Colors.CocotteBlue;
|
||||||
|
|
||||||
return new EmbedBuilder()
|
return new EmbedBuilder()
|
||||||
.WithColor(Colors.CocotteBlue)
|
.WithColor(color)
|
||||||
.WithTitle(title)
|
.WithTitle(title)
|
||||||
.WithDescription(description)
|
.WithDescription(description)
|
||||||
.WithImageUrl(bannerUrl)
|
.WithImageUrl(bannerUrl)
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ public partial class ActivityModule : InteractionModuleBase<SocketInteractionCon
|
|||||||
await _activitiesRepository.SaveChanges();
|
await _activitiesRepository.SaveChanges();
|
||||||
|
|
||||||
// Add components
|
// Add components
|
||||||
var components = ActivityRoleComponent(activity.ActivityId);
|
var components = ActivityComponents(activity.ActivityId);
|
||||||
|
|
||||||
await ModifyOriginalResponseAsync(m =>
|
await ModifyOriginalResponseAsync(m =>
|
||||||
{
|
{
|
||||||
@@ -162,7 +162,7 @@ public partial class ActivityModule : InteractionModuleBase<SocketInteractionCon
|
|||||||
await _activitiesRepository.SaveChanges();
|
await _activitiesRepository.SaveChanges();
|
||||||
|
|
||||||
// Update activity embed
|
// Update activity embed
|
||||||
await UpdateActivityEmbed(activity);
|
await UpdateActivityEmbed(activity, ActivityUpdateReason.PlayerJoin);
|
||||||
|
|
||||||
await RespondAsync(
|
await RespondAsync(
|
||||||
ephemeral: true,
|
ephemeral: true,
|
||||||
@@ -203,7 +203,7 @@ public partial class ActivityModule : InteractionModuleBase<SocketInteractionCon
|
|||||||
await _activitiesRepository.SaveChanges();
|
await _activitiesRepository.SaveChanges();
|
||||||
|
|
||||||
// Update activity embed
|
// Update activity embed
|
||||||
await UpdateActivityEmbed(activity);
|
await UpdateActivityEmbed(activity, ActivityUpdateReason.PlayerLeave);
|
||||||
|
|
||||||
await RespondAsync(
|
await RespondAsync(
|
||||||
ephemeral: true,
|
ephemeral: true,
|
||||||
@@ -211,7 +211,7 @@ public partial class ActivityModule : InteractionModuleBase<SocketInteractionCon
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task UpdateActivityEmbed(Activity activity)
|
private async Task UpdateActivityEmbed(Activity activity, ActivityUpdateReason updateReason)
|
||||||
{
|
{
|
||||||
// Get channel
|
// Get channel
|
||||||
var channel = await Context.Interaction.GetChannelAsync();
|
var channel = await Context.Interaction.GetChannelAsync();
|
||||||
@@ -227,10 +227,19 @@ public partial class ActivityModule : InteractionModuleBase<SocketInteractionCon
|
|||||||
await channel.ModifyMessageAsync(activity.ActivityId, properties =>
|
await channel.ModifyMessageAsync(activity.ActivityId, properties =>
|
||||||
{
|
{
|
||||||
properties.Embed = _activityFormatter.ActivityEmbed(activity, players).Build();
|
properties.Embed = _activityFormatter.ActivityEmbed(activity, players).Build();
|
||||||
|
|
||||||
|
// Disable join button if the activity is full on join, enable it on leave if activity is not full anymore
|
||||||
|
var isActivityFull = players.Count >= activity.MaxPlayers;
|
||||||
|
properties.Components = updateReason switch
|
||||||
|
{
|
||||||
|
ActivityUpdateReason.PlayerJoin when isActivityFull => ActivityComponents(activity.ActivityId, disabled: true).Build(),
|
||||||
|
ActivityUpdateReason.PlayerLeave when !isActivityFull => ActivityComponents(activity.ActivityId, disabled: false).Build(),
|
||||||
|
_ => Optional<MessageComponent>.Unspecified
|
||||||
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ComponentBuilder ActivityRoleComponent(ulong activityId)
|
private static ComponentBuilder ActivityComponents(ulong activityId, bool disabled = false)
|
||||||
{
|
{
|
||||||
return new ComponentBuilder()
|
return new ComponentBuilder()
|
||||||
.AddRow(new ActionRowBuilder()
|
.AddRow(new ActionRowBuilder()
|
||||||
@@ -239,6 +248,7 @@ public partial class ActivityModule : InteractionModuleBase<SocketInteractionCon
|
|||||||
.WithCustomId($"activity join:{activityId}")
|
.WithCustomId($"activity join:{activityId}")
|
||||||
.WithEmote(":white_check_mark:".ToEmote())
|
.WithEmote(":white_check_mark:".ToEmote())
|
||||||
.WithStyle(ButtonStyle.Primary)
|
.WithStyle(ButtonStyle.Primary)
|
||||||
|
.WithDisabled(disabled)
|
||||||
)
|
)
|
||||||
.WithButton(new ButtonBuilder()
|
.WithButton(new ButtonBuilder()
|
||||||
.WithLabel("Se désinscrire de l'activité")
|
.WithLabel("Se désinscrire de l'activité")
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public partial class ActivityModule
|
|||||||
activity.ActivityPlayers.Add(player);
|
activity.ActivityPlayers.Add(player);
|
||||||
await _activitiesRepository.SaveChanges();
|
await _activitiesRepository.SaveChanges();
|
||||||
|
|
||||||
await UpdateActivityEmbed(activity);
|
await UpdateActivityEmbed(activity, ActivityUpdateReason.PlayerJoin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
8
Cocotte/Modules/Activities/ActivityUpdateReason.cs
Normal file
8
Cocotte/Modules/Activities/ActivityUpdateReason.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
namespace Cocotte.Modules.Activities;
|
||||||
|
|
||||||
|
public enum ActivityUpdateReason
|
||||||
|
{
|
||||||
|
PlayerJoin,
|
||||||
|
PlayerLeave,
|
||||||
|
Update
|
||||||
|
}
|
||||||
@@ -6,6 +6,8 @@ public static class Colors
|
|||||||
{
|
{
|
||||||
// Main Cocotte colors
|
// Main Cocotte colors
|
||||||
public static Color CocotteBlue => new(0x3196c8);
|
public static Color CocotteBlue => new(0x3196c8);
|
||||||
|
public static Color CocotteRed => new(0xe40808);
|
||||||
|
public static Color CocotteOrange => new(0xff6d01);
|
||||||
|
|
||||||
// Colors used in embeds
|
// Colors used in embeds
|
||||||
public static Color ErrorColor => new(0xFB6060);
|
public static Color ErrorColor => new(0xFB6060);
|
||||||
|
|||||||
Reference in New Issue
Block a user