67 lines
2.4 KiB
C#
67 lines
2.4 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|