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); } }
/// <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)); } }