Ejemplo n.º 1
0
        public DietBot(ConversationState conversationState, UserState userState) : base()
        {
            _conversationState = conversationState;
            _userState         = userState;

            userPromptingContext = new Dictionary <string, int>();
            userPromptingRecords = new Dictionary <string, PersonalDataRecord>();

            foodRecognizer = new FoodRecognizer();

            qnah = new QnAHandler();

            bsh = new BlobStorageHandler();
            bsh.Init();

            string localPrefix = Path.GetTempPath();

            string nutrientsCsvBlobPath  = "dishesPOG.csv";
            string nutrientsCsvLocalPath = Path.Combine(localPrefix + nutrientsCsvBlobPath);

            bsh.Download(nutrientsCsvBlobPath, nutrientsCsvLocalPath).Wait();

            nutrients = CSVHandler.ReadFromCsv <Record>(nutrientsCsvLocalPath);
        }
Ejemplo n.º 2
0
        protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var conversationStateAccessors = _conversationState.CreateProperty <ConversationFlow>(nameof(ConversationFlow));
            var flow = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationFlow(), cancellationToken);

            var userStateAccessors = _userState.CreateProperty <PersonalDataRecord>(nameof(PersonalDataRecord));
            var profile            = await userStateAccessors.GetAsync(turnContext, () => new PersonalDataRecord(), cancellationToken);

            IMessageActivity a = turnContext.Activity;

            string replyText = "";

            string userId = a.From.Id;

            bool accountExists = bsh.Exists(Path.Combine(userId, "pers.csv")).Result;

            if (!accountExists)
            {
                if (a.Text == "/start")
                {
                    string welcomeText = $"Welcome to " + Italic("Diet Bot") + "! First time with us?" + Newline()
                                         + $"Let's create user account for you." + Newline();
                    await turnContext.SendActivityAsync(welcomeText, null, null, cancellationToken);
                }

                await FillOutUserProfileAsync(flow, profile, turnContext, cancellationToken);
            }
            else if (a.Attachments != null && a.Attachments.Count > 0)
            {
                foreach (var item in a.Attachments)
                {
                    var remoteFileUrl = item.ContentUrl;

                    string fileName      = userId + DateTime.Now.ToString().Replace(' ', '_').Replace('.', '_').Replace(':', '_');
                    var    localFileName = Path.Combine(Path.GetTempPath(), fileName).Replace('-', '_');

                    using (var webClient = new WebClient())
                    {
                        webClient.DownloadFile(remoteFileUrl, localFileName);
                    }

                    var res = await foodRecognizer.MakePredictionRequest(localFileName);

                    replyText += "Your dish is recognized as " + Bold($"{res.tag.ToUpper()}") + "." + Newline();

                    Record curDishRec = null;
                    foreach (var r in nutrients)
                    {
                        if (r.product_name.ToUpper() == res.tag.ToUpper())
                        {
                            curDishRec = r;
                            break;
                        }
                    }

                    replyText += $"It has:" + Newline() +
                                 $"calories: {curDishRec.calories}," + Newline() +
                                 $"protein: {curDishRec.protein}g," + Newline() +
                                 $"fat: {curDishRec.fat}g," + Newline() +
                                 $"carbohydrate: {curDishRec.carbohydrate}g" + Newline();


                    string localPrefix = Path.GetTempPath();

                    string eatingCsvLocal = Path.Combine(localPrefix, userId + "eat.csv");
                    string eatingCsvBlob  = Path.Combine(userId, "eat.csv");

                    string personalCsvLocal = Path.Combine(localPrefix, userId + "pers.csv");
                    string personalCsvBlob  = Path.Combine(userId, "pers.csv");

                    EatingRecord rec = new EatingRecord {
                        product_name = res.tag, calories = curDishRec.calories,
                        protein      = curDishRec.protein, carbohydrate = curDishRec.carbohydrate,
                        date         = DateTime.Now.ToString(), fat = curDishRec.fat
                    };

                    if (!File.Exists(personalCsvLocal))
                    {
                        bsh.Download(personalCsvBlob, personalCsvLocal).Wait();
                    }

                    var pers = CSVHandler.ReadFromCsv <PersonalDataRecord>(personalCsvLocal);
                    PersonalDataRecord personalData = pers[0];

                    if (!File.Exists(eatingCsvLocal))
                    {
                        bsh.Download(eatingCsvBlob, eatingCsvLocal).Wait();
                    }

                    List <EatingRecord> eatings = CSVHandler.ReadFromCsv <EatingRecord>(eatingCsvLocal);

                    float todayCalories     = curDishRec.calories;
                    float todayProtein      = curDishRec.protein;
                    float todayFat          = curDishRec.fat;
                    float todayCarbohydrate = curDishRec.carbohydrate;

                    string piePlotUrl = $"http://84.201.131.5/test/pie/{todayProtein.ToString().Replace(',', '.')},{todayFat.ToString().Replace(',', '.')},{todayCarbohydrate.ToString().Replace(',', '.')}";

                    replyText += "Nutrient ratio:" + Newline() + piePlotUrl + Newline();

                    int n = eatings.Count;

                    for (int i = n - 1; i >= 0; --i)
                    {
                        if (Convert.ToDateTime(eatings[i].date).Date < DateTime.Now.Date)
                        {
                            break;
                        }
                        todayCalories     += eatings[i].calories;
                        todayProtein      += eatings[i].protein;
                        todayFat          += eatings[i].fat;
                        todayCarbohydrate += eatings[i].carbohydrate;
                    }

                    replyText += "Bon appetit!" + Newline();
                    replyText += $"Daily nutrient norm:" + Newline() +
                                 Italic("calories") + $": {todayCalories} \\ {personalData.caloriesNorm}" + Newline() +
                                 Italic("protein") + $": {todayProtein} \\ {personalData.proteinNorm}" + Newline() +
                                 Italic("fat") + $": {todayFat} \\ {personalData.fatNorm}" + Newline() +
                                 Italic("carbohydrate") + $": {todayCarbohydrate} \\ {personalData.carbohydrateNorm}" + Newline();

                    string dayPfcUrl = $"http://84.201.131.5/test/bar/{todayProtein.ToString().Replace(',', '.')},{todayFat.ToString().Replace(',', '.')},{todayCarbohydrate.ToString().Replace(',', '.')},{personalData.proteinNorm.ToString().Replace(',', '.')},{personalData.fatNorm.ToString().Replace(',', '.')},{personalData.carbohydrateNorm.ToString().Replace(',', '.')}";
                    string dayCalUrl = $"http://84.201.131.5/test/calories/{todayCalories.ToString().Replace(',', '.')},{personalData.caloriesNorm.ToString().Replace(',', '.')}";

                    replyText += Newline() + Newline() + "Todays calories: " + Newline() + dayCalUrl + Newline() + "Todays nutrients:" + Newline() + dayPfcUrl;

                    eatings.Add(rec);
                    CSVHandler.WriteToCsv(eatings, eatingCsvLocal);
                    bsh.Upload(eatingCsvLocal, eatingCsvBlob).Wait();
                }
            }
            else
            {
                string userName = a.From.Name;

                string mode = qnah.GenerateAnswer(a.Text).Result;

                if (mode.Contains("stats"))
                {
                    string localPrefix = Path.GetTempPath();

                    string eatingCsvLocal = Path.Combine(localPrefix, userId + "eat.csv");
                    string eatingCsvBlob  = Path.Combine(userId, "eat.csv");

                    string personalCsvLocal = Path.Combine(localPrefix, userId + "pers.csv");
                    string personalCsvBlob  = Path.Combine(userId, "pers.csv");

                    if (!File.Exists(personalCsvLocal))
                    {
                        bsh.Download(personalCsvBlob, personalCsvLocal).Wait();
                    }

                    var pers = CSVHandler.ReadFromCsv <PersonalDataRecord>(personalCsvLocal);
                    PersonalDataRecord personalData = pers[0];

                    if (!File.Exists(eatingCsvLocal))
                    {
                        bsh.Download(eatingCsvBlob, eatingCsvLocal).Wait();
                    }

                    List <EatingRecord> eatings = CSVHandler.ReadFromCsv <EatingRecord>(eatingCsvLocal);

                    int      n             = eatings.Count;
                    DateTime curDate       = DateTime.Now.Date;
                    string   curDateString = $"{curDate.Year},{curDate.Month},{curDate.Day}";

                    if (mode.Contains("week"))
                    {
                        float[] dayCalories     = new float[7];
                        float[] dayProtein      = new float[7];
                        float[] dayFat          = new float[7];
                        float[] dayCarbohydrate = new float[7];

                        int j = n - 1;
                        for (int i = 6; i >= 0; --i)
                        {
                            for (; j >= 0; --j)
                            {
                                if (Convert.ToDateTime(eatings[j].date).Date < curDate)
                                {
                                    break;
                                }
                                dayCalories[i]     += eatings[j].calories;
                                dayProtein[i]      += eatings[j].protein;
                                dayFat[i]          += eatings[j].fat;
                                dayCarbohydrate[i] += eatings[j].carbohydrate;
                            }
                            curDate = curDate.AddDays(-1);
                        }

                        string weekPfcUrl = "http://84.201.131.5/test/linechart/";

                        for (int i = 0; i < 7; ++i)
                        {
                            weekPfcUrl += $"{dayProtein[i].ToString().Replace(',', '.')},";
                        }
                        for (int i = 0; i < 7; ++i)
                        {
                            weekPfcUrl += $"{dayFat[i].ToString().Replace(',', '.')},";
                        }
                        for (int i = 0; i < 7; ++i)
                        {
                            weekPfcUrl += $"{dayCarbohydrate[i].ToString().Replace(',', '.')},";
                        }

                        weekPfcUrl += @$ "{personalData.proteinNorm.ToString().Replace(',', '.')},"
                                      + $"{personalData.fatNorm.ToString().Replace(',', '.')},"
                                      + $"{personalData.carbohydrateNorm.ToString().Replace(',', '.')},";

                        weekPfcUrl += curDateString;

                        replyText += "Week statistic: " + Newline() + "weekly nutrients: " + Newline() + weekPfcUrl;
                    }
                    else if (mode.Contains("day"))
                    {
                        float dayCalories     = 0.0f;
                        float dayProtein      = 0.0f;
                        float dayFat          = 0.0f;
                        float dayCarbohydrate = 0.0f;

                        for (int j = n - 1; j >= 0; --j)
                        {
                            if (Convert.ToDateTime(eatings[j].date).Date < curDate)
                            {
                                break;
                            }
                            dayCalories     += eatings[j].calories;
                            dayProtein      += eatings[j].protein;
                            dayFat          += eatings[j].fat;
                            dayCarbohydrate += eatings[j].carbohydrate;
                        }

                        string dayPfcUrl = $"http://84.201.131.5/test/bar/{dayProtein.ToString().Replace(',', '.')},{dayFat.ToString().Replace(',', '.')},{dayCarbohydrate.ToString().Replace(',', '.')},{personalData.proteinNorm.ToString().Replace(',', '.')},{personalData.fatNorm.ToString().Replace(',', '.')},{personalData.carbohydrateNorm.ToString().Replace(',', '.')}";
                        string dayCalUrl = $"http://84.201.131.5/test/calories/{dayCalories.ToString().Replace(',', '.')},{personalData.caloriesNorm.ToString().Replace(',', '.')}";

                        replyText += "Day statistic: " + Newline() + "daily nutrients: " + Newline() + dayPfcUrl + Newline() + "daily calories: " + Newline() + dayCalUrl;
                    }
                }
                else
                {
                    replyText += mode;
                }
            }

            await SendFormattedMessage(turnContext, cancellationToken, replyText);

            await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken);

            await _userState.SaveChangesAsync(turnContext, false, cancellationToken);
        }