using SharpChat.Events; using SharpChat.SockChat.PacketsS2C; using System; using System.Linq; namespace SharpChat.SockChat.Commands { public class ChannelCreateCommand : ISockChatClientCommand { public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("create"); } public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.CreateChannel)) { ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } string firstArg = ctx.Args.First(); bool createChanHasHierarchy; if(!ctx.Args.Any() || (createChanHasHierarchy = firstArg.All(char.IsDigit) && ctx.Args.Length < 2)) { ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } int createChanHierarchy = 0; if(createChanHasHierarchy) if(!int.TryParse(firstArg, out createChanHierarchy)) createChanHierarchy = 0; if(createChanHierarchy > ctx.User.Rank) { ctx.Chat.SendTo(ctx.User, new ChannelRankTooHighErrorS2CPacket()); return; } string channelName = string.Join('_', ctx.Args.Skip(createChanHasHierarchy ? 1 : 0)); if(!SockChatUtility.CheckChannelName(channelName)) { ctx.Chat.SendTo(ctx.User, new ChannelNameFormatErrorS2CPacket()); return; } if(ctx.Chat.Channels.Get(channelName, SockChatUtility.SanitiseChannelName) != null) { ctx.Chat.SendTo(ctx.User, new ChannelNameInUseErrorS2CPacket(channelName)); return; } ctx.Chat.Events.Dispatch( "chan:add", channelName, ctx.User, new ChannelAddEventData( !ctx.User.Permissions.HasFlag(UserPermissions.SetChannelPermanent), createChanHierarchy, string.Empty ) ); DateTimeOffset now = DateTimeOffset.UtcNow; ctx.Chat.Events.Dispatch("chan:leave", now, ctx.Channel, ctx.User); ctx.Chat.Events.Dispatch("chan:join", now, channelName, ctx.User); ctx.Chat.SendTo(ctx.User, new ChannelCreateResponseS2CPacket(channelName)); } } }