Exemple #1
0
        public async Task <LUISObject> QueryAsync(string query)
        {
            try
            {
                using (HttpClient LUISHttpClient = new HttpClient())
                {
                    string response = await LUISHttpClient.GetStringAsync(new Uri("https://api.projectoxford.ai/luis/v1/application?id={ResourcesManager.LUISAppID}&subscription-key={ResourcesManager.LUISSubscriptionKey}&q={query}"));

                    LUISObject luisResponse = JsonConvert.DeserializeObject <LUISObject>(response);
                    if (luisResponse != null)
                    {
                        return(luisResponse);
                    }
                }

                return(null);
            }
            catch (Exception)
            {
                return(null);
            }
        }
Exemple #2
0
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task <Message> Post([FromBody] Message message)
        {
            if (message.Type == "Message")
            {
                string ErrorState = "200OK";

                if (message.Text == "/arabic")
                {
                    lang = "ar";
                    System.Web.Configuration.WebConfigurationManager.AppSettings["lang"] = lang;
                    string hello = await string.Format(helloFormat, "Arabic").Translate("en", "ar");

                    return(message.CreateReplyMessage(hello));
                }
                else if (message.Text == "/english")
                {
                    lang = "en";
                    System.Web.Configuration.WebConfigurationManager.AppSettings["lang"] = lang;
                    string hello = string.Format(helloFormat, "English");
                    return(message.CreateReplyMessage(hello));
                }

                //Received a message
                lang = System.Web.Configuration.WebConfigurationManager.AppSettings["lang"];

                string standardEnglishMessage = message.Text;
                if (lang == "ar")
                {
                    standardEnglishMessage = await message.Text.Translate("ar", "en");
                }

                OWeatherMap weatherService = new OWeatherMap();
                string      city, time, condition;

                Core.LuisService luisService = new Core.LuisService();
                LUISObject       luis        = await luisService.QueryAsync(standardEnglishMessage);

                if (luis == null)
                {
                    return(message.CreateReplyMessage(BuildErrorMessage("404NOT_FOUND_LUISSERVICE")));
                }
                if (luis.intents.Count() == 0)
                {
                    return(message.CreateReplyMessage(BuildErrorMessage("404NOT_FOUND_LUISSERVICEINTENTS")));
                }

                switch (luis.intents[0]?.intent)
                {
                    #region Weather CASE:
                case "Weather":
                {
                    if (luis.entities.Count() == 0)
                    {
                        return(message.CreateReplyMessage(BuildErrorMessage("404NOT_FOUND_LUISSERVICEENTITIES")));
                    }

                    city = luis.entities.Where(ent => ent.type == "Location").FirstOrDefault()?.entity;
                    time = luis.entities.Where(ent => ent.type == "builtin.datetime.date").FirstOrDefault()?.resolution.date;

                    //Todo: Build error messages..
                    if (city == null)
                    {
                        return(message.CreateReplyMessage(":TODO"));

                        break;         //"save state to serve again" return message.CreateReplyMessage("Please specify the location.."); }
                    }

                    if (time == null)
                    {
                        time = DateTime.Now.ToShortDateString();         //Default time is now..
                    }

                    DateTime requestedDt = time.ConvertToDateTime();
                    string   replyBase;


                    if ((requestedDt - DateTime.Now).Days > 0)
                    {
                        //Forecast Requested
                        var weatherForecast = await weatherService.GetForecastData(city, requestedDt, lang);

                        List lastDayWeather = weatherForecast.list.Last();

                        string   description = lastDayWeather.weather.FirstOrDefault()?.description;
                        DateTime date        = lastDayWeather.dt.ConvertToDateTime();
                        string   lowAt       = Math.Round(lastDayWeather.temp.min) + "°";
                        string   highAt      = Math.Round(lastDayWeather.temp.max) + "°";
                        string   cityName    = "";

                        if (lang == "ar")
                        {
                            //Country is not in a good format to translate, i.e. SA, US, UAE.. etc.
                            cityName = await weatherForecast.city.name.Translate("en", "ar");
                        }
                        else if (lang == "en")
                        {
                            cityName = weatherForecast.city.name + ", " + weatherForecast.city.country;
                        }

                        replyBase = forecastFormat;

                        if (lang == "ar")
                        {
                            replyBase = await forecastFormat.Translate("en", "ar");
                        }

                        replyBase = string.Format(replyBase, date.ToString("dddd, MMMM, yyyy", new CultureInfo($"{lang},SA")), description, cityName, lowAt, highAt);
                    }
                    else
                    {
                        var weather = await weatherService.GetWeatherData(city, lang);

                        string description = weather.weather.FirstOrDefault()?.description;
                        string lowAt       = weather.main.temp_min + "";
                        string highAt      = weather.main.temp_min + "";
                        string cityName    = "";

                        if (lang == "ar")
                        {
                            //Country is not in a good format to translate, i.e. SA, US, UAE.. etc.
                            cityName = await weather.name.Translate("en", "ar");
                        }
                        else if (lang == "en")
                        {
                            cityName = weather.name + ", " + weather.sys.country;
                        }

                        //Build a reply message
                        replyBase = weatherFormat;

                        if (lang == "ar")
                        {
                            replyBase = await weatherFormat.Translate("en", "ar");
                        }

                        replyBase = string.Format(replyBase, description, cityName, lowAt, highAt);
                    }
                    return(message.CreateReplyMessage(replyBase));
                }
                    #endregion

                    #region Condition CASE:
                case "Condition":
                {
                    city      = luis.entities.Where(ent => ent.type == "Location").FirstOrDefault()?.entity;
                    condition = luis.entities.Where(ent => ent.type == "Condition").FirstOrDefault()?.entity;

                    if (city == null)
                    {
                        return(message.CreateReplyMessage(":TODO"));

                        // if (city == null || condition == null) { return message.CreateReplyMessage("404NOT_FOUND_LUISSERVICEENTITIES"); }
                        break;         //"save state to serve again" return message.CreateReplyMessage("Please specify the location.."); }
                    }

                    var weatherForecast = await weatherService.GetWeatherData(city, lang);

                    string description = weatherForecast.weather.FirstOrDefault()?.description;
                    string status      = weatherForecast.weather.FirstOrDefault()?.main;

                    string cityName;
                    if (lang == "ar")
                    {
                        cityName = city;         //Use the user input city.. OWM will return wired name city
                        status   = await status.Translate("en", "ar");

                        #region Language Builder
                        description = description.Replace("لطيف", "صافي|شمس|غائم جزئيا").Replace("جيد", "صافي|شمس|غائم جزئيا").Replace("bad", "مطر|ثلج|غائم|ماطر").Replace("cold", "ثلج|برد|بارد|مطر").Replace("ليلة", "").Replace("يوم", "").Replace("صباح", "");
                        #endregion
                    }
                    else if (lang == "en")
                    {
                        cityName = weatherForecast.name + ", " + weatherForecast.sys.country;

                        #region Language Builder
                        description = description.Replace("nice", "clear|sun|bright|fine|partially cloudy").Replace("good", "clear|sun|bright|fine").Replace("bad", "rain|snow|cloud").Replace("cold", "snow|hail|sleet|blizzard").Replace("day", "").Replace("night", "").Replace("morning", "").Replace("afternoon", "");
                        #endregion
                    }


                    if (condition.ToLower().StartsWith(status.ToLower()) || description.Contains(condition))
                    {
                        if (lang == "ar")
                        {
                            yesFormat = await yesFormat.Translate("en", "ar");
                        }

                        yesFormat = string.Format(yesFormat, description, city);
                        return(message.CreateReplyMessage(yesFormat));
                    }
                    else         //Condition is false
                    {
                        if (lang == "ar")
                        {
                            noFormat = await noFormat.Translate("en", "ar");
                        }

                        noFormat = string.Format(noFormat, description, city);
                        return(message.CreateReplyMessage(noFormat));
                    }
                }
                    #endregion

                    #region None CASE:
                case "None":
                {
                    return(message.CreateReplyMessage(BuildErrorMessage("400BAD_REQUEST")));

                    break;
                }
                    #endregion
                }


                return(message.CreateReplyMessage(BuildErrorMessage("400BAD_REQUEST")));
            }
            else
            {
                return(HandleSystemMessage(message));
            }
        }