using SharpChat.SockChat.PacketsS2C; using System.Linq; namespace SharpChat.SockChat.Commands { public class WhoCommand : ISockChatClientCommand { public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("who"); } public void Dispatch(SockChatClientCommandContext ctx) { string? channelName = ctx.Args.FirstOrDefault(); if(string.IsNullOrEmpty(channelName)) { ctx.Chat.SendTo(ctx.User, new WhoServerResponseS2CPacket( ctx.Chat.Users.All.Select(u => SockChatUtility.GetUserName(u, ctx.Chat.UserStatuses.Get(u))).ToArray(), SockChatUtility.GetUserName(ctx.User) )); return; } ChannelInfo? channel = ctx.Chat.Channels.Get(channelName, SockChatUtility.SanitiseChannelName); if(channel == null) { ctx.Chat.SendTo(ctx.User, new ChannelNotFoundErrorS2CPacket(channelName)); return; } if(channel.Rank > ctx.User.Rank || (channel.HasPassword && !ctx.User.Permissions.HasFlag(UserPermissions.JoinAnyChannel))) { ctx.Chat.SendTo(ctx.User, new WhoChannelNotFoundErrorS2CPacket(channelName)); return; } UserInfo[] userInfos = ctx.Chat.Users.GetMany( ctx.Chat.ChannelsUsers.GetChannelUserIds(channel) ); ctx.Chat.SendTo(ctx.User, new WhoChannelResponseS2CPacket( channel.Name, userInfos.Select(user => SockChatUtility.GetUserName(user, ctx.Chat.UserStatuses.Get(user))).ToArray(), SockChatUtility.GetUserName(ctx.User, ctx.Chat.UserStatuses.Get(ctx.User)) )); } } }