HudNotifications.cs

Client-side static store for HUD notifications. Pushes messages with a kind and timestamp, caps the list at five, and drops entries older than six seconds.

namespace HorizonRP;

/// <summary>
/// File des notifications affichées par le HUD, côté client. Elle ne passe pas
/// par le réseau : l'hôte envoie un RPC au joueur concerné, qui empile ici.
/// </summary>
public static class HudNotifications
{
	public sealed record Entry( int Id, string Message, string Kind, RealTimeSince Age );

	/// <summary>Durée d'affichage, en secondes.</summary>
	public const float Lifetime = 6f;

	static readonly List<Entry> entries = new();
	static int nextId;

	public static void Push( string message, string kind = "info" )
	{
		// Le serveur ne connaît pas le répertoire du joueur : un numéro enregistré devient ici le nom du contact.
		message = PhoneClient.WithNames( message );
		entries.Add( new Entry( ++nextId, message, kind ?? "info", 0 ) );
		Sounds.ForNotification( kind ?? "info" );

		// Au-delà de cinq, les plus anciennes ne se liraient de toute façon plus.
		while ( entries.Count > 5 )
			entries.RemoveAt( 0 );
	}

	public static IReadOnlyList<Entry> Current
	{
		get
		{
			entries.RemoveAll( x => x.Age > Lifetime );
			return entries;
		}
	}

	/// <summary>Change quand la liste change : sert au BuildHash du HUD.</summary>
	public static int Version => HashCode.Combine( nextId, Current.Count );
}