예제 #1
0
        public void Initialize()
        {
            // Initialize Engine
            engine.SetInputToDefaultAudioDevice();
            engine.UnloadAllGrammars();

            // Load Grammar
            var commandDatabase = CommandDatabaseConfig.FromDirectory(Program.Config.CommandDatabaseDirectory);
            var grammars        = GrammarGenerator.FromConfig(commandDatabase);

            foreach (var grammar in grammars)
            {
                engine.LoadGrammar(grammar);
            }

            // Load Corrections
            var correctionsContent  = File.ReadAllText(Program.Config.CorrectionsDictionaryPath);
            var correctionsUnloaded = JsonConvert.DeserializeObject <Dictionary <string, string> >(correctionsContent);

            corrections.Clear();
            foreach (var kvp in correctionsUnloaded)
            {
                corrections.Add(kvp.Key, kvp.Value);
            }

            // Initialize Services
            foreach (var service in services.Values)
            {
                service.Initialize();
            }
        }
예제 #2
0
        public static CommandDatabaseConfig FromDirectory(string directory)
        {
            if (directory == null)
            {
                throw new ArgumentNullException("directory");
            }

            var config = new CommandDatabaseConfig();

            var di    = new DirectoryInfo(directory);
            var files = di.GetFiles("*.json");

            foreach (var file in files)
            {
                var fragmentContents = File.ReadAllText(file.FullName);
                var fragmentConfig   = JsonConvert.DeserializeObject <CommandDatabaseConfig>(fragmentContents);

                config.MergeFrom(fragmentConfig);
            }

            config.Commands.Sort((l, r) =>
            {
                int lLen = l.Pattern.Length - (Math.Max(l.Pattern.LastIndexOf('}'), 0) - Math.Max(l.Pattern.IndexOf('{'), 0));
                int rLen = r.Pattern.Length - (Math.Max(r.Pattern.LastIndexOf('}'), 0) - Math.Max(r.Pattern.IndexOf('{'), 0));

                return(rLen - lLen);
            });

            config.Validate();

            return(config);
        }
예제 #3
0
        public static IEnumerable <Grammar> FromConfig(CommandDatabaseConfig config)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }

            yield return(GenerateCommandGrammar(config.Commands));
        }
예제 #4
0
        private void MergeFrom(CommandDatabaseConfig source)
        {
            if (!source.Enabled)
            {
                return;
            }

            Commands.AddRange(source.Commands);
        }
예제 #5
0
        public CommandEngine()
        {
            Enabled = false;

            segment = "";
            lastTs  = DateTime.MinValue;

            actions         = new Dictionary <string, IAction>();
            commandDatabase = CommandDatabaseConfig.FromDirectory(Program.Config.CommandDatabaseDirectory);

            var asm = Assembly.GetExecutingAssembly();

            foreach (var type in asm.GetTypes()
                     .Where(x => typeof(IAction).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract))
            {
                actions[type.Name] = (IAction)Activator.CreateInstance(type);
            }
        }