/// <summary>
        /// Проверка полученного токена на валидность (?)
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public bool CheckAuthorization(string token, string session)
        {
            try
            {
                WebClient web = new WebClient();
                web.Headers.Add(HttpRequestHeader.Authorization, token);

                /*web.Proxy = new WebProxy()
                 * {
                 *  Address = new Uri("http://85.234.124.34:41088"),
                 *  BypassProxyOnLocal = true,
                 *  UseDefaultCredentials = false,
                 *  Credentials = new NetworkCredential("telega", "client")
                 * };*/

                string reply = web.DownloadString("https://login.yandex.ru/info?format=json");
                YandexPassportReply result = JsonConvert.DeserializeObject <YandexPassportReply>(reply, new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore
                });
                var lunchService = new AliceLunchService();

                DataSet data = lunchService.Call("AliceUsersService", session, "GET", "USER", new string[] { result.ID });
                if (data.Tables[0].Rows.Count == 0)
                {
                    List <string> keysString = new List <string>();
                    List <string> valString  = new List <string>();
                    var           count      = result.GetType().GetProperties();
                    foreach (var key in result.GetType().GetProperties())
                    {
                        if (key.GetValue(result) != null && key.GetValue(result).GetType() != typeof(string[]) && key.Name != "bIsAvatarEmpty")
                        {
                            keysString.Add(key.Name);
                            valString.Add("'" + key.GetValue(result).ToString() + "'");
                        }
                    }
                    string command = ("insert into AliceUsers(" + String.Join(",", keysString) + ")" +
                                      "values(" + String.Join(",", valString) + ");" +
                                      "insert into AliceSessions(UserID, SessionID)" +
                                      "values((select AliceUsers.AliceUser from AliceUsers where AliceUsers.ID = '" + result.ID + "'),'" + session + "'));");

                    lunchService.Execute(command);
                    return(true);
                }
                else
                {
                    foreach (DataRow row in data.Tables[0].Rows)
                    {
                        if (row["ID"].ToString() == result.ID.ToString())
                        {
                            return(true);
                        }
                    }
                    return(false);
                }
            } catch (Exception e)
            {
                return(false);
            }
        }
        /// <summary>
        /// Обработка запроса навыка "Обеды в офис"
        /// </summary>
        /// <param name="aliceRequest"></param>
        /// <returns></returns>
        public string ProcessLunchRequest(AliceRequest aliceRequest)
        {
            try
            {
                if (aliceRequest.Request.nlu.tokens.Count() == 0)
                {
                    return("Здравствуйте! ...");
                }
                else
                {
                    var lunchService = new AliceLunchService();
                    FillCategoryKeywords(lunchService, aliceRequest.Session.SessionId, "AliceLunchService");
                    var result = MatchDialogState(aliceRequest.Request.nlu.tokens, 3);
                    if (result == null)
                    {
                        return("Не могу понять, чего вы хотите. Повторите команду.");
                    }

                    switch (result.Id)
                    {
                    case 1:
                    {
                        return("чтобы посмотреть меню произнесите \"Открой меню\", \r\n чтобы сделать заказ произдесите \"Заказать\" и Назовите блюдо из меню, \r\n" +
                               "чтобы сделать доставку на адрес произнесите \"Оформи доставку\"");
                    }

                    case 2:
                    {
                        return("Навык \"\" позволяет посмотреть меню в ресторане \"Name\", сделать заказ в этом ресторане и оформить доставку по адресу");
                    }

                    case 3:
                    {
                        return("trash");
                    }

                    case 4:
                    {
                        //история заказов
                        DataSet data = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "GET", "HISTORY", new string[] { aliceRequest.Session.UserId });
                        ///sessionId
                        ///orderId
                        ///date
                        ///
                        if (data.Tables[0].Rows.Count == 0)
                        {
                            return("Еще не было сделано ни одного заказа");
                        }
                        string        history = "Последние заказы: \r\n";
                        StringBuilder orders  = new StringBuilder();
                        foreach (DataRow order in data.Tables[0].Rows)
                        {
                            orders.Append(order.ItemArray[data.Tables[0].Columns.IndexOf("OrderDate")].ToString() + ": ");
                            orders.Append("Заказ № " + order.ItemArray[data.Tables[0].Columns.IndexOf("ID")].ToString() + "\r\n");
                        }
                        return(history + orders.ToString());
                    }

                    case 5:
                    {
                        //корзина
                        DataSet data = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "GET", "ORDER");
                        ///sessionId
                        ///orderId
                        ///item
                        ///coast
                        if (data.Tables[0].Rows.Count == 0)
                        {
                            return("Корзина пуста");
                        }

                        string        basket = "Заказ №: " + data.Tables[0].Rows[0]["ID"].ToString() + "\r\n";
                        StringBuilder orders = new StringBuilder();
                        foreach (DataRow order in data.Tables[0].Rows)
                        {
                            orders.Append(order["Item"].ToString() + ": ");
                            orders.Append(order["Coast"].ToString() + "\r\n");
                        }
                        return(basket + orders.ToString());
                    }

                    case 6:
                    {
                        //меню
                        DataSet data = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "GET", "MENU");
                        ///groupItem
                        ///
                        if (data.Tables[0].Rows.Count == 0)
                        {
                            return("Нет категорий в меню");
                        }

                        StringBuilder menu = new StringBuilder();
                        foreach (DataRow item in data.Tables[0].Rows)
                        {
                            menu.Append(Decode(item["Category"].ToString()) + "\r\n");
                        }
                        return("Выберите категорию из нижеперечисленных: \r\n" + menu.ToString());
                    }

                    case 7:
                    {
                        ///элемент категории

                        DataSet data = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "GET", "MENU", aliceRequest.Request.nlu.tokens);
                        if (data.Tables[0].Rows.Count == 0)
                        {
                            return("Нет элементов категории");
                        }
                        StringBuilder menu = new StringBuilder();
                        foreach (DataRow item in data.Tables[0].Rows)
                        {
                            menu.Append(item["Item"].ToString() + " : " + item["Coast"].ToString() + "\r\n");
                        }
                        return(menu.ToString());
                    }

                    case 8:
                    {
                        //order
                        DataSet data = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "GET", "ORDER");
                        if (data.Tables[0].Rows.Count == 0)
                        {
                            lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "ADD", "ORDER");
                        }
                        else if (data.Tables[0].Rows[0]["OrderState"].ToString() == "ready")
                        {
                            return("Заказ уже сформирован и отправлен, чтобы отменить заказ - позвоните 7(123) 456 - 78 - 90");
                        }
                        //addToOrder

                        //убираем из токена активационные фразы
                        //var itemWords = aliceRequest.Request.nlu.tokens.ToList().Where(x => result.Keywords[0].ToList().IndexOf(x) == -1);
                        var itemWords = aliceRequest.Request.nlu.tokens.ToList().Except(result.Keywords[0].ToList());

                        //запрос в базу на соответствие, возвращает точное название из меню
                        DataSet item = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "UPD", "ORDER", itemWords.ToArray());
                        if (item.Tables[0].Rows[0]["MenuItem"] != null)
                        {
                            return(item.Tables[0].Rows[0]["MenuItem"] + ", добавлено к заказу, можете добавить к заказу чтото еще, либо завершить заказ");
                        }
                        else
                        {
                            return("Кажется, такой позиции нет в меню этого ресторана, попробуйте еще раз");
                        }
                    }

                    case 9:
                    {
                        //order end
                        DataSet data = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "END", "ORDER");
                        if (data.Tables[0].Rows[0]["OrderState"].ToString() == "ready")
                        {
                            string address = "MagazineAddress";
                            return($"Заказ № {data.Tables[0].Rows[0]["ID"]} принят, забрать его можно по адресу {address} или можете попросить меня оформить доставку");
                        }
                        else
                        {
                            return("Произошла ошибка, попробуйте еще раз");
                        }
                    }

                    case 10:
                    {
                        //доставка
                        DataSet data = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "GET", "DELIVERY");
                        if (data.Tables[0].Rows.Count == 0)
                        {
                            lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "ADD", "DELIVERY");
                            return("Скажите \"Адрес\" или \"Телефон\" и назовите адрес на который необходимо организовать доставку или телефон для подтверждения");
                        }
                        else
                        {
                            if (data.Tables[0].Rows[0]["Address"].ToString() == "")
                            {
                                return("Необходимо записать адрес доставки, скажите \"Адрес\" и назовите адрес, на который необходимо организовать доставку");
                            }
                            else if (data.Tables[0].Rows[0]["Phone"].ToString() == "")
                            {
                                return("Необходимо записать номер телефона, скажите \"Телефон\" и назовите номер телефона");
                            }
                            else
                            {
                                return("Данные для доставки \r\n Адрес: " + data.Tables[0].Rows[0]["Address"] + ", Телефон: " + data.Tables[0].Rows[0]["Phone"]);
                            }
                        }
                    }

                    case 11:
                    {
                        DataSet data      = lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "GET", "DELIVERY");
                        var     itemWords = aliceRequest.Request.nlu.tokens.ToList().Except(result.Keywords[0].ToList());
                        string  phrase    = String.Join(' ', itemWords);

                        if (data.Tables[0].Rows.Count == 0)
                        {
                            return("Не понимаю о чем вы, попробуйте еще раз");
                        }
                        else
                        {
                            if (aliceRequest.Request.nlu.tokens.Contains("адрес"))
                            {
                                if (data.Tables[0].Rows[0]["Address"].ToString() == "")
                                {
                                    lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "ADD", "ADDRESS", new string[] { phrase });
                                    if (data.Tables[0].Rows[0]["Phone"].ToString() == "")
                                    {
                                        return("Адрес " + phrase + " записан, Необходимо записать номер телефона, скажите \"Телефон\" и назовите номер телефона");
                                    }
                                    else
                                    {
                                        return("Адрес " + phrase + " записан");
                                    }
                                }
                                else
                                {
                                    lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "ADD", "ADDRESS", new string[] { phrase });
                                    if (data.Tables[0].Rows[0]["Phone"].ToString() == "")
                                    {
                                        return("Адрес " + phrase + " перезаписан, Необходимо записать номер телефона, скажите \"Телефон\" и назовите номер телефона");
                                    }
                                    else
                                    {
                                        return("Адрес " + phrase + " перезаписан");
                                    }
                                }
                            }
                            else if (aliceRequest.Request.nlu.tokens.Contains("телефон"))
                            {
                                if (data.Tables[0].Rows[0]["Phone"].ToString() == "")
                                {
                                    lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "ADD", "PHONE", new string[] { phrase });
                                    if (data.Tables[0].Rows[0]["Address"].ToString() == "")
                                    {
                                        return("Телефон " + phrase + " записан, Необходимо записать адрес доставки, скажите \"Адрес\" и назовите адрес, на который необходимо организовать доставку");
                                    }
                                    else
                                    {
                                        return("Телефон " + phrase + " записан");
                                    }
                                }
                                else
                                {
                                    lunchService.Call("AliceLunchService", aliceRequest.Session.SessionId, "ADD", "PHONE", new string[] { phrase });
                                    if (data.Tables[0].Rows[0]["Address"].ToString() == "")
                                    {
                                        return("Телефон " + phrase + " перезаписан, Необходимо записать адрес доставки, скажите \"Адрес\" и назовите адрес, на который необходимо организовать доставку");
                                    }
                                    else
                                    {
                                        return("Телефон " + phrase + " перезаписан");
                                    }
                                }
                            }
                            else
                            {
                                return("Как вы сюда попали?");
                            }
                        }
                    }

                    default:
                    {
                        return("абсолютно неожиданная ошибка");
                    }
                    }
                }
            } catch (Exception ex)
            {
                return("К сожалению произошла ошибка. Попробуйте перезапустить навык. Прошу прощения за доставленные неудобства.");
            }
        }