예제 #1
0
        public void Run(string[] command)
        {
            if (command.Length != 1 && command.Length != 2)
            {
                Console.WriteLine("Invalid ammount of parameters, use help [command]");
                return;
            }

            if (command.Length == 1)
            {
                Console.WriteLine("Aviable commands: ");
                foreach (var cmd in RegisteredCommands)
                {
                    Console.WriteLine(cmd.Key);
                }

                Help(command);
            }
            else
            {
                BaseCommand b;
                if (RegisteredCommands.TryGetValue(command[1], out b))
                {
                    List <string> l = command.ToList();

                    l.RemoveAt(0);
                    Console.WriteLine(command[1] + ":");
                    b.Help(l.ToArray());
                }
                else
                {
                    Console.WriteLine("Command not found");
                }
            }
        }
 public ConventionAggregateHandler(T aggregate)
 {
     RegisteredCommands = aggregate.RegisteredCommands;
     if (!RegisteredCommands.Any())
     {
         throw new MissingRegisteredCommandsException();
     }
 }
예제 #3
0
파일: Manager.cs 프로젝트: Skimt/OBD2Apps
        /// <summary>
        /// Register commands of service type 1.
        /// </summary>
        public void RegisterCommand <T>() where T : class, ICommand
        {
            ICommand command = assemblyCommands.FirstOrDefault(c => c is T);

            if (command == null)
            {
                throw new Exception(string.Format("Could not find command of type '{0}'.", typeof(T)));
            }

            RegisteredCommands.Add(command);
        }
예제 #4
0
        /// <summary>
        /// Unregisters specified commands from CommandsNext.
        /// </summary>
        /// <param name="cmds">Commands to unregister.</param>
        public void UnregisterCommands(params Command[] cmds)
        {
            if (cmds.Any(x => x.Parent != null))
            {
                throw new InvalidOperationException("Cannot unregister nested commands.");
            }

            var keys = RegisteredCommands.Where(x => cmds.Contains(x.Value)).Select(x => x.Key).ToList();

            foreach (var key in keys)
            {
                TopLevelCommands.Remove(key);
            }
        }
예제 #5
0
 private void Command_OnCommandChange(object sender, CommandChangeEventArgs e)
 {
     if (e.IsRemoval)
     {
         if (RegisteredCommands.ContainsKey(e.Key))
         {
             RegisteredCommands.Remove(e.Key);
         }
     }
     else
     {
         RegisteredCommands.Add(e.Key, e.IsMasterJob);
     }
 }
예제 #6
0
 public static void Register(string commandName, params Trigger[] commandTriggers)
 {
     if (string.IsNullOrEmpty(commandName))
     {
         throw new ArgumentNullException("commandName");
     }
     if (commandTriggers == null || commandTriggers.Length == 0)
     {
         throw new UnableToRegisterCommandWithoutTriggers(commandName);
     }
     if (RegisteredCommands.ContainsKey(commandName))
     {
         RegisteredCommands[commandName] = commandTriggers;
     }
     else
     {
         RegisteredCommands.Add(commandName, commandTriggers);
     }
 }
예제 #7
0
        /// <summary>
        /// Executes Immediate commands and enqueues unsafe commands.
        /// </summary>
        /// <param name="session">session that sent the command</param>
        /// <param name="requestInfo">request that tells us which command to execute</param>
        /// <seealso cref="Whisper.Daemon.Shard.Net.ShardServer.ExecuteQueuedCommand"/>
        protected override void ExecuteCommand(ShardSession session, ShardRequest requestInfo)
        {
            IWhisperCommand <ShardSession, ShardRequest> command;

            if (RegisteredCommands.TryGetValue(requestInfo.Key, out command))
            {
                // best to assume the worst, right?
                CommandThreadSafety safety = CommandThreadSafety.NotThreadSafe;

                if (command is IThreadAwareCommand)
                {
                    safety = (command as IThreadAwareCommand).ThreadSafety;
                }

                if (safety == CommandThreadSafety.Immediate)
                {
                    // execute Immediate commands immediately
                    base.ExecuteCommand(session, requestInfo);
                }
                else
                {
                    // split remaining commands by thread safety. thread-safe commands are executed on a thread owned by the session that received them; thread-unsafe commands are executed on the server update thread
                    CommandClosure closure = () => base.ExecuteCommand(session, requestInfo);

                    if (safety == CommandThreadSafety.ThreadSafe)
                    {
                        session.EnqueueCommand(closure);
                    }
                    else
                    {
                        EnqueueCommand(closure);
                    }
                }
            }
            // no need to log the 'else' case here. unknown packet notifications are handled by the Composer
        }
