internal static void RegisterCommand( [NotNull] CommandDescriptor descriptor )
{
if ( descriptor == null )
throw new ArgumentNullException( "descriptor" );
#if DEBUG
if( descriptor.Category == CommandCategory.None && !descriptor.IsCustom ) {
throw new CommandRegistrationException( "Standard commands must have a category set." );
}
#endif
if ( !IsValidCommandName( descriptor.Name ) ) {
throw new CommandRegistrationException( "All commands need a name, between 1 and 16 alphanumeric characters long." );
}
string normalizedName = descriptor.Name.ToLower();
if ( Commands.ContainsKey( normalizedName ) ) {
throw new CommandRegistrationException( "A command with the name \"{0}\" is already registered.", descriptor.Name );
}
if ( ReservedCommandNames.Contains( normalizedName ) ) {
throw new CommandRegistrationException( "The command name is reserved." );
}
if ( descriptor.Handler == null ) {
throw new CommandRegistrationException( "All command descriptors are required to provide a handler callback." );
}
if ( descriptor.Aliases != null ) {
if ( descriptor.Aliases.Any( alias => Commands.ContainsKey( alias ) ) ) {
throw new CommandRegistrationException( "One of the aliases for \"{0}\" is using the name of an already-defined command." );
}
}
if ( !Char.IsUpper( descriptor.Name[0] ) ) {
descriptor.Name = descriptor.Name.UppercaseFirst();
}
if ( descriptor.Usage == null ) {
descriptor.Usage = "/" + descriptor.Name;
}
if ( RaiseCommandRegisteringEvent( descriptor ) )
return;
if ( Aliases.ContainsKey( normalizedName ) ) {
Logger.Log( LogType.Warning,
"CommandManager.RegisterCommand: \"{0}\" was defined as an alias for \"{1}\", " +
"but has now been replaced by a different command of the same name.",
descriptor.Name, Aliases[descriptor.Name] );
Aliases.Remove( normalizedName );
}
if ( descriptor.Aliases != null ) {
foreach ( string alias in descriptor.Aliases ) {
string normalizedAlias = alias.ToLower();
if ( ReservedCommandNames.Contains( normalizedAlias ) ) {
Logger.Log( LogType.Warning,
"CommandManager.RegisterCommand: Alias \"{0}\" for \"{1}\" ignored (reserved name).",
alias, descriptor.Name );
} else if ( Aliases.ContainsKey( normalizedAlias ) ) {
Logger.Log( LogType.Warning,
"CommandManager.RegisterCommand: \"{0}\" was defined as an alias for \"{1}\", " +
"but has been overridden to resolve to \"{2}\" instead.",
alias, Aliases[normalizedAlias], descriptor.Name );
} else {
Aliases.Add( normalizedAlias, normalizedName );
}
}
}
Commands.Add( normalizedName, descriptor );
RaiseCommandRegisteredEvent( descriptor );
}