public ModuleResponse Search(ModuleRequest request)
        {
            if(!request.EncodeData.ContainsKey("searchResource"))
                return new ModuleResponse(request, "Требуется указать поисковую машину");
            if(!request.EncodeData.ContainsKey("q"))
                return new ModuleResponse(request, "Требуется сформулировать запрос");

            switch (request.EncodeData["searchResource"].ToString())
            {
                case "www.google.ru":
                case "goolge":
                case "гугл":
                case "гугле":
                case "www.google.com":
                    Process.Start("chrome.exe", "http://www.google.ru/search?q=" + request.EncodeData["q"]);
                    break;
                case "www.yandex.ru":
                case "яндекс":
                case "яндексе":
                    Process.Start("chrome.exe", "http://www.yandex.ru/yandsearch?text=" + request.EncodeData["q"]);
                    break;
                default:
                    return new ModuleResponse(request, "Поисковая машина с именем '" + request.EncodeData["searchResource"] + "' не найдена");
            }
            return new ModuleResponse(request, "Осуществляется поиск в '" + request.EncodeData["searchResource"] + "' по запросу '" + request.EncodeData["q"] + "'");
        }
        static void Main()
        {
            try
            {

                var module = new TestModule();
                HistoryLog.HistoryFilePath = "history.log";
                var history = HistoryLog.Open();
                RoseMarkExpression.CommonExecutors.Add(new UseFunctionExecutor());
                var provider = new TextMappingEngine();
                provider.Modules.Add(module);
                ModuleRequest.RequestProvider = provider;

                LogFile.Default = new LogFile(@"C:\Users\Sasha\Documents\visual studio 2013\Projects\Rose.TextFramework\Rose.Test\LogFile.log");

                while (true)
                {
                    Console.WriteLine("\n\nВведи запрос:");
                    var q = Console.ReadLine();
                    var stopwatch = new Stopwatch();
                    var request = new ModuleRequest(q);
                    var response = request.GetResponse();
                    var speaker = new Speaker();

                    if (response != null)
                    {
                        stopwatch.Stop();
                        history.WriteResponse(response, stopwatch.Elapsed);
                    }

                    if(response.Status == ResponseStatus.Ok)
                        LogFile.Default.WriteRequestInfo(request);

                    if (response.Content.ToString() != string.Empty)
                    {
                        Console.WriteLine("Ответ: " + response.Content);
                        try
                        {
                            speaker.Speak(response.Content.ToString());
                        }
                        catch { }
                    }
                    if(response.Status == ResponseStatus.Exit)
                        break;
                }

                LogFile.Default.Dispose();

            }
            catch (Exception e)
            {
                Console.WriteLine("Что-то не так.\n" + e.Message);
                Console.ReadKey();
            }



        }
 public static void WriteRequestInfo(this LogFile file, ModuleRequest request)
 {
     file.WriteLine("Запрос '" + request.Text + "'");
     file.WriteLine("Имя паттерна: " + request.Pattern.Name);
     file.WriteLine("Текст патерна: " + request.MatchedText.Text);
     file.WriteLine("Кодировка текста патерна: " + request.MatchedText.Encoding);
     file.WriteLine("Количество данных кодировщика: " + request.EncodeData.Count);
     foreach (var data in request.EncodeData)
     {
         file.WriteLine("Данные кодировщика: Имя: " + data.Key + "   Значение: " + data.Value);
     }
 }
        private void RequestClick(object sender, RoutedEventArgs e)
        {
            if(Input.Text == string.Empty)
                return;

            var q = Input.Text;
            var stopwatch = new Stopwatch();
            var request = new ModuleRequest(q);
            var response = request.GetResponse();
            var speaker = new Speaker();

            if (response != null)
            {
                stopwatch.Stop();
            }

            var model = response.Content;

            if (ModelMapping.ContainsKey(model.GetType()))
            {
                var controlType = ModelMapping[model.GetType()];
                var instanse = Activator.CreateInstance(controlType);

                if (instanse is Control && instanse is IModelControl)
                {
                    var asModel = instanse as IModelControl;
                    asModel.Model = model;
                    AddMessage(instanse as Control, MessageAligment.Left);
                }

            }
            else
            {
                var text = new MessageTextContent();
                text.Model = model.ToString();
                AddMessage(text, MessageAligment.Left);
            }

            if (response.Content.ToString() != string.Empty)
            {
            }
        }
 public ModuleResponse Write(ModuleRequest request)
 {
     var toSay = request.EncodeData["toSay"].ToString();
     toSay = char.ToUpper(toSay[0]) + toSay.Substring(1);
     return new ModuleResponse(request, "Ладно. " + toSay);
 }
 public ModuleResponse OpenChrome(ModuleRequest request)
 {
     Process.Start("chrome.exe", "http://www.google.ru");
     return new ModuleResponse(request, "Браузер открыт");
 }
 public ModuleResponse Hello(ModuleRequest request)
 {
     return new ModuleResponse(request, "HELLO WORLD");
 }
 public ModuleResponse GetSyns(ModuleRequest request)
 {
     try
     {
         var q = request.EncodeData["sync"].ToString();
         if (!string.IsNullOrEmpty(q))
         {
             var source = new WebSynonymsSource();
             var syncs = source.GetSynonyms(q);
             if (!syncs.Any())
             {
                 return new ModuleResponse(request, "Синонимы к слову '" + q + "' не найдены");
             }
             var builder = new StringBuilder();
             builder.Append("Синонимы к слову '" + q + "'. Всего: " + syncs.Count() + Environment.NewLine);
             foreach (var sync in syncs)
             {
                 builder.Append(sync + Environment.NewLine);
             }
             return new ModuleResponse(request, builder.ToString());
         }
         else
         {
             return new ModuleResponse(request, "Не могу вывести синонимы - отсутствует исходное слово");
         }
     }
     catch (Exception e)
     {
         return new ModuleResponse(request, "Ошибка: " + e.Message);
     }
 }
        public ModuleResponse WriteRandom(ModuleRequest request)
        {


            try
            {
                int from;
                int to;

                if(!request.EncodeData.ContainsKey("from"))
                    return new ModuleResponse(ResponseStatus.Error, request, "Не обнаружено начало отсчета");
                if(!request.EncodeData.ContainsKey("to"))
                    return new ModuleResponse(ResponseStatus.Error, request, "Не обнаружено завершение отсчета");

                try
                {
                    from = Convert.ToInt32(request.EncodeData["from"].ToString());
                    to = Convert.ToInt32(request.EncodeData["to"].ToString());
                }
                catch(Exception e)
                {
                    return new ModuleResponse(ResponseStatus.Error, request, "Неверный формат границ случайного числа");
                }

                var random = new Random();
                var number = random.Next(from, to);
                return new ModuleResponse(request, new RandomNumberModel(from, to, number));
            }
            catch (Exception e)
            {
                return new ModuleResponse(ResponseStatus.Error, request, "Ошибка вычесления случайного числа:\n " + e.Message);
            }
        }
 public ModuleResponse WriteTimeRu(ModuleRequest request)
 {
     return new ModuleResponse(request, "Сейчас " + DateTime.Now);
 }
 public ModuleResponse WriteTime(ModuleRequest request)
 {
     return new ModuleResponse(request, "Its " + DateTime.Now);
 }
        public ModuleResponse GetResponse(ModuleRequest request)
        {

            try
            {

                var matchedPatterns = new List<MatchedPatternInfo>();

                foreach (var module in Modules)
                {
                    foreach (var pattern in module.Patterns)
                    {

                        foreach (var text in pattern.Texts)
                        {
                            var matchInfo = IsMatch(request.Text, text, module);

                            if (matchInfo.IsMatch)
                            {

                                matchedPatterns.Add(new MatchedPatternInfo(matchInfo, module, pattern));
                            } 
                        }


                    }
                }

                if(matchedPatterns.Count == 0)
                    return new ModuleResponse(ResponseStatus.Error, request, "Sorry, but im not found this");
                if (matchedPatterns.Count == 1)
                {
                    var info = matchedPatterns.First();
                    var methods = info.Module.GetType().GetTypeInfo().GetMethods();

                    foreach (var methodInfo in methods)
                    {
                        if (methodInfo.GetCustomAttribute(typeof(PatternAttribute)) != null)
                        {
                            var attribute = methodInfo.GetCustomAttribute<PatternAttribute>();
                            if (attribute.PatternPath == info.Pattern.Name)
                            {

                                request.Pattern = info.Pattern;
                                request.MatchedText = info.TextMatchInfo.Text;
                                request.EncodeData = info.TextMatchInfo.EncodeData;

                                var response = methodInfo.Invoke(info.Module, new object[] { request });
                                return response as ModuleResponse;
                            }
                        }
                    }
                }

                else
                {
                    matchedPatterns.Sort((info1, patternInfo) =>
                                         {
                                             if (info1.TextMatchInfo.Text.Weight > patternInfo.TextMatchInfo.Text.Weight)
                                                 return -1;
                                             if (info1.TextMatchInfo.Text.Weight < patternInfo.TextMatchInfo.Text.Weight)
                                                 return 1;
                                             return 0;
                                         });

                    var info = matchedPatterns.First();
                    var methods = info.Module.GetType().GetTypeInfo().GetMethods();

                    foreach (var methodInfo in methods)
                    {
                        if (methodInfo.GetCustomAttribute(typeof(PatternAttribute)) != null)
                        {
                            var attribute = methodInfo.GetCustomAttribute<PatternAttribute>();
                            if (attribute.PatternPath == info.Pattern.Name)
                            {

                                request.Pattern = info.Pattern;
                                request.MatchedText = info.TextMatchInfo.Text;
                                request.EncodeData = info.TextMatchInfo.EncodeData;

                                var response = methodInfo.Invoke(info.Module, new object[] { request });
                                return response as ModuleResponse;
                            }
                        }
                    }
                }

            }
            catch (Exception e)
            {
                return new ModuleResponse(ResponseStatus.Error, request, "К сожалению, произошла ошибка во время выполнения запроса. \n" + e.Message);
            }
            return new ModuleResponse(ResponseStatus.Error, request, "Sorry, but im not found this");
        }