using System.Globalization; using System.Text; namespace SharpChat.ClientCommands; public class AFKClientCommand : ClientCommand { private const string DEFAULT = "AFK"; public const int MAX_GRAPHEMES = 5; public const int MAX_BYTES = MAX_GRAPHEMES * 10; public bool IsMatch(ClientCommandContext ctx) { return ctx.NameEquals("afk"); } public async Task Dispatch(ClientCommandContext ctx) { string? statusText = ctx.Args.FirstOrDefault(); if(string.IsNullOrWhiteSpace(statusText)) statusText = DEFAULT; else { statusText = statusText.Trim(); StringInfo sti = new(statusText); if(Encoding.UTF8.GetByteCount(statusText) > MAX_BYTES || sti.LengthInTextElements > MAX_GRAPHEMES) statusText = sti.SubstringByTextElements(0, Math.Min(sti.LengthInTextElements, MAX_GRAPHEMES)).Trim(); } await ctx.Chat.UpdateUser( ctx.User, status: UserStatus.Away, statusText: statusText ); } }