using SharpChat.SockChat.S2CPackets; using System.Text; namespace SharpChat.ClientCommands; public class WhoClientCommand : ClientCommand { public bool IsMatch(ClientCommandContext ctx) { return ctx.NameEquals("who"); } public async Task Dispatch(ClientCommandContext ctx) { long msgId = ctx.Chat.RandomSnowflake.Next(); StringBuilder whoChanSB = new(); string? whoChanStr = ctx.Args.FirstOrDefault(); if(string.IsNullOrEmpty(whoChanStr)) { foreach(User whoUser in ctx.Chat.Users) { whoChanSB.Append(@"<a href=""javascript:void(0);"" onclick=""UI.InsertChatText(this.innerHTML);"""); if(whoUser == ctx.User) whoChanSB.Append(@" style=""font-weight: bold;"""); whoChanSB.Append('>'); whoChanSB.Append(whoUser.LegacyName); whoChanSB.Append("</a>, "); } if(whoChanSB.Length > 2) whoChanSB.Length -= 2; await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.USERS_LISTING_SERVER, false, whoChanSB)); } else { Channel? whoChan = ctx.Chat.Channels.FirstOrDefault(c => c.NameEquals(whoChanStr)); if(whoChan is null) { await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_NOT_FOUND, true, whoChanStr)); return; } if(whoChan.Rank > ctx.User.Rank || (whoChan.HasPassword && !ctx.User.Can(UserPermissions.JoinAnyChannel))) { await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.USERS_LISTING_ERROR, true, whoChanStr)); return; } foreach(User whoUser in ctx.Chat.GetChannelUsers(whoChan)) { whoChanSB.Append(@"<a href=""javascript:void(0);"" onclick=""UI.InsertChatText(this.innerHTML);"""); if(whoUser == ctx.User) whoChanSB.Append(@" style=""font-weight: bold;"""); whoChanSB.Append('>'); whoChanSB.Append(whoUser.LegacyName); whoChanSB.Append("</a>, "); } if(whoChanSB.Length > 2) whoChanSB.Length -= 2; await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.USERS_LISTING_CHANNEL, false, whoChan.Name, whoChanSB)); } } }