[Activity] Fix embed field character limit
This commit is contained in:
@@ -9,6 +9,9 @@ namespace Cocotte.Modules.Activities;
|
|||||||
|
|
||||||
public class ActivityFormatter
|
public class ActivityFormatter
|
||||||
{
|
{
|
||||||
|
private const int FieldsChunkSize = 20;
|
||||||
|
private const string EmptyField = "\u200B";
|
||||||
|
|
||||||
private readonly ActivityOptions _options;
|
private readonly ActivityOptions _options;
|
||||||
private readonly InterstellarFormatter _interstellarFormatter;
|
private readonly InterstellarFormatter _interstellarFormatter;
|
||||||
|
|
||||||
@@ -45,6 +48,8 @@ public class ActivityFormatter
|
|||||||
|
|
||||||
public EmbedBuilder ActivityEmbed(Activity activity, IReadOnlyCollection<ActivityPlayer> players)
|
public EmbedBuilder ActivityEmbed(Activity activity, IReadOnlyCollection<ActivityPlayer> players)
|
||||||
{
|
{
|
||||||
|
int GetNamesPadding(IReadOnlyCollection<ActivityPlayer> activityPlayers) => activityPlayers.Count > 0 ? activityPlayers.Max(p => p.Name.Length) : 0;
|
||||||
|
|
||||||
// Load activity players and organizers
|
// Load activity players and organizers
|
||||||
var participants = activity.Participants.OrderBy(p => p.HasCompleted).ToArray();
|
var participants = activity.Participants.OrderBy(p => p.HasCompleted).ToArray();
|
||||||
var organizers = activity.Organizers.ToArray();
|
var organizers = activity.Organizers.ToArray();
|
||||||
@@ -58,24 +63,50 @@ public class ActivityFormatter
|
|||||||
// Add organizers if it's an organized activity
|
// Add organizers if it's an organized activity
|
||||||
if (activity is OrganizedActivity)
|
if (activity is OrganizedActivity)
|
||||||
{
|
{
|
||||||
var organizersPadding = organizers.Length > 0 ? organizers.Max(p => p.Name.Length) : 0;
|
var organizersFields = organizers.Chunk(FieldsChunkSize).Select(organizersChunk =>
|
||||||
|
new EmbedFieldBuilder()
|
||||||
|
.WithName(EmptyField)
|
||||||
|
.WithIsInline(true)
|
||||||
|
.WithValue($"{(!organizersChunk.Any() ? "*Aucun organisateur inscrit*" : string.Join("\n", organizersChunk.Select(p => FormatActivityPlayer(p, GetNamesPadding(organizersChunk), showOrganizerRole: ActivityHelper.IsEventActivity(activity.Type)))))}")
|
||||||
|
).ToArray();
|
||||||
|
|
||||||
var organizersField = new EmbedFieldBuilder()
|
if (organizersFields.Length > 0)
|
||||||
.WithName("Organisateurs")
|
{
|
||||||
.WithValue($"{(!organizers.Any() ? "*Aucun organisateur inscrit*" : string.Join("\n", organizers.Select(p => FormatActivityPlayer(p, organizersPadding, ActivityHelper.IsEventActivity(activity.Type)))))}");
|
organizersFields[0].Name = "Organisateurs";
|
||||||
|
}
|
||||||
|
|
||||||
fields.Add(organizersField);
|
// Complete with empty fields to go to next line
|
||||||
|
var emptyFields = Enumerable.Repeat(0, (3 - organizersFields.Length) % 3).Select(_ =>
|
||||||
|
new EmbedFieldBuilder()
|
||||||
|
.WithName(EmptyField)
|
||||||
|
.WithValue(EmptyField)
|
||||||
|
.WithIsInline(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
fields.AddRange(organizersFields);
|
||||||
|
fields.AddRange(emptyFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute padding using player with longest name
|
|
||||||
var participantsPadding = participants.Length > 0 ? participants.Max(p => p.Name.Length) : 0;
|
|
||||||
|
|
||||||
// Players field
|
// Players field
|
||||||
var playersField = new EmbedFieldBuilder()
|
var playersFields = participants.Chunk(FieldsChunkSize).Select(participantsChunk =>
|
||||||
.WithName("Joueurs inscrits")
|
new EmbedFieldBuilder()
|
||||||
.WithValue($"{(!participants.Any() ? "*Aucun joueur inscrit*" : string.Join("\n", participants.Select(p => FormatActivityPlayer(p, participantsPadding))))}");
|
.WithName(EmptyField)
|
||||||
|
.WithIsInline(true)
|
||||||
|
.WithValue($"{(!participantsChunk.Any() ? "*Aucun joueur inscrit*" : string.Join("\n", participantsChunk.Select(p => FormatActivityPlayer(p, GetNamesPadding(participantsChunk), hideRoles: activity is OrganizedActivity))))}")
|
||||||
|
).ToList();
|
||||||
|
|
||||||
fields.Add(playersField);
|
// Insert empty fields in third column
|
||||||
|
for (int i = 2; i <= playersFields.Count; i += 3)
|
||||||
|
{
|
||||||
|
playersFields.Insert(i, new EmbedFieldBuilder().WithName(EmptyField).WithValue(EmptyField).WithIsInline(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (playersFields.Count > 0)
|
||||||
|
{
|
||||||
|
playersFields[0].Name = "Joueurs inscrits";
|
||||||
|
}
|
||||||
|
|
||||||
|
fields.AddRange(playersFields);
|
||||||
|
|
||||||
string countTitlePart = activity.MaxPlayers == ActivityHelper.UnlimitedPlayers
|
string countTitlePart = activity.MaxPlayers == ActivityHelper.UnlimitedPlayers
|
||||||
? ""
|
? ""
|
||||||
@@ -129,7 +160,9 @@ public class ActivityFormatter
|
|||||||
|
|
||||||
string bannerUrl = GetActivityBanner(activity.Name);
|
string bannerUrl = GetActivityBanner(activity.Name);
|
||||||
|
|
||||||
var color = activity.IsClosed ? Colors.CocotteRed : (activityFull ? Colors.CocotteOrange : Colors.CocotteBlue);
|
var color = activity.IsClosed ?
|
||||||
|
Colors.CocotteRed : activityFull ?
|
||||||
|
Colors.CocotteOrange : Colors.CocotteBlue;
|
||||||
|
|
||||||
var builder = new EmbedBuilder()
|
var builder = new EmbedBuilder()
|
||||||
.WithColor(color)
|
.WithColor(color)
|
||||||
@@ -164,16 +197,16 @@ public class ActivityFormatter
|
|||||||
_ => "NA"
|
_ => "NA"
|
||||||
};
|
};
|
||||||
|
|
||||||
public string FormatActivityPlayer(ActivityPlayer player, int namePadding, bool isEvent = false) =>
|
public string FormatActivityPlayer(ActivityPlayer player, int namePadding, bool showOrganizerRole = false, bool hideRoles = false) =>
|
||||||
player.HasCompleted
|
player.HasCompleted
|
||||||
? $"~~{FormatActivityPlayerSub(player, namePadding, isEvent)}~~"
|
? $"~~{FormatActivityPlayerSub(player, namePadding, showOrganizerRole, hideRoles)}~~"
|
||||||
: FormatActivityPlayerSub(player, namePadding, isEvent);
|
: FormatActivityPlayerSub(player, namePadding, showOrganizerRole, hideRoles);
|
||||||
|
|
||||||
private string FormatActivityPlayerSub(ActivityPlayer player, int namePadding, bool isEvent = false) => player switch
|
private string FormatActivityPlayerSub(ActivityPlayer player, int namePadding, bool showOrganizerRole = false, bool hideRoles = false) => player switch
|
||||||
{
|
{
|
||||||
ActivityRolePlayer rolePlayer => $"` {player.Name.PadRight(namePadding)} ` **|** {RolesToEmotes(rolePlayer.Roles)}",
|
ActivityRolePlayer rolePlayer when !hideRoles => $"` {player.Name.PadRight(namePadding)} ` **|** {RolesToEmotes(rolePlayer.Roles)}",
|
||||||
_ when isEvent && player.IsOrganizer => $"` {player.Name.PadRight(namePadding)} ` **|** {_options.OrganizerEmote} ",
|
_ when showOrganizerRole && player.IsOrganizer => $"` {player.Name.PadRight(namePadding)} ` **|** {_options.OrganizerEmote} ",
|
||||||
_ => $"` {player.Name} `"
|
_ => $"` {player.Name.PadRight(namePadding)} `"
|
||||||
};
|
};
|
||||||
|
|
||||||
private string RolesToEmotes(PlayerRoles rolePlayerRoles)
|
private string RolesToEmotes(PlayerRoles rolePlayerRoles)
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ await using(var scope = host.Services.CreateAsyncScope())
|
|||||||
// Backup database before migrations
|
// Backup database before migrations
|
||||||
if (File.Exists("cocotte.db"))
|
if (File.Exists("cocotte.db"))
|
||||||
{
|
{
|
||||||
File.Copy("cocotte.db", $"cocotte.{DateTime.UtcNow:s}.db");
|
File.Copy("cocotte.db", $"cocotte.{DateTime.UtcNow:yy-MM-dd hh-mm-ss}.db");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply migrations
|
// Apply migrations
|
||||||
|
|||||||
Reference in New Issue
Block a user