예제 #8
0
파일: IrcBot.cs 프로젝트: rayschpp/lebot
        private void HandleMessage(IrcMessage message)
        {
            // scope in switch...case is stupid in C#
            string     raw, channelName, reason;
            IrcChannel channel;

            switch (message.Command)
            {
            case "001":
                if (ConnectionComplete != null)
                {
                    ConnectionComplete(this, null);
                }
                break;

            case "PRIVMSG":
                IrcCommand     command     = null;
                IrcUserMessage userMessage = new IrcUserMessage(message);
                if (UserMessageRecieved != null)
                {
                    UserMessageRecieved(this, new UserMessageEventArgs(userMessage));
                }
                string messagePrepend = "", destination = userMessage.Target;
                string sourceNick = userMessage.Source.Nick;
                if (userMessage.Message.Contains("@"))
                {
                    sourceNick          = userMessage.Message.Substring(userMessage.Message.IndexOf("@") + 1).Trim();
                    userMessage.Message = userMessage.Message.Remove(userMessage.Message.IndexOf("@"));
                }
                if (message.Payload.StartsWith("#"))     // channel message
                {
                    messagePrepend = sourceNick + ": \u000f";
                }
                if (userMessage.Message.StartsWith(ControlCharacter))
                {
                    command             = new IrcCommand(userMessage.Source, userMessage.Message.Trim(), messagePrepend);
                    command.Destination = destination;
                    if (RegisteredCommands.ContainsKey(command.Command.ToLower()))
                    {
                        Thread tempThread = new Thread(() =>
                        {
                            try
                            {
                                if (PreCommand != null)
                                {
                                    var eventArgs = new CommandEventArgs(command);
                                    PreCommand(this, eventArgs);
                                    command = eventArgs.Command;
                                }
                                string response = RegisteredCommands[command.Command.ToLower()](command);
                                if (response != null)
                                {
                                    SendMessage(destination, messagePrepend + response);
                                }
                                if (PostCommand != null)
                                {
                                    PostCommand(this, new CommandEventArgs(command));
                                }
                            }
                            catch (Exception e) {
                                SendMessage(destination, messagePrepend + "Error: " + e.ToString().Haste());
                            }
                        });
                        tempThread.Start();
                    }
                }
                break;

            case "PING":
                SendRawMessage("PONG " + message.Payload);
                ServerPingAddress = message.Payload;
                LastPingRecieved  = DateTime.Now;
                break;

            case "PONG":
                LastPongRecieved = DateTime.Now;
                break;

            case "332":     // Channel topic
                raw           = message.Payload.Substring(message.Payload.IndexOf(' ') + 1);
                channelName   = raw.Remove(raw.IndexOf(' '));
                raw           = raw.Substring(raw.IndexOf(' ') + 1).Substring(1);
                channel       = GetChannel(channelName);
                channel.Topic = raw;
                break;

            case "353":
                raw         = message.Payload.Substring(message.Payload.IndexOf(' ') + 3);
                channelName = raw.Remove(raw.IndexOf(' '));
                raw         = raw.Substring(raw.IndexOf(':') + 1);
                string[] names = raw.Split(' ');
                channel = GetChannel(channelName);
                foreach (var user in names)
                {
                    if (user.StartsWith("+"))
                    {
                        channel.Users.Add(user.Substring(1));
                    }
                    else if (user.StartsWith("@"))
                    {
                        channel.Users.Add(user.Substring(1));
                    }
                    else
                    {
                        channel.Users.Add(user);
                    }
                }
                break;

            case "366":     // End of names
                raw         = message.Payload.Substring(message.Payload.IndexOf(' ') + 1);
                channelName = raw.Remove(raw.IndexOf(' '));
                if (ChannelListRecieved != null)
                {
                    ChannelListRecieved(this, new ChannelListEventArgs(GetChannel(channelName)));
                }
                break;

            case "MODE":
                if (message.Payload.StartsWith("#"))
                {
                    ChannelModeChangeEventArgs eventArgs = new ChannelModeChangeEventArgs();
                    eventArgs.Source     = new IrcUser(message.Prefix);
                    eventArgs.Channel    = GetChannel(message.Payload.Remove(message.Payload.IndexOf(' ')));
                    eventArgs.ModeChange = message.Payload.Substring(message.Payload.IndexOf(' ') + 1);
                    if (ChannelModeChanged != null)
                    {
                        ChannelModeChanged(this, eventArgs);
                    }
                }
                break;

            case "NOTICE":
                if (NoticeRecieved != null)
                {
                    NoticeRecieved(this, new NoticeEventArgs(new IrcNotice(message)));
                }
                break;

            case "PART":
                // #IAmABotAMA :\"hello world\"
                channelName = message.Parameters[0];
                channel     = GetChannel(channelName);
                reason      = message.Payload.Substring(message.Payload.IndexOf(':') + 1);
                if (new IrcUser(message.Prefix).Nick != User.Nick)
                {
                    channel.Users.Remove(new IrcUser(message.Prefix).Nick);
                    if (UserPartedChannel != null)
                    {
                        UserPartedChannel(this, new UserPartEventArgs(new IrcUser(message.Prefix), channel, reason));
                    }
                }
                break;

            case "JOIN":
                channelName = message.Parameters[0];
                channel     = GetChannel(channelName);
                channel.Users.Add(new IrcUser(message.Prefix).Nick);
                if (UserJoinedChannel != null)
                {
                    UserJoinedChannel(this, new UserJoinEventArgs(new IrcUser(message.Prefix), channel));
                }
                break;

            case "QUIT":
                reason = message.Payload.Substring(message.Payload.IndexOf(':') + 1);
                if (new IrcUser(message.Prefix).Nick != User.Nick)
                {
                    foreach (var c in Channels)
                    {
                        if (c.Users.Contains(new IrcUser(message.Prefix).Nick))
                        {
                            c.Users.Remove(new IrcUser(message.Prefix).Nick);
                        }
                    }
                    if (UserQuit != null)
                    {
                        UserQuit(this, new UserQuitEventArgs(new IrcUser(message.Prefix), reason));
                    }
                }
                else
                {
                    if (ServerQuit != null)
                    {
                        ServerQuit(this, null);
                    }
                    // Reconnect
                    if (IrcConnection.Connected)
                    {
                        IrcConnection.Disconnect(false);
                    }
                    IrcConnection   = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    ReadBuffer      = new byte[1024];
                    ReadBufferIndex = 0;
                    IrcConnection.BeginConnect(ServerHostname, ServerPort, ConnectComplete, null);
                }
                break;

            case "311":     // WHOIS response
                string[] whois  = message.Payload.Split(' ');
                var      result = new IrcUser(whois[1], whois[2].Substring(1));
                result.Hostname = whois[3];
                if (WhoIsCallback != null)
                {
                    WhoIsCallback(result);
                    WhoIsCallback = null;
                }
                break;

            case "TOPIC":
                if (TopicCallback != null)
                {
                    TopicCallback(message.Payload.Substring(message.Payload.IndexOf(":") + 1));
                    TopicCallback = null;
                }
                break;

            case "NICK":
                if (NickChanged != null)
                {
                    NickChanged(this, new NickChangedEventArgs(new IrcUser(message.Prefix), message.Payload));
                }
                break;
            }
        }
예제 #9
0
        /// <summary>
        /// Finds a specified command by its qualified name, then separates arguments.
        /// </summary>
        /// <param name="commandString">Qualified name of the command, optionally with arguments.</param>
        /// <param name="rawArguments">Separated arguments.</param>
        /// <returns>Found command or null if none was found.</returns>
        public Command FindCommand(string commandString, out string rawArguments)
        {
            rawArguments = null;

            var ignoreCase = !Config.CaseSensitive;
            var pos        = 0;
            var next       = commandString.ExtractNextArgument(ref pos);

            if (next == null)
            {
                return(null);
            }

            if (!RegisteredCommands.TryGetValue(next, out var cmd))
            {
                if (!ignoreCase)
                {
                    return(null);
                }

                next = next.ToLowerInvariant();
                var cmdKvp = RegisteredCommands.FirstOrDefault(x => x.Key.ToLowerInvariant() == next);
                if (cmdKvp.Value == null)
                {
                    return(null);
                }

                cmd = cmdKvp.Value;
            }

            if (!(cmd is CommandGroup))
            {
                rawArguments = commandString.Substring(pos).Trim();
                return(cmd);
            }

            while (cmd is CommandGroup)
            {
                var cm2    = cmd as CommandGroup;
                var oldPos = pos;
                next = commandString.ExtractNextArgument(ref pos);
                if (next == null)
                {
                    break;
                }

                if (ignoreCase)
                {
                    next = next.ToLowerInvariant();
                    cmd  = cm2.Children.FirstOrDefault(x => x.Name.ToLowerInvariant() == next || x.Aliases?.Any(xx => xx.ToLowerInvariant() == next) == true);
                }
                else
                {
                    cmd = cm2.Children.FirstOrDefault(x => x.Name == next || x.Aliases?.Contains(next) == true);
                }

                if (cmd == null)
                {
                    cmd = cm2;
                    pos = oldPos;
                    break;
                }
            }

            rawArguments = commandString.Substring(pos).Trim();
            return(cmd);
        }
예제 #10
0
 public void UnregisterPhrase(string phrase)
 {
     _speechRecognizer.UnregisterPhrase(phrase);
     RegisteredCommands.Remove(phrase);
 }
예제 #11
0
 public void RegisterPhrase(string phrase, ScriptCommandList command)
 {
     RegisteredCommands.Add(phrase, command);
     _speechRecognizer.RegisterPhrase(phrase);
 }