From 45826d7096941aaec4c396dc899b69ad23858da5 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 09:41:43 +0200 Subject: [PATCH 001/159] Try to delay table showing --- frontend/static/js/script.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 86d2da5..1f2cd38 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -294,11 +294,13 @@ function setBotResponse(response) { for (j = 0; j < response_text.length; j++){ if(response_text[j].includes("I see, thank you for letting me know!")){ - $(".timeslots_table").toggle(); - - var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); + + setTimeout(()=> { + $(".timeslots_table").toggle(); + } + ,7000); } else if(response_text[j].includes("Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time.")){ From 18715cb5e301b249acb1b1a4a6a9f169d784b459 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 09:44:24 +0200 Subject: [PATCH 002/159] Remove delay between messages --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 1f2cd38..5e8ea9a 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -485,7 +485,7 @@ function setBotResponse(response) { for (var i = 1; i < response.length; i++){ //Add delay based on the length of the next message - summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); + // summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); doScaledTimeout(i, response, summed_timeout) } From 57fcfd948473b700be49336024825c01dee1a8d6 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 09:47:00 +0200 Subject: [PATCH 003/159] Add delay back --- frontend/static/js/script.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 5e8ea9a..b0ae470 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -272,8 +272,8 @@ function setBotResponse(response) { //display bot response after the number of miliseconds caputred by the variable 'delay_first_message' var delay_first_message = 500; if (response.length >=1) { - // delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); - delay_first_message = 20; + delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); + // delay_first_message = 20; } setTimeout(function () { hideBotTyping(); @@ -485,7 +485,7 @@ function setBotResponse(response) { for (var i = 1; i < response.length; i++){ //Add delay based on the length of the next message - // summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); + summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); doScaledTimeout(i, response, summed_timeout) } From 199b22c5db44dbae2372c4424c1532d33c500956 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 09:59:48 +0200 Subject: [PATCH 004/159] Increase delay --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index b0ae470..19007db 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -300,7 +300,7 @@ function setBotResponse(response) { setTimeout(()=> { $(".timeslots_table").toggle(); } - ,7000); + ,30000); } else if(response_text[j].includes("Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time.")){ From 8289c0a49db31e830ef44b337d31d1207f63e5b1 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 10:00:44 +0200 Subject: [PATCH 005/159] Add delay for energy table as well --- frontend/static/js/script.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 19007db..ba9cae7 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -304,7 +304,11 @@ function setBotResponse(response) { } else if(response_text[j].includes("Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time.")){ - $(".energy_levels_table").toggle(); + + setTimeout(()=> { + $(".energy_levels_table").toggle(); + } + ,10000); var BotResponse = '

' + response_text[j] + '

'; From 62f13aadcb2c5e4655fbfff450a144a8ed6a1fda Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 10:19:08 +0200 Subject: [PATCH 006/159] Add delay to plan modification button --- frontend/static/js/script.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index ba9cae7..a5ed8a1 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -382,7 +382,10 @@ function setBotResponse(response) { days.forEach(element => document.getElementById(element).classList.add("toggleable")); - button.style.display = "table"; + setTimeout(function(){ + button.style.display = "table"; + } + ,15000); } else if(response_text[j].includes("What can you take away from this example for yourself? Please type this in the chat.") || response_text[j].includes("The question was: What can you take away from this example for yourself?")){ From c84f9fe0f3fc2fcb4b4f8a22c9eb59eefd2ef345 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 10:35:46 +0200 Subject: [PATCH 007/159] Fix typo --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index ea7562a..d9abae8 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1462,7 +1462,7 @@ responses: - text: "Thank you for telling me. \n We've previously thought of barriers which might prevent you from taking walks regularly." utter_deal_with_barriers_2: - - text: "Now, let's try to think how you could overcome those barriers." + - text: "Now, let's try to think of how you could overcome those barriers." utter_deal_with_barriers_3: - text: "Keep in mind that, while I can provide suggestions, it's really up to you to come up with the solution that works best for you." From bd37cac3e51124ca9d8397c1bedfc057fde45564 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 10:37:40 +0200 Subject: [PATCH 008/159] Increase delay --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index a5ed8a1..04e15c5 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -385,7 +385,7 @@ function setBotResponse(response) { setTimeout(function(){ button.style.display = "table"; } - ,15000); + ,35000); } else if(response_text[j].includes("What can you take away from this example for yourself? Please type this in the chat.") || response_text[j].includes("The question was: What can you take away from this example for yourself?")){ From 410fea9fd4ebaa015231aba5447dbcbcc6dedec8 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 10:38:02 +0200 Subject: [PATCH 009/159] Remove chatbot delay --- frontend/static/js/script.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 04e15c5..f79bc82 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -481,8 +481,8 @@ function setBotResponse(response) { //if there is more than 1 message from the bot if (response.length > 1){ //show typing symbol again - var delay_typing = 600 + delay_first_message; - // var delay_typing = 20; + // var delay_typing = 600 + delay_first_message; + var delay_typing = 20; setTimeout(function () { showBotTyping(); }, delay_typing) @@ -492,7 +492,7 @@ function setBotResponse(response) { for (var i = 1; i < response.length; i++){ //Add delay based on the length of the next message - summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); + // summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); doScaledTimeout(i, response, summed_timeout) } From 57908c2c67da8f7835de54bd58b9c27da7359b35 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 10:40:55 +0200 Subject: [PATCH 010/159] Change energy table colours based on slot --- frontend/static/js/script.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index f79bc82..a37a04e 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -611,22 +611,25 @@ function select_energy(clicked_id){ var time_slot = document.getElementById(clicked_id); - time_slot.style.backgroundColor = "#82e876"; - if(clicked_id.includes("0")){ - time_slot.innerHTML = "None at all" + time_slot.innerHTML = "None at all"; + time_slot.style.backgroundColor = "#D3D3D3"; } else if (clicked_id.includes("1")){ - time_slot.innerHTML = "Less than usual" + time_slot.innerHTML = "Less than usual"; + time_slot.style.backgroundColor = "#ADD8E6"; } else if (clicked_id.includes("2")){ - time_slot.innerHTML = "An average amount" + time_slot.innerHTML = "An average amount"; + time_slot.style.backgroundColor = "#3cb371"; } else if (clicked_id.includes("3")){ - time_slot.innerHTML = "More than average" + time_slot.innerHTML = "More than average"; + time_slot.style.backgroundColor = "#FFA500"; } else if (clicked_id.includes("4")){ - time_slot.innerHTML = "Much more than average" + time_slot.innerHTML = "Much more than average"; + time_slot.style.backgroundColor = "#3a243b"; } } From dfd164104ad060d52136ab88abb2022d4197728a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 10:45:05 +0200 Subject: [PATCH 011/159] Remove delay properly --- frontend/static/js/script.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index a37a04e..fdaae75 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -272,8 +272,8 @@ function setBotResponse(response) { //display bot response after the number of miliseconds caputred by the variable 'delay_first_message' var delay_first_message = 500; if (response.length >=1) { - delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); - // delay_first_message = 20; + // delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); + delay_first_message = 20; } setTimeout(function () { hideBotTyping(); From 745c38cdaf41d3bb8eee010d1e4168d779570b9e Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 11 May 2023 11:12:32 +0200 Subject: [PATCH 012/159] Change colours --- frontend/static/js/script.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index fdaae75..601e224 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -613,23 +613,23 @@ function select_energy(clicked_id){ if(clicked_id.includes("0")){ time_slot.innerHTML = "None at all"; - time_slot.style.backgroundColor = "#D3D3D3"; + time_slot.style.backgroundColor = "#F7F97A"; } else if (clicked_id.includes("1")){ time_slot.innerHTML = "Less than usual"; - time_slot.style.backgroundColor = "#ADD8E6"; + time_slot.style.backgroundColor = "#B1F97D"; } else if (clicked_id.includes("2")){ time_slot.innerHTML = "An average amount"; - time_slot.style.backgroundColor = "#3cb371"; + time_slot.style.backgroundColor = "#82E876"; } else if (clicked_id.includes("3")){ time_slot.innerHTML = "More than average"; - time_slot.style.backgroundColor = "#FFA500"; + time_slot.style.backgroundColor = "#21E4AE"; } else if (clicked_id.includes("4")){ time_slot.innerHTML = "Much more than average"; - time_slot.style.backgroundColor = "#3a243b"; + time_slot.style.backgroundColor = "#4EB3F5"; } } From 9f747fbde871ca3e89af4ad6fe863522ec1a6299 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 14 May 2023 12:45:18 +0200 Subject: [PATCH 013/159] Fix typo --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index d9abae8..c326334 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1095,7 +1095,7 @@ responses: - text: "Having a clear goal to work towards is helpful in keeping you motivated." utter_explain_goal_3: - - text: "However, for the goal to be most effective, you should pick a goal is both challenging and achievable." + - text: "However, for the goal to be most effective, you should pick a goal that is both challenging and achievable." utter_explain_goal_4: - text: "You should feel like you have to put in the effort to reach your goal, while avoiding aiming for something unrealistic." From 894a382aacc7a3d8ac2984acda3f0c9c8063b17b Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Mon, 15 May 2023 10:26:56 +0200 Subject: [PATCH 014/159] Remove future action set up --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index c326334..bf6bb0a 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1442,7 +1442,7 @@ responses: - text: "I see. Thank you for informing me. Would you mind briefly describing your barrier to me in the chat?" utter_identify_barriers_5: - - text: "Thank you for telling me. I'll try to think a way to overcome your barrier. In the meantime..." + - text: "Thank you for telling me." # utter_identify_barriers_7: # - text: "Maybe you don't have shoes that are comfortable to take longer walks in." From 641f7f8bede5b12524a123a6ddcea21fa186652a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:01:56 +0200 Subject: [PATCH 015/159] Change mood to emojis --- backend/domain.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index bf6bb0a..82a5fb8 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -996,22 +996,22 @@ responses: utter_confirm_mood: - buttons: - payload: /confirm_mood_very_good - title: "I'm doing fantastic today!" + title: "😄" - payload: /confirm_mood_good - title: "I'm doing good." + title: "🙂" - payload: /confirm_mood_neutral - title: "I'm alright." + title: "😐" - payload: /confirm_mood_bad - title: "Not so good…" + title: "🙁" - payload: /confirm_mood_very_bad - title: "Quite bad…" - text: "How are you doing today?" + title: "😔" + text: "How are you doing today? Pick one of the emojis to let me know how you feel." utter_mood_very_good_response: - - text: "That's awesome!" + - text: "That's awesome! I'm glad you're in a great mood." utter_mood_good_response: - - text: "That's good to hear!" + - text: "That's good to hear! I'm glad you're in a good mood." utter_mood_neutral_response: - text: "Ah, so a pretty regular day, then. Okay." From dcdc627458a8cd7216633ec5406370d8b0adffb5 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:30:02 +0200 Subject: [PATCH 016/159] Shorter intro --- backend/data/rules.yml | 18 ++---------- backend/domain.yml | 62 ++++++------------------------------------ 2 files changed, 12 insertions(+), 68 deletions(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 6d03c6a..2605a5f 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -76,15 +76,14 @@ rules: - action: utter_button - action: utter_purpose_1 - action: utter_purpose_2 - - action: utter_purpose_3 - action: utter_continue_purpose_1 - rule: continue purpose 1 steps: - intent: confirm_continue_purpose_1 + - action: utter_purpose_3 - action: utter_purpose_4 - action: utter_purpose_5 - - action: utter_purpose_6 - action: utter_confirm_purpose - rule: confirm purpose explain planning @@ -92,8 +91,6 @@ rules: - intent: confirm_purpose - action: utter_explain_usefulness_planning_1 - action: utter_explain_usefulness_planning_2 - - action: utter_explain_usefulness_planning_3 - - action: utter_explain_usefulness_planning_4 - action: utter_explain_usefulness_planning_question @@ -103,7 +100,6 @@ rules: - action: utter_explain_goal_1 - action: utter_explain_goal_2 - action: utter_explain_goal_3 - - action: utter_explain_goal_4 - action: utter_explain_goal_question - rule: set goal @@ -111,14 +107,13 @@ rules: - intent: confirm_explain_goal - action: utter_set_goal_1 - action: utter_set_goal_2 - - action: utter_set_goal_3 - action: utter_set_goal_continue - rule: set goal continue steps: - intent: confirm_set_goal_continue + - action: utter_set_goal_3 - action: utter_set_goal_4 - - action: utter_set_goal_5 - action: utter_set_goal - rule: confirm goal @@ -126,16 +121,9 @@ rules: - intent: confirm_goal - action: utter_confirm_goal -- rule: internal motivation - steps: - - intent: confirm_initial_plan - - action: utter_internal_motivation_1 - - action: utter_internal_motivation_2 - - action: utter_internal_motivation_question - - rule: ask about routines steps: - - intent: confirm_motivation + - intent: confirm_initial_plan - action: utter_thank_for_motivation - action: utter_routines_1 - action: utter_routines_2 diff --git a/backend/domain.yml b/backend/domain.yml index 82a5fb8..4687916 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1041,10 +1041,7 @@ responses: - text: "Let me tell you a bit about myself. My goal is to help people create plans for taking walks during the week." utter_purpose_2: - - text: "Walking is generally regarded as beneficial for both health and mood." - - utter_purpose_3: - - text: "Another advantage of taking regular walks is that they are easily accessible for everyone." + - text: "Walking is generally regarded as beneficial for both health and mood, and it's also easily accessible for everyone." utter_continue_purpose_1: - buttons: @@ -1052,17 +1049,14 @@ responses: title: "Let's continue." text: "This means that it doesn't take a lot of time like a workout might, nor does it require special equipment. Let me know when you are done reading so we can continue." - utter_purpose_4: + utter_purpose_3: - text: "Okay! Let me explain in a bit more detail the kinds of walks we will make a plan for." - utter_purpose_5: + utter_purpose_4: - text: "Unlike leisurely walks, you'll have to walk at moderate intensity for our plan to be effective." - utter_purpose_6: + utter_purpose_5: - text: "Moderate intensity is characterised by breathing more heavily than usual, while still being able to hold a short conversation." - - utter_purpose_7: - - text: "In other words, you should walk at a pace that makes it somewhat challenging for you to keep going, which is about 100 steps per minute for the average person." utter_confirm_purpose: - buttons: @@ -1074,13 +1068,7 @@ responses: - text: "Nice. So, how does planning help you make progress towards your goal?" utter_explain_usefulness_planning_2: - - text: "If you have a clear indication of when you should go for a walk, it will be much easier for you to actually do it." - - utter_explain_usefulness_planning_3: - - text: "You'll have a clear schedule set in place, which will make it more difficult to avoid taking a walk or to postpone it." - - utter_explain_usefulness_planning_4: - - text: "After all, there is only so much time in a week, so, by making a plan, you integrate walking into your schedule such that you actually have time to do it." + - text: "If you have a clear indication of when you should go for a walk, you integrate walking into your schedule such that you actually have time to do it and." utter_explain_usefulness_planning_question: - buttons: @@ -1097,22 +1085,16 @@ responses: utter_explain_goal_3: - text: "However, for the goal to be most effective, you should pick a goal that is both challenging and achievable." - utter_explain_goal_4: - - text: "You should feel like you have to put in the effort to reach your goal, while avoiding aiming for something unrealistic." - utter_explain_goal_question: - buttons: - payload: /confirm_explain_goal title: "Let's move on." - text: "Let me know when you are ready to continue." + text: "Let me know when you are ready to continue with setting a goal." utter_set_goal_1: - - text: "I think we are ready for you to set a goal for walking." + - text: "Okay! A common way of measuring how much you walk is through counting the number of steps you take in a day." utter_set_goal_2: - - text: "A common way of measuring how much you walk is through counting the number of steps you take in a day." - - utter_set_goal_3: - text: "And a common goal is to aim for 10000 steps per day, as this is beneficial for your health, especially if you are currently inactive." utter_set_goal_continue: @@ -1121,10 +1103,10 @@ responses: title: "I am ready." text: "Once you are ready to continue, please click the button." - utter_set_goal_4: + utter_set_goal_3: - text: "Okay. I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." - utter_set_goal_5: + utter_set_goal_4: - text: "However, you can also pick a higher goal if you want a challenge!" utter_set_goal: @@ -1143,32 +1125,6 @@ responses: title: "I am prepared." text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day. Now, tell me when you are ready to continue." - - utter_internal_motivation_1: - - text: "Okay! An important part of achieving your goal is being motivated." - - utter_internal_motivation_2: - - text: "So, I am curious: what motivates you to want to walk regularly?" - - utter_internal_motivation_question: - - buttons: - - payload: /confirm_motivation - title: "Family." - - payload: /confirm_motivation - title: "Health." - - payload: /confirm_motivation - title: "Relationships." - - payload: /confirm_motivation - title: "Personal growth." - - payload: /confirm_motivation - title: "Work." - - payload: /confirm_motivation - title: "Friends." - text: "Please pick one of the options below:" - - utter_thank_for_motivation: - - text: "I see, thank you for letting me know!" - utter_routines_1: - text: "Alright, let's move on to creating the plan. In order to do that, let's first see when you have free time." From d98d5d36bb4f842c4178a3d3b044667c7a3ecbb3 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:32:37 +0200 Subject: [PATCH 017/159] Even shorter --- backend/data/rules.yml | 2 -- backend/domain.yml | 6 ------ 2 files changed, 8 deletions(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 2605a5f..5195c7e 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -127,8 +127,6 @@ rules: - action: utter_thank_for_motivation - action: utter_routines_1 - action: utter_routines_2 - - action: utter_routines_3 - - action: utter_routines_4 - action: utter_timeslots diff --git a/backend/domain.yml b/backend/domain.yml index 4687916..085c5e9 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1129,12 +1129,6 @@ responses: - text: "Alright, let's move on to creating the plan. In order to do that, let's first see when you have free time." utter_routines_2: - - text: "You don't have to provide me with your exact daily schedule, but let me know if you have any routines in place." - - utter_routines_3: - - text: "For example, most people work a day job. But maybe you have things planned on some evenings as well." - - utter_routines_4: - text: "Ideally, we're looking for at least four different times during the week when you have at least 30 minutes to take a walk." utter_timeslots: From 9eec610226db70a7ed7dde747fd176e42f7373bb Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:33:53 +0200 Subject: [PATCH 018/159] Remove non-existing action --- backend/data/rules.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 5195c7e..f564617 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -124,7 +124,6 @@ rules: - rule: ask about routines steps: - intent: confirm_initial_plan - - action: utter_thank_for_motivation - action: utter_routines_1 - action: utter_routines_2 - action: utter_timeslots From f1a081083d9bdc3f70534cdf42068a995824364d Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:43:28 +0200 Subject: [PATCH 019/159] Even shorter intro --- backend/data/rules.yml | 3 --- backend/domain.yml | 17 ++++------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index f564617..2c41e30 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -82,8 +82,6 @@ rules: steps: - intent: confirm_continue_purpose_1 - action: utter_purpose_3 - - action: utter_purpose_4 - - action: utter_purpose_5 - action: utter_confirm_purpose - rule: confirm purpose explain planning @@ -99,7 +97,6 @@ rules: - intent: confirm_usefulness_planning_intro - action: utter_explain_goal_1 - action: utter_explain_goal_2 - - action: utter_explain_goal_3 - action: utter_explain_goal_question - rule: set goal diff --git a/backend/domain.yml b/backend/domain.yml index 085c5e9..7852289 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1041,22 +1041,16 @@ responses: - text: "Let me tell you a bit about myself. My goal is to help people create plans for taking walks during the week." utter_purpose_2: - - text: "Walking is generally regarded as beneficial for both health and mood, and it's also easily accessible for everyone." + - text: "Walking is generally regarded as beneficial for both health and mood, and it's also easily accessible for everyone, since it doesn't take a lot of time like a workout might, nor does it require special equipment." utter_continue_purpose_1: - buttons: - payload: /confirm_continue_purpose_1 title: "Let's continue." - text: "This means that it doesn't take a lot of time like a workout might, nor does it require special equipment. Let me know when you are done reading so we can continue." + text: "Let me know when you are done reading so we can continue." utter_purpose_3: - - text: "Okay! Let me explain in a bit more detail the kinds of walks we will make a plan for." - - utter_purpose_4: - - text: "Unlike leisurely walks, you'll have to walk at moderate intensity for our plan to be effective." - - utter_purpose_5: - - text: "Moderate intensity is characterised by breathing more heavily than usual, while still being able to hold a short conversation." + - text: "Okay! For uor plan, you'll have to walk at moderate intensity, whch means you should be breathing more heavily than usual, while still being able to hold a short conversation." utter_confirm_purpose: - buttons: @@ -1080,10 +1074,7 @@ responses: - text: "Okay! In order to create a plan for walking, we should first set a goal for you." utter_explain_goal_2: - - text: "Having a clear goal to work towards is helpful in keeping you motivated." - - utter_explain_goal_3: - - text: "However, for the goal to be most effective, you should pick a goal that is both challenging and achievable." + - text: "Having a clear goal that is both challenging and achievable is helpful in keeping you motivated." utter_explain_goal_question: - buttons: From 18c2b0ddd0fef465aeb4cda75b7fa02e583fc036 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:47:25 +0200 Subject: [PATCH 020/159] Fix continuity issues --- backend/domain.yml | 7 +++++-- frontend/static/js/script.js | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 7852289..bb77597 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1122,8 +1122,11 @@ responses: utter_routines_2: - text: "Ideally, we're looking for at least four different times during the week when you have at least 30 minutes to take a walk." - utter_timeslots: - - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. Please select all the slots when you are avaialable." + utter_timeslots_1: + - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. By clicking that slot again, you indicate that you are not available. Please select all the slots when you are avaialable. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You might need to scroll to see theis button." + + utter_timeslots_2: + - text: "Please select all the slots when you are avaialable. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You may need to scroll to see theis button." utter_confirm_sunday_slots: diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 601e224..112d948 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -293,14 +293,14 @@ function setBotResponse(response) { var response_text = response[0].text.split("\n") for (j = 0; j < response_text.length; j++){ - if(response_text[j].includes("I see, thank you for letting me know!")){ + if(response_text[j].includes("Alright, let's move on to creating the plan. In order to do that, let's first see when you have free time.")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); setTimeout(()=> { $(".timeslots_table").toggle(); } - ,30000); + ,20000); } else if(response_text[j].includes("Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time.")){ From b64f020b96f53ba8e05b213317d97a276d55e4c0 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:48:12 +0200 Subject: [PATCH 021/159] Fix action names --- backend/data/rules.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 2c41e30..1476584 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -123,7 +123,8 @@ rules: - intent: confirm_initial_plan - action: utter_routines_1 - action: utter_routines_2 - - action: utter_timeslots + - action: utter_timeslots_1 + - action: utter_timeslots_2 - rule: ask about energy levels From 96fba209cca9fdd0c781bb6287dc2361ecd40bba Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:49:13 +0200 Subject: [PATCH 022/159] Fix typo --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index bb77597..c75c305 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1050,7 +1050,7 @@ responses: text: "Let me know when you are done reading so we can continue." utter_purpose_3: - - text: "Okay! For uor plan, you'll have to walk at moderate intensity, whch means you should be breathing more heavily than usual, while still being able to hold a short conversation." + - text: "Okay! For our plan, you'll have to walk at moderate intensity, whch means you should be breathing more heavily than usual, while still being able to hold a short conversation." utter_confirm_purpose: - buttons: From 3ac573c9fd258b7f82b251ef3b2754e64985a0a8 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:49:45 +0200 Subject: [PATCH 023/159] Ajust wording --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index c75c305..b82ed7e 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1062,7 +1062,7 @@ responses: - text: "Nice. So, how does planning help you make progress towards your goal?" utter_explain_usefulness_planning_2: - - text: "If you have a clear indication of when you should go for a walk, you integrate walking into your schedule such that you actually have time to do it and." + - text: "If you have a clear indication of when you should go for a walk, you can integrate walking into your schedule such that you actually have time to do it and." utter_explain_usefulness_planning_question: - buttons: From 0e7b91e90e3435b0e4839b5b96610669db5495ec Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:52:08 +0200 Subject: [PATCH 024/159] Remove more utterances --- backend/data/rules.yml | 4 ---- backend/domain.yml | 7 ++----- frontend/static/js/script.js | 2 +- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 1476584..2c3d67f 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -117,10 +117,6 @@ rules: steps: - intent: confirm_goal - action: utter_confirm_goal - -- rule: ask about routines - steps: - - intent: confirm_initial_plan - action: utter_routines_1 - action: utter_routines_2 - action: utter_timeslots_1 diff --git a/backend/domain.yml b/backend/domain.yml index b82ed7e..3dc5c52 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1111,13 +1111,10 @@ responses: text: "Please pick one of these options as your goal." utter_confirm_goal: - - buttons: - - payload: /confirm_initial_plan - title: "I am prepared." - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day. Now, tell me when you are ready to continue." + - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day. Now, tell me when you are ready to continue." utter_routines_1: - - text: "Alright, let's move on to creating the plan. In order to do that, let's first see when you have free time." + - text: "Let's move on to creating the plan. In order to do that, let's first see when you have free time." utter_routines_2: - text: "Ideally, we're looking for at least four different times during the week when you have at least 30 minutes to take a walk." diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 112d948..ad13453 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -293,7 +293,7 @@ function setBotResponse(response) { var response_text = response[0].text.split("\n") for (j = 0; j < response_text.length; j++){ - if(response_text[j].includes("Alright, let's move on to creating the plan. In order to do that, let's first see when you have free time.")){ + if(response_text[j].includes("Great! Take walks regularly and you'll be able to achieve your goal")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); From 9d7ce63cb37ebbaa5ab867ea8770b0e726edf278 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:55:36 +0200 Subject: [PATCH 025/159] Rewording --- backend/domain.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 3dc5c52..ae8586a 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1111,7 +1111,7 @@ responses: text: "Please pick one of these options as your goal." utter_confirm_goal: - - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day. Now, tell me when you are ready to continue." + - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day."aasd utter_routines_1: - text: "Let's move on to creating the plan. In order to do that, let's first see when you have free time." @@ -1144,7 +1144,7 @@ responses: utter_thank_for_energy_levels: - - text: "Thank you for letting me know when you have more energy than usual." + - text: "Thank you for letting me know about your energy levels." utter_present_plan_1: - buttons: From d32386a91ef1bde322984d6b609b5ba6e219016e Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 10:58:57 +0200 Subject: [PATCH 026/159] Show parts of the plan separately --- frontend/index.html | 2 ++ frontend/static/css/style.css | 10 +++++++++- frontend/static/js/script.js | 5 ++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 6e842e0..9083358 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -60,10 +60,12 @@ Midday (10:00 - 14:00) Afternoon (14:00 - 18:00) Evening (18:00 - 22:00) +
Week 3 Week 4 Month 2 Month 3 +
I'm done adjusting the plan. diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index eebe4b4..1e17cbe 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -65,8 +65,16 @@ body { } .plan{ + display: none; width: 800px; - height: 500px; + height: 350px; + margin: 0 auto; +} + +.plan_after_week_2{ + display: none; + width: 800px; + height: 150px; margin: 0 auto; } diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index ad13453..33dbd35 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -356,10 +356,13 @@ function setBotResponse(response) { document.getElementById("month_3").innerHTML = "Walking for up to " + month_3 + " hours per week, distributed across 6 time slots each week"; - $(".plan_table").toggle(); + $(".plan").toggle(); number_plan = 1; } + else if(response_text[j].includes("That's right, your first walk is on")){ + $(".plan_after_week_2").toggle(); + } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ var button = document.getElementById("submit_plan_button"); From d9921026cebbf16efff18cac6127666535ee723e Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:00:22 +0200 Subject: [PATCH 027/159] Fix typo --- backend/domain.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index ae8586a..fac39db 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1111,7 +1111,7 @@ responses: text: "Please pick one of these options as your goal." utter_confirm_goal: - - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day."aasd + - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day." utter_routines_1: - text: "Let's move on to creating the plan. In order to do that, let's first see when you have free time." @@ -1156,7 +1156,7 @@ responses: - buttons: - payload: /confirm_checked_plan{"changes_to_plan":"0"} title: "Let's discuss the plan." - text: "I'll leave the plan on the left side on the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail. " + text: "I'll leave the plan on the left side on the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail." utter_present_plan_3: - text: "Okay, let's take a took at the plan. On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." From dcd8a3a583a88209ea5f1ed588c6ef965964e303 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:05:46 +0200 Subject: [PATCH 028/159] Try to fix displaying plan --- frontend/index.html | 2 +- frontend/static/css/style.css | 4 ++-- frontend/static/js/script.js | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 9083358..49a6c5d 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -49,7 +49,7 @@
- +
diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 1e17cbe..f5e7b8c 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -64,14 +64,14 @@ body { border:none; } -.plan{ +#plan_first_2_weeks{ display: none; width: 800px; height: 350px; margin: 0 auto; } -.plan_after_week_2{ +#plan_after_week_2{ display: none; width: 800px; height: 150px; diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 33dbd35..ac2d977 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -356,12 +356,14 @@ function setBotResponse(response) { document.getElementById("month_3").innerHTML = "Walking for up to " + month_3 + " hours per week, distributed across 6 time slots each week"; - $(".plan").toggle(); + $(".plan_table").toggle(); + + $("#plan_first_2_weeks").toggle(); number_plan = 1; } else if(response_text[j].includes("That's right, your first walk is on")){ - $(".plan_after_week_2").toggle(); + $("#plan_after_week_2").toggle(); } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ From 734e4fe4c0ceb92371fb160ffbc5604611017d2f Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:07:11 +0200 Subject: [PATCH 029/159] Remove duplicate text --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index fac39db..ca1b089 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1120,7 +1120,7 @@ responses: - text: "Ideally, we're looking for at least four different times during the week when you have at least 30 minutes to take a walk." utter_timeslots_1: - - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. By clicking that slot again, you indicate that you are not available. Please select all the slots when you are avaialable. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You might need to scroll to see theis button." + - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. By clicking that slot again, you indicate that you are not available." utter_timeslots_2: - text: "Please select all the slots when you are avaialable. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You may need to scroll to see theis button." From 426bdaaab14018cab82e4eb9431ce5c2235bde09 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:13:39 +0200 Subject: [PATCH 030/159] Try a different fix --- frontend/index.html | 10 ++++------ frontend/static/css/style.css | 2 +- frontend/static/js/script.js | 2 ++ 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 49a6c5d..322a585 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -60,12 +60,10 @@ -
-
- - - - + + + +
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
Week 3
Week 4
Month 2
Month 3
I'm done adjusting the plan.
diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index f5e7b8c..86d3353 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -71,7 +71,7 @@ body { margin: 0 auto; } -#plan_after_week_2{ +.plan_after_week_2{ display: none; width: 800px; height: 150px; diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index ac2d977..648a241 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -363,6 +363,8 @@ function setBotResponse(response) { number_plan = 1; } else if(response_text[j].includes("That's right, your first walk is on")){ + var BotResponse = '

' + response_text[j] + '

'; + $(BotResponse).appendTo(".chats").hide().fadeIn(1000); $("#plan_after_week_2").toggle(); } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ From 6e781dabc362a595ce4c900eafeb544f2525b444 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:18:18 +0200 Subject: [PATCH 031/159] Add the changes to js code --- frontend/static/js/script.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 648a241..af79947 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -356,16 +356,16 @@ function setBotResponse(response) { document.getElementById("month_3").innerHTML = "Walking for up to " + month_3 + " hours per week, distributed across 6 time slots each week"; - $(".plan_table").toggle(); + $(".plan_table").css("display","block"); - $("#plan_first_2_weeks").toggle(); + $("#plan_first_2_weeks").css("display","table"); number_plan = 1; } else if(response_text[j].includes("That's right, your first walk is on")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - $("#plan_after_week_2").toggle(); + $(".plan_after_week_2").css("display",""); } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ From 6c455f562d16091adcb0560c2107f52f6c458a80 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:25:36 +0200 Subject: [PATCH 032/159] Try to remove display property --- frontend/static/js/script.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index af79947..5a8d7e0 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -365,7 +365,8 @@ function setBotResponse(response) { else if(response_text[j].includes("That's right, your first walk is on")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - $(".plan_after_week_2").css("display",""); + const collection = document.getElementsByClassName("plan_after_week_2"); + collection.forEach(el => el.style.removeProperty('display')); } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ From 4c5a8b1c33b18bec3bc6cc10261a205d1053ca31 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:34:15 +0200 Subject: [PATCH 033/159] Try a different way of iterating collection --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 5a8d7e0..03bfdc2 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -366,7 +366,7 @@ function setBotResponse(response) { var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); const collection = document.getElementsByClassName("plan_after_week_2"); - collection.forEach(el => el.style.removeProperty('display')); + Array.from(collection).forEach(el => el.style.removeProperty('display')); } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ From b13660dfa3c49921de5316ba2542851cd6739b3c Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:46:06 +0200 Subject: [PATCH 034/159] Remove display using ids --- frontend/index.html | 8 ++++---- frontend/static/js/script.js | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 322a585..ce90932 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -60,10 +60,10 @@ Midday (10:00 - 14:00) Afternoon (14:00 - 18:00) Evening (18:00 - 22:00) - Week 3 - Week 4 - Month 2 - Month 3 + Week 3 + Week 4 + Month 2 + Month 3 I'm done adjusting the plan. diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 03bfdc2..14b1da5 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -365,8 +365,11 @@ function setBotResponse(response) { else if(response_text[j].includes("That's right, your first walk is on")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - const collection = document.getElementsByClassName("plan_after_week_2"); - Array.from(collection).forEach(el => el.style.removeProperty('display')); + + document.getElementById("plan_week_3").style.removeProperty('display'); + document.getElementById("plan_week_4").style.removeProperty('display'); + document.getElementById("plan_month_2").style.removeProperty('display'); + document.getElementById("plan_month_3").style.removeProperty('display'); } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ From 1a07cfcff18ed3c01917783e6d0cad1710bf6344 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 11:50:20 +0200 Subject: [PATCH 035/159] Fix typo --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index ca1b089..7c08803 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1123,7 +1123,7 @@ responses: - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. By clicking that slot again, you indicate that you are not available." utter_timeslots_2: - - text: "Please select all the slots when you are avaialable. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You may need to scroll to see theis button." + - text: "Please select all the slots when you are avaialable. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You may need to scroll to see this button." utter_confirm_sunday_slots: From 247807b79c4bffd3deebe64c6d7e118f9a5e0ffa Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 12:11:39 +0200 Subject: [PATCH 036/159] Fix displaying tabe --- frontend/static/js/script.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 14b1da5..c13d71d 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -366,10 +366,7 @@ function setBotResponse(response) { var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - document.getElementById("plan_week_3").style.removeProperty('display'); - document.getElementById("plan_week_4").style.removeProperty('display'); - document.getElementById("plan_month_2").style.removeProperty('display'); - document.getElementById("plan_month_3").style.removeProperty('display'); + $(".plan_after_week_2").css("display", "inherit"); } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ From daeaa4fa1a590884a0f22c3e283c9b72e41ba4cc Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 12:24:24 +0200 Subject: [PATCH 037/159] FIx displaying table --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index c13d71d..b921f04 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -366,7 +366,7 @@ function setBotResponse(response) { var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - $(".plan_after_week_2").css("display", "inherit"); + $(".plan_after_week_2").css("display", "table-row"); } else if(response_text[j].includes("this is a message for javascript: enable the buttons")){ From c8898c626e569dda2f7230b14335576ee8c74cbc Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 13:02:39 +0200 Subject: [PATCH 038/159] Determine when to end dialogue --- actions/actions.py | 50 +++++++++++++++++++++++++++++++++++++++++- backend/data/rules.yml | 5 +++++ backend/domain.yml | 3 +++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/actions/actions.py b/actions/actions.py index 3bac21c..8e932ca 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -494,6 +494,54 @@ async def run(self, dispatcher: CollectingDispatcher, return [] +class ActionSaveAction(Action): + def name(self): + return "action_check_dialogue_done" + + async def run(self, dispatcher: CollectingDispatcher, + tracker: Tracker, + domain: Dict[Text, Any]) -> List[Dict[Text, Any]]: + + + # check how many actions have been done + # after 2 actions, we can end the dialogue if states are good + + changes_to_plan = int(tracker.get_slot("changes_to_plan")) + + explain_planning = tracker.get_slot("explain_planning") + + identify_barriers = tracker.get_slot("identify_barriers") + + deal_with_barriers = tracker.get_slot("deal_with_barriers") + + show_testimonials = tracker.get_slot("show_testimonials") + + num_actions = changes_to_plan + explain_planning + identify_barriers + deal_with_barriers + show_testimonials + + if num_actions >= 2: + + c = tracker.get_slot("confidence") + + pu = tracker.get_slot("perceived_usefulness") + + a = tracker.get_slot("attitude") + + if c in ["medium", "high"] and (pu == "high" or a == "high"): + + end = True + + else: + end = False + + if end: + + return [ActionExecuted("action_listen"), UserUttered(text="/confirm_actions_done", parse_data={"intent": {"name": "confirm_actions_done", "confidence": 1.0}})] + + else: + + return[ActionExecuted("action_listen"), UserUttered(text="/confirm_continue_dialogue", parse_data={"intent": {"name": "confirm_continue_dialogue", "confidence": 1.0}})] + + return [] class ActionSelectAction(Action): def name(self): @@ -642,7 +690,7 @@ async def run(self, dispatcher: CollectingDispatcher, return [] -class ActionSelectAction(Action): +class ActionSaveAction(Action): def name(self): return "action_save_action" diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 2c3d67f..e9528c3 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -200,6 +200,11 @@ rules: # - action: utter_attitude_repeat\ # - action: utter_thank_for_attitude - action: action_save_event_state + - action: action_check_dialogue_done + +- rule: confirm attitude do action ask confidence + steps: + - intent: confirm_continue_dialogue - action: action_select_action - rule: explain planning diff --git a/backend/domain.yml b/backend/domain.yml index 7c08803..99f8bb5 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -108,6 +108,8 @@ intents: ## actions +- confirm_continue_dialogue + - do_explain_planning - do_identify_barriers - do_deal_with_barriers @@ -1697,3 +1699,4 @@ actions: - action_save_action - action_save_goal_plans_and_reward - action_rearrange_db +- action_check_dialogue_done From ced86b4acddefe1946d9d703b600b8f7c58c0911 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 13:04:28 +0200 Subject: [PATCH 039/159] Add more explanation --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 99f8bb5..71c86a9 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1139,7 +1139,7 @@ responses: - text: "Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time." utter_energy_instruction: - - text: "Like before, I would like you to pay attention to the left side of the sceen. Please specify how much energy you have during the weekdays and during the weekends by clicking the corresponding box for each time of the day." + - text: "Like before, I would like you to pay attention to the left side of the sceen. Please specify how much energy you have during the weekdays and during the weekends by clicking the corresponding box for each time of the day. Note again that you may need to scroll to see the button which confirms that you are done." utter_energy_levels_weekends_confirm: - text: "So those are your energy levels on weekends:\n Morning: {weekends_morning}, Midday: {weekends_midday}, Afternoon: {weekends_afternoon}, Evening: {weekends_evening}." From dc70226700bad5d0a8432a3df5631393cf8c228d Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 13:08:07 +0200 Subject: [PATCH 040/159] Add debug message --- actions/actions.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/actions/actions.py b/actions/actions.py index 8e932ca..3291282 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -494,7 +494,7 @@ async def run(self, dispatcher: CollectingDispatcher, return [] -class ActionSaveAction(Action): +class ActionCheckDialogueDone(Action): def name(self): return "action_check_dialogue_done" @@ -506,6 +506,8 @@ async def run(self, dispatcher: CollectingDispatcher, # check how many actions have been done # after 2 actions, we can end the dialogue if states are good + dispatcher.utter_message(text= "I got here") + changes_to_plan = int(tracker.get_slot("changes_to_plan")) explain_planning = tracker.get_slot("explain_planning") From 50a6eaaa3b6fb8ce92ded5aa10283e256ccb44b5 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 13:10:42 +0200 Subject: [PATCH 041/159] Fix continue issue --- actions/actions.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index 3291282..5134223 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -506,8 +506,6 @@ async def run(self, dispatcher: CollectingDispatcher, # check how many actions have been done # after 2 actions, we can end the dialogue if states are good - dispatcher.utter_message(text= "I got here") - changes_to_plan = int(tracker.get_slot("changes_to_plan")) explain_planning = tracker.get_slot("explain_planning") @@ -537,13 +535,9 @@ async def run(self, dispatcher: CollectingDispatcher, if end: - return [ActionExecuted("action_listen"), UserUttered(text="/confirm_actions_done", parse_data={"intent": {"name": "confirm_actions_done", "confidence": 1.0}})] - - else: - - return[ActionExecuted("action_listen"), UserUttered(text="/confirm_continue_dialogue", parse_data={"intent": {"name": "confirm_continue_dialogue", "confidence": 1.0}})] + return [ActionExecuted("action_listen"), UserUttered(text="/confirm_actions_done", parse_data={"intent": {"name": "confirm_actions_done", "confidence": 1.0}})] - return [] + return[ActionExecuted("action_listen"), UserUttered(text="/confirm_continue_dialogue", parse_data={"intent": {"name": "confirm_continue_dialogue", "confidence": 1.0}})] class ActionSelectAction(Action): def name(self): From 506391fffc54b4d4a2ab699758da412031ac680e Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 13:26:41 +0200 Subject: [PATCH 042/159] Minimum 3 actions: avoid 2 plans in these 3 actions; deal with barriers if they are identified before ending --- actions/actions.py | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index 5134223..86b12c7 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -518,24 +518,26 @@ async def run(self, dispatcher: CollectingDispatcher, num_actions = changes_to_plan + explain_planning + identify_barriers + deal_with_barriers + show_testimonials - if num_actions >= 2: + if num_actions >= 3: - c = tracker.get_slot("confidence") + if identify_barriers and deal_with_barriers or not identify_barriers: - pu = tracker.get_slot("perceived_usefulness") + c = tracker.get_slot("confidence") - a = tracker.get_slot("attitude") + pu = tracker.get_slot("perceived_usefulness") - if c in ["medium", "high"] and (pu == "high" or a == "high"): - - end = True + a = tracker.get_slot("attitude") - else: - end = False - - if end: + if c in ["medium", "high"] and (pu == "high" or a == "high"): + + end = True + + else: + end = False + + if end: - return [ActionExecuted("action_listen"), UserUttered(text="/confirm_actions_done", parse_data={"intent": {"name": "confirm_actions_done", "confidence": 1.0}})] + return [ActionExecuted("action_listen"), UserUttered(text="/confirm_actions_done", parse_data={"intent": {"name": "confirm_actions_done", "confidence": 1.0}})] return[ActionExecuted("action_listen"), UserUttered(text="/confirm_continue_dialogue", parse_data={"intent": {"name": "confirm_continue_dialogue", "confidence": 1.0}})] @@ -579,15 +581,20 @@ async def run(self, dispatcher: CollectingDispatcher, possible_actions = [] - # this corresponds to having done 3 actions, none of which were changes to the plan - # if we do the 4th action that is not a change to the plan, then we have to do changes to plans in turns 5 and 6 - # that shouldn't happen, since we don't want to make changes to plans twice in a row - if number_actions == 3 and changes_to_plan == 0: + # this corresponds to having done 2 actions, none of which were changes to the plan + # we want to give people the chance to change the plan at least once before ending the dialogue + if number_actions == 2 and changes_to_plan == 0: possible_actions = ["changes_to_plan"] + elif number_actions == 3 and identify_barriers and not deal_with_barriers: + possible_actions = ["deal_with_barriers"] else: # we want to make at most 2 changes to the initial plan and to not change the plan twice in a row if last_action != "changes_to_plan" and changes_to_plan<=1: possible_actions.append("changes_to_plan") + # we want to avoid a situation where people change the plan, do a different action, change the plan again, and then end + if changes_to_plan == 1 and number_actions == 2: + if "changes_to_plan" in possible_actions: + possible_actions.remove("changes_to_plan") # we want to explain planning only once if explain_planning == False: possible_actions.append("explain_planning") From 983fb46955540a974a968089d762c5bfb44f8341 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 13:36:24 +0200 Subject: [PATCH 043/159] Fix logic --- actions/actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/actions.py b/actions/actions.py index 86b12c7..6675ac8 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -585,7 +585,7 @@ async def run(self, dispatcher: CollectingDispatcher, # we want to give people the chance to change the plan at least once before ending the dialogue if number_actions == 2 and changes_to_plan == 0: possible_actions = ["changes_to_plan"] - elif number_actions == 3 and identify_barriers and not deal_with_barriers: + elif number_actions >= 3 and identify_barriers and not deal_with_barriers: possible_actions = ["deal_with_barriers"] else: # we want to make at most 2 changes to the initial plan and to not change the plan twice in a row From 3ff8b450124de28e27b1a6ec2f029d40e38630d9 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 14:03:01 +0200 Subject: [PATCH 044/159] Make table headers stand out --- frontend/index.html | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index ce90932..bbaf0fc 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -50,20 +50,20 @@
- - - - - - - - - - - - - - + + + + + + + + + + + + + +
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
I'm done adjusting the plan.
@@ -71,11 +71,11 @@
- - - - - + + + + +
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
I'm done selecting time slots when I am free. @@ -84,18 +84,18 @@
- - - - - - - - - - - - + + + + + + + + + + + +
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
I'm done specifying my energy levels.
From 3d4cbce15424a34a8f1ab5f819907af326c1eeee Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 14:07:42 +0200 Subject: [PATCH 045/159] Make cursor a pointer on tables --- frontend/static/css/style.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 86d3353..f36d7e4 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -89,6 +89,10 @@ body { overflow: auto; } +.timeslots_table td{ + cursor: pointer; +} + .time_table{ width: 750px; height: 300px; @@ -106,6 +110,10 @@ body { overflow: auto; } +.energy_levels_table td{ + cursor: pointer; +} + .energy_table{ width: 850px; height: 300px; From b4ce8477e37c5fc150fb28818b00e3dea530e7b4 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 14:14:06 +0200 Subject: [PATCH 046/159] Make only cells that should be clicked clickable --- frontend/index.html | 44 +++++++++++++++++------------------ frontend/static/css/style.css | 6 +---- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index bbaf0fc..a935c61 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -51,15 +51,15 @@
- - - - + + + + - - - - + + + + @@ -72,10 +72,10 @@
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
- - - - + + + +
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
I'm done selecting time slots when I am free. @@ -85,17 +85,17 @@
- - - - - + + + + + - - - - - + + + + +
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
None at all
Less than usual
An average amount
More than average
Much more than average
I'm done specifying my energy levels.
diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index f36d7e4..3ca60bd 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -89,10 +89,6 @@ body { overflow: auto; } -.timeslots_table td{ - cursor: pointer; -} - .time_table{ width: 750px; height: 300px; @@ -110,7 +106,7 @@ body { overflow: auto; } -.energy_levels_table td{ +.clickable{ cursor: pointer; } From fafbcc0a904bb26b6d2a1fb191ee602af35ab5df Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 14:17:37 +0200 Subject: [PATCH 047/159] Fix displaying table --- frontend/index.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index a935c61..14765ee 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -51,15 +51,15 @@
- - - - + + + + - - - - + + + + From a2765a370a180ba4ab0c9183961042c92e77494a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 14:28:05 +0200 Subject: [PATCH 048/159] Change more colours --- frontend/index.html | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 14765ee..f10fb5a 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -50,20 +50,20 @@
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
- + - + - - - - + + + +
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
Week 3
Week 4
Month 2
Month 3
I'm done adjusting the plan.
@@ -71,7 +71,7 @@
- + @@ -84,13 +84,13 @@
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
- + - + From 3582d47e171e8e9dbc8b3a752aa82b1096066132 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 19:08:13 +0200 Subject: [PATCH 049/159] CHange table colours --- frontend/index.html | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index f10fb5a..2cc070d 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -50,20 +50,20 @@
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
- - - - - - - - - - - - - - + + + + + + + + + + + + + +
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
I'm done adjusting the plan.
@@ -71,11 +71,11 @@
- - - - - + + + + +
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
I'm done selecting time slots when I am free. @@ -84,18 +84,18 @@
- - - - - - - - - - - - + + + + + + + + + + + +
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
I'm done specifying my energy levels.
From 3fbdf172150ab202ab40e708c2a507526f5facc7 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 19:09:42 +0200 Subject: [PATCH 050/159] Fix typo --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 71c86a9..2c911ee 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1125,7 +1125,7 @@ responses: - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. By clicking that slot again, you indicate that you are not available." utter_timeslots_2: - - text: "Please select all the slots when you are avaialable. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You may need to scroll to see this button." + - text: "Please select all the slots when you are available. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You may need to scroll to see this button." utter_confirm_sunday_slots: From b1bd76c68c296d97ef70a980033cc11e90fc1486 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 19:11:32 +0200 Subject: [PATCH 051/159] Change colours again --- frontend/index.html | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 2cc070d..d43c39b 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -50,20 +50,20 @@
- - - - - - - - - - - - - - + + + + + + + + + + + + + +
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
I'm done adjusting the plan.
@@ -71,11 +71,11 @@
- - - - - + + + + +
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
I'm done selecting time slots when I am free. @@ -84,18 +84,18 @@
- - - - - - - - - - - - + + + + + + + + + + + +
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
I'm done specifying my energy levels.
From 892c039363639738f8b5eef6b63dc3496d0e6fa1 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 19:14:46 +0200 Subject: [PATCH 052/159] Change colours again --- frontend/index.html | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index d43c39b..0760694 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -50,20 +50,20 @@
- - - - - - - - - - - - - - + + + + + + + + + + + + + +
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
Month 3
I'm done adjusting the plan.
@@ -71,11 +71,11 @@
- - - - - + + + + +
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
I'm done selecting time slots when I am free. @@ -84,18 +84,18 @@
- - - - - - - - - - - - + + + + + + + + + + + +
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
I'm done specifying my energy levels.
From fe67b0c332776604c924771cf7cb535850774133 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 21:57:40 +0200 Subject: [PATCH 053/159] Make chatbox blink --- frontend/static/css/style.css | 35 +++++++++++++++++++++-------------- frontend/static/js/script.js | 10 ++++++++++ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 3ca60bd..d7fff74 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -64,17 +64,9 @@ body { border:none; } -#plan_first_2_weeks{ - display: none; +.plan{ width: 800px; - height: 350px; - margin: 0 auto; -} - -.plan_after_week_2{ - display: none; - width: 800px; - height: 150px; + height: 500px; margin: 0 auto; } @@ -106,10 +98,6 @@ body { overflow: auto; } -.clickable{ - cursor: pointer; -} - .energy_table{ width: 850px; height: 300px; @@ -217,6 +205,7 @@ textarea-webkit-scrollbar { width: 100%; padding: 5px; border-radius: 0px 0px 10px 10px; + animation: border-flicker-green 0.5s linear; } #sendButton { @@ -324,6 +313,24 @@ textarea-webkit-scrollbar { } } +@keyframes border-flicker-green { + 0% { + box-shadow: 5px 5px 20px #09ff00; + } + 25% { + box-shadow: 5px 5px 20px #09ff00; + } + 50% { + box-shadow: 5px 5px 50px #09ff00; + } + 75% { + box-shadow: 5px 5px 20px #09ff00; + } + 100% { + box-shadow: 5px 5px 20px #09ff00; + } + } + /*========== css related to chats elements============= */ diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index b921f04..cc539c3 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -538,6 +538,16 @@ function doScaledTimeout(i, response, summed_timeout) { }, summed_timeout); } +function blink() { + var f = document.getElementById('keypad'); + setTimeout(function() { + f.style.boxShadow = '5px 5px 50px #09ff00'; + setTimeout(function() { + f.style.boxShadow = 'none'; + }, 1000); + }, 1000); + } + //====================================== Toggle chatbot ======================================= $("#profile_div").click(function () { From e1b2d946d9ef5885d426787bd12d9a06ce3dcd69 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 21:59:52 +0200 Subject: [PATCH 054/159] Move animation to function --- frontend/static/css/style.css | 1 - frontend/static/js/script.js | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index d7fff74..fc3db40 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -205,7 +205,6 @@ textarea-webkit-scrollbar { width: 100%; padding: 5px; border-radius: 0px 0px 10px 10px; - animation: border-flicker-green 0.5s linear; } #sendButton { diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index cc539c3..77bb2ea 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -542,8 +542,10 @@ function blink() { var f = document.getElementById('keypad'); setTimeout(function() { f.style.boxShadow = '5px 5px 50px #09ff00'; + f.style.animation = 'border-flicker-green 0.5s linear'; setTimeout(function() { f.style.boxShadow = 'none'; + f.style.animation = 'none'; }, 1000); }, 1000); } From ec863fd68f412caad253350866f132e5d302864c Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:06:04 +0200 Subject: [PATCH 055/159] Add missing id --- frontend/index.html | 2 +- frontend/static/js/script.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 0760694..bf0fbf9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -35,7 +35,7 @@
-
+
diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 77bb2ea..91ded91 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -541,14 +541,14 @@ function doScaledTimeout(i, response, summed_timeout) { function blink() { var f = document.getElementById('keypad'); setTimeout(function() { - f.style.boxShadow = '5px 5px 50px #09ff00'; - f.style.animation = 'border-flicker-green 0.5s linear'; + f.style.boxShadow = '5px 5px 50px #09ff00'; + f.style.animation = 'border-flicker-green 0.5s linear'; setTimeout(function() { - f.style.boxShadow = 'none'; - f.style.animation = 'none'; + f.style.boxShadow = 'none'; + f.style.animation = 'none'; }, 1000); }, 1000); - } +} //====================================== Toggle chatbot ======================================= From 9ff0409757b8dd4bdc163ac9fa2331cc9b334e74 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:15:35 +0200 Subject: [PATCH 056/159] Remove not needed code --- frontend/static/css/style.css | 13 ++++++++----- frontend/static/js/script.js | 9 +-------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index fc3db40..0faf1c6 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -316,19 +316,22 @@ textarea-webkit-scrollbar { 0% { box-shadow: 5px 5px 20px #09ff00; } - 25% { + 20% { box-shadow: 5px 5px 20px #09ff00; } - 50% { - box-shadow: 5px 5px 50px #09ff00; + 40% { + box-shadow: 5px 5px 50px white; + } + 60% { + box-shadow: 5px 5px 50px white; } - 75% { + 80% { box-shadow: 5px 5px 20px #09ff00; } 100% { box-shadow: 5px 5px 20px #09ff00; } - } +} /*========== css related to chats elements============= */ diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 91ded91..d24a303 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -540,14 +540,7 @@ function doScaledTimeout(i, response, summed_timeout) { function blink() { var f = document.getElementById('keypad'); - setTimeout(function() { - f.style.boxShadow = '5px 5px 50px #09ff00'; - f.style.animation = 'border-flicker-green 0.5s linear'; - setTimeout(function() { - f.style.boxShadow = 'none'; - f.style.animation = 'none'; - }, 1000); - }, 1000); + f.style.animation = 'border-flicker-green 10s linear'; } From 3de28267269ded8faf245a06bc31ef16b4926ade Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:17:14 +0200 Subject: [PATCH 057/159] Chage animation color --- frontend/static/css/style.css | 10 +++++----- frontend/static/js/script.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 0faf1c6..8d8ebed 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -312,12 +312,12 @@ textarea-webkit-scrollbar { } } -@keyframes border-flicker-green { +@keyframes border-flicker-yellow { 0% { - box-shadow: 5px 5px 20px #09ff00; + box-shadow: 5px 5px 20px #F7F97A; } 20% { - box-shadow: 5px 5px 20px #09ff00; + box-shadow: 5px 5px 20px #F7F97A; } 40% { box-shadow: 5px 5px 50px white; @@ -326,10 +326,10 @@ textarea-webkit-scrollbar { box-shadow: 5px 5px 50px white; } 80% { - box-shadow: 5px 5px 20px #09ff00; + box-shadow: 5px 5px 20px #F7F97A; } 100% { - box-shadow: 5px 5px 20px #09ff00; + box-shadow: 5px 5px 20px #F7F97A; } } diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index d24a303..9855462 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -540,7 +540,7 @@ function doScaledTimeout(i, response, summed_timeout) { function blink() { var f = document.getElementById('keypad'); - f.style.animation = 'border-flicker-green 10s linear'; + f.style.animation = 'border-flicker-yellow linear'; } From acaf75b395619b5dc72326592212c422da5bcb4a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:22:36 +0200 Subject: [PATCH 058/159] Add back animation time --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 9855462..d7158a1 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -540,7 +540,7 @@ function doScaledTimeout(i, response, summed_timeout) { function blink() { var f = document.getElementById('keypad'); - f.style.animation = 'border-flicker-yellow linear'; + f.style.animation = 'border-flicker-yellow 3s linear'; } From d57a5b9dc493e4fa5874f13359473af5a903f3d8 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:26:59 +0200 Subject: [PATCH 059/159] Put cursor on text field during blink --- frontend/static/js/script.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index d7158a1..0da5a26 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -538,9 +538,18 @@ function doScaledTimeout(i, response, summed_timeout) { }, summed_timeout); } -function blink() { +function blink_and_select() { + document.getElementById("userInput").focus(); + document.getElementById("userInput").select(); + var f = document.getElementById('keypad'); - f.style.animation = 'border-flicker-yellow 3s linear'; + f.style.animation = 'border-flicker-yellow 3s ease-out'; + setTimeout(function() { + f.style.animation = 'none'; + }, 5000); + + + } From 45bdbe4e786b906808047f9a7ec3501ecfa2791b Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:28:36 +0200 Subject: [PATCH 060/159] Use function when needed --- frontend/static/js/script.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 0da5a26..88aa0fc 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -403,6 +403,7 @@ function setBotResponse(response) { $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); current_takeaway = 1; + blink_and_select(); } else if(response_text[j].includes("How about this example? What can you take away for yourself? Please type this in the chat.") || response_text[j].includes("The question was: What can you take away from this second example for yourself?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -411,6 +412,7 @@ function setBotResponse(response) { $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); current_takeaway = 2; + blink_and_select(); } else if(response_text[j].includes("Please type your answer as a number with one decimal point.")){ @@ -420,6 +422,7 @@ function setBotResponse(response) { $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); check_week_3 = true; + blink_and_select(); } else if(response_text[j].includes("You can see the first two weeks planned in detail.")){ var BotResponse = '

' + response_text[j] + '

'; @@ -428,6 +431,7 @@ function setBotResponse(response) { $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); check_first_walk = true; + blink_and_select(); } else if(response_text[j].includes("User barrier: ")){ @@ -435,6 +439,7 @@ function setBotResponse(response) { $(".usrInput").prop('placeholder', "Type something..."); barrier_strategy = true; barrier_type = response_text[j].split("User barrier: ")[1]; + blink_and_select(); } else if(response_text[j].includes("The question was: How can you overcome this barrier?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -443,6 +448,7 @@ function setBotResponse(response) { $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); barrier_strategy = true; + blink_and_select(); } else if(response_text[j].includes("I see. Thank you for informing me. Would you mind briefly describing your barrier to me in the chat?") || response_text[j].includes("The question was: Would you mind briefly describing your barrier to me in the chat?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -451,6 +457,7 @@ function setBotResponse(response) { $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); identified_barrier = true; + blink_and_select(); } else if(response_text[j].includes("Okay! Now, you have your approach to this barrier. Here is a strategy I thought about.") || response_text[j].includes("The question was: How can you overcome this barrier after having read my suggestion?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -459,6 +466,7 @@ function setBotResponse(response) { $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); barrier_repeat = true; + blink_and_select(); } else if(response_text[j].includes("Good choice!") || response_text[j].includes("The question was: How do you think planning can help you do this?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -467,6 +475,7 @@ function setBotResponse(response) { $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); planning = true; + blink_and_select(); } // otherwise, display the message else{ From ca542883ee1e21714e250273b993b6d61e287bd7 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:33:03 +0200 Subject: [PATCH 061/159] Change table colours --- frontend/index.html | 46 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index bf0fbf9..b7c141c 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -51,15 +51,15 @@
- - - - + + + + - - - - + + + + @@ -71,11 +71,11 @@
Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 2MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
Week 3
Week 4
Month 2
- - - - - + + + + +
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)
Afternoon (14:00 - 18:00)
Evening (18:00 - 22:00)
I'm done selecting time slots when I am free. @@ -85,17 +85,17 @@
- - - - - + + + + + - - - - - + + + + +
WeekdaysMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
None at all
Less than usual
An average amount
More than average
Much more than average
WeekendsMorning (6:00 - 10:00)Midday (10:00 - 14:00)Afternoon (14:00 - 18:00)Evening (18:00 - 22:00)
None at all
Less than usual
An average amount
More than average
Much more than average
None at all
Less than usual
An average amount
More than average
Much more than average
I'm done specifying my energy levels.
From 2b66d397bd9527650b46fb4a7b8f17412f6c7293 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:37:36 +0200 Subject: [PATCH 062/159] Adjust table position --- frontend/static/css/style.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 8d8ebed..b653a22 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -65,6 +65,9 @@ body { } .plan{ + left: 3%; + top: 5%; + position:fixed; width: 800px; height: 500px; margin: 0 auto; From c2555ab5ed3b2da60a2ed30154a8a490451547ed Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:40:59 +0200 Subject: [PATCH 063/159] Slightly adjust table again --- frontend/static/css/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index b653a22..b2c7348 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -65,7 +65,7 @@ body { } .plan{ - left: 3%; + left: 3.5%; top: 5%; position:fixed; width: 800px; From 90617243fa12e46aff18187224f4b694e1c6409a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:46:37 +0200 Subject: [PATCH 064/159] Change user icon --- frontend/static/img/user_picture.png | Bin 17087 -> 11564 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/frontend/static/img/user_picture.png b/frontend/static/img/user_picture.png index 57d3a20a0ac49b5b33aea314ec5a3dfe2e8d2cb8..a6dc0a997d7d4f8dbb6e4ae53c6113761b33b8b5 100644 GIT binary patch literal 11564 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 N6$MTCs&|%O{vQT+^uPcB literal 17087 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 From 15d1dcb133112d99ec63ba1cce6df11182f562ff Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 17 May 2023 22:48:39 +0200 Subject: [PATCH 065/159] Remove rounded border around user --- frontend/static/css/style.css | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index b2c7348..88d3b7e 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -182,7 +182,6 @@ textarea-webkit-scrollbar { .userAvatar { animation: animateElement linear 0.3s; animation-iteration-count: 1; - border-radius: 50%; width: 1.5em; height: 1.5em; float: right; From f7def4c922cacb5a58d5933a501ec2bb2b95c8f0 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sat, 20 May 2023 19:06:27 +0200 Subject: [PATCH 066/159] Move intro to qualtrics --- backend/data/rules.yml | 61 ++++++++++++++++++++++++------------------ backend/domain.yml | 17 +++++++++++- 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index e9528c3..e197b04 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -70,34 +70,43 @@ rules: - action: utter_prompt_usage_2 - action: utter_explain_usage -- rule: confirm usage explain purpose +- rule: intro steps: - intent: confirm_usage - - action: utter_button - - action: utter_purpose_1 - - action: utter_purpose_2 - - action: utter_continue_purpose_1 - -- rule: continue purpose 1 - steps: - - intent: confirm_continue_purpose_1 - - action: utter_purpose_3 - - action: utter_confirm_purpose - -- rule: confirm purpose explain planning - steps: - - intent: confirm_purpose - - action: utter_explain_usefulness_planning_1 - - action: utter_explain_usefulness_planning_2 - - action: utter_explain_usefulness_planning_question - - -- rule: confirm usefulness planning explain goal - steps: - - intent: confirm_usefulness_planning_intro - - action: utter_explain_goal_1 - - action: utter_explain_goal_2 - - action: utter_explain_goal_question + - action: utter_intro_1 + - action: utter_intro_2 + - action: utter_intro_3 + - action: utter_intro_4 + + +# - rule: confirm usage explain purpose +# steps: +# - intent: confirm_usage +# - action: utter_button +# - action: utter_purpose_1 +# - action: utter_purpose_2 +# - action: utter_continue_purpose_1 + +# - rule: continue purpose 1 +# steps: +# - intent: confirm_continue_purpose_1 +# - action: utter_purpose_3 +# - action: utter_confirm_purpose + +# - rule: confirm purpose explain planning +# steps: +# - intent: confirm_purpose +# - action: utter_explain_usefulness_planning_1 +# - action: utter_explain_usefulness_planning_2 +# - action: utter_explain_usefulness_planning_question + + +# - rule: confirm usefulness planning explain goal +# steps: +# - intent: confirm_usefulness_planning_intro +# - action: utter_explain_goal_1 +# - action: utter_explain_goal_2 +# - action: utter_explain_goal_question - rule: set goal steps: diff --git a/backend/domain.yml b/backend/domain.yml index 2c911ee..8d340db 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1039,8 +1039,23 @@ responses: utter_button: - text: "Nice. Seems like you're getting familiar with using the buttons." + utter_intro_1: + - text: "Let me first reiterate what you previously read." + + utter_intro_2: + - text: "My goal is to help people create plans for taking walks." + + utter_intro_3: + - text: "We'll set a goal for you to reach in 6 months from now, and then create a plan for doing so." + + utter_intro_4: + - buttons: + - payload: /confirm_explain_goal + title: "Let's continue." + text: "Let me know when you are ready to continue." + utter_purpose_1: - - text: "Let me tell you a bit about myself. My goal is to help people create plans for taking walks during the week." + - text: "Let me tell you a bit about myself. My goal is to help people create plans for taking walks." utter_purpose_2: - text: "Walking is generally regarded as beneficial for both health and mood, and it's also easily accessible for everyone, since it doesn't take a lot of time like a workout might, nor does it require special equipment." From 8eb3ae33c72134198daa734cbc9e84f16203c075 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sat, 20 May 2023 19:08:05 +0200 Subject: [PATCH 067/159] Add more explanations --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 8d340db..b8fa8a2 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1040,7 +1040,7 @@ responses: - text: "Nice. Seems like you're getting familiar with using the buttons." utter_intro_1: - - text: "Let me first reiterate what you previously read." + - text: "Let me first reiterate what you previously read to Qualtrics." utter_intro_2: - text: "My goal is to help people create plans for taking walks." From 3b511454803b3bebbd9dfd8ad3b64b27cef05308 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sat, 20 May 2023 23:20:27 +0200 Subject: [PATCH 068/159] Adjust flow --- backend/data/rules.yml | 12 ++++++------ backend/domain.yml | 8 ++++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index e197b04..5d3b680 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -101,12 +101,12 @@ rules: # - action: utter_explain_usefulness_planning_question -# - rule: confirm usefulness planning explain goal -# steps: -# - intent: confirm_usefulness_planning_intro -# - action: utter_explain_goal_1 -# - action: utter_explain_goal_2 -# - action: utter_explain_goal_question +- rule: confirm usefulness planning explain goal + steps: + - intent: confirm_intro + - action: utter_explain_goal_1 + - action: utter_explain_goal_2 + - action: utter_explain_goal_question - rule: set goal steps: diff --git a/backend/domain.yml b/backend/domain.yml index b8fa8a2..d219eb5 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -20,6 +20,10 @@ intents: # usage - confirm_usage +# intro + +- confirm_intro + # goal - confirm_explain_goal @@ -1050,7 +1054,7 @@ responses: utter_intro_4: - buttons: - - payload: /confirm_explain_goal + - payload: /confirm_intro title: "Let's continue." text: "Let me know when you are ready to continue." @@ -1167,7 +1171,7 @@ responses: - buttons: - payload: /confirm_ready_initial_plan title: "Show me the plan." - text: "Now, let's see initial plan! Don't worry if it's not entirely to you liking yet. You'll have opportunities to modify it later. Please let me know when you are ready to continue." + text: "Now, let's see the initial plan! It is based on the free times and energy levels you specified, but don't worry if it's not entirely to you liking yet. You'll have opportunities to modify it later. Please let me know when you are ready to continue." utter_present_plan_2: - buttons: From c90291d9efd8541c78edc6c635ef605c7fe94f40 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sat, 20 May 2023 23:23:13 +0200 Subject: [PATCH 069/159] Add missing utter --- backend/data/rules.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 5d3b680..25feeaa 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -73,6 +73,7 @@ rules: - rule: intro steps: - intent: confirm_usage + - action: utter_button - action: utter_intro_1 - action: utter_intro_2 - action: utter_intro_3 From ed47abfc2a843a175691fcafac21a55092c2bacc Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sat, 20 May 2023 23:23:44 +0200 Subject: [PATCH 070/159] Rewording --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index d219eb5..d653878 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1044,7 +1044,7 @@ responses: - text: "Nice. Seems like you're getting familiar with using the buttons." utter_intro_1: - - text: "Let me first reiterate what you previously read to Qualtrics." + - text: "Let me briefly reiterate what you previously read to Qualtrics." utter_intro_2: - text: "My goal is to help people create plans for taking walks." From f64d4a9779a8029d734b146ac27c58553d0357ce Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 21 May 2023 22:44:41 +0200 Subject: [PATCH 071/159] Adjust formulation --- backend/domain.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index d653878..f629c44 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1092,7 +1092,7 @@ responses: text: "Let me know when you are done reading and you want to continue." utter_explain_goal_1: - - text: "Okay! In order to create a plan for walking, we should first set a goal for you." + - text: "Alright, let's keep going. In order to create a plan for walking, we should first set a goal for you." utter_explain_goal_2: - text: "Having a clear goal that is both challenging and achievable is helpful in keeping you motivated." @@ -1104,7 +1104,7 @@ responses: text: "Let me know when you are ready to continue with setting a goal." utter_set_goal_1: - - text: "Okay! A common way of measuring how much you walk is through counting the number of steps you take in a day." + - text: "Great, let's carry on. A common way of measuring how much you walk is through counting the number of steps you take in a day." utter_set_goal_2: - text: "And a common goal is to aim for 10000 steps per day, as this is beneficial for your health, especially if you are currently inactive." @@ -1116,7 +1116,7 @@ responses: text: "Once you are ready to continue, please click the button." utter_set_goal_3: - - text: "Okay. I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." + - text: "Okay, let's proceed. I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." utter_set_goal_4: - text: "However, you can also pick a higher goal if you want a challenge!" From ece2bfc5c0fee39d05559175098707947efa3064 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 10:12:53 +0200 Subject: [PATCH 072/159] FIx typo --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index f629c44..14f2c4f 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1630,7 +1630,7 @@ responses: title: "9" - payload: /confirm_commitment_f{"commitment_f":"10"} title: "10 (I strongly agree)" - text: "How much do you agree with the following statement: 'I am committing to being physically active by following the entire plan, no mater what feels uncomfortable or challenging about that'?" + text: "How much do you agree with the following statement: 'I am committing to being physically active by following the entire plan, no matter what feels uncomfortable or challenging about that'?" utter_confidence_goal: - buttons: From 6c89a0e3dcf9cc259a5fa1fb91455f80fd7966d8 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 10:35:21 +0200 Subject: [PATCH 073/159] Fix typos --- backend/domain.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 14f2c4f..05cbe74 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1032,7 +1032,7 @@ responses: - text: "Before we start, let me explain how you can communicate with me." utter_prompt_usage_2: - - text: "You can simply click on one of the buttons, like you already did. Sometimes, you will have to use the chat box bellow to type in your answer." + - text: "You can simply click on one of the buttons like you already did. Sometimes, you will have to use the chat box below to type in your answer." utter_explain_usage: - buttons: @@ -1071,7 +1071,7 @@ responses: text: "Let me know when you are done reading so we can continue." utter_purpose_3: - - text: "Okay! For our plan, you'll have to walk at moderate intensity, whch means you should be breathing more heavily than usual, while still being able to hold a short conversation." + - text: "Okay! For our plan, you'll have to walk at moderate intensity, which means you should be breathing more heavily than usual, while still being able to hold a short conversation." utter_confirm_purpose: - buttons: @@ -1080,10 +1080,10 @@ responses: text: "Once you are done reading, I will explain how this all ties together with the help of the plan." utter_explain_usefulness_planning_1: - - text: "Nice. So, how does planning help you make progress towards your goal?" + - text: "Nice. So, how does planning help you make progress toward your goal?" utter_explain_usefulness_planning_2: - - text: "If you have a clear indication of when you should go for a walk, you can integrate walking into your schedule such that you actually have time to do it and." + - text: "If you have a clear indication of when you should go for a walk, you can integrate walking into your schedule such that you actually have time to do it." utter_explain_usefulness_planning_question: - buttons: @@ -1092,10 +1092,10 @@ responses: text: "Let me know when you are done reading and you want to continue." utter_explain_goal_1: - - text: "Alright, let's keep going. In order to create a plan for walking, we should first set a goal for you." + - text: "Alright, let's keep going. To create a plan for walking, we should first set a goal for you." utter_explain_goal_2: - - text: "Having a clear goal that is both challenging and achievable is helpful in keeping you motivated." + - text: "Having a clear goal that is both challenging and achievable helps keep you motivated." utter_explain_goal_question: - buttons: @@ -1135,7 +1135,7 @@ responses: - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day." utter_routines_1: - - text: "Let's move on to creating the plan. In order to do that, let's first see when you have free time." + - text: "Let's move on to creating the plan. To do that, let's first see when you have free time." utter_routines_2: - text: "Ideally, we're looking for at least four different times during the week when you have at least 30 minutes to take a walk." @@ -1158,7 +1158,7 @@ responses: - text: "Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time." utter_energy_instruction: - - text: "Like before, I would like you to pay attention to the left side of the sceen. Please specify how much energy you have during the weekdays and during the weekends by clicking the corresponding box for each time of the day. Note again that you may need to scroll to see the button which confirms that you are done." + - text: "Like before, I would like you to pay attention to the left side of the screen. Please specify how much energy you have during the weekdays and during the weekends by clicking the corresponding box for each time of the day. Note again that you may need to scroll to see the button which confirms that you are done." utter_energy_levels_weekends_confirm: - text: "So those are your energy levels on weekends:\n Morning: {weekends_morning}, Midday: {weekends_midday}, Afternoon: {weekends_afternoon}, Evening: {weekends_evening}." @@ -1171,16 +1171,16 @@ responses: - buttons: - payload: /confirm_ready_initial_plan title: "Show me the plan." - text: "Now, let's see the initial plan! It is based on the free times and energy levels you specified, but don't worry if it's not entirely to you liking yet. You'll have opportunities to modify it later. Please let me know when you are ready to continue." + text: "Now, let's see the initial plan! It is based on the times when you are free and the energy levels you specified, but don't worry if it's not entirely to your liking yet. You'll have opportunities to modify it later. Please let me know when you are ready to continue." utter_present_plan_2: - buttons: - payload: /confirm_checked_plan{"changes_to_plan":"0"} title: "Let's discuss the plan." - text: "I'll leave the plan on the left side on the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail." + text: "I'll leave the plan on the left side of the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail." utter_present_plan_3: - - text: "Okay, let's take a took at the plan. On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." + - text: "Okay, let's take a look at the plan. On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." utter_check_plan_first_walk: - text: "You can see the first two weeks planned in detail. To check that you understand what the plan signifies, let's do a quick pop quiz! When is the first time you have to take a walk? Please type your answer as day_time. For example, if your first walk is on Friday morning, please type 'friday_morning'." @@ -1189,7 +1189,7 @@ responses: - text: "That's right, your first walk is on {plan_check_first_walk}." utter_check_plan_first_walk_incorrect: - - text: "Unfortunately, you are not right. Please, take another look at the plan. You can see the first two weeks planned in detail. Look for the first day with a time slot selected, then look at what time in that day you should take a walk. Please type your answer as day_time." + - text: "Unfortunately, you are not right. Please, take another look at the plan. You can see the first two weeks planned in detail. Look for the first day with a time slot selected, then look at what time during that day you should take a walk. Please type your answer as day_time." utter_explain_weeks: - buttons: @@ -1198,7 +1198,7 @@ responses: text: "Moving on, you can also see the third and fourth weeks, but only in terms of how many hours you have to walk and how often. For the two months after that, you see only how much you will have to do in the last week of that month, to give you an idea of the effort that you are building up towards. Let me know when you are done reading." utter_check_plan_week_3: - - text: "Let's do an extra check to make sure everything is clear. How much time will you have to walk on your third week? Please type your answer as a number with one decimal point. For example, if your answer is 1 and a half hours, please type '1.5'" + - text: "Let's do an extra check to make sure everything is clear. How much time will you have to walk in your third week? Please type your answer as a number with one decimal point. For example, if your answer is 1 and a half hours, please type '1.5'" utter_check_plan_week_3_correct: - text: "Correct! In your third week, you will have to walk for {plan_check_week_3} hours." @@ -1635,7 +1635,7 @@ responses: utter_confidence_goal: - buttons: - payload: /confirm_confidence_goal{"confidence_goal":"0"} - title: "0 (I am not confident at that I can reach my goal)" + title: "0 (I am not confident at all that I can reach my goal)" - payload: /confirm_confidence_goal{"confidence_goal":"1"} title: "1" - payload: /confirm_confidence_goal{"confidence_goal":"2"} From 823feadb218596fd7037a462824114f09536ec5a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 10:36:28 +0200 Subject: [PATCH 074/159] Fix typos From dd87304088e2523ee4c5438e56f79c8757cd4928 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 10:40:43 +0200 Subject: [PATCH 075/159] Change questions to match questionnaire --- backend/domain.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 05cbe74..607231c 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1255,7 +1255,7 @@ responses: utter_state_perceived_usefulness: - buttons: - payload: /confirm_perceived_usefulness{"perceived_usefulness":"low"} - title: "0 (I don't think it can help me)" + title: "0 (I think it can hinder me very much)" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"low"} title: "1" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"low"} @@ -1275,8 +1275,8 @@ responses: - payload: /confirm_perceived_usefulness{"perceived_usefulness":"high"} title: "9" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"high"} - title: "10 (I think it can help me)" - text: "To what extent do you think planning can help you take walks?" + title: "10 (I think it can help me very much)" + text: "To what extent do you think planning can help or hinder you in terms of taking walks?" utter_perceived_usefulness_repeat: - text: "So your perceived usefulness is {perceived_usefulness}." @@ -1292,7 +1292,7 @@ responses: utter_state_attitude: - buttons: - payload: /confirm_attitude{"attitude":"low"} - title: "0 (Very useless)" + title: "0 (Bad)" - payload: /confirm_attitude{"attitude":"low"} title: "1" - payload: /confirm_attitude{"attitude":"low"} @@ -1312,8 +1312,8 @@ responses: - payload: /confirm_attitude{"attitude":"high"} title: "9" - payload: /confirm_attitude{"attitude":"high"} - title: "10 (Very useful)" - text: "Please complete the following statement: 'For me, planning walks for the next 3 months would be ...'" + title: "10 (Good)" + text: "Please complete the following statement: 'Making plans for taking walks is ...'" utter_attitude_repeat: - text: "So your attitude is {attitude}." From 9819448f8ea01a9bdf92b82b0993e45d2f353ddc Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 10:42:41 +0200 Subject: [PATCH 076/159] Change to minimum 2 actions and end when all variables are high --- actions/actions.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index 6675ac8..dbdeab2 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -518,7 +518,7 @@ async def run(self, dispatcher: CollectingDispatcher, num_actions = changes_to_plan + explain_planning + identify_barriers + deal_with_barriers + show_testimonials - if num_actions >= 3: + if num_actions >= 2: if identify_barriers and deal_with_barriers or not identify_barriers: @@ -528,7 +528,7 @@ async def run(self, dispatcher: CollectingDispatcher, a = tracker.get_slot("attitude") - if c in ["medium", "high"] and (pu == "high" or a == "high"): + if c == "high" and pu == "high" and a == "high": end = True @@ -581,20 +581,20 @@ async def run(self, dispatcher: CollectingDispatcher, possible_actions = [] - # this corresponds to having done 2 actions, none of which were changes to the plan + # this corresponds to having done 1 action, which was not changes to the plan # we want to give people the chance to change the plan at least once before ending the dialogue - if number_actions == 2 and changes_to_plan == 0: + if number_actions == 1 and changes_to_plan == 0: possible_actions = ["changes_to_plan"] - elif number_actions >= 3 and identify_barriers and not deal_with_barriers: + elif number_actions >= 2 and identify_barriers and not deal_with_barriers: possible_actions = ["deal_with_barriers"] else: # we want to make at most 2 changes to the initial plan and to not change the plan twice in a row if last_action != "changes_to_plan" and changes_to_plan<=1: possible_actions.append("changes_to_plan") - # we want to avoid a situation where people change the plan, do a different action, change the plan again, and then end - if changes_to_plan == 1 and number_actions == 2: - if "changes_to_plan" in possible_actions: - possible_actions.remove("changes_to_plan") + # # we want to avoid a situation where people change the plan, do a different action, change the plan again, and then end + # if changes_to_plan == 1 and number_actions == 2: + # if "changes_to_plan" in possible_actions: + # possible_actions.remove("changes_to_plan") # we want to explain planning only once if explain_planning == False: possible_actions.append("explain_planning") From 7a1b92d19988bec67fcd55570292e359adbc71b6 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 10:48:06 +0200 Subject: [PATCH 077/159] Disable chatbox from the start --- frontend/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/index.html b/frontend/index.html index b7c141c..10a6a91 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -36,7 +36,7 @@
- +
From 5e0df8c7eeec92e3e9951db7a15c5cc7a5b2fcf8 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 10:56:33 +0200 Subject: [PATCH 078/159] Rewording --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 607231c..516d1a0 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1044,7 +1044,7 @@ responses: - text: "Nice. Seems like you're getting familiar with using the buttons." utter_intro_1: - - text: "Let me briefly reiterate what you previously read to Qualtrics." + - text: "Let me briefly reiterate what you previously read in the introduction part of this session." utter_intro_2: - text: "My goal is to help people create plans for taking walks." From 872205c60d7cda01664d997f1d042f40f1b3dcb2 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 11:18:10 +0200 Subject: [PATCH 079/159] Add code which somehow disappeared --- frontend/static/css/style.css | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 88d3b7e..22dff9e 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -64,12 +64,17 @@ body { border:none; } -.plan{ - left: 3.5%; - top: 5%; - position:fixed; +#plan_first_2_weeks{ + display: none; width: 800px; - height: 500px; + height: 350px; + margin: 0 auto; +} + +.plan_after_week_2{ + display: none; + width: 800px; + height: 150px; margin: 0 auto; } @@ -182,6 +187,7 @@ textarea-webkit-scrollbar { .userAvatar { animation: animateElement linear 0.3s; animation-iteration-count: 1; + border-radius: 50%; width: 1.5em; height: 1.5em; float: right; @@ -910,4 +916,3 @@ input:focus { video:focus { outline: none; } - From 2d6d34a061cb60350235b07fddd7e80bde015a35 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 11:23:48 +0200 Subject: [PATCH 080/159] Add back plan css --- frontend/static/css/style.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 22dff9e..b218dee 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -64,6 +64,14 @@ body { border:none; } +.plan{ + left: 3.5%; + top: 5%; + position:fixed; + width: 800px; + height: 500px; +} + #plan_first_2_weeks{ display: none; width: 800px; From 9657694327bd44c599ce14892ab4de6f39317ed0 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 11:32:29 +0200 Subject: [PATCH 081/159] Add margin --- frontend/static/css/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index b218dee..584540c 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -70,6 +70,7 @@ body { position:fixed; width: 800px; height: 500px; + margin: 0 auto; } #plan_first_2_weeks{ From 1e16ebf040a19f88c391c84caccd3f73484bb4c7 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 11:41:14 +0200 Subject: [PATCH 082/159] Change plan display --- frontend/index.html | 2 +- frontend/static/css/style.css | 8 +------- frontend/static/js/script.js | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 10a6a91..a1caadb 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -49,7 +49,7 @@
- +
diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 584540c..ec2949e 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -65,6 +65,7 @@ body { } .plan{ + display: none; left: 3.5%; top: 5%; position:fixed; @@ -73,13 +74,6 @@ body { margin: 0 auto; } -#plan_first_2_weeks{ - display: none; - width: 800px; - height: 350px; - margin: 0 auto; -} - .plan_after_week_2{ display: none; width: 800px; diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 88aa0fc..daf1667 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -358,7 +358,7 @@ function setBotResponse(response) { $(".plan_table").css("display","block"); - $("#plan_first_2_weeks").css("display","table"); + $(".plan").css("display","table"); number_plan = 1; } From 8d1c4493b108d9f3d3101bdc30f5b0da52920c6b Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 11:43:06 +0200 Subject: [PATCH 083/159] Remove user avatar border --- frontend/static/css/style.css | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index ec2949e..4ba7a12 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -190,7 +190,6 @@ textarea-webkit-scrollbar { .userAvatar { animation: animateElement linear 0.3s; animation-iteration-count: 1; - border-radius: 50%; width: 1.5em; height: 1.5em; float: right; From 45f2c4c9e66cc1fa2dc3a430ef4995784cd519a4 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 12:38:09 +0200 Subject: [PATCH 084/159] Fix plan scrolling --- frontend/static/css/style.css | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 4ba7a12..781972e 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -48,8 +48,8 @@ body { .plan_table{ display: none; - width: 57%; - height: 95%; + width: 875px; + height: 700 px; left: 1%; bottom: 2%; top: 2%; @@ -66,21 +66,13 @@ body { .plan{ display: none; - left: 3.5%; - top: 5%; - position:fixed; + top: 3%; + position: relative; width: 800px; height: 500px; margin: 0 auto; } -.plan_after_week_2{ - display: none; - width: 800px; - height: 150px; - margin: 0 auto; -} - .timeslots_table{ display: none; width: 57%; @@ -236,6 +228,8 @@ textarea-webkit-scrollbar { width: 250px; text-align: center; margin: 10 auto; + position: relative; + top: 5%; cursor: pointer; border: 2px solid #000000; background-color: #2ed59f61 From 0197f57d53324017b8dde3a0ac276a12b1f2ff6d Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 12:42:16 +0200 Subject: [PATCH 085/159] Fix displaying plan in steps --- frontend/static/css/style.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 781972e..7be6a5e 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -73,6 +73,13 @@ body { margin: 0 auto; } +.plan_after_week_2{ + display: none; + width: 800px; + height: 150px; + margin: 0 auto; +} + .timeslots_table{ display: none; width: 57%; From f88a5b0bdc8687c2c530da1c4854401ed70f3542 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 13:49:36 +0200 Subject: [PATCH 086/159] Change mood question --- backend/domain.yml | 62 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 10 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 516d1a0..b3df678 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -995,23 +995,65 @@ responses: utter_greet_1: - text: "Hey there! I'm Jamie, your virtual coach." - utter_greet_2: - - text: "I'm happy to meet you." - - utter_confirm_mood: - buttons: - payload: /confirm_mood_very_good - title: "😄" + title: 'happy' + - payload:/confirm_mood_very_good + title: "glad" + - payload: /confirm_mood_very_good + title: "pleased" + - payload: /confirm_mood_very_good + title: "delighted" + - payload: /confirm_mood_very_good + title: "serene" + - payload: /confirm_mood_very_good + title: 'content' + - payload: /confirm_mood_very_good + title: "satisfied" + - payload: /confirm_mood_very_good + title: "relaxed" + - payload: /confirm_mood_very_good + title: "calm" - payload: /confirm_mood_good - title: "🙂" + title: "excited" + - payload: /confirm_mood_good + title: "astonished" + - payload: /confirm_mood_good + title: "aroused" + - payload: /confirm_mood_neutral + title: "sleepy" - payload: /confirm_mood_neutral - title: "😐" + title: "neutral" + - payload: /confirm_mood_neutral + title: "tired" + - payload: /confirm_mood_neutral + title: "tense" + - payload: /confirm_mood_neutral + title: "alarmed" + - payload: /confirm_mood_neutral + title: "afraid" + - payload: /confirm_mood_bad + title: "droopy" + - payload: /confirm_mood_bad + title: "bored" - payload: /confirm_mood_bad - title: "🙁" + title: "angry" + - payload: /confirm_mood_bad + title: "annoyed" + - payload: /confirm_mood_bad + title: "frustrated" + - payload: /confirm_mood_very_bad + title: "distressed" + - payload: /confirm_mood_very_bad + title: "depressed" + - payload: /confirm_mood_very_bad + title: "sad" + - payload: /confirm_mood_very_bad + title: "gloomy" - payload: /confirm_mood_very_bad - title: "😔" - text: "How are you doing today? Pick one of the emojis to let me know how you feel." + title: "miserable" + text: "How are you doing today? Pick one of the options below to let me know how you feel." utter_mood_very_good_response: - text: "That's awesome! I'm glad you're in a great mood." From 8079d71c3a99b90a142508714a71c10cea5d3ef7 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 13:50:22 +0200 Subject: [PATCH 087/159] Fix typos --- backend/domain.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index b3df678..9c9d170 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -998,8 +998,8 @@ responses: utter_confirm_mood: - buttons: - payload: /confirm_mood_very_good - title: 'happy' - - payload:/confirm_mood_very_good + title: "happy" + - payload: /confirm_mood_very_good title: "glad" - payload: /confirm_mood_very_good title: "pleased" From e5959e4ca461d655467df446d07bbfc517a1bcc8 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 13:51:38 +0200 Subject: [PATCH 088/159] Add back deleted utter --- backend/domain.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/domain.yml b/backend/domain.yml index 9c9d170..500db63 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -995,6 +995,9 @@ responses: utter_greet_1: - text: "Hey there! I'm Jamie, your virtual coach." + utter_greet_2: + - text: "I'm happy to meet you." + utter_confirm_mood: - buttons: - payload: /confirm_mood_very_good From 96cd07f23c9b9628200bba006ab9314b274c506a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 13:57:19 +0200 Subject: [PATCH 089/159] Try to change color of mood question buttons --- frontend/static/css/style.css | 14 ++++++++++++++ frontend/static/js/script.js | 21 ++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 7be6a5e..c8610bc 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -554,6 +554,20 @@ div.content_data::-webkit-scrollbar { word-wrap: break-word; } +.menuChipsCustom { + display: block; + background: #ccd132; + color: #fff; + padding: 2px; + text-align: center; + margin-bottom: 1px; + cursor: pointer; + border-radius: 50px; + font-size: 13px; + margin: 2px; + word-wrap: break-word; +} + /* cards carousels */ diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index daf1667..bc36011 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -488,6 +488,8 @@ function setBotResponse(response) { //check if the response contains "buttons" if (response[0].hasOwnProperty("buttons")) { addSuggestion(response[0].buttons); + var BotResponse = '

' + response_text[j] + '

'; + $(BotResponse).appendTo(".chats").hide().fadeIn(1000); } scrollToBottomOfResults(); @@ -932,13 +934,26 @@ function addSuggestion(textToAdd) { setTimeout(function () { $(".usrInput").prop('placeholder', "Use one of the buttons to answer."); + var suggestions = textToAdd; var suggLength = textToAdd.length; + $('
').appendTo(".chats").hide().fadeIn(1000); - // Loop through suggestions - for (i = 0; i < suggLength; i++) { - $('").appendTo(".menu"); + + if (suggestions.includes("happy")){ + for (i = 0; i < suggLength; i++) { + $('").appendTo(".menu"); + } } + else{ + // Loop through suggestions + for (i = 0; i < suggLength; i++) { + $('").appendTo(".menu"); + } + } + + + scrollToBottomOfResults(); }, 1000); } From 8aae45e86df3bbf47d3703b60874a02830955d03 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 13:58:57 +0200 Subject: [PATCH 090/159] log for debugging --- frontend/static/js/script.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index bc36011..5a2bad6 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -940,7 +940,11 @@ function addSuggestion(textToAdd) { $('
').appendTo(".chats").hide().fadeIn(1000); + console.log(suggestions); + if (suggestions.includes("happy")){ + + for (i = 0; i < suggLength; i++) { $('").appendTo(".menu"); } From d5338625a6efdaa38360ffe5be003e0abeb3403f Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:02:53 +0200 Subject: [PATCH 091/159] Change log message --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 5a2bad6..44f27b6 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -940,7 +940,7 @@ function addSuggestion(textToAdd) { $('
').appendTo(".chats").hide().fadeIn(1000); - console.log(suggestions); + console.log(typeof suggestions); if (suggestions.includes("happy")){ From 7079e965a3ebf65491d096711f409c911507f149 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:06:17 +0200 Subject: [PATCH 092/159] Change log message --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 44f27b6..34454df 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -940,7 +940,7 @@ function addSuggestion(textToAdd) { $('
').appendTo(".chats").hide().fadeIn(1000); - console.log(typeof suggestions); + console.log(typeof suggestions[0]); if (suggestions.includes("happy")){ From 3eb97a502a9bda683581210bd71683a233d4a6f9 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:07:19 +0200 Subject: [PATCH 093/159] Try to fix changing buttons --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 34454df..2bf09a0 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -942,7 +942,7 @@ function addSuggestion(textToAdd) { console.log(typeof suggestions[0]); - if (suggestions.includes("happy")){ + if (suggestions[0].title == "happy"){ for (i = 0; i < suggLength; i++) { From e5b76495856bf0f9691a4327a63a8ce76c38c8d4 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:08:26 +0200 Subject: [PATCH 094/159] Change log --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 2bf09a0..91de999 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -940,7 +940,7 @@ function addSuggestion(textToAdd) { $('
').appendTo(".chats").hide().fadeIn(1000); - console.log(typeof suggestions[0]); + console.log(suggestions[0].title); if (suggestions[0].title == "happy"){ From 68c1bac3ffffa36e6a1c9df40d6d61d57e277743 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:10:22 +0200 Subject: [PATCH 095/159] Remove console log --- frontend/static/js/script.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 91de999..1223270 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -939,8 +939,7 @@ function addSuggestion(textToAdd) { var suggLength = textToAdd.length; $('
').appendTo(".chats").hide().fadeIn(1000); - - console.log(suggestions[0].title); + if (suggestions[0].title == "happy"){ From 77eabf53fac99fa173fca3b7e279770ec7b6f8fe Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:17:08 +0200 Subject: [PATCH 096/159] Add missing onClick --- frontend/static/js/script.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 1223270..b189604 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -977,6 +977,22 @@ $(document).on("click", ".menu .menuChips", function () { }); +// on click of suggestions, get the value and send to rasa +$(document).on("click", ".menu .menuChipsCustom", function () { + // $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Use the buttons to communicate with Jamie."); + var text = this.innerText; + var payload = this.getAttribute('data-payload'); + console.log("payload: ", this.getAttribute('data-payload')) + setUserResponse(text); + send(payload); + + //delete the suggestions once user click on it + $(".suggestions").remove(); + +}); + + //======================================bot typing animation ====================================== function showBotTyping() { From 48936cd6c3633d6be071640f91cac6160b3c3e77 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:19:55 +0200 Subject: [PATCH 097/159] Change names --- backend/domain.yml | 56 ++++++++++++++++++------------------ frontend/static/js/script.js | 2 +- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 500db63..9d62b9c 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1001,61 +1001,61 @@ responses: utter_confirm_mood: - buttons: - payload: /confirm_mood_very_good - title: "happy" + title: "Happy" - payload: /confirm_mood_very_good - title: "glad" + title: "Glad" - payload: /confirm_mood_very_good - title: "pleased" + title: "Pleased" - payload: /confirm_mood_very_good - title: "delighted" + title: "Delighted" - payload: /confirm_mood_very_good - title: "serene" + title: "Serene" - payload: /confirm_mood_very_good - title: 'content' + title: 'Content' - payload: /confirm_mood_very_good - title: "satisfied" + title: "Satisfied" - payload: /confirm_mood_very_good - title: "relaxed" + title: "Relaxed" - payload: /confirm_mood_very_good - title: "calm" + title: "Calm" - payload: /confirm_mood_good - title: "excited" + title: "Excited" - payload: /confirm_mood_good - title: "astonished" + title: "Aastonished" - payload: /confirm_mood_good - title: "aroused" + title: "Aroused" - payload: /confirm_mood_neutral - title: "sleepy" + title: "Sleepy" - payload: /confirm_mood_neutral - title: "neutral" + title: "Neutral" - payload: /confirm_mood_neutral - title: "tired" + title: "Tired" - payload: /confirm_mood_neutral - title: "tense" + title: "Tense" - payload: /confirm_mood_neutral - title: "alarmed" + title: "Alarmed" - payload: /confirm_mood_neutral - title: "afraid" + title: "Afraid" - payload: /confirm_mood_bad - title: "droopy" + title: "Droopy" - payload: /confirm_mood_bad - title: "bored" + title: "Bored" - payload: /confirm_mood_bad - title: "angry" + title: "Angry" - payload: /confirm_mood_bad - title: "annoyed" + title: "Annoyed" - payload: /confirm_mood_bad - title: "frustrated" + title: "Frustrated" - payload: /confirm_mood_very_bad - title: "distressed" + title: "Distressed" - payload: /confirm_mood_very_bad - title: "depressed" + title: "Depressed" - payload: /confirm_mood_very_bad - title: "sad" + title: "Sad" - payload: /confirm_mood_very_bad - title: "gloomy" + title: "Gloomy" - payload: /confirm_mood_very_bad - title: "miserable" + title: "Miserable" text: "How are you doing today? Pick one of the options below to let me know how you feel." utter_mood_very_good_response: diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index b189604..ac4ce39 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -941,7 +941,7 @@ function addSuggestion(textToAdd) { $('
').appendTo(".chats").hide().fadeIn(1000); - if (suggestions[0].title == "happy"){ + if (suggestions[0].title == "Happy"){ for (i = 0; i < suggLength; i++) { From 58a53976663951ede6632918427c417c628ef1f2 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:22:17 +0200 Subject: [PATCH 098/159] Change button alignment --- frontend/static/css/style.css | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index c8610bc..5c7e6dc 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -523,11 +523,10 @@ div.content_data::-webkit-scrollbar { /* css for suggestions buttons */ .suggestions { - padding: 5px; - width: 80%; + padding: 2px; + width: 100%; border-radius: 10px; - background: #ffffff; - box-shadow: 2px 5px 5px 1px #dbdade; + background: #f7f7f7; } .menuTitle { @@ -537,7 +536,10 @@ div.content_data::-webkit-scrollbar { } .menu { - padding: 10px; + padding: 2px; + display: flex; + flex-wrap: wrap; + justify-content: center; } .menuChips { From 87b9ba760c910925531c0db94162e330532e1630 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:24:26 +0200 Subject: [PATCH 099/159] Fix typo --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 9d62b9c..54846bf 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1021,7 +1021,7 @@ responses: - payload: /confirm_mood_good title: "Excited" - payload: /confirm_mood_good - title: "Aastonished" + title: "Astonished" - payload: /confirm_mood_good title: "Aroused" - payload: /confirm_mood_neutral From c179f315971bd132e2380ca4ffd9794f23dca8f0 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:25:46 +0200 Subject: [PATCH 100/159] Customise buttons --- frontend/static/css/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 5c7e6dc..b193aa5 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -558,9 +558,9 @@ div.content_data::-webkit-scrollbar { .menuChipsCustom { display: block; - background: #ccd132; + background: #2ed59f; color: #fff; - padding: 2px; + padding:7px; text-align: center; margin-bottom: 1px; cursor: pointer; From ef7a751d2e4d10c854ec0d1a4ce27ec5c2fac3b9 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:31:51 +0200 Subject: [PATCH 101/159] Add custom menu for custom buttons --- frontend/static/css/style.css | 11 +++++++++++ frontend/static/js/script.js | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index b193aa5..54a35c9 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -536,6 +536,17 @@ div.content_data::-webkit-scrollbar { } .menu { + padding: 10px; +} + +.menuCustom { + padding: 2px; + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +.menuCustom { padding: 2px; display: flex; flex-wrap: wrap; diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index ac4ce39..cf971be 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -938,14 +938,14 @@ function addSuggestion(textToAdd) { var suggestions = textToAdd; var suggLength = textToAdd.length; - $('
').appendTo(".chats").hide().fadeIn(1000); + $('
').appendTo(".chats").hide().fadeIn(1000); if (suggestions[0].title == "Happy"){ for (i = 0; i < suggLength; i++) { - $('").appendTo(".menu"); + $('").appendTo(".menuCustom"); } } else{ From 6845ebc8a405bb60fcec931b6f00ba1f423f121f Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:32:20 +0200 Subject: [PATCH 102/159] Fix typo --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index cf971be..105b775 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -978,7 +978,7 @@ $(document).on("click", ".menu .menuChips", function () { // on click of suggestions, get the value and send to rasa -$(document).on("click", ".menu .menuChipsCustom", function () { +$(document).on("click", ".menuCustom .menuChipsCustom", function () { // $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Use the buttons to communicate with Jamie."); var text = this.innerText; From 017b7c09928cf079d57db936758c1a60027febd0 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 24 May 2023 14:45:32 +0200 Subject: [PATCH 103/159] Change suggestions css --- frontend/static/css/style.css | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 54a35c9..29d80e6 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -523,10 +523,11 @@ div.content_data::-webkit-scrollbar { /* css for suggestions buttons */ .suggestions { - padding: 2px; - width: 100%; + padding: 5px; + width: 80%; border-radius: 10px; - background: #f7f7f7; + background: #ffffff; + box-shadow: 2px 5px 5px 1px #dbdade; } .menuTitle { From a0240f4abb543b5b3420caca7f522ed9f18539ce Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 25 May 2023 11:39:51 +0200 Subject: [PATCH 104/159] Fix extra message from buttons --- frontend/static/js/script.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 105b775..3b163fa 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -488,8 +488,6 @@ function setBotResponse(response) { //check if the response contains "buttons" if (response[0].hasOwnProperty("buttons")) { addSuggestion(response[0].buttons); - var BotResponse = '

' + response_text[j] + '

'; - $(BotResponse).appendTo(".chats").hide().fadeIn(1000); } scrollToBottomOfResults(); From e6512e8cba4a87bcf252b89b9cbc6c2e74c205ce Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Tue, 30 May 2023 11:25:09 +0200 Subject: [PATCH 105/159] Add more exclamation marks --- backend/domain.yml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 54846bf..636d1fc 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1065,13 +1065,13 @@ responses: - text: "That's good to hear! I'm glad you're in a good mood." utter_mood_neutral_response: - - text: "Ah, so a pretty regular day, then. Okay." + - text: "Ah, so a pretty regular day, then. Okay!" utter_mood_bad_response: - - text: "I'm sorry to hear that. I hope our conversation might cheer you up a bit." + - text: "I'm sorry to hear that! I hope our conversation might cheer you up a bit." utter_mood_very_bad_response: - - text: "I'm sorry to hear that. Do talk to someone if you have problems you need help with. For now, I hope our conversation might cheer you up a little bit." + - text: "I'm sorry to hear that! Do talk to someone if you have problems you need help with. For now, I hope our conversation might cheer you up a little bit." utter_prompt_usage_1: - text: "Before we start, let me explain how you can communicate with me." @@ -1086,7 +1086,7 @@ responses: text: "Other times, you will need to do something on the left side of the screen. I will tell you when that is the case. Let me know when you are ready to continue by clicking the button." utter_button: - - text: "Nice. Seems like you're getting familiar with using the buttons." + - text: "Nice! Seems like you're getting familiar with using the buttons." utter_intro_1: - text: "Let me briefly reiterate what you previously read in the introduction part of this session." @@ -1149,7 +1149,7 @@ responses: text: "Let me know when you are ready to continue with setting a goal." utter_set_goal_1: - - text: "Great, let's carry on. A common way of measuring how much you walk is through counting the number of steps you take in a day." + - text: "Great, let's carry on! A common way of measuring how much you walk is through counting the number of steps you take in a day." utter_set_goal_2: - text: "And a common goal is to aim for 10000 steps per day, as this is beneficial for your health, especially if you are currently inactive." @@ -1161,7 +1161,7 @@ responses: text: "Once you are ready to continue, please click the button." utter_set_goal_3: - - text: "Okay, let's proceed. I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." + - text: "Okay, let's proceed! I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." utter_set_goal_4: - text: "However, you can also pick a higher goal if you want a challenge!" @@ -1197,7 +1197,7 @@ responses: utter_thank_for_times: - - text: "Thank you for letting me know when you are available." + - text: "Thank you for letting me know when you are available!" utter_energy_levels: - text: "Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time." @@ -1210,7 +1210,7 @@ responses: utter_thank_for_energy_levels: - - text: "Thank you for letting me know about your energy levels." + - text: "Thank you for letting me know about your energy levels!" utter_present_plan_1: - buttons: @@ -1225,13 +1225,13 @@ responses: text: "I'll leave the plan on the left side of the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail." utter_present_plan_3: - - text: "Okay, let's take a look at the plan. On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." + - text: "Okay, let's take a look at the plan! On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." utter_check_plan_first_walk: - text: "You can see the first two weeks planned in detail. To check that you understand what the plan signifies, let's do a quick pop quiz! When is the first time you have to take a walk? Please type your answer as day_time. For example, if your first walk is on Friday morning, please type 'friday_morning'." utter_check_plan_first_walk_correct: - - text: "That's right, your first walk is on {plan_check_first_walk}." + - text: "That's right, your first walk is on {plan_check_first_walk}!" utter_check_plan_first_walk_incorrect: - text: "Unfortunately, you are not right. Please, take another look at the plan. You can see the first two weeks planned in detail. Look for the first day with a time slot selected, then look at what time during that day you should take a walk. Please type your answer as day_time." @@ -1290,8 +1290,8 @@ responses: - text: "So your confidence is {confidence}." utter_thank_for_confidence: - - text: "I see. Thank you for telling me." - - text: "Okay. Good to know. Thank you." + - text: "I see. Thank you for telling me!" + - text: "Okay! Good to know. Thank you." - text: "Okay! Thanks for letting me know." - text: "Good to know. Thanks!" - text: "Got it. Thanks for letting me know!" @@ -1327,8 +1327,8 @@ responses: - text: "So your perceived usefulness is {perceived_usefulness}." utter_thank_for_perceived_usefulness: - - text: "I see. Thank you for telling me." - - text: "Okay. Good to know. Thank you." + - text: "I see. Thank you for telling me!" + - text: "Okay! Good to know. Thank you." - text: "Okay! Thanks for letting me know." - text: "Good to know. Thanks!" - text: "Got it. Thanks for letting me know!" @@ -1364,7 +1364,7 @@ responses: - text: "So your attitude is {attitude}." utter_thank_for_attitude: - - text: "That is good to know. Thank you." + - text: "That is good to know. Thank you!" - text: "Thanks for telling me!" utter_input_too_short_takeaway_1: @@ -1446,10 +1446,10 @@ responses: text: "Which of these do you think is the biggest barrier for you?" utter_identify_barriers_4: - - text: "I see. Thank you for informing me. Would you mind briefly describing your barrier to me in the chat?" + - text: "I see. Thank you for informing me! Would you mind briefly describing your barrier to me in the chat?" utter_identify_barriers_5: - - text: "Thank you for telling me." + - text: "Thank you for telling me!" # utter_identify_barriers_7: # - text: "Maybe you don't have shoes that are comfortable to take longer walks in." @@ -1466,7 +1466,7 @@ responses: utter_deal_with_barriers_1: - - text: "Thank you for telling me. \n We've previously thought of barriers which might prevent you from taking walks regularly." + - text: "Thank you for telling me! \n We've previously thought of barriers which might prevent you from taking walks regularly." utter_deal_with_barriers_2: - text: "Now, let's try to think of how you could overcome those barriers." @@ -1556,7 +1556,7 @@ responses: - text: "Okay, that's good!" utter_changes_to_plan_1: - - text: "I see. Thank you for informing me. \n I propose we take another look at the plan." + - text: "I see. Thank you for informing me! \n I propose we take another look at the plan." utter_changes_to_plan_intermediary: - text: "Maybe considering our discussion so far, you realised that you want to change some of the times when you have to go for walks. If you do not want to change anything, please just click the button titled 'I am done adjusting the plan'" From a5344ff7d150bb9bc2cc5310d03b57501d0404d6 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Tue, 30 May 2023 12:17:52 +0200 Subject: [PATCH 106/159] Change ' to " --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 636d1fc..b930902 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1011,7 +1011,7 @@ responses: - payload: /confirm_mood_very_good title: "Serene" - payload: /confirm_mood_very_good - title: 'Content' + title: "Content" - payload: /confirm_mood_very_good title: "Satisfied" - payload: /confirm_mood_very_good From 6279ff36f5151cba471590ee9fa5ae49e068446c Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 31 May 2023 11:49:34 +0200 Subject: [PATCH 107/159] Change formulation --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index b930902..b0bf8f3 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1386,7 +1386,7 @@ responses: - text: "It seems like your answer is a bit too short... Please type at least 3 words. The question was: How do you think planning can help you do this?" utter_explain_planning_1: - - text: "Thanks for telling me! \n I think it would be useful to look again at more ways in which planning can help you be more physically active by walking." + - text: "Thanks for telling me! \n I think it would be useful to look at ways in which planning can help you be more physically active by walking." utter_explain_planning_2: - buttons: From 9440ae882688b18a85c2c22dff5f46c18e34edf1 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 31 May 2023 12:26:22 +0200 Subject: [PATCH 108/159] Require 4 different days for the time slots --- backend/domain.yml | 2 +- frontend/static/js/script.js | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index b0bf8f3..36bf930 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1183,7 +1183,7 @@ responses: - text: "Let's move on to creating the plan. To do that, let's first see when you have free time." utter_routines_2: - - text: "Ideally, we're looking for at least four different times during the week when you have at least 30 minutes to take a walk." + - text: "Ideally, we're looking for at least four different days during the week when you have at least 30 minutes to take a walk." utter_timeslots_1: - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. By clicking that slot again, you indicate that you are not available." diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 3b163fa..336015c 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -743,6 +743,11 @@ function check_selected_timeslots(){ } } +function day_only(id){ + const day = id.split('_')[0]; + return day; +} + function check_selected_timeslots_initial(){ var button = document.getElementById("submit_timeslots_button"); @@ -759,20 +764,24 @@ function check_selected_timeslots_initial(){ ] - var count = 0; - - days.forEach(element_id => count+= check_inner_HTML(element_id)); - var selected_slots = []; days.forEach(element_id => selected_slots.push(slots_selected_initial(element_id))); + var selected_slots_day_only = []; + + days.forEach(function(element_id) { + if (!selected_slots_day_only.includes(day_only(element_id))) { + selected_slots_day_only.push(day_only(element_id)) + } + }); + var selected_slots = selected_slots.filter(function (el) { return el != ""; }); - if(count >= 4){ + if(len(selected_slots_day_only) >= 4){ button.style.display = "none"; table.style.display = "none"; @@ -792,7 +801,7 @@ function check_selected_timeslots_initial(){ } else{ - window.alert("Please select at least four time slots."); + window.alert("Please select at least four time slots and at least four different days."); } } From 0b488d86398eb3a5272ba7d0332272b58b47c145 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 31 May 2023 12:31:53 +0200 Subject: [PATCH 109/159] Change requirement --- frontend/static/js/script.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 336015c..6ad9aad 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -763,14 +763,15 @@ function check_selected_timeslots_initial(){ "sunday_morning_slot", "sunday_midday_slot", "sunday_afternoon_slot", "sunday_evening_slot" ] + var count = 0; var selected_slots = []; - days.forEach(element_id => selected_slots.push(slots_selected_initial(element_id))); - var selected_slots_day_only = []; days.forEach(function(element_id) { + count+= check_inner_HTML(element_id); + selected_slots.push(slots_selected_initial(element_id)); if (!selected_slots_day_only.includes(day_only(element_id))) { selected_slots_day_only.push(day_only(element_id)) } @@ -781,7 +782,7 @@ function check_selected_timeslots_initial(){ }); - if(len(selected_slots_day_only) >= 4){ + if(selected_slots_day_only.length >= 4 || selected_slots_day_only.length == 3 && count >=4){ button.style.display = "none"; table.style.display = "none"; From 2593efc90fa986647e260e076adae3631788a5aa Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 31 May 2023 12:36:12 +0200 Subject: [PATCH 110/159] fix logic --- frontend/static/js/script.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 6ad9aad..999bcd5 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -772,15 +772,17 @@ function check_selected_timeslots_initial(){ days.forEach(function(element_id) { count+= check_inner_HTML(element_id); selected_slots.push(slots_selected_initial(element_id)); - if (!selected_slots_day_only.includes(day_only(element_id))) { - selected_slots_day_only.push(day_only(element_id)) - } }); var selected_slots = selected_slots.filter(function (el) { return el != ""; }); + selected_slots.forEach(function(element_id) { + if (!selected_slots_day_only.includes(day_only(element_id))) { + selected_slots_day_only.push(day_only(element_id)) + } + }); if(selected_slots_day_only.length >= 4 || selected_slots_day_only.length == 3 && count >=4){ button.style.display = "none"; From 43b1585a823d3be3e9c4a640c6ba92cd98631a4c Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 31 May 2023 12:42:18 +0200 Subject: [PATCH 111/159] Change some of the moods --- backend/domain.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 36bf930..6ba5f23 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1012,11 +1012,11 @@ responses: title: "Serene" - payload: /confirm_mood_very_good title: "Content" - - payload: /confirm_mood_very_good + - payload: /confirm_mood_good title: "Satisfied" - - payload: /confirm_mood_very_good + - payload: /confirm_mood_good title: "Relaxed" - - payload: /confirm_mood_very_good + - payload: /confirm_mood_good title: "Calm" - payload: /confirm_mood_good title: "Excited" @@ -1032,19 +1032,19 @@ responses: title: "Tired" - payload: /confirm_mood_neutral title: "Tense" - - payload: /confirm_mood_neutral + - payload: /confirm_mood_bad title: "Alarmed" - - payload: /confirm_mood_neutral + - payload: /confirm_mood_bad title: "Afraid" - payload: /confirm_mood_bad title: "Droopy" - payload: /confirm_mood_bad title: "Bored" - - payload: /confirm_mood_bad + - payload: /confirm_mood_very_bad title: "Angry" - - payload: /confirm_mood_bad + - payload: /confirm_mood_very_bad title: "Annoyed" - - payload: /confirm_mood_bad + - payload: /confirm_mood_very_bad title: "Frustrated" - payload: /confirm_mood_very_bad title: "Distressed" From 591bf7f853d8019b27a570385f0b7c29b8804e04 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 31 May 2023 14:32:31 +0200 Subject: [PATCH 112/159] Change to balanced question --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 6ba5f23..edcd264 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1623,7 +1623,7 @@ responses: title: "9" - payload: /confirm_satisfaction{"satisfaction":"10"} title: "10 (I am very satisfied)" - text: "How satisfied were you with the dialogue?" + text: "How satisfied or dissatisfied were you with the dialogue?" utter_commitment_1: - buttons: From d505f4ed7a2967e2a8f3771c70a56779063f2878 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 31 May 2023 14:33:11 +0200 Subject: [PATCH 113/159] Change to balanced questions --- backend/domain.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index edcd264..565d255 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1649,7 +1649,7 @@ responses: title: "9" - payload: /confirm_commitment_1{"commitment_1":"10"} title: "10 (I strongly agree)" - text: "How much do you agree with the following statement: 'I am committing to being physically active by following the first two weeks of the plan, no matter what feels uncomfortable or challenging about that'?" + text: "How much do you agree or disagree with the following statement: 'I am committing to being physically active by following the first two weeks of the plan, no matter what feels uncomfortable or challenging about that'?" utter_commitment_f: - buttons: @@ -1675,7 +1675,7 @@ responses: title: "9" - payload: /confirm_commitment_f{"commitment_f":"10"} title: "10 (I strongly agree)" - text: "How much do you agree with the following statement: 'I am committing to being physically active by following the entire plan, no matter what feels uncomfortable or challenging about that'?" + text: "How much do you agree or disagree with the following statement: 'I am committing to being physically active by following the entire plan, no matter what feels uncomfortable or challenging about that'?" utter_confidence_goal: - buttons: @@ -1701,7 +1701,7 @@ responses: title: "9" - payload: /confirm_confidence_goal{"confidence_goal":"10"} title: "10 (I am sure that I can reach my goal)" - text: "How confident are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" + text: "How confident or unconfidence are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" utter_thank: - text: "Thank you for all your answers and for your time!" From a3ea09f02f371781ab8afbaf62f843363794d38c Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 7 Jun 2023 10:57:24 +0200 Subject: [PATCH 114/159] Change to 0-10 values --- backend/domain.yml | 364 ++++++++++++++++++++++++--------------------- 1 file changed, 191 insertions(+), 173 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 565d255..18fb757 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -20,10 +20,6 @@ intents: # usage - confirm_usage -# intro - -- confirm_intro - # goal - confirm_explain_goal @@ -112,8 +108,6 @@ intents: ## actions -- confirm_continue_dialogue - - do_explain_planning - do_identify_barriers - do_deal_with_barriers @@ -756,9 +750,17 @@ slots: type: categorical influence_conversation: false values: - - low - - medium - - high + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 mappings: - type: from_entity entity: confidence @@ -767,8 +769,17 @@ slots: type: categorical influence_conversation: false values: - - low - - high + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 mappings: - type: from_entity entity: perceived_usefulness @@ -777,8 +788,17 @@ slots: type: categorical influence_conversation: false values: - - low - - high + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 mappings: - type: from_entity entity: attitude @@ -998,86 +1018,41 @@ responses: utter_greet_2: - text: "I'm happy to meet you." + utter_confirm_mood: - buttons: - payload: /confirm_mood_very_good - title: "Happy" - - payload: /confirm_mood_very_good - title: "Glad" - - payload: /confirm_mood_very_good - title: "Pleased" - - payload: /confirm_mood_very_good - title: "Delighted" - - payload: /confirm_mood_very_good - title: "Serene" - - payload: /confirm_mood_very_good - title: "Content" - - payload: /confirm_mood_good - title: "Satisfied" - - payload: /confirm_mood_good - title: "Relaxed" - - payload: /confirm_mood_good - title: "Calm" + title: "I'm doing fantastic today!" - payload: /confirm_mood_good - title: "Excited" - - payload: /confirm_mood_good - title: "Astonished" - - payload: /confirm_mood_good - title: "Aroused" - - payload: /confirm_mood_neutral - title: "Sleepy" + title: "I'm doing good." - payload: /confirm_mood_neutral - title: "Neutral" - - payload: /confirm_mood_neutral - title: "Tired" - - payload: /confirm_mood_neutral - title: "Tense" - - payload: /confirm_mood_bad - title: "Alarmed" + title: "I'm alright." - payload: /confirm_mood_bad - title: "Afraid" - - payload: /confirm_mood_bad - title: "Droopy" - - payload: /confirm_mood_bad - title: "Bored" - - payload: /confirm_mood_very_bad - title: "Angry" - - payload: /confirm_mood_very_bad - title: "Annoyed" - - payload: /confirm_mood_very_bad - title: "Frustrated" + title: "Not so good…" - payload: /confirm_mood_very_bad - title: "Distressed" - - payload: /confirm_mood_very_bad - title: "Depressed" - - payload: /confirm_mood_very_bad - title: "Sad" - - payload: /confirm_mood_very_bad - title: "Gloomy" - - payload: /confirm_mood_very_bad - title: "Miserable" - text: "How are you doing today? Pick one of the options below to let me know how you feel." + title: "Quite bad…" + text: "How are you doing today?" utter_mood_very_good_response: - - text: "That's awesome! I'm glad you're in a great mood." + - text: "That's awesome!" utter_mood_good_response: - - text: "That's good to hear! I'm glad you're in a good mood." + - text: "That's good to hear!" utter_mood_neutral_response: - - text: "Ah, so a pretty regular day, then. Okay!" + - text: "Ah, so a pretty regular day, then. Okay." utter_mood_bad_response: - - text: "I'm sorry to hear that! I hope our conversation might cheer you up a bit." + - text: "I'm sorry to hear that. I hope our conversation might cheer you up a bit." utter_mood_very_bad_response: - - text: "I'm sorry to hear that! Do talk to someone if you have problems you need help with. For now, I hope our conversation might cheer you up a little bit." + - text: "I'm sorry to hear that. Do talk to someone if you have problems you need help with. For now, I hope our conversation might cheer you up a little bit." utter_prompt_usage_1: - text: "Before we start, let me explain how you can communicate with me." utter_prompt_usage_2: - - text: "You can simply click on one of the buttons like you already did. Sometimes, you will have to use the chat box below to type in your answer." + - text: "You can simply click on one of the buttons, like you already did. Sometimes, you will have to use the chat box bellow to type in your answer." utter_explain_usage: - buttons: @@ -1086,37 +1061,34 @@ responses: text: "Other times, you will need to do something on the left side of the screen. I will tell you when that is the case. Let me know when you are ready to continue by clicking the button." utter_button: - - text: "Nice! Seems like you're getting familiar with using the buttons." - - utter_intro_1: - - text: "Let me briefly reiterate what you previously read in the introduction part of this session." - - utter_intro_2: - - text: "My goal is to help people create plans for taking walks." - - utter_intro_3: - - text: "We'll set a goal for you to reach in 6 months from now, and then create a plan for doing so." - - utter_intro_4: - - buttons: - - payload: /confirm_intro - title: "Let's continue." - text: "Let me know when you are ready to continue." + - text: "Nice. Seems like you're getting familiar with using the buttons." utter_purpose_1: - - text: "Let me tell you a bit about myself. My goal is to help people create plans for taking walks." + - text: "Let me tell you a bit about myself. My goal is to help people create plans for taking walks during the week." utter_purpose_2: - - text: "Walking is generally regarded as beneficial for both health and mood, and it's also easily accessible for everyone, since it doesn't take a lot of time like a workout might, nor does it require special equipment." + - text: "Walking is generally regarded as beneficial for both health and mood." + + utter_purpose_3: + - text: "Another advantage of taking regular walks is that they are easily accessible for everyone." utter_continue_purpose_1: - buttons: - payload: /confirm_continue_purpose_1 title: "Let's continue." - text: "Let me know when you are done reading so we can continue." + text: "This means that it doesn't take a lot of time like a workout might, nor does it require special equipment. Let me know when you are done reading so we can continue." - utter_purpose_3: - - text: "Okay! For our plan, you'll have to walk at moderate intensity, which means you should be breathing more heavily than usual, while still being able to hold a short conversation." + utter_purpose_4: + - text: "Okay! Let me explain in a bit more detail the kinds of walks we will make a plan for." + + utter_purpose_5: + - text: "Unlike leisurely walks, you'll have to walk at moderate intensity for our plan to be effective." + + utter_purpose_6: + - text: "Moderate intensity is characterised by breathing more heavily than usual, while still being able to hold a short conversation." + + utter_purpose_7: + - text: "In other words, you should walk at a pace that makes it somewhat challenging for you to keep going, which is about 100 steps per minute for the average person." utter_confirm_purpose: - buttons: @@ -1125,10 +1097,16 @@ responses: text: "Once you are done reading, I will explain how this all ties together with the help of the plan." utter_explain_usefulness_planning_1: - - text: "Nice. So, how does planning help you make progress toward your goal?" + - text: "Nice. So, how does planning help you make progress towards your goal?" utter_explain_usefulness_planning_2: - - text: "If you have a clear indication of when you should go for a walk, you can integrate walking into your schedule such that you actually have time to do it." + - text: "If you have a clear indication of when you should go for a walk, it will be much easier for you to actually do it." + + utter_explain_usefulness_planning_3: + - text: "You'll have a clear schedule set in place, which will make it more difficult to avoid taking a walk or to postpone it." + + utter_explain_usefulness_planning_4: + - text: "After all, there is only so much time in a week, so, by making a plan, you integrate walking into your schedule such that you actually have time to do it." utter_explain_usefulness_planning_question: - buttons: @@ -1137,21 +1115,30 @@ responses: text: "Let me know when you are done reading and you want to continue." utter_explain_goal_1: - - text: "Alright, let's keep going. To create a plan for walking, we should first set a goal for you." + - text: "Okay! In order to create a plan for walking, we should first set a goal for you." utter_explain_goal_2: - - text: "Having a clear goal that is both challenging and achievable helps keep you motivated." + - text: "Having a clear goal to work towards is helpful in keeping you motivated." + + utter_explain_goal_3: + - text: "However, for the goal to be most effective, you should pick a goal is both challenging and achievable." + + utter_explain_goal_4: + - text: "You should feel like you have to put in the effort to reach your goal, while avoiding aiming for something unrealistic." utter_explain_goal_question: - buttons: - payload: /confirm_explain_goal title: "Let's move on." - text: "Let me know when you are ready to continue with setting a goal." + text: "Let me know when you are ready to continue." utter_set_goal_1: - - text: "Great, let's carry on! A common way of measuring how much you walk is through counting the number of steps you take in a day." + - text: "I think we are ready for you to set a goal for walking." utter_set_goal_2: + - text: "A common way of measuring how much you walk is through counting the number of steps you take in a day." + + utter_set_goal_3: - text: "And a common goal is to aim for 10000 steps per day, as this is beneficial for your health, especially if you are currently inactive." utter_set_goal_continue: @@ -1160,10 +1147,10 @@ responses: title: "I am ready." text: "Once you are ready to continue, please click the button." - utter_set_goal_3: - - text: "Okay, let's proceed! I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." - utter_set_goal_4: + - text: "Okay. I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." + + utter_set_goal_5: - text: "However, you can also pick a higher goal if you want a challenge!" utter_set_goal: @@ -1177,19 +1164,51 @@ responses: text: "Please pick one of these options as your goal." utter_confirm_goal: - - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day." + - buttons: + - payload: /confirm_initial_plan + title: "I am prepared." + text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day. Now, tell me when you are ready to continue." + + + utter_internal_motivation_1: + - text: "Okay! An important part of achieving your goal is being motivated." + + utter_internal_motivation_2: + - text: "So, I am curious: what motivates you to want to walk regularly?" + + utter_internal_motivation_question: + - buttons: + - payload: /confirm_motivation + title: "Family." + - payload: /confirm_motivation + title: "Health." + - payload: /confirm_motivation + title: "Relationships." + - payload: /confirm_motivation + title: "Personal growth." + - payload: /confirm_motivation + title: "Work." + - payload: /confirm_motivation + title: "Friends." + text: "Please pick one of the options below:" + + utter_thank_for_motivation: + - text: "I see, thank you for letting me know!" utter_routines_1: - - text: "Let's move on to creating the plan. To do that, let's first see when you have free time." + - text: "Alright, let's move on to creating the plan. In order to do that, let's first see when you have free time." utter_routines_2: - - text: "Ideally, we're looking for at least four different days during the week when you have at least 30 minutes to take a walk." + - text: "You don't have to provide me with your exact daily schedule, but let me know if you have any routines in place." + + utter_routines_3: + - text: "For example, most people work a day job. But maybe you have things planned on some evenings as well." - utter_timeslots_1: - - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. By clicking that slot again, you indicate that you are not available." + utter_routines_4: + - text: "Ideally, we're looking for at least four different times during the week when you have at least 30 minutes to take a walk." - utter_timeslots_2: - - text: "Please select all the slots when you are available. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You may need to scroll to see this button." + utter_timeslots: + - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. Please select all the slots when you are avaialable." utter_confirm_sunday_slots: @@ -1197,44 +1216,44 @@ responses: utter_thank_for_times: - - text: "Thank you for letting me know when you are available!" + - text: "Thank you for letting me know when you are available." utter_energy_levels: - text: "Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time." utter_energy_instruction: - - text: "Like before, I would like you to pay attention to the left side of the screen. Please specify how much energy you have during the weekdays and during the weekends by clicking the corresponding box for each time of the day. Note again that you may need to scroll to see the button which confirms that you are done." + - text: "Like before, I would like you to pay attention to the left side of the sceen. Please specify how much energy you have during the weekdays and during the weekends by clicking the corresponding box for each time of the day." utter_energy_levels_weekends_confirm: - text: "So those are your energy levels on weekends:\n Morning: {weekends_morning}, Midday: {weekends_midday}, Afternoon: {weekends_afternoon}, Evening: {weekends_evening}." utter_thank_for_energy_levels: - - text: "Thank you for letting me know about your energy levels!" + - text: "Thank you for letting me know when you have more energy than usual." utter_present_plan_1: - buttons: - payload: /confirm_ready_initial_plan title: "Show me the plan." - text: "Now, let's see the initial plan! It is based on the times when you are free and the energy levels you specified, but don't worry if it's not entirely to your liking yet. You'll have opportunities to modify it later. Please let me know when you are ready to continue." + text: "Now, let's see initial plan! Don't worry if it's not entirely to you liking yet. You'll have opportunities to modify it later. Please let me know when you are ready to continue." utter_present_plan_2: - buttons: - payload: /confirm_checked_plan{"changes_to_plan":"0"} title: "Let's discuss the plan." - text: "I'll leave the plan on the left side of the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail." + text: "I'll leave the plan on the left side on the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail. " utter_present_plan_3: - - text: "Okay, let's take a look at the plan! On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." + - text: "Okay, let's take a took at the plan. On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." utter_check_plan_first_walk: - text: "You can see the first two weeks planned in detail. To check that you understand what the plan signifies, let's do a quick pop quiz! When is the first time you have to take a walk? Please type your answer as day_time. For example, if your first walk is on Friday morning, please type 'friday_morning'." utter_check_plan_first_walk_correct: - - text: "That's right, your first walk is on {plan_check_first_walk}!" + - text: "That's right, your first walk is on {plan_check_first_walk}." utter_check_plan_first_walk_incorrect: - - text: "Unfortunately, you are not right. Please, take another look at the plan. You can see the first two weeks planned in detail. Look for the first day with a time slot selected, then look at what time during that day you should take a walk. Please type your answer as day_time." + - text: "Unfortunately, you are not right. Please, take another look at the plan. You can see the first two weeks planned in detail. Look for the first day with a time slot selected, then look at what time in that day you should take a walk. Please type your answer as day_time." utter_explain_weeks: - buttons: @@ -1243,7 +1262,7 @@ responses: text: "Moving on, you can also see the third and fourth weeks, but only in terms of how many hours you have to walk and how often. For the two months after that, you see only how much you will have to do in the last week of that month, to give you an idea of the effort that you are building up towards. Let me know when you are done reading." utter_check_plan_week_3: - - text: "Let's do an extra check to make sure everything is clear. How much time will you have to walk in your third week? Please type your answer as a number with one decimal point. For example, if your answer is 1 and a half hours, please type '1.5'" + - text: "Let's do an extra check to make sure everything is clear. How much time will you have to walk on your third week? Please type your answer as a number with one decimal point. For example, if your answer is 1 and a half hours, please type '1.5'" utter_check_plan_week_3_correct: - text: "Correct! In your third week, you will have to walk for {plan_check_week_3} hours." @@ -1262,27 +1281,27 @@ responses: utter_state_confidence: - buttons: - - payload: /confirm_confidence{"confidence":"low"} + - payload: /confirm_confidence{"confidence":"0"} title: "0 (Not confident at all)" - - payload: /confirm_confidence{"confidence":"low"} + - payload: /confirm_confidence{"confidence":"1"} title: "1" - - payload: /confirm_confidence{"confidence":"low"} + - payload: /confirm_confidence{"confidence":"2"} title: "2" - - payload: /confirm_confidence{"confidence":"low"} + - payload: /confirm_confidence{"confidence":"3"} title: "3" - - payload: /confirm_confidence{"confidence":"medium"} + - payload: /confirm_confidence{"confidence":"4"} title: "4" - - payload: /confirm_confidence{"confidence":"medium"} + - payload: /confirm_confidence{"confidence":"5"} title: "5" - - payload: /confirm_confidence{"confidence":"medium"} + - payload: /confirm_confidence{"confidence":"6"} title: "6" - - payload: /confirm_confidence{"confidence":"high"} + - payload: /confirm_confidence{"confidence":"7"} title: "7" - - payload: /confirm_confidence{"confidence":"high"} + - payload: /confirm_confidence{"confidence":"8"} title: "8" - - payload: /confirm_confidence{"confidence":"high"} + - payload: /confirm_confidence{"confidence":"9"} title: "9" - - payload: /confirm_confidence{"confidence":"high"} + - payload: /confirm_confidence{"confidence":"10"} title: "10 (Very confident)" text: "How confident are you that you can follow the plan?" @@ -1290,8 +1309,8 @@ responses: - text: "So your confidence is {confidence}." utter_thank_for_confidence: - - text: "I see. Thank you for telling me!" - - text: "Okay! Good to know. Thank you." + - text: "I see. Thank you for telling me." + - text: "Okay. Good to know. Thank you." - text: "Okay! Thanks for letting me know." - text: "Good to know. Thanks!" - text: "Got it. Thanks for letting me know!" @@ -1299,36 +1318,36 @@ responses: utter_state_perceived_usefulness: - buttons: - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"low"} - title: "0 (I think it can hinder me very much)" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"low"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"0"} + title: "0 (I don't think it can help me)" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"1"} title: "1" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"low"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"2"} title: "2" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"low"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"3"} title: "3" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"low"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"4"} title: "4" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"high"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"5"} title: "5" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"high"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"6"} title: "6" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"high"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"7"} title: "7" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"high"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"8"} title: "8" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"high"} + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"9"} title: "9" - - payload: /confirm_perceived_usefulness{"perceived_usefulness":"high"} - title: "10 (I think it can help me very much)" - text: "To what extent do you think planning can help or hinder you in terms of taking walks?" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"10"} + title: "10 (I think it can help me)" + text: "To what extent do you think planning can help you take walks?" utter_perceived_usefulness_repeat: - text: "So your perceived usefulness is {perceived_usefulness}." utter_thank_for_perceived_usefulness: - - text: "I see. Thank you for telling me!" - - text: "Okay! Good to know. Thank you." + - text: "I see. Thank you for telling me." + - text: "Okay. Good to know. Thank you." - text: "Okay! Thanks for letting me know." - text: "Good to know. Thanks!" - text: "Got it. Thanks for letting me know!" @@ -1336,35 +1355,35 @@ responses: utter_state_attitude: - buttons: - - payload: /confirm_attitude{"attitude":"low"} - title: "0 (Bad)" - - payload: /confirm_attitude{"attitude":"low"} + - payload: /confirm_attitude{"attitude":"0"} + title: "0 (Very useless)" + - payload: /confirm_attitude{"attitude":"1"} title: "1" - - payload: /confirm_attitude{"attitude":"low"} + - payload: /confirm_attitude{"attitude":"2"} title: "2" - - payload: /confirm_attitude{"attitude":"low"} + - payload: /confirm_attitude{"attitude":"3"} title: "3" - - payload: /confirm_attitude{"attitude":"low"} + - payload: /confirm_attitude{"attitude":"4"} title: "4" - - payload: /confirm_attitude{"attitude":"high"} + - payload: /confirm_attitude{"attitude":"5"} title: "5" - - payload: /confirm_attitude{"attitude":"high"} + - payload: /confirm_attitude{"attitude":"6"} title: "6" - - payload: /confirm_attitude{"attitude":"high"} + - payload: /confirm_attitude{"attitude":"7"} title: "7" - - payload: /confirm_attitude{"attitude":"high"} + - payload: /confirm_attitude{"attitude":"8"} title: "8" - - payload: /confirm_attitude{"attitude":"high"} + - payload: /confirm_attitude{"attitude":"9"} title: "9" - - payload: /confirm_attitude{"attitude":"high"} - title: "10 (Good)" - text: "Please complete the following statement: 'Making plans for taking walks is ...'" + - payload: /confirm_attitude{"attitude":"10"} + title: "10 (Very useful)" + text: "Please complete the following statement: 'For me, planning walks for the next 3 months would be ...'" utter_attitude_repeat: - text: "So your attitude is {attitude}." utter_thank_for_attitude: - - text: "That is good to know. Thank you!" + - text: "That is good to know. Thank you." - text: "Thanks for telling me!" utter_input_too_short_takeaway_1: @@ -1386,7 +1405,7 @@ responses: - text: "It seems like your answer is a bit too short... Please type at least 3 words. The question was: How do you think planning can help you do this?" utter_explain_planning_1: - - text: "Thanks for telling me! \n I think it would be useful to look at ways in which planning can help you be more physically active by walking." + - text: "Thanks for telling me! \n I think it would be useful to look again at more ways in which planning can help you be more physically active by walking." utter_explain_planning_2: - buttons: @@ -1446,10 +1465,10 @@ responses: text: "Which of these do you think is the biggest barrier for you?" utter_identify_barriers_4: - - text: "I see. Thank you for informing me! Would you mind briefly describing your barrier to me in the chat?" + - text: "I see. Thank you for informing me. Would you mind briefly describing your barrier to me in the chat?" utter_identify_barriers_5: - - text: "Thank you for telling me!" + - text: "Thank you for telling me. I'll try to think a way to overcome your barrier. In the meantime..." # utter_identify_barriers_7: # - text: "Maybe you don't have shoes that are comfortable to take longer walks in." @@ -1466,10 +1485,10 @@ responses: utter_deal_with_barriers_1: - - text: "Thank you for telling me! \n We've previously thought of barriers which might prevent you from taking walks regularly." + - text: "Thank you for telling me. \n We've previously thought of barriers which might prevent you from taking walks regularly." utter_deal_with_barriers_2: - - text: "Now, let's try to think of how you could overcome those barriers." + - text: "Now, let's try to think how you could overcome those barriers." utter_deal_with_barriers_3: - text: "Keep in mind that, while I can provide suggestions, it's really up to you to come up with the solution that works best for you." @@ -1556,7 +1575,7 @@ responses: - text: "Okay, that's good!" utter_changes_to_plan_1: - - text: "I see. Thank you for informing me! \n I propose we take another look at the plan." + - text: "I see. Thank you for informing me. \n I propose we take another look at the plan." utter_changes_to_plan_intermediary: - text: "Maybe considering our discussion so far, you realised that you want to change some of the times when you have to go for walks. If you do not want to change anything, please just click the button titled 'I am done adjusting the plan'" @@ -1623,7 +1642,7 @@ responses: title: "9" - payload: /confirm_satisfaction{"satisfaction":"10"} title: "10 (I am very satisfied)" - text: "How satisfied or dissatisfied were you with the dialogue?" + text: "How satisfied were you with the dialogue?" utter_commitment_1: - buttons: @@ -1649,7 +1668,7 @@ responses: title: "9" - payload: /confirm_commitment_1{"commitment_1":"10"} title: "10 (I strongly agree)" - text: "How much do you agree or disagree with the following statement: 'I am committing to being physically active by following the first two weeks of the plan, no matter what feels uncomfortable or challenging about that'?" + text: "How much do you agree with the following statement: 'I am committing to being physically active by following the first two weeks of the plan, no matter what feels uncomfortable or challenging about that'?" utter_commitment_f: - buttons: @@ -1675,12 +1694,12 @@ responses: title: "9" - payload: /confirm_commitment_f{"commitment_f":"10"} title: "10 (I strongly agree)" - text: "How much do you agree or disagree with the following statement: 'I am committing to being physically active by following the entire plan, no matter what feels uncomfortable or challenging about that'?" + text: "How much do you agree with the following statement: 'I am committing to being physically active by following the entire plan, no mater what feels uncomfortable or challenging about that'?" utter_confidence_goal: - buttons: - payload: /confirm_confidence_goal{"confidence_goal":"0"} - title: "0 (I am not confident at all that I can reach my goal)" + title: "0 (I am not confident at that I can reach my goal)" - payload: /confirm_confidence_goal{"confidence_goal":"1"} title: "1" - payload: /confirm_confidence_goal{"confidence_goal":"2"} @@ -1701,7 +1720,7 @@ responses: title: "9" - payload: /confirm_confidence_goal{"confidence_goal":"10"} title: "10 (I am sure that I can reach my goal)" - text: "How confident or unconfidence are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" + text: "How confident are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" utter_thank: - text: "Thank you for all your answers and for your time!" @@ -1763,4 +1782,3 @@ actions: - action_save_action - action_save_goal_plans_and_reward - action_rearrange_db -- action_check_dialogue_done From b4d0ded4771e9720b9ec97508dfb888be2aa846a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 7 Jun 2023 10:58:00 +0200 Subject: [PATCH 115/159] Fix end dialogue logic --- actions/actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/actions.py b/actions/actions.py index dbdeab2..de0b7ad 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -528,7 +528,7 @@ async def run(self, dispatcher: CollectingDispatcher, a = tracker.get_slot("attitude") - if c == "high" and pu == "high" and a == "high": + if c >= 8 and pu >= 8 and a >= 8: end = True From e394e5a40758433dbc2922e00f8a7ab04ccebe47 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 7 Jun 2023 11:02:08 +0200 Subject: [PATCH 116/159] FIx domain file --- backend/domain.yml | 246 +++++++++++++++++++++++---------------------- 1 file changed, 127 insertions(+), 119 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 18fb757..371945f 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -20,6 +20,10 @@ intents: # usage - confirm_usage +# intro + +- confirm_intro + # goal - confirm_explain_goal @@ -108,6 +112,8 @@ intents: ## actions +- confirm_continue_dialogue + - do_explain_planning - do_identify_barriers - do_deal_with_barriers @@ -1018,41 +1024,86 @@ responses: utter_greet_2: - text: "I'm happy to meet you." - utter_confirm_mood: - buttons: - payload: /confirm_mood_very_good - title: "I'm doing fantastic today!" + title: "Happy" + - payload: /confirm_mood_very_good + title: "Glad" + - payload: /confirm_mood_very_good + title: "Pleased" + - payload: /confirm_mood_very_good + title: "Delighted" + - payload: /confirm_mood_very_good + title: "Serene" + - payload: /confirm_mood_very_good + title: "Content" + - payload: /confirm_mood_good + title: "Satisfied" + - payload: /confirm_mood_good + title: "Relaxed" + - payload: /confirm_mood_good + title: "Calm" + - payload: /confirm_mood_good + title: "Excited" + - payload: /confirm_mood_good + title: "Astonished" - payload: /confirm_mood_good - title: "I'm doing good." + title: "Aroused" - payload: /confirm_mood_neutral - title: "I'm alright." + title: "Sleepy" + - payload: /confirm_mood_neutral + title: "Neutral" + - payload: /confirm_mood_neutral + title: "Tired" + - payload: /confirm_mood_neutral + title: "Tense" + - payload: /confirm_mood_bad + title: "Alarmed" - payload: /confirm_mood_bad - title: "Not so good…" + title: "Afraid" + - payload: /confirm_mood_bad + title: "Droopy" + - payload: /confirm_mood_bad + title: "Bored" + - payload: /confirm_mood_very_bad + title: "Angry" - payload: /confirm_mood_very_bad - title: "Quite bad…" - text: "How are you doing today?" + title: "Annoyed" + - payload: /confirm_mood_very_bad + title: "Frustrated" + - payload: /confirm_mood_very_bad + title: "Distressed" + - payload: /confirm_mood_very_bad + title: "Depressed" + - payload: /confirm_mood_very_bad + title: "Sad" + - payload: /confirm_mood_very_bad + title: "Gloomy" + - payload: /confirm_mood_very_bad + title: "Miserable" + text: "How are you doing today? Pick one of the options below to let me know how you feel." utter_mood_very_good_response: - - text: "That's awesome!" + - text: "That's awesome! I'm glad you're in a great mood." utter_mood_good_response: - - text: "That's good to hear!" + - text: "That's good to hear! I'm glad you're in a good mood." utter_mood_neutral_response: - - text: "Ah, so a pretty regular day, then. Okay." + - text: "Ah, so a pretty regular day, then. Okay!" utter_mood_bad_response: - - text: "I'm sorry to hear that. I hope our conversation might cheer you up a bit." + - text: "I'm sorry to hear that! I hope our conversation might cheer you up a bit." utter_mood_very_bad_response: - - text: "I'm sorry to hear that. Do talk to someone if you have problems you need help with. For now, I hope our conversation might cheer you up a little bit." + - text: "I'm sorry to hear that! Do talk to someone if you have problems you need help with. For now, I hope our conversation might cheer you up a little bit." utter_prompt_usage_1: - text: "Before we start, let me explain how you can communicate with me." utter_prompt_usage_2: - - text: "You can simply click on one of the buttons, like you already did. Sometimes, you will have to use the chat box bellow to type in your answer." + - text: "You can simply click on one of the buttons like you already did. Sometimes, you will have to use the chat box below to type in your answer." utter_explain_usage: - buttons: @@ -1061,34 +1112,37 @@ responses: text: "Other times, you will need to do something on the left side of the screen. I will tell you when that is the case. Let me know when you are ready to continue by clicking the button." utter_button: - - text: "Nice. Seems like you're getting familiar with using the buttons." + - text: "Nice! Seems like you're getting familiar with using the buttons." + + utter_intro_1: + - text: "Let me briefly reiterate what you previously read in the introduction part of this session." + + utter_intro_2: + - text: "My goal is to help people create plans for taking walks." + + utter_intro_3: + - text: "We'll set a goal for you to reach in 6 months from now, and then create a plan for doing so." + + utter_intro_4: + - buttons: + - payload: /confirm_intro + title: "Let's continue." + text: "Let me know when you are ready to continue." utter_purpose_1: - - text: "Let me tell you a bit about myself. My goal is to help people create plans for taking walks during the week." + - text: "Let me tell you a bit about myself. My goal is to help people create plans for taking walks." utter_purpose_2: - - text: "Walking is generally regarded as beneficial for both health and mood." - - utter_purpose_3: - - text: "Another advantage of taking regular walks is that they are easily accessible for everyone." + - text: "Walking is generally regarded as beneficial for both health and mood, and it's also easily accessible for everyone, since it doesn't take a lot of time like a workout might, nor does it require special equipment." utter_continue_purpose_1: - buttons: - payload: /confirm_continue_purpose_1 title: "Let's continue." - text: "This means that it doesn't take a lot of time like a workout might, nor does it require special equipment. Let me know when you are done reading so we can continue." - - utter_purpose_4: - - text: "Okay! Let me explain in a bit more detail the kinds of walks we will make a plan for." + text: "Let me know when you are done reading so we can continue." - utter_purpose_5: - - text: "Unlike leisurely walks, you'll have to walk at moderate intensity for our plan to be effective." - - utter_purpose_6: - - text: "Moderate intensity is characterised by breathing more heavily than usual, while still being able to hold a short conversation." - - utter_purpose_7: - - text: "In other words, you should walk at a pace that makes it somewhat challenging for you to keep going, which is about 100 steps per minute for the average person." + utter_purpose_3: + - text: "Okay! For our plan, you'll have to walk at moderate intensity, which means you should be breathing more heavily than usual, while still being able to hold a short conversation." utter_confirm_purpose: - buttons: @@ -1097,16 +1151,10 @@ responses: text: "Once you are done reading, I will explain how this all ties together with the help of the plan." utter_explain_usefulness_planning_1: - - text: "Nice. So, how does planning help you make progress towards your goal?" + - text: "Nice. So, how does planning help you make progress toward your goal?" utter_explain_usefulness_planning_2: - - text: "If you have a clear indication of when you should go for a walk, it will be much easier for you to actually do it." - - utter_explain_usefulness_planning_3: - - text: "You'll have a clear schedule set in place, which will make it more difficult to avoid taking a walk or to postpone it." - - utter_explain_usefulness_planning_4: - - text: "After all, there is only so much time in a week, so, by making a plan, you integrate walking into your schedule such that you actually have time to do it." + - text: "If you have a clear indication of when you should go for a walk, you can integrate walking into your schedule such that you actually have time to do it." utter_explain_usefulness_planning_question: - buttons: @@ -1115,30 +1163,21 @@ responses: text: "Let me know when you are done reading and you want to continue." utter_explain_goal_1: - - text: "Okay! In order to create a plan for walking, we should first set a goal for you." + - text: "Alright, let's keep going. To create a plan for walking, we should first set a goal for you." utter_explain_goal_2: - - text: "Having a clear goal to work towards is helpful in keeping you motivated." - - utter_explain_goal_3: - - text: "However, for the goal to be most effective, you should pick a goal is both challenging and achievable." - - utter_explain_goal_4: - - text: "You should feel like you have to put in the effort to reach your goal, while avoiding aiming for something unrealistic." + - text: "Having a clear goal that is both challenging and achievable helps keep you motivated." utter_explain_goal_question: - buttons: - payload: /confirm_explain_goal title: "Let's move on." - text: "Let me know when you are ready to continue." + text: "Let me know when you are ready to continue with setting a goal." utter_set_goal_1: - - text: "I think we are ready for you to set a goal for walking." + - text: "Great, let's carry on! A common way of measuring how much you walk is through counting the number of steps you take in a day." utter_set_goal_2: - - text: "A common way of measuring how much you walk is through counting the number of steps you take in a day." - - utter_set_goal_3: - text: "And a common goal is to aim for 10000 steps per day, as this is beneficial for your health, especially if you are currently inactive." utter_set_goal_continue: @@ -1147,10 +1186,10 @@ responses: title: "I am ready." text: "Once you are ready to continue, please click the button." - utter_set_goal_4: - - text: "Okay. I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." + utter_set_goal_3: + - text: "Okay, let's proceed! I assume you take at least about 2000 steps per day through your regular activities, so one of your options is to increase that amount by 8000 steps to reach a total of 10000 steps per day." - utter_set_goal_5: + utter_set_goal_4: - text: "However, you can also pick a higher goal if you want a challenge!" utter_set_goal: @@ -1164,51 +1203,19 @@ responses: text: "Please pick one of these options as your goal." utter_confirm_goal: - - buttons: - - payload: /confirm_initial_plan - title: "I am prepared." - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day. Now, tell me when you are ready to continue." - - - utter_internal_motivation_1: - - text: "Okay! An important part of achieving your goal is being motivated." - - utter_internal_motivation_2: - - text: "So, I am curious: what motivates you to want to walk regularly?" - - utter_internal_motivation_question: - - buttons: - - payload: /confirm_motivation - title: "Family." - - payload: /confirm_motivation - title: "Health." - - payload: /confirm_motivation - title: "Relationships." - - payload: /confirm_motivation - title: "Personal growth." - - payload: /confirm_motivation - title: "Work." - - payload: /confirm_motivation - title: "Friends." - text: "Please pick one of the options below:" - - utter_thank_for_motivation: - - text: "I see, thank you for letting me know!" + - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day." utter_routines_1: - - text: "Alright, let's move on to creating the plan. In order to do that, let's first see when you have free time." + - text: "Let's move on to creating the plan. To do that, let's first see when you have free time." utter_routines_2: - - text: "You don't have to provide me with your exact daily schedule, but let me know if you have any routines in place." - - utter_routines_3: - - text: "For example, most people work a day job. But maybe you have things planned on some evenings as well." + - text: "Ideally, we're looking for at least four different days during the week when you have at least 30 minutes to take a walk." - utter_routines_4: - - text: "Ideally, we're looking for at least four different times during the week when you have at least 30 minutes to take a walk." + utter_timeslots_1: + - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. By clicking that slot again, you indicate that you are not available." - utter_timeslots: - - text: "On the left side of the screen, you can see a table. You can click on a time slot in the table to specify that you are available at that time. Please select all the slots when you are avaialable." + utter_timeslots_2: + - text: "Please select all the slots when you are available. Once you are done, click the button that says 'I'm done selecting time slots when I am free.' You may need to scroll to see this button." utter_confirm_sunday_slots: @@ -1216,44 +1223,44 @@ responses: utter_thank_for_times: - - text: "Thank you for letting me know when you are available." + - text: "Thank you for letting me know when you are available!" utter_energy_levels: - text: "Now, I want to ask when you have more energy than usual. We could make use of this opportunity to schedule a walk if you are also free at the time." utter_energy_instruction: - - text: "Like before, I would like you to pay attention to the left side of the sceen. Please specify how much energy you have during the weekdays and during the weekends by clicking the corresponding box for each time of the day." + - text: "Like before, I would like you to pay attention to the left side of the screen. Please specify how much energy you have during the weekdays and during the weekends by clicking the corresponding box for each time of the day. Note again that you may need to scroll to see the button which confirms that you are done." utter_energy_levels_weekends_confirm: - text: "So those are your energy levels on weekends:\n Morning: {weekends_morning}, Midday: {weekends_midday}, Afternoon: {weekends_afternoon}, Evening: {weekends_evening}." utter_thank_for_energy_levels: - - text: "Thank you for letting me know when you have more energy than usual." + - text: "Thank you for letting me know about your energy levels!" utter_present_plan_1: - buttons: - payload: /confirm_ready_initial_plan title: "Show me the plan." - text: "Now, let's see initial plan! Don't worry if it's not entirely to you liking yet. You'll have opportunities to modify it later. Please let me know when you are ready to continue." + text: "Now, let's see the initial plan! It is based on the times when you are free and the energy levels you specified, but don't worry if it's not entirely to your liking yet. You'll have opportunities to modify it later. Please let me know when you are ready to continue." utter_present_plan_2: - buttons: - payload: /confirm_checked_plan{"changes_to_plan":"0"} title: "Let's discuss the plan." - text: "I'll leave the plan on the left side on the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail. " + text: "I'll leave the plan on the left side of the screen so you can take a look at it later. Note that you may need to scroll to see the entire plan, depending on your screen resolution. Let me know when you are prepared to discuss the plan in more detail." utter_present_plan_3: - - text: "Okay, let's take a took at the plan. On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." + - text: "Okay, let's take a look at the plan! On the left side of your screen, you should see a big table with a view similar to that of a calendar. Time slots when you should take walks are marked with the duration you should walk for. You can also notice that the duration increases each week." utter_check_plan_first_walk: - text: "You can see the first two weeks planned in detail. To check that you understand what the plan signifies, let's do a quick pop quiz! When is the first time you have to take a walk? Please type your answer as day_time. For example, if your first walk is on Friday morning, please type 'friday_morning'." utter_check_plan_first_walk_correct: - - text: "That's right, your first walk is on {plan_check_first_walk}." + - text: "That's right, your first walk is on {plan_check_first_walk}!" utter_check_plan_first_walk_incorrect: - - text: "Unfortunately, you are not right. Please, take another look at the plan. You can see the first two weeks planned in detail. Look for the first day with a time slot selected, then look at what time in that day you should take a walk. Please type your answer as day_time." + - text: "Unfortunately, you are not right. Please, take another look at the plan. You can see the first two weeks planned in detail. Look for the first day with a time slot selected, then look at what time during that day you should take a walk. Please type your answer as day_time." utter_explain_weeks: - buttons: @@ -1262,7 +1269,7 @@ responses: text: "Moving on, you can also see the third and fourth weeks, but only in terms of how many hours you have to walk and how often. For the two months after that, you see only how much you will have to do in the last week of that month, to give you an idea of the effort that you are building up towards. Let me know when you are done reading." utter_check_plan_week_3: - - text: "Let's do an extra check to make sure everything is clear. How much time will you have to walk on your third week? Please type your answer as a number with one decimal point. For example, if your answer is 1 and a half hours, please type '1.5'" + - text: "Let's do an extra check to make sure everything is clear. How much time will you have to walk in your third week? Please type your answer as a number with one decimal point. For example, if your answer is 1 and a half hours, please type '1.5'" utter_check_plan_week_3_correct: - text: "Correct! In your third week, you will have to walk for {plan_check_week_3} hours." @@ -1309,8 +1316,8 @@ responses: - text: "So your confidence is {confidence}." utter_thank_for_confidence: - - text: "I see. Thank you for telling me." - - text: "Okay. Good to know. Thank you." + - text: "I see. Thank you for telling me!" + - text: "Okay! Good to know. Thank you." - text: "Okay! Thanks for letting me know." - text: "Good to know. Thanks!" - text: "Got it. Thanks for letting me know!" @@ -1346,8 +1353,8 @@ responses: - text: "So your perceived usefulness is {perceived_usefulness}." utter_thank_for_perceived_usefulness: - - text: "I see. Thank you for telling me." - - text: "Okay. Good to know. Thank you." + - text: "I see. Thank you for telling me!" + - text: "Okay! Good to know. Thank you." - text: "Okay! Thanks for letting me know." - text: "Good to know. Thanks!" - text: "Got it. Thanks for letting me know!" @@ -1383,7 +1390,7 @@ responses: - text: "So your attitude is {attitude}." utter_thank_for_attitude: - - text: "That is good to know. Thank you." + - text: "That is good to know. Thank you!" - text: "Thanks for telling me!" utter_input_too_short_takeaway_1: @@ -1405,7 +1412,7 @@ responses: - text: "It seems like your answer is a bit too short... Please type at least 3 words. The question was: How do you think planning can help you do this?" utter_explain_planning_1: - - text: "Thanks for telling me! \n I think it would be useful to look again at more ways in which planning can help you be more physically active by walking." + - text: "Thanks for telling me! \n I think it would be useful to look at ways in which planning can help you be more physically active by walking." utter_explain_planning_2: - buttons: @@ -1465,10 +1472,10 @@ responses: text: "Which of these do you think is the biggest barrier for you?" utter_identify_barriers_4: - - text: "I see. Thank you for informing me. Would you mind briefly describing your barrier to me in the chat?" + - text: "I see. Thank you for informing me! Would you mind briefly describing your barrier to me in the chat?" utter_identify_barriers_5: - - text: "Thank you for telling me. I'll try to think a way to overcome your barrier. In the meantime..." + - text: "Thank you for telling me!" # utter_identify_barriers_7: # - text: "Maybe you don't have shoes that are comfortable to take longer walks in." @@ -1485,10 +1492,10 @@ responses: utter_deal_with_barriers_1: - - text: "Thank you for telling me. \n We've previously thought of barriers which might prevent you from taking walks regularly." + - text: "Thank you for telling me! \n We've previously thought of barriers which might prevent you from taking walks regularly." utter_deal_with_barriers_2: - - text: "Now, let's try to think how you could overcome those barriers." + - text: "Now, let's try to think of how you could overcome those barriers." utter_deal_with_barriers_3: - text: "Keep in mind that, while I can provide suggestions, it's really up to you to come up with the solution that works best for you." @@ -1575,7 +1582,7 @@ responses: - text: "Okay, that's good!" utter_changes_to_plan_1: - - text: "I see. Thank you for informing me. \n I propose we take another look at the plan." + - text: "I see. Thank you for informing me! \n I propose we take another look at the plan." utter_changes_to_plan_intermediary: - text: "Maybe considering our discussion so far, you realised that you want to change some of the times when you have to go for walks. If you do not want to change anything, please just click the button titled 'I am done adjusting the plan'" @@ -1642,7 +1649,7 @@ responses: title: "9" - payload: /confirm_satisfaction{"satisfaction":"10"} title: "10 (I am very satisfied)" - text: "How satisfied were you with the dialogue?" + text: "How satisfied or dissatisfied were you with the dialogue?" utter_commitment_1: - buttons: @@ -1668,7 +1675,7 @@ responses: title: "9" - payload: /confirm_commitment_1{"commitment_1":"10"} title: "10 (I strongly agree)" - text: "How much do you agree with the following statement: 'I am committing to being physically active by following the first two weeks of the plan, no matter what feels uncomfortable or challenging about that'?" + text: "How much do you agree or disagree with the following statement: 'I am committing to being physically active by following the first two weeks of the plan, no matter what feels uncomfortable or challenging about that'?" utter_commitment_f: - buttons: @@ -1694,12 +1701,12 @@ responses: title: "9" - payload: /confirm_commitment_f{"commitment_f":"10"} title: "10 (I strongly agree)" - text: "How much do you agree with the following statement: 'I am committing to being physically active by following the entire plan, no mater what feels uncomfortable or challenging about that'?" + text: "How much do you agree or disagree with the following statement: 'I am committing to being physically active by following the entire plan, no matter what feels uncomfortable or challenging about that'?" utter_confidence_goal: - buttons: - payload: /confirm_confidence_goal{"confidence_goal":"0"} - title: "0 (I am not confident at that I can reach my goal)" + title: "0 (I am not confident at all that I can reach my goal)" - payload: /confirm_confidence_goal{"confidence_goal":"1"} title: "1" - payload: /confirm_confidence_goal{"confidence_goal":"2"} @@ -1720,7 +1727,7 @@ responses: title: "9" - payload: /confirm_confidence_goal{"confidence_goal":"10"} title: "10 (I am sure that I can reach my goal)" - text: "How confident are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" + text: "How confident or unconfidence are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" utter_thank: - text: "Thank you for all your answers and for your time!" @@ -1782,3 +1789,4 @@ actions: - action_save_action - action_save_goal_plans_and_reward - action_rearrange_db +- action_check_dialogue_done \ No newline at end of file From f53faf5fdd9f18e0fa86d69862102e18b737f0d5 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 7 Jun 2023 11:09:00 +0200 Subject: [PATCH 117/159] Fix script --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 999bcd5..285d43f 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -450,7 +450,7 @@ function setBotResponse(response) { barrier_strategy = true; blink_and_select(); } - else if(response_text[j].includes("I see. Thank you for informing me. Would you mind briefly describing your barrier to me in the chat?") || response_text[j].includes("The question was: Would you mind briefly describing your barrier to me in the chat?")){ + else if(response_text[j].includes("Would you mind briefly describing your barrier to me in the chat?") || response_text[j].includes("The question was: Would you mind briefly describing your barrier to me in the chat?")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); From 7392b1ea4de24fe441dd49375c18d627cbb26ec2 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 7 Jun 2023 11:13:36 +0200 Subject: [PATCH 118/159] Cast solts to int --- actions/actions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index de0b7ad..44a92c6 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -522,11 +522,11 @@ async def run(self, dispatcher: CollectingDispatcher, if identify_barriers and deal_with_barriers or not identify_barriers: - c = tracker.get_slot("confidence") + c = int(tracker.get_slot("confidence")) - pu = tracker.get_slot("perceived_usefulness") + pu = int(tracker.get_slot("perceived_usefulness")) - a = tracker.get_slot("attitude") + a = int(tracker.get_slot("attitude")) if c >= 8 and pu >= 8 and a >= 8: From a65529a225512218dbc8e42ccce10962c925344d Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 7 Jun 2023 11:41:06 +0200 Subject: [PATCH 119/159] Pick action based on adjusted db state values --- actions/actions.py | 65 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index 44a92c6..0d9f052 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -617,24 +617,73 @@ async def run(self, dispatcher: CollectingDispatcher, ch = tracker.get_slot("changes_to_plan") - c = tracker.get_slot("confidence") + c = int(tracker.get_slot("confidence")) - pu = tracker.get_slot("perceived_usefulness") + pu = int(tracker.get_slot("perceived_usefulness")) - a = tracker.get_slot("attitude") + a = int(tracker.get_slot("attitude")) + + + + if c in [0,1,2,3]: + current_c = "low" + elif c in [4,5,6]: + current_c = "medium" + elif c in [7,8,9,10]: + current_c = "high" + + if pu in [0,1,2,3,4]: + current_pu = "low" + elif pu in [5,6,7,8,9,10]: + current_pu = "high" + + if a in [0,1,2,3,4]: + current_a = "low" + elif a in [5,6,7,8,9,10]: + current_a = "high" # build current state state = f"{ch}, {c}, {pu}, {a}, {explain_planning}, {identify_barriers}, {deal_with_barriers}, {show_testimonials}" - query = ("SELECT * FROM state_action_state WHERE state_before = %s") + current_state = f"{ch}, {current_c}, {current_pu}, {current_a}, {explain_planning}, {identify_barriers}, {deal_with_barriers}, {show_testimonials}" - cur.execute(query, [state]) + query = ("SELECT * FROM state_action_state") - # retrieve all database entries which have an action taken from this state + cur.execute(query) + + # retrieve all database entries result = cur.fetchall() - # select only the actions in the database results - actions = [f"{action}" for (userid,date,state,action,next_state) in result] + # select all entries with a similar state + similar = [] + + for (userid,date,state,action,next_state) in result: + split = state.split(", ") + + if split[1] in [0,1,2,3]: + db_c = "low" + elif split[1] in [4,5,6]: + db_c = "medium" + elif split[1] in [7,8,9,10]: + db_c = "high" + + if pu in [0,1,2,3,4]: + db_pu = "low" + elif pu in [5,6,7,8,9,10]: + db_pu = "high" + + if a in [0,1,2,3,4]: + db_a = "low" + elif a in [5,6,7,8,9,10]: + db_a = "high" + + db_state = f"{ch}, {db_c}, {db_pu}, {db_a}, {explain_planning}, {identify_barriers}, {deal_with_barriers}, {show_testimonials}" + + if db_state == current_state: + similar.append((userid,date,state,action,next_state)) + + # select only the actions in the database results + actions = [f"{action}" for (userid,date,state,action,next_state) in similar] # count how many times each action was done count = collections.Counter(actions) From d67af3a92713eff11a1c8970b938a5349bd1a301 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 7 Jun 2023 11:44:21 +0200 Subject: [PATCH 120/159] Fix comparison logic --- actions/actions.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index 0d9f052..da480cc 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -660,21 +660,21 @@ async def run(self, dispatcher: CollectingDispatcher, for (userid,date,state,action,next_state) in result: split = state.split(", ") - if split[1] in [0,1,2,3]: + if int(split[1]) in [0,1,2,3]: db_c = "low" - elif split[1] in [4,5,6]: + elif int(split[1]) in [4,5,6]: db_c = "medium" - elif split[1] in [7,8,9,10]: + elif int(split[1]) in [7,8,9,10]: db_c = "high" - if pu in [0,1,2,3,4]: + if int(split[2]) in [0,1,2,3,4]: db_pu = "low" - elif pu in [5,6,7,8,9,10]: + elif int(split[2]) in [5,6,7,8,9,10]: db_pu = "high" - if a in [0,1,2,3,4]: + if int(split[2]) in [0,1,2,3,4]: db_a = "low" - elif a in [5,6,7,8,9,10]: + elif int(split[2]) in [5,6,7,8,9,10]: db_a = "high" db_state = f"{ch}, {db_c}, {db_pu}, {db_a}, {explain_planning}, {identify_barriers}, {deal_with_barriers}, {show_testimonials}" From ad2195e933310f0ab7ae7f29ecb4c50b25f2ceb9 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Wed, 7 Jun 2023 12:01:54 +0200 Subject: [PATCH 121/159] Add delay back --- frontend/static/js/script.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 285d43f..b5b6024 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -272,8 +272,7 @@ function setBotResponse(response) { //display bot response after the number of miliseconds caputred by the variable 'delay_first_message' var delay_first_message = 500; if (response.length >=1) { - // delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); - delay_first_message = 20; + delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); } setTimeout(function () { hideBotTyping(); @@ -498,8 +497,7 @@ function setBotResponse(response) { //if there is more than 1 message from the bot if (response.length > 1){ //show typing symbol again - // var delay_typing = 600 + delay_first_message; - var delay_typing = 20; + var delay_typing = 600 + delay_first_message; setTimeout(function () { showBotTyping(); }, delay_typing) @@ -509,7 +507,7 @@ function setBotResponse(response) { for (var i = 1; i < response.length; i++){ //Add delay based on the length of the next message - // summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); + summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); doScaledTimeout(i, response, summed_timeout) } From f8843ee63fe1322e0421072fc52f706d5f03ba97 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 10:41:27 +0200 Subject: [PATCH 122/159] Add final model --- ...re-20230510-213224-sophisticated-tree.tar.gz | Bin 25726 -> 0 bytes ...ore-20230608-083511-exothermic-action.tar.gz | Bin 0 -> 24561 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 backend/models/core-20230510-213224-sophisticated-tree.tar.gz create mode 100644 backend/models/core-20230608-083511-exothermic-action.tar.gz diff --git a/backend/models/core-20230510-213224-sophisticated-tree.tar.gz b/backend/models/core-20230510-213224-sophisticated-tree.tar.gz deleted file mode 100644 index d318300bb5aa621f3b9cc6f079b2712636c893c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25726 zcmV*8KykkxiwFp54P0ab|6^}*Wi2u=GBYqWF)%GMF*7nUG%a&)aA;|BbZKK@bY)~M zbaG{7E_7jX0PTI-a^pslsGt26Xub40LZ(HK)TJXfyxyJhxc7`bK4Z^1PK+IlB2koJ zfdB^=u{nJ@;(X11*nY{$%&Gzk7m@&o3nf7_;g$eYWmZ;JW>!{a*66FzSO4}S`|urS z7WY4E<>yNL?EClXYBEWF$LHhmbTVKQ{GYEnfPw4bMl6l-4J>T&ubE!+sr5g*xte`u%(`6v%(Z-O z&zUn1LcU^d_Pb;6pXvG^4f21G{~7szJG;A@nuGj*4L?h7z42V`hCzFpptAfo;e*K_ z|6h;%pXTMiImrJ`h;uO_oW0lYH#Z+UBGyYr3jJ=q`&zG`&+-`vb9$p48s zz8d8JApZyXKgj>#rziO@{vPetP6JEh`g&R{|HqTbWO|*E|1)zu{mi)Pa{a$j`TxZI z!1mmC#@oqg{PuI(4Ure#eg37fV7_m2e-6ChhW5(l);xId{7`%4^9^TV?r{+MEadmQ z_{Gw5SGK>Nvtg%TH<_0Ao@Xs~`Ukdahc-|&!(406O@j~*ia@NPPaueueT1;G&s-kCEIHZ7u<&+8 zUC{GfKcW4^aP4RhH{4%x`w13F6!2B#xIED5sHPr9yNUEgC?`XE;)Crs4|xD~fafA% z#)n>-nU}kL^b7#wU?tXk`f=o^39TL#kviZZ&1m7f5af*hca)hy@t~+_$R0V{!n<+N zLw$_lL*xhPZq=j0jw7D^T0ANGI11Q(`foLp`uv5yr+u^KmYW3;KPv*V<@^y|1#`9v zx$kI{#M0g)h_Z<+H51onNt4AT#7H+j7Fo;ac<1ROj-sDQjh zI#m8mGpp32&qG-AXob%M#|sf48YQ4ufe~QwAd4pa8aGS0HGYJ&nol$w<%0x29CB!L z((qEgNxHuK+<+h3T{#hHN1#6%2PAgh87m+J*V@o5RcaD5M5R`eQ_8hbE3MLq;zkvQ zq}o&*lWJCJP|4b^G%T%Ig@GllDh@4aSZ&6XB&{}OajPnGrW#e9G}W%sz@&LnX;`XF zg+a+C6^A5SRT@yNqbm(5X;ooRaifaEirZBiSX5mKsy0;y71fb~vQqeJt=Dp`a@K9RW_c63q@c=L&6Ti3=aPh1 zuAOor9eJg7bLo)|zHh-Vs!;8KZbN-5-7#baVvIf&tUmXy}~{3+52gkUSG6%%B5r_qad$ zLotU?8p*TZ#VkH46wihq3s6cSdL}%XLkO2mq2H>1dt_FJ|#U6r*$6GpDi9&^r%4jM97N;xmfg@k?=FbWVHbG&W?s7M;CF zw+;rydA_}5PDylV1TivK^53!i*OdQG%1!zexqdLCm)c00ufQ_o@)>D^G# zN!ha)MtW7`5AM!=5UHReqxc;0d5l3{6-B3-&teqWRgphteHOz=R)v1*E1HM=L)en0 z62KHxvrDL^f;#CE>O?`!pJ{i4fDSi}OZK3=OMDX8@J({&)y&cvW9EbUeXRX%s^6<( zPO;oZE&!kzbRBOie_M0Qj@I&z2mAh^7P4BtfpH)Pp=so6<69U(Ze(I0&Ia2!OT@^> zU9`S}G>Ax{E(L{N4AM zC4co6LCBU44{FQz^cdiSJpn-d5kDVqZ|sf#X@>e3QZIj%(fHzz4fi%q{N^8#y}_Un z`S*&gZAX3Sg%8|6WwhGJ;DfzkORYizG$!hn4}qur1)fnD zg8skvIhVZsC5gFr#&>*Ypqazp81LV%jsFDuhhG{yFY=8i+Yck=K*wzPFv@gd>YZTA z2S69P@?bm7L+l`Fp{F>DW(#-$xT&FS*bW0}-x*)+$%Ymqg>gDuK(jm`4a|re!rshY z0$hvj-W=}kP*3=7bhx=n<<9lM93Qr|;gRMGmI3~Q7aD;_kpJiZ{dWmUt@)dD(_^jhJ#xYWXMU!s zBw}IfZyqj@Ak5hKJPdb+&+j9L`3B&Ai9G6#jK4gx-6-8748O29oSDG${hh)Dx?thR zcyBy-8*U(j>&x3%;~c^+mUEvd7i|C&*shHV$W|5RA3P&u&LciWa)NF(>=i+IU{4&z z>n$9<4(N%?xdm;Vje&;n$oSUt4cFUVRzuveLtv3K{s3mZ2}Rm@S_u3*UwObVTP{+M zFAWEl@S3X~GXUOF*GuM-T#Z~Cg(hJL-|YdB5)uDLHV^Fe#@QK5$6h`ffIZT}TjBI7 zp#aeBN5Q?YvarU0VcFKm_z5V7d%A$c6To&HK|Y{r6maTd3FHR5>4UN0jsr-;D-@d` z(uGK4Zm{Kkg0FH35W*!zlStc7O96we4S^~^R9W~VZB70KWvr1!pXM4`Sb{IY2VAT` z6da1fS0Eoipeypg){WyDcrV(9FhbE2tPJ8a!wv)ySincdpT!hD0`G`Vh@ddbIXsPp zoDUKe@kAt45`XKn`GdU#5I=EbS~Xj5q3?TGxI!?)HrfXMCk}~%bkBjtFsgEh-n&FS z9wDtmgDt!Wp6>$gtVYK7J8}=xm_4yx#KztLG9hoGTO=@muQ62~;iKC-Fs#T|$e?#V zk4cJae}OjmIY7BbCjxUEl1t3DVCGl=eCG0%y#(u=KrK8NE-ZWp{$Z|Vtfg8>gP5eG zo=a{9gIQ0g&F;l~3zU@v6sXhm!ZgF@JDN$(0vqsQ%Oz%`fCwQRIEpA(Rw@0Psnb%D z)e8!|r1%~t3dDU8zyJII*seKFfnd!Ln4Aah+mI?3po9YTha-h0Ay|kRThD)_IYxqSCZ$(h z;fq5Kv7`WnP9o?{5d(os1 zyNPIxB94F)YAkpNGXd-y%PyttXmJuA_FCzf#G;Q}Xy(}HsMv#9MJ`U2$tz%7tU_f7 z#dMT!3%4x-#kl%fia+0@VsRgl^^*3Q`HP%}oF1zW&8j{3v*IBV0?$aRN^iZ!pd5%voTU20;<5l>C2-n+PHvh(z0q zf_Db(+*DtIQZLG+B25sJ@awk+K~>bRnZTWRa=)eMkWuA!-;oZe-tMp5p{K!vy$Px} z|B<$*Ff;eQx2*&J7cc;;xBAw%G1ysW{K?2S% z$?Nb)jDhObk`rW^*xpt~1?`Me<~Zz5P^+kh%J9|} z9+{9UpNk#MD33_aH4eLnw_##>iYn~1m~ppGYm9#Y?FY*p-7RW2b&0&Jy!B+;>E{Z} z-5CmGyxlCoCS?QRc>{o2Z?Jc=$faMEb^~Na8NYjrk@4^7sbjl^ZZ)I1D_sEGLTaKB zY{;m0lD}IJQUxfajE46Z2juKd5$o$m>B+|AUgnqQlO4vW+c6dSOf;0j` zCf*~Xi~>2pLcB1*7E*K1(x5Xd#j29M<1L*Wc}$MX0!Bt6<0$hS)l2Twii#ZLnJjI@ z@eq(sLzr@5NsLk^eQM&8V$*VQ9A6JYFpEKmPH+jRehSt=Hnr^2Wy1cMlr4CrbACP* z3O-1fKAU1x$o6~rv?Ti2`XUp$7$vXl zgg$#?{DBnfmJa1%ZP@sg3z8T4md;p&gA!SrtXUq8Qm)%%xd|t_LAAVh=%WSOjQcTf zJ2f0EDN>nb59PGmF+N^o!tP-!mD@%MpO9q-%P0s6DR}W7#|z_lN+?`#4()2%4!7S* z-^C|-9v#Ibr1`-Md7{g}Scp%&p%c$>gu6(<6cZx7$rj&mv5q}g`Hu-I5X^HTIx^bt z(o)+mGS)J~MwP1_-i?fl;@OyFH$sZVnh+JLCwHy(N-i&3xdK75hA_oaMzbyFUG%OzmO#93sd$PZMStv5qpshk3+KE&LRD4ezaaWb?rMrr z_*j??_~{t5_zHpaarKHsBdm2a*464m=_&%^B<(IGL1mzWlUq48*y7LFi8?|M-y><| zI!X*|VH|Ty1dzqBx5|nZ7B~~Fvr9>C3QDm+&aY3XSBw;ixQE|HALlEQ4LMahx+u-anettc=3y%Y(aK-H#ZSBaKBma<#-gWru-hPrE zY!~xym@@d(;f=nfT12)(>LuE!1Fn*RB!w#_$uHJIn4|!54Z5gFNik1Y^cdhFB6Y+O z5r$ge+1rSsHOaIII_Jy`r69adX{nU>5}kh%2pyP~V&O%ByDOjBR(7-~ zzhr~NxFfl7kC7EA$@R^?1$e0~Ey1sJq)z)EG$bpoqZ1}KIbOi~lIBm$x6$MX#IbiS z@J>JW28}{zFnB^kRsfjQ-hIU5XcOGe(i%oDkMgkw;xrdw>bhE(LUtI5fFBCyOg!{S zV-e0OE|;T29*fKoa*Tsnv_?I!iX{h&TWWqD88sT<*7L~l%NpI{vZ)g1XtmB+3AJ>Z zdpWHk8^AUo{vCDzj)fkQ;}#R#FQ>Vf0FS|$w#PDJ|=$_I%cwKUpwU(Wt=m3$|syNque?BpJd_%N*}G= zD0ikuuYw|HkN#~zcfp&~d)(}g4)peBPj4{>6bJk!BMJ9a&nOd1SIVYZL{;c7CRr) z+TFiurIW-Hn}7HNCBNlK!H=!t(B-&o9Ir%PwL}FJp>;qR#Gf0<=cE>j`YBWp`$gjG zRuy`=q7v#seg5%6{kB&PknIqm|0oE)IJv_^;=ObqW&?dp8t7wMv5%_aw|pnpO>}b8 zL?^dRbaK}~Cu5CwK~U(j??So}mL7U~Lg{QJGnZ1Na7AHG6<~rMp*4klN|7jz6_m%- zh5n3*a_Nb~Vc4LLMx(dMd5S{xfM8UgkT6t#6biufLQfptl$v*3mT7V)k&17$n6XV1 z&O^@=m+5L3M5kiZ-cy{9mh-6ljYMJ?^da(_fEFpYO%i<~vX~Ij#P0$04c-~QP_7bl zwK!P}hsKMizvaJ#)Y7bX>F*mXqZ@ft}&eIXgyk3baZfo?qep zqb*Mw9z<>ny5EfT&IqFWd(q8-Vd)j?Ivr36bCjYF?LfmmTh}fvwBo>(Vi9Pl7!}QQ zj^(*fA;`*U2RI#|Z!tIr{ubG5#mFvXxX9*V7hruA%2viK2aMjyWrpMiVpcsr%k}^p zh+K6%^s2={rCIIyUfVcOcIcWX;mmZ(cPT~=yFnm-Vho~01i~d_Ws_|AUm3bMTLSSfv z%psx3R|z~+8tUu)teQIgqy5YB!Lyf|jgf0I&7_f3S^cSV23SiVWkkMZtZoW-kqR{7 z;ueQhr#5N91H;I>k@1~O4W-TV`@J|)&5}f}W{W=V7flBZxgsGY&WTb&O1#7LFVqDJ z<|U=cipXSfWK1oC(A(gfjgJv?!tE<8l)bBJ-=NI=8Jau}R0zd^DyoeL&;&Dr!V-z)vS405UgT?5!ji*7=v+J*TRy7N4WlN3iJ-!L;KbWT z0gA}>EWkh5fs6(e=`3T(iwwZxAHevq1F6ZHBZjJQv6mik35+JeiUO!v zm?H57#HnN7i;R>;ff6}$LS5y~CsF=bWdnyUTk1mnm$W2LiBcKuwXn(bi|xalP|qVg zJ?dk#F$iicy=oFo`xv z5T^=%6{-w#axi-;2=nRw1$b6WB#u{d5gVLbFyTNzgxF4^tJ~KrL&saOzrhPNGw+O# zd71L*?IAKu_vveq#3j#wWtO|z3o&7x$njC%uWk%%-5-dzh1w(i#*DD5}3C!Q&#`R7-1-={dB=6?ECg!n_7$?o#^! znfsd(lG3!+PBgN0rH^mqvnMjKwEc;b=^`R-Wdfh5!$W1!(DGE~CY2KlqUDmSU~y64 zERab(wn*T&XqL3voQw{Pq`*YZWDUR+VemUfK4JkoP2ldStsV2p$AS;Ebx~Xj zdtYmOzo)Tz47Pa?ws{1$nS~APNO>{o5mZR1NjEG}U+Tx=A`gbQukI8vP^#h+dP#7R zWJ_Ze4#uoI7_-&3BO~AyM4nzrzB59d2l5EP3Hdag;0HQCGTTJj0Fq>gxn(OezXU&I9oogcUZ?ZmGZJ)fd7yIqGeQS0 z9->Ge8JKV&F15;pm+~y)%EtZ6!zCF{kJ(M0o;)OrI`bv0 zXJ;o$6^Ip!l%{%HPJDO7a1qPxm!1BZd=y&$S#75zr z!Cg^eAgRHt*%_4lJzv?b9RMnGSehF!WS25^507f?dG6|nxK6%a zIKQtr`!bm?b=zxeugF=7iSdx*0!FkkiOHVl-n<9f{7N%Uwc<<0NY;o-k~MS@Pd#p>h(UZmRfY6 zC$m~|(Se>O)zXU&^faxOU38$QS+(S%13g_=%Pl(4(@nMHq60nMR?99r(9>PD^rAzY zxo5e?oUgIHjJAw3dF5dgeUYry;=oH$0*_z|BiWOukcA;MNgqXd^C=73#mr+$$|Mgr z*1Qdj$OTZC9!=IEX!}%6UFlGOZTQz0MFM42U7)N|gk3c(Q1ZRk6)5?h>I#&6Pjv-K zzNfkZCErtBfs*g3u0YB6R9B$nd#Wo?@;%iRC(f1sCWiLg+q_{Rt(uZ{V;G|{F!c`KF zrInFMUBpHm&mB8WgSWEmEuKbm4B8Z7oib;gx*=3s1WEYp>Hp*lcRyLM(UOIR`kfhI^19Cf1L0?=%jM1@znwI!v z&*S%XYAzZ2PD|>tPSp9>p{oNcRIz-W1^z*xX8)GcJ)mm?% z=W}u8s?CEr3uLieBlIKwxpW)9`}|Ak0G}g=tKLKnwd5TPWG;L($ul)U0M|jUd*Mf- zs*$MlGxt^k1?@HE2Bhm}#xL{tmB+7?Nv2g!jgyclVqD!`f3SsQ;B<(29JsF`0!xDG zlZMjIpS+UHXY|$RtAG2E zefW+uSYYkIxDr46{=K@IOq1X7`FK2?nV%USx*$M=hiU-6=|Mh|AM@5&qh$Qo@%8QG zW;UHnXQSEe&6PQx4y)!B{Gh?-xgd{&ufVqASmqccH|bRdTJNi-*8k1T4F4V9%*OIx zGri{Z-_0rf?=xf8<@yI5;&XcrIt8{EE9PduJNEvWuKz*)5AuJI|AYMBC;#E$J@+@h z4PSf-*8P|A6>czp4?MT*(zw2!?v?+hIZ3boi8;Hz`pmfMa{a$j`Tr5Nw--JO*q3+{ zGsPts7n6}W8eibODi_-Peh|X1^H0N~9Q6O7|9jN`x3k&RbUYjM z|LfBKp^vpGzUOPt{wFE;A3euj?ykOSVrf*||J}@PhW+0l{|EWsvHYK0UzwxHm3cig zuLt=*$bXXmE6&2mxBtog(p$c2`@hL7v;PB;U=I7gPWFEno84F5;&;9baeIb4!4dA& zM#-cHBjAkXBc8r%&%OtpVdKH*?q~7#+xX?hrEwu@^Ck_Tb2oAvc(Z07<`1GJJiLV` zBEfEMMH}EZyy*EtoU9Hz!9o8I`hU>>!%x5Ze+`dNh+A_I=5A2g2sozyuguI|a5BES z8T5ZQ`X3#&n28^4K}{olR*pXBxbc+mfy=>MA{|L@(^)Ew0RtJMF0jT|l% z|M;s0*MBwt?__c_9sIw8{2%0h$MT={e|Oi{H&>HE{=a(pf2!lR+I$h3t4R&;F$i0<(|?1H(&t_`o9zX zPw~I;JX2CB=-$6m9`uFEVa0@2ZeazF-!9V)uu>#7_-*hU5Bh)5|AYP?eqNUT-_ReY zH~%c4KDu|JOtOSBLsPIsX-EALl)Y|AYsB|M=?#UdALVG5m_}e!Y;D7O?g+ zK8YVVu)F8*(WgszhBx@g@3Ba}8;Vc&-|GPFKK+Kih@u-0D6yy)lrD{O0E@6bnG~r} zv`GWY%Ux2LnUDNcvpwKbZ8GvGH%MI32J>F>J5sM<{IMfwCni1>gf=G$21HxSomwrfnD4H>F|-9xFy zX>Sg+Z;SR#05xk(c;^3mhm8tEC%C@6;BF*4QWp#a}{!_Sq{e(}SuXt*boIf=j> z`&#i5gZY9L`dihz?tQL0RyCX^ImAyVNKgLPGa*DrUZgU#HwW6cPWz6$czdS1A0O>7 z+a1n!H-6h3e|4^6)y2_si-S3W*Ttx-J%afp!}bNA+?@rE)h4TG7)=r@e@Dqcq&kS? z>DW9=@4e!Fn6k5)vWjt5`)0L;W!|Z%mRIrZb)6-jbdOM7KTxWdQ^+73I(>N$&w&_q z9ANd`a0L_5`I_J^_wRRehd*&=zehRsRWE4O<%euXCz2#}dOCh}lsMt2d3*}-dx^+M z1r3i6#ZQm>L+OP0>G8>=IIGQ8F08xk6^v(rctr!T?AV$l>s}-IcA#Km*zG5B3oE4k zg)3o$5ZQ1R;)SVxHf+LnH&HkbJx{!yr zFpB0$Rq)AlpjB-=ipbf?q|Js&JI6^o8If5h+;cr}&%ixxB68gc8{Z6UJh1U|VB?b! zxoL7eb#BXxCc)hD+^n0QIcqNn=}jM)RPh46j=aE-D%+QE)0;Rh@ zz>tw6_a1Yy^UXtg+>xU`gGfd4$GA2(Z1d$0yCyWVIU-L6A~#Fqn$RZAO{r4p!^}SC znXL&;P5ue&)R_*%8e5@Ce#je}9<$WTIba)v-QrU5Kqil_1W3g*W#e?^OnmtF@#yN( zfdBkfgHmGd?|lxlKOU%49lI0(yPYp{n6Go5uR0i+U2%{eLq4$4z((z1q;p#P+}-)^ zJL5G-ud(&o4%Zj}HtqwJs`Hd!d&1DWpMV0pwQy52?G2lnhWNB$0?b|$0cwJrHB0k> z;;mA=9>`OtxXYrs`7@Q{CzRt}a60+8Y1|4i%-2PXlL4Ep%)(@tg-&MSWWbYFroRh+ z^1ucCbHT}g%lV!Ub75!d*>$4%iaCx<3r(+q6^op(OXyW;PY9km!0w7f^)TF8Aga`3 zDx`0xHK<+#Ra+`?b!hUs^M0suA^O@}z&~EM(5p?VK(PJ*H<7hjRb)7w zlIB3kI+Uyj#XNn!Cc}K4?|jvRGO5oMaRlxl7zg&K1trfxb-1zn81JO?ZoY69f5NjY zDpArkE_I3>Y3QCfc<%6J*kRqUUPoRPpiZ3A=-fV=Cl~#d${X+IHp3#MPRkcBd!ON6 za`cxcUiCV^N$=R5c+cLXWdcnH0-cP)w5d7jZ(ZqTNYVah+8;Lc%(rR71em=l0@MRJ zYnbNO1I^o|c|DNV4NY@=Lx*@jO!kYL?0SK#vWt_stn-pnSXnc)S2njQm7PkO^@U_J z<)@OKPb63OcU>t;ZCy*X=e;!0>&F}Wtan64+ zI|mFaZhrEEXpm4n-$QiX6zc3oo8zo}9(NE8)72aqn!10e#Om%&IHwMJ)BOABdRvEE zU~w`x*mhG&JB?1&`N?8jn*{v`+5QLL_JTaXZ9PiM*GBhF#oqqa)k(5$PS_r`ILCcp zbgDugw?GK<6%pc8ux1PNpA7VGoBpSQot!Z3ok>Bu>1^#;>fEgl6DNm5TN_eZtL=3C}G_JLDHCu$(Af8e zS$~i3uz-b;R> zjoMvwdVJM%mDqIEs2>EIiAz`go| z_R3xY&0Yns^+NB8d9C`CG%?5bo@Xs~e3;#rGrJXU01^yv8ZYVR!E^}%9`6Nn2Kw3O zTjpB>e+~TAF0`X8*a(OF9QN7Fz2|dlG4S-j)6bQsD`KFteIx6r{cThdm?BbDmtmRM z8})7Xm^BcAqjh%*VN`vuE$5HHt0P3cVroRI+H~(U+>$bm%Q(^1$K4`yn$ujXNmrc= zox6DOj?4LiWn)3r;LFzfCQXb1FzSKAM$3JqHX=&0C)~NT~iw7L5<&+A!A(A3CmCG(Ig-U839|5zO|p z+s=px^?{mYQWGjtzU@@6*G~9TfF92XIXc;e$sXn~;V)~#8%O{$YcpEsinSngQGeAX z3iYl9DPN7apLmI!U1f3LkgXj)B!*S+Xm7yY4t-YU28B2k35$ZuKF(_d4HP~v8f2S< z?yI)$OQB_FWnIh7>N(Zp9j3T1Oq#9XTS=bua?3#eDz&8kejlh*)#$0)0_qOEpJ<~e z?(ZmmwJ7E&e%XEGQ3|gbfdqNf8z4$gu}J4bi;e;;O3~jO=-&zbI|_5zH|PCCFbz}Q z^^|uL-<0RF&eblMbD=GBH*yiz@Lw0+t-a8GqC330Q8QVbss>#bpxp{F%vVK>(*c{U z%tDtz0mEdR4!GJOcp)?NvpI2j1Y1<6Xlo*0b-yvuaH?S!WYIpE7(H!C&VdRYSw2X;+lvg;kzB~X7c1T?1o z6NOpx-Q>sQF{(W|0_l?o(beiCT_<}9(&ZI2%Lgo_5}-gW@W6=r zlU)>FC`P67t>2}~E*u?t=56bh+RtG0Rrx+cpoR%f-lR3RZ07F<+P6Ua(?IIe)9}oj z!*sv6={^m**)WGq1`ZoI>~s!04dkR@rk)N=JuvmNWa`sEP8(iFvtb<#>u6Xns zw%OKnOor*`WICFIJ!y*-rUNUycvff*_OvZF>@pa9;Ko7#sAX8wQ%xp&&FM<;fma7!Jx5-x$R&!MYcGq=b~8!I$Wm9$C7*YV z)M?kvr7C0AAxC;bXy~5=1up!^;d9S*c5@-Z-Wh*aqzPbyOU*oHaZ5D&E!Pa|hfy>A zRX|dPN{dDA1KVtN^9>6h5amy)&s;Br;m(85^KG7j-u%SKI%RX8Z#WBe61~1_IA3d? zQooh!&CZa>O67KgCzNAMi+-r-S}W^6-2=4kf#!=IRv&6X;ly!YfX%)DPig}0Wbue5 z!QArP8eU@NtUZuEvT+S?znxnF<_^%oqT#!OA~D@iLf#?X8OROym)w5hmUfhI7BgR? zPN}q}5NLCycE_DjBbyH2{~Va-V5zh}0k5o%!4SPVM6V9ft3&i^H@1x|K+s_2gDQ0o zy4rEOPBdRJ$C1_REAL8HEONpQK+Knp7x20Cr?mr6KH#o32Z`o*_tn6(t)PMjZ>wJl zRAU#J>!O6xXa%g(t8{XWgQ4@|7KZdj5v{ZioAB_uMqwH~0NE zMDq^Oye~bPcc@kb33>W7x(cvv96jh4=2ka$kT{c) zUej?62Mz`aCg|F;?3K-}Hr`hJ@q8sDqK~c1v&Up`}L!CyNFu|E}is`!n6St zx}67ozfyB&HSHectb35x-GR(|AZr7D9q|ZtO!6n@+iZc^DkK4qN$`$?Ao{hEuUfWA z4@FS)i{HM0i*~U3?N!x~>on?H8KQN(-5tT=Yi8rMdu!XZDuh>`26W?l4s0!!K-SI% zihi2Kj<*g?-)fOrjO-fBnTxKpE%U9eFz`8SOffcaZY^rV>{xaGHXM1J?~zB3dxB0t z$2rb50?XL)(e<_tw_v%!a^IE}rS)LejUr1!Yu!~vO1hg|=vRCfR+lTIhMBEJjl#|N><=)$vhbzuJ1$K8FeB!~M%pyv4{jt>V}FYh3$o}X?l&Y_?A`C4+W zzF^k*WT<9yVl|ttBh<&8naQ!|up1-!xg9C=5F7B@ za2-P%H#fbaW(5YX=Y95?4w|Z^C)*2#asBs7T`_^b+!HFReo_sHJ5-hxV5UK z!iH4fXOs%u$$Cw~P%6>`bRznz$~)svfLO7*d;z4_RT#B$B}v7!#Dqh6o1sj2Z)L(y z0AH=9?irOBdWEHJx-Eg$b@_@{=U40Gj5~XA@@cnPr+YoatD6r+z&11Vq~|k@#eMC$ z#cf9!hcqkV2p(BV?7;Zm$NFU1;!_aMBR6yB$RJzj398K^9Hq!Z~h_(55{ zz{)_~T#Tk|zD|fmA9o7PtOu?4n2q4k-T+pi&(6B2Pa4fuskZi>IHvcC3+uYwyq}Pi zP&Xf;<4dVJzK^QYL<@rG@(8%psX2?Xb)AW<4Y>APHUrV@0%BdCj0SMXD;bK{oO5!= zS=}ewy~^w<3!pBMduerrhAZmZy`sJz$e~DCU)Ll( z&x-XY=S|+el+yXn@<^i3+S>InX=ERGCTBLo{;=CU+K|t7uK8@QrVd{(DXxR3b?~(I zXP88n8H`e#{Ezi$>DH^HLQX3*%UTuFxk z1U*Rp^C`^*4^`M(sKQ?cytVyWRysKLB!^Mrm#f>lN;>N-KRXb9l z{$X+>WN7LLxldnUzd5Hp=%xmuYPIfK2CwLa7q$dvr-^fntkBgIYs~>yjnzJg!s{vu zd^%wB49|#@%}vMq&z=(#hlBU?J9uw~MxYTua~kVScaomvx%x^SWy253bFZ=i2Pb3(?(utLMQ;-Cq9CmhZ4O zpp%@0hwip0ch?Wt-(B7EGXzEqfe~jFt#D>{9t_tEwS3J`J&@ODYY65q;5nf{V%)y= z?LQrtN^Aa-wHQN;3T(WYfHO8bqKe%-XMOh}T zbB8#!Y$Vn!*Hw#PMd89H=G$!H@Id5#9b16y05z)u9d=F4?wW>cP8z=Eq$ae<8HUsL z;@ligM2BRL){;Gjq~YOgY&fqvpF6tSCUI}M0fWWUmc>&OS~`bUO65cw5fC_1>)26tKm?zC5-NINUfwX2ZE@%LFT) zYiMat^$%W|52Yi6pxXqLPGxsDcOn**iE1e5cYLM=suEpXKSoV8uO0H+ZM0fLAk9ud zo|GQeMO>b=2oi&*p_P;Ew=Nc41ns6uGn^W>t9MorbpQ1lyH5J4M(mZ1wF;LGrr`!W z2uj;#U8foKTsE+xh*~onoiuCPwJL0KdZ|^I55^#vzrlY$eg5gQv-lZ(HTvq`eq~C~U5(T0 z-@KZbu>P;QT>s3qd~VM{WrKiUu^cUqy?>_b|05`)3(Eto>Y^ee1$6=TJen);;9@cw zOI0aVTmVo1u5_oegk_AZ%`IUIC)!ngA*)92d7HMRllMjLs)Dz&o?!kB8N7fLT8#y7 zlX$-I!MCfTx5}nC^o~@2;Rl){?7;h?IH_u%o7Fy_RQo(}%pPc$HQf(FYzI zjZ5N`_@c_!}(4TPR)QFV?oT2Nm^! z=kM==yVg-e=$nIx&=-dg5g%j`$wv;Q-sM$O>h*pNRFvP7dYikaEP0#1#-#9F>@-W> zrpumd)iU);n(4>MrEtk}pNAkIarZW-n;4TfBJfRmowU`K_52sSF|%*dsqDGu$?$}8 zLmG=n)6nL+wfIr~O9UWMp{Dtr_KpnAl@pQq1dM^Us1Wq;j1|zI$6tPuzkRyg4?r+l zYyBt7p*0X{H8l@F3BdMdA%@V_G$;UV&Vz!{-b5s-puMTkV6-(E35YhQBZ1Q5%1~xS zi%TO0(c0Qj5L#Uv3P^jCA@@k_O@#u`)O?Hbw+M5iK z`qWm(W?LOk+Ui(D-H7dSyD$>3Lkn=o72SNd+CfSSv?+20HxDL0fNH*Lhrx_W2XG6- z&-m1uhmdoilWQY%N&0uXhqYw=*|+nbh{H-AfN8yj5x zphvp-+lGR9TrC4JI~j`E)=*j#h^at>RyK#pd0rd3R10Wmwfj}8mcYCTTO)NGA|c3jdmI~$>|UZhU|DMQX#(;d)7n{ z!>LAt;?3f7CPOl!YLqD2(LQH7sPUAf!lC25XGw8Gv?0`zr;qW>0v!q0RNY!caLgYklM3pJ=f@DR}peobj#mI~NkjhHVLxB*_ zQ*>rWRGAVl#jMB-s45*^l3|e_Q&nob9Md8@qLP$25T)}h>5v&uMJl`y8Ic}NH5$Ai z`H&k?HA=h~*^n7eNh%x+9eb8^$c?BnC0>Yp$PTC~9bS-(C>T>!YP=XZksDE2N<=T~ zY$G$Cid1+hG9s#Rws9~(^f{BEx^#$M*4aj8Jf(dy2ZC*rlT@rB;Q98Fl{>c04wvYa z9qg4pl(GJYssAz2|ClC2Y1^@rp-W|Y9*{DxnVc0ps0X8{2Z9E5ys!s?#s`W9btLHC z2>Dk|&lFuM({qrZh2*R(K@X%p32*_K?~AaV!$E)5MG>#g)Q-{GAi?# zjLNJus>w4M)uhs>_GS~E?*LOMS0C%1tfq4xuZDKXG3TP5+m+H|tW%hh)Z^>}6CQLW zmud7RDYYkQtX+CtINmme{srE%7Om6I9_;&vi>_#<(V^_RI+hXFH4QtZSK;VOQm!z` z??qE99&t$u?aNg>OG&LGTb2W!$QD}7Z`*{<1ZZaPC24jrtMys><#QvdV5c2O z!faVS7L)-MVv;TFF#X8)v^t~o#9IU*TRJ@GPW|MGRg%nybDWahsvlH)y6 z2H;t)!-6rDJ)1sQui$wePv?eIHWK(qoq)4k2}MZP8gDMm{}~LIaIP_0^EuA0S$}rT zXE?iNrPEhr8vWLBK?n<{>Qcc$Bq8St^UVd3TS8U%@m1CyE*sN z^BAV3IS;Bv;_B0~8m6V~X<1c26qt8>lJdG{CQaqTlk>SYMHlME-c%tTajoOM&$$qC z37)CyKV)eD`0x16z|Ap#W4wR6HvSVf&-~KZd692C*?t%?$5?u7`7pZ3RRoF&lY(g; zhlzk5fRX^&GuF@u;gtZOUuLr($^t$Hs$`}pJ4xtMU^}cuGy;!C z`9J^fzZ(LXyC^9S_kTxr$PM@=4^{i?x68ssh=N*b0~K1806&NRqQE0Q=_Q5+|M+8=r^a&hYttPaJ}ti zwQ)Lj2#coVaML%xA0Otw^OXlnY0C||gy+(5Kwqr6ArDvp&n;oHWUhf$PUPBXlhA&+w8Vm1(vEYsaV}w^|R~Rs4($35cw%ji{aL_A#-9bVJ;I_8pU_+aKjsEwEF>$CxQ}_D!~}^CkMrFR_7X7q ziR0o`eDxMkxd-tm43V|%*dPap^`jt-NKj@a#8)~VMMe@PrXNW=gDt!Wp6>$gtVYK7 zI|EHxqNpdtj5xMRddHuE4M&U*V2HZWRzOv3h?25ZF5)b&n@a z%yCG!Fy8_;Vgal-m#^%l4TvLV3lE41;?;qFm}?p9w7GQ*qe%%x=hE?%!K^1VCGQ2V z3W6x5CkR8V2`mbq?}!UI3v582Etgn+6XZIf%u$C~$MA11k=fyP5cwQfmSB?*f2%1!d}=U6+2VME zu|anv2e4Hp#zwtI_`# z2n-_P3D+WUoD0GiHqMv85w?SN3zB!i@l%Ft6osMZfUq&>YQU6*RbePMC2T~nN=UW< zcUw|t0?Y`2D^kOZvn3Y`1zCVN9`)!JpTMXchr9QrUp!&+0s4=eZ$P%gQyS#*0VyPe z|M=<(M$9(>$a)`ElN*IXDk1B^H2Wyv;8jp+tl8UR+YwILyJ`0rFjiWomb6*iB`=f; zm&yjwE!hx77em9u=BPD6x6|~YMn?jY5|yS5u7pbVU;diaacQf=yCnQbB&y~D8yp+S z4zQ!|Vf%t;Z$X;|!cIjC;Oo<{EaOtrb~p^|Fx(D-n8U3AZd*{;Dd{Zv|K206WV8@2 zk?FT$nHuW|_!%`T5MJYXSo{$g3t(rK+UXn`(xlWjBNmNnNCE7;tO#Wa$a-KI=x@o@ z5=^9cEcERaSTd0l68=w~Z7I7#4BNnE=^4QL;fD5!rw*%xuKEV^u8_qqh2Ie+hvx!W zK}izjNhy=^LgNp80GB9k*9vh2CL|fk=X;XWTV>R_FdSmLgi_Qe$}(DnY7&LUK~Q4n zaPrXq5#f31Av^xW9oDf+k{dUp%Gow(6VnC?Y}Y-TyJO^}YqQ5?%^cKeV5<}7%6&v) zwJ1)wB!_`m>6AD^D~5^vh+NcFF)Sg5z5^S8m{crRf`(=d*p{(W1b#=k3A2e@j+zvk zkQ5csm)xp~SqW+Kowvnp!DXz96>cc-VEre?RLV-&pl^f4+c??`={5n*K3hK6{0S|a zs(4S!Ia|~`a_%G!6=gDRB9eqSBp3pkQ}7Vj0#<#jf0QLgB9PFw*UF+vTn3Q~%^VwD z`Bewf^5WNF9bNBu8Mcu!u1;L;hx|7Cr~|95^s;`BR*(CLD>ebADc;P=l`Fgo5+zpd zH{?77Q(?#Vz4*{&Ww&1OkQD#4v`X@D$~YuXGw5?`;}TR6unw1Q;YyCccmO50{OHAGK@hEZ z!fIgWAbjPDGjkjevo1}y@-NY3(gpK$=ptR&^od6iy@BK{+eMul$PFV~Bmbj$cAEf- zfwXR=pVtjx+BnJIKy;$Q6g zq41+v^c!&$q)r>)iCR5O+YVRod$h=ID&~^%w2ny1jn6kA?ySmm`4bxGZ;YQ&GzoX3 zlsM?M7CVQxV%M!aW5Sx`3AK=xAMuw@8Tn!SfG3r70s#{6WRnGVlfDZCNs^$-Z%V## z4ST%->l394kc!;PVkpwO_Y)(U3#VauW4{Qs5;hGwZD{&HZQEWHyfetBryvK)z*1W` zGH&Ae`MMrnEt|r7GSt#M`z@saH4>jv0@`z>Ap#=}h$h&Vu@E65lB)iSn8Kd?>Gg8fU)Pm_nt5^U@e11NJ#S!U0w+BV7A^MGUTq22kGQlqP?Z@ySEq_|Bfe^Y`4&TB`|QlOXfM64!H=h zrRR%qPVzZpEFVSZFm=c!F)HT^NwLK|F1jbzZpGy)RGk>A=n+?_>NLGXvlTr*T_#I3 zQ=SrD=}R9B;^<%YbSz6 zL_1*I53WWVv^;E3{dk!=O`c7pX31{8ZvJ$FhTE6a@7r z@I6u+sQ8pHK|ye=t64SZ09JNQ953fluuw8FKX@TeY!)y%<1k$4#B&^Ra3f#}c8~}6 z7T<6o5It8N)e}^h70-z%25Ns;opMCch9W~6G_AB)w~*OC18t)r#gTMXr zjqwZ8SjL7+`1U$|6s_$-zE+ZpV)nIwecW!LVJhtT)V|J^Y$AGBCyhYsZ|R;WL+ao7 zgo(O-o4#1>ZQV(jld-Z4OD6$IFF-NI9}DYteyWWea9dgQ{^qVor+}Ek?WYnPsFp<5 znw*(SIbAaN+Q}{B8cg?R>_i1vi0^UY~McgG1O#Vp$iCR$PZHDKt$L=H~5VQ=(}RU6O1hyJ8t+8!~r8qTAx>GwE1%g`mX;{TWjD$0faK>r#!#mu_&57R#-+B- z#p0m=RPqJjPNd?ZK7n;g1RaE+$>vYYx6wchM9^o+3@ttS)A(7$ePC1wS#q$A^X?-a zhoPhAh~y7?ht(-wAVLHY6WxFk=Byn?B4>dT8j~~cq_IdB1)H6tbPGsw;SAz=FPOG# zRG+I@>an<`=J1tylL2~d>Qbw%O&&pOC(5YVXgs1ys>pXsdR_v+9dG;xZFU`Rdw9Eh zW&Fzzw6;aFkaANT=Zn*i|4u?{+%tT$XZVwL;fspzhf$dJkHV~f6t3Gv0VCuNBXH9< z0=Io5aMw2iV-S-61vYOYCBLXsnnaVavPen17g$mng(x^6?WnIy9w3SuMncz@I*!=M z>JqXkT6Z6lKdYSvl+kUepb4~x^b-LLBNHbAI^4@LLAZaCNk2PrrTK0>Yc`r*3Pd!5!B0-)bs(6Ni9!sRXGv4Cq=$aCvrR^djlT@69 z3mqC0bs8?hdKcUnjYcKTMAe`x8!)ON87=CMYKF>jHKvEmP{F~IjS5YLC&ta2GMRdt zD4d6$H>Z+gbF>)QmhDQ_XP`74t>~nF9xF=BLC2z&8O&PhI5f%E5GBZP)X4!Ma6<6T z_=O6MF;`1s$07_^Jzd13%cJ$UNC8%t{Q873o6lg(0f!}SH8pf~MOSh&*%^?4RyswG z+Az`uAh^QnT6BxpBF>tXsEbnZD(nS|j|SQD-wGjqYQz15XF=5fZJH_j3Bzd7v0pLfp(GT8H~Qf7M`*r?Vv)XyedWfiq(ek zt7~XJi&*svivU+#ItGAc|1AmK}bH#&M$Q+8z!!E#^L8wG6R*S(Dnez2}aw9d{ z4p7WOM4wRZj!|)B8)xYrHnZMqz96cax#mggKSk+zaaE%x(z$C4g)Vn3KZ-R^%C1pU ztz2=Y#6v&h!JBC-4d=eE4vFr4D4}1omkXEFItRBs8T})I z1ylM*yu*TOXfr6-msGb@q_vBfXKERQ-Ui=nd`u`5@eIPCJ|>*XkJ>C7cPS%I75;I? ziRwwD&w|}c830?3Sy~taiD9L(R(P_G;hS|WbSG^q%mTguahAUTnZy}JWFN_SW6MWX zn7v7nTM12(`B@H8@ojIYiYgF?QT>A*$oxxDct}bpk@~izuw6=lk!fW716b&Gkhah| zo&Z%}zvLXm<@ozTSX?=N7+X=32vo9T--`l1y`f9feZ-_tb*Gc^9C&R2l3Vsv*`)X- zZAYY3t<0-i*tF$~_l4z6iv0MeHO~xf%pY6JQ^QW26gkvqRnytEb54WueM508lprpn znx^n)y!qB~rXoFvE?$^Ha(7fh)#NWZFTD*d#2PGtU-(K(h24eKhp@y|5LT$ET`;Vc3&X}zvXE=L zub*Bgg+n;=FeJiP$d|~4g|8LIy)!=M)xoD)(>1MT1dAG9GQe1tdRDF`CN>AM=rY2h z6&#o2$}5`+c$Sc(e*_6(tE#afUdpnLv)x6JWE~Blp>nPY4M0WS>Jjm}jJQNv>8}5G zBwS8)7#Cnu;x3t7mYedTSKRX!K))>|Y?CN;vQ01}EbS-0%$7d8_plsL%8H>xSaI=3 zQf@*N%G4?f$wErx`4lwY#)d$HRKF|X_mBltQ<_t5^2-F=0Pgb;$+Pxcn>j&6Z*ewe z2^IBEoc0kSZ(i1+6BoeHb#Az+RXbU_s4R$$5G%P3tD}u3Txq6yUL)jQAJ2*tx=h^ zMrGC+m05OFu(GL$Qksx0R%^-tYU7rvAB&658{WR#r)YVmE^@--2$X20@8&9`quCW5 z%@;+-D)AWg;w4fCm%_NIq_$I7n&sT-;tm2Gr?2-$J~WA|&L^_KOKD9jG(xNjWO*2g zei=F~QBgYFy61CokX*K`RG8eZ{iaNPg;Yhcau=-}^>>g*9`=ZM9Ul6j57)@4jwMwL z$8=Zbmyqw@lQ{<>0Ly4my+u(mmg;`lRLRy@F=@Sv%X_$$n2GU~RD^^$Ly$F4GIdH- zb%)eptRXLzlQj!6y)jpm9*IkN{2swxCnq>aCRxVYq_hpQ@Jqe6&D-j9EPo|l#85{|s?rS4=;%2)P^OXY@oRWtPU$QsM)hLWTzvn4JXp#s$6G7|Yk4NRxy zF{M&LN6>Y>1l?2tRc#ol!oJlpo|WA`3K<-8`c_tZ6TG}9_@FEj*JTPQXB6k&3v$XW z6K$!%1Cp@9` zJ9}cnTk_7}t|)w++)G|YrP9q3E8DdL7|ouL<6n`mSp?zoEc zHl@qf^j6>y%#kniUp+C0yq7DG4!oqv`LZg{T(*(ObCBjuxoLl)0`<(HXciJXNuf+x zBk2toMWo*4p%}UcD8MbLbfo;>Mx$O|ft4V@@qIy~11TXKSZD_;wrugX7ahdMUoZ4O z%aqWioJ?2&aioFt}+w1MCmv9mC+R^<1!{66vZ;3cC`Qdu3&*5<_uoFg0b3p`0=* zRaj`fwnL2VY0W{agP@vB$)BZFOc45>d+(5rVfV0GXryZ0VZ6p2)U7*=f!RUjy2BVu zI;dTD7=vjCrRxr3FzcXl-C+!_J1AUt7=xP*D%Tyx;I@O(b%!yy>!5bs5s6evzr?b# zP*9dqE>zxG#t%|2iEb&*Ko*x^628Klc2t^ zI@N!L7<8)t3Nh$Z{}p1;ss1a(pi}) zYuOV5h$Qy)4r`bhB{0B30iVkWE*01msFYDIl2R#*O)*&<#Onnzd=#u%%iE5Ab-!`J zzQs%3kgK$c4S0VTGLz5glA|=o+3pi_Y%2~3ByNjO%rEIcAIxV_J%k6G`Ah5{Oz8r~ zE|np(Vv$qoDn`kE3}ZGy_^j1VKwERA;Z>c6ePkvnvxg=gWgwO%1owTs+o2h>M#f2# zUx4lBngYC#-wWl2p;8LD_znNCvBmAFbU7n@GK;14^n5YH5dPwoq~!PIVKkITSO0Tz{1S*D>}*6G46 zap|5sb|5e4lJhVVw-tXt_kqfIr{d;^-l3sEc)*kcwSA7Yi*la=8GRq466e-JFf%eR z@xuiW!gjeer*d%@=9M}5@@n?w`08hK{BB~tGiRf_tJ&4n4Rw04_AKtqZBiSv>CJLH zxmjMDv&nQdHgEaNx?#67cC%#5yOqdxx$s%Q=H7+_!k{R@$^%B1e0?z)nIribp)tp( z#Wjoh`oaZpL5j`kgE_5B1}v|=!_PUlg482;Xs_|6aWY>n=5zJed|nvAb`b>xkkB68 z`)u=o&L5b4n8IKb!wp7?+c6+>!xM}~e-JPJYy4Mw^ItKl8WfCchjqDx$8!~CD41RU zYDGknJ@ZU^x&C$BIWVTL% z7q|oe*PV{sY@RkHMHr2~jUTo=6Q8GpLg`Bs9y~`{{R7vDa>1kh&8g+BsdkpA6i{_K z3pt|3lq&GB$kO1A7Sgd++CGmk?cg!?Cs~d z7P$o*jy8xm>?n%?xRi&H{R%*9*dT|cbdhWmh@GwKq1MJW1{;hDu^IjF=f8a~ z9{xv+;Sv5K_i~QAWS63xm4s8?w#&~^8^Yg@Kr--q{y`4;JLXzW5yZ-ChnuVXv2sVcW)?SAjMmx#3Uv|Xx6wd|AgQ+%t? z&XP05tzH!3RSU3f0hBhr?UKuIF}s~jua;L=vzyt}Vzb-po7LUT)$QzVxm?{%7kTe_ zdZE>_vGy;V%Z$QCl`I6L($DksH>5m0*V)Zs1ICCmQcrp^xb`uS&?!=D;?WOV*bX`U zo3+Ba;kUhJb_vFtPL}5F)Lh*x7t`tLW_){f$AJN_%*AYWy;_>b7_XY`_bfQBo*~!< zt36BWuuGoTxvvDX&#uOI6Kgs#Ia^MzrnijW++AJWOs(n6n%tPn!^~dHUCrsr1VXGX zaeRM)Cw~BtjVR4?QKZ@H4$$E*92eHNCZNm&?1=bjl`&rcoXhrdaxz z)Y`-vb)T-i%zr*spYI*qX~M9oRO4>I*RZVB(V9T%$CwU(l<(_qNY)G6m^(A@$GnVb;lNW)_7rE z-z-++vAMdtyS=@=S>7;n1+00yIg z!Z8eT`{MIYpAA35&+s$+3_ruq@H6}jKf}-PGyDuc!_V+D{G9jC{|Bp=92Eet1OWL8 B_;COL diff --git a/backend/models/core-20230608-083511-exothermic-action.tar.gz b/backend/models/core-20230608-083511-exothermic-action.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8908df3e58fc509a77425dd274b439c2d523e40b GIT binary patch literal 24561 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 BC}98q literal 0 HcmV?d00001 From c110957c3fc11045a0b7853bc3157eb1cc80296f Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:04:17 +0200 Subject: [PATCH 123/159] Change questions --- backend/domain.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 371945f..86c3336 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1310,7 +1310,7 @@ responses: title: "9" - payload: /confirm_confidence{"confidence":"10"} title: "10 (Very confident)" - text: "How confident are you that you can follow the plan?" + text: "How confident are you that you can follow the plan for taking walks?" utter_confidence_repeat: - text: "So your confidence is {confidence}." @@ -1326,7 +1326,7 @@ responses: utter_state_perceived_usefulness: - buttons: - payload: /confirm_perceived_usefulness{"perceived_usefulness":"0"} - title: "0 (I don't think it can help me)" + title: "0 (I think it can hinder me very much)" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"1"} title: "1" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"2"} @@ -1346,8 +1346,8 @@ responses: - payload: /confirm_perceived_usefulness{"perceived_usefulness":"9"} title: "9" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"10"} - title: "10 (I think it can help me)" - text: "To what extent do you think planning can help you take walks?" + title: "10 (I think it can help me very much)" + text: "To what extent do you think planning can help or hinder you in terms of taking walks?" utter_perceived_usefulness_repeat: - text: "So your perceived usefulness is {perceived_usefulness}." @@ -1363,7 +1363,7 @@ responses: utter_state_attitude: - buttons: - payload: /confirm_attitude{"attitude":"0"} - title: "0 (Very useless)" + title: "0 (Bad)" - payload: /confirm_attitude{"attitude":"1"} title: "1" - payload: /confirm_attitude{"attitude":"2"} @@ -1383,8 +1383,8 @@ responses: - payload: /confirm_attitude{"attitude":"9"} title: "9" - payload: /confirm_attitude{"attitude":"10"} - title: "10 (Very useful)" - text: "Please complete the following statement: 'For me, planning walks for the next 3 months would be ...'" + title: "10 (Good)" + text: "Please complete the following statement: 'Making plans for taking walks is...'" utter_attitude_repeat: - text: "So your attitude is {attitude}." @@ -1727,7 +1727,7 @@ responses: title: "9" - payload: /confirm_confidence_goal{"confidence_goal":"10"} title: "10 (I am sure that I can reach my goal)" - text: "How confident or unconfidence are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" + text: "How confident or unconfident are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" utter_thank: - text: "Thank you for all your answers and for your time!" From 6def28d9b65873125bb5c3516097e621b17f963b Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:13:58 +0200 Subject: [PATCH 124/159] Change ending --- backend/data/rules.yml | 2 +- backend/domain.yml | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 25feeaa..9ef0213 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -405,8 +405,8 @@ rules: steps: - intent: confirm_confidence_goal - action: utter_thank - - action: utter_email_reminder - action: utter_prolific_link + - action: utter_post - action: utter_goodbye - action: action_save_goal_plans_and_reward - action: action_rearrange_db diff --git a/backend/domain.yml b/backend/domain.yml index 86c3336..d28e685 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1732,14 +1732,16 @@ responses: utter_thank: - text: "Thank you for all your answers and for your time!" + utter_prolific_link: + - text: "Here is your completion link: ... ." + ### End session - utter_email_reminder: - - text: "That's all for this session. I'll be sending you a message on Prolific right after this session to confirm that you have completed everything." + utter_post: + - text: "That's all for this session. You will soon get invited on Prolific to complete the post questionnaire." + - utter_prolific_link: - - text: "Alright! Then here is your completion link: ... ." utter_goodbye: From 8df285f0122f42ae4225812b8e2422b05b6c12ee Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:16:23 +0200 Subject: [PATCH 125/159] Small changes --- backend/domain.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index d28e685..46229da 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1760,7 +1760,7 @@ responses: utter_default_close_session: - - text: "Please close this window and contact the researcher on prolific." + - text: "Please close this window and contact the researcher on Prolific." utter_error_close_session: @@ -1768,7 +1768,7 @@ responses: session_config: - session_expiration_time: 33 # these are minutes (33 is max. time in Prolific for 6-minute study) + session_expiration_time: 56 # these are minutes (56 is max. time in Prolific for 15-minute study) carry_over_slots_to_new_session: false From bf3a61b884b8a806e5ea6e48457ab76d5b0dc5b0 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:33:11 +0200 Subject: [PATCH 126/159] Change logic for picking time slots --- actions/actions.py | 125 ++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 69 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index da480cc..fcae5ea 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -321,30 +321,6 @@ def run(self, dispatcher: CollectingDispatcher, "sunday_evening" : [sunday_evening, weekends_evening] } - available_timeslots = [[day, days[day][1]] for day in days if days[day][0] == True] - - number_of_timeslots = len(available_timeslots) - - very_high_energy_timeslots = [[available, energy] for [available, energy] in available_timeslots if energy == '4'] - - high_energy_timeslots = [[available, energy] for [available, energy] in available_timeslots if energy == '3'] - - medium_energy_timeslots = [[available, energy] for [available, energy] in available_timeslots if energy == '2'] - - low_energy_timeslots = [[available, energy] for [available, energy] in available_timeslots if energy == '1'] - - very_low_energy_timeslots = [[available, energy] for [available, energy] in available_timeslots if energy == '0'] - - number_of_very_high_energy_timeslots = len(very_high_energy_timeslots) - - number_of_high_energy_timeslots = len(high_energy_timeslots) - - number_of_medium_energy_timeslots = len(medium_energy_timeslots) - - number_of_low_energy_timeslots = len(low_energy_timeslots) - - number_of_very_low_energy_timeslots = len(very_low_energy_timeslots) - minutes_week_1 = 120 if goal == "10000": @@ -353,61 +329,72 @@ def run(self, dispatcher: CollectingDispatcher, weekly_increase = 22 elif goal == "12000": weekly_increase = 25 - - if number_of_timeslots == 4: - - selected = available_timeslots - - else: - - select_slots = 4 - - if number_of_very_high_energy_timeslots > select_slots: - - selected = random.sample(very_high_energy_timeslots, select_slots) - - else: - - selected = very_high_energy_timeslots - - select_slots -= number_of_very_high_energy_timeslots - - if number_of_high_energy_timeslots > select_slots: - - selected += random.sample(high_energy_timeslots, select_slots) - - else: - selected += high_energy_timeslots - - select_slots -= number_of_high_energy_timeslots - - if number_of_medium_energy_timeslots > select_slots: - - selected += random.sample(medium_energy_timeslots, select_slots) - - else: - - selected += medium_energy_timeslots + available_timeslots = [[day, days[day][1]] for day in days if days[day][0] == True] - select_slots -= number_of_medium_energy_timeslots + possibilities = list(combinations(available_timeslots, 4)) - if number_of_low_energy_timeslots > select_slots: - selected += random.sample(low_energy_timeslots, select_slots) + with_three_days = [] - else: + for possibility in possibilities: + if has_days(possibility) >=3: + with_three_days.append(possibility) - selected += low_energy_timeslots + energies = {} + + for possibility in with_three_days: - select_slots -= number_of_low_energy_timeslots + energy = energy_levels(possibility) + + energies[str(possibility)] = energy + + for i in range(4): + + backup = energies.copy() + + without_i = {} + + for k,v in energies.items(): + + if f'{i}' not in v: + without_i[k] = v - if select_slots is not 0: - - selected += random.sample(very_low_energy_timeslots, select_slots) + if (len(without_i) == 0): + energies = backup.copy() + else: + energies = without_i.copy() + + largest_possible_energy = 0 - # dispatcher.utter_message(text=f"Available slots: {available_timeslots}, Selected slots: {selected}") + for k,v in energies.items(): + + energy = 0 + + for i in range(5): + if f'{i}' in v: + energy += i * v[f'{i}'] + + + if energy > largest_possible_energy: + largest_possible_energy = energy + + best_possibilities = [] + + for k,v in energies.items(): + + energy = 0 + + for i in range(5): + if f'{i}' in v: + energy += i * v[f'{i}'] + + if energy == largest_possible_energy: + best_possibilities.append(k) + + + selected = random.choice(best_possibilities) duration_per_timeslot_week_1 = math.ceil(minutes_week_1/4) From 8d2ac33b2d58339aef357d698e2a3b8eff3fc7fc Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:38:59 +0200 Subject: [PATCH 127/159] Add missing import --- actions/actions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/actions/actions.py b/actions/actions.py index fcae5ea..caa0e2e 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -8,6 +8,7 @@ from datetime import datetime from definitions import (DATABASE_HOST, DATABASE_PASSWORD, DATABASE_PORT, DATABASE_USER) +from itertools import combinations from rasa_sdk import Action, FormValidationAction, Tracker from rasa_sdk.executor import CollectingDispatcher from rasa_sdk.events import FollowupAction, SlotSet, UserUttered, ActionExecuted From 4dc84430e61ddd9ae237916d5adcacb2c10ef890 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:42:45 +0200 Subject: [PATCH 128/159] Clarification --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 46229da..da25a9d 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1200,7 +1200,7 @@ responses: title: "11000 steps (or 110 minutes) per day." - payload: /confirm_goal{"goal":"12000"} title: "12000 steps (or 120 minutes) per day." - text: "Please pick one of these options as your goal." + text: "Please pick one of these options as your goal. Remember that this goal represents how many steps you will be able to do in six months from know." utter_confirm_goal: - text: "Great! Take walks regularly and you'll be able to achieve your goal of {goal} steps per day." From c98b7ccd5c7013e8597d5b9f6e09d14db0dad2d2 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:44:29 +0200 Subject: [PATCH 129/159] Add missing functions --- actions/actions.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/actions/actions.py b/actions/actions.py index caa0e2e..4b954c7 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -220,6 +220,34 @@ def round_to_nearest_5(n): def round_to_nearest_half(n): return round(n * 2.0) / 2.0 +def has_days(combination): + + days = [] + + for [time, energy] in combination: + + day = time.split("_")[0] + if day not in days: + days.append(day) + + return len(days) + +def energy_levels(combination): + + energy_levels = {} + + # for i in range(5): + # energy_levels[f"{i}"] = 0 + + for [time, energy] in combination: + + if energy not in energy_levels: + energy_levels[energy] = 1 + else: + energy_levels[energy] += 1 + + return energy_levels + class ActionCreateInitialPlan(Action): From aeaf2d484636e66f5f44cde8beb13ad6c635cce2 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:55:23 +0200 Subject: [PATCH 130/159] Fix logic --- actions/actions.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index 4b954c7..5d09fd9 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -423,11 +423,28 @@ def run(self, dispatcher: CollectingDispatcher, best_possibilities.append(k) - selected = random.choice(best_possibilities) + picked = random.choice(best_possibilities) + + picked = picked[1:-1] + + split = picked.split(", [") + + selected_times = [] + + + for item in split: + item = item.split(", ")[0] + + if "[" in item: + item = item[1:] + + item = item[1:-1] + + + selected_times.append(item) + - duration_per_timeslot_week_1 = math.ceil(minutes_week_1/4) - selected_times = [time_energy[0] for time_energy in selected] custom_order = { "monday_morning": 0, "monday_midday": 1, "monday_afternoon": 2, "monday_evening": 3, @@ -443,6 +460,7 @@ def run(self, dispatcher: CollectingDispatcher, first = selected_times[0] + message = f"""Plan 1: Week 1 - {round_to_nearest_5(duration_per_timeslot_week_1)} minutes at these time slots: {selected_times}. Week 2 - {round_to_nearest_5(math.ceil((minutes_week_1 + weekly_increase)/4))} minutes at these time slots: {selected_times}. Week 3 - Walking for {round_to_nearest_half((minutes_week_1 + 2* weekly_increase)/60.0)} hours, distributed across 4 time slots. Week 4 - Walking for {round_to_nearest_half((minutes_week_1 + 3* weekly_increase)/60.0)} hours, distributed across 4 time slots. Month 2 - Walking for up to {round_to_nearest_half((minutes_week_1 + 7* weekly_increase)/60.0)} hours per week, distributed across 5 time slots. Month 3 - Walking for up to {round_to_nearest_half((minutes_week_1 + 11* weekly_increase)/60.0)} hours per week, distributed across 6 time slots.""" dispatcher.utter_message(text=message) From 98f3e444e43d7aa5d1e66613044eaffc7907644e Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 12:00:44 +0200 Subject: [PATCH 131/159] Add missing variable --- actions/actions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/actions/actions.py b/actions/actions.py index 5d09fd9..f78f2e6 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -460,6 +460,7 @@ def run(self, dispatcher: CollectingDispatcher, first = selected_times[0] + duration_per_timeslot_week_1 = math.ceil(minutes_week_1/4) message = f"""Plan 1: Week 1 - {round_to_nearest_5(duration_per_timeslot_week_1)} minutes at these time slots: {selected_times}. Week 2 - {round_to_nearest_5(math.ceil((minutes_week_1 + weekly_increase)/4))} minutes at these time slots: {selected_times}. Week 3 - Walking for {round_to_nearest_half((minutes_week_1 + 2* weekly_increase)/60.0)} hours, distributed across 4 time slots. Week 4 - Walking for {round_to_nearest_half((minutes_week_1 + 3* weekly_increase)/60.0)} hours, distributed across 4 time slots. Month 2 - Walking for up to {round_to_nearest_half((minutes_week_1 + 7* weekly_increase)/60.0)} hours per week, distributed across 5 time slots. Month 3 - Walking for up to {round_to_nearest_half((minutes_week_1 + 11* weekly_increase)/60.0)} hours per week, distributed across 6 time slots.""" From 4edda103ddaec5e5d88df8d60ad64f03723282db Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 12:11:51 +0200 Subject: [PATCH 132/159] Add delay before text box enabled and blink --- frontend/static/js/script.js | 110 ++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 46 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index b5b6024..c81a844 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -398,83 +398,101 @@ function setBotResponse(response) { else if(response_text[j].includes("What can you take away from this example for yourself? Please type this in the chat.") || response_text[j].includes("The question was: What can you take away from this example for yourself?")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - current_takeaway = 1; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + current_takeaway = 1; + blink_and_select(); + } + ,35000); } else if(response_text[j].includes("How about this example? What can you take away for yourself? Please type this in the chat.") || response_text[j].includes("The question was: What can you take away from this second example for yourself?")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - current_takeaway = 2; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + current_takeaway = 2; + blink_and_select(); + } + ,35000); } else if(response_text[j].includes("Please type your answer as a number with one decimal point.")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - check_week_3 = true; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + check_week_3 = true; + blink_and_select(); + } + ,35000); } else if(response_text[j].includes("You can see the first two weeks planned in detail.")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - check_first_walk = true; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + check_first_walk = true; + blink_and_select(); + } + ,35000); } else if(response_text[j].includes("User barrier: ")){ - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - barrier_strategy = true; - barrier_type = response_text[j].split("User barrier: ")[1]; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + barrier_strategy = true; + barrier_type = response_text[j].split("User barrier: ")[1]; + blink_and_select(); + } + ,35000); } else if(response_text[j].includes("The question was: How can you overcome this barrier?")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - barrier_strategy = true; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + barrier_strategy = true; + blink_and_select(); + } + ,35000); } else if(response_text[j].includes("Would you mind briefly describing your barrier to me in the chat?") || response_text[j].includes("The question was: Would you mind briefly describing your barrier to me in the chat?")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - identified_barrier = true; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + identified_barrier = true; + blink_and_select(); + } + ,35000); } else if(response_text[j].includes("Okay! Now, you have your approach to this barrier. Here is a strategy I thought about.") || response_text[j].includes("The question was: How can you overcome this barrier after having read my suggestion?")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - barrier_repeat = true; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + barrier_repeat = true; + blink_and_select(); + } + ,35000); } else if(response_text[j].includes("Good choice!") || response_text[j].includes("The question was: How do you think planning can help you do this?")){ var BotResponse = '

' + response_text[j] + '

'; $(BotResponse).appendTo(".chats").hide().fadeIn(1000); - - $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - planning = true; - blink_and_select(); + setTimeout(function(){ + $('.usrInput').attr("disabled",false); + $(".usrInput").prop('placeholder', "Type something..."); + planning = true; + blink_and_select(); + } + ,35000); } // otherwise, display the message else{ From e7cc1bb4b7fb26263af0341cea44e096fca459e5 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 12:18:49 +0200 Subject: [PATCH 133/159] Fix delay duration --- frontend/static/js/script.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index c81a844..4f69827 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -404,7 +404,7 @@ function setBotResponse(response) { current_takeaway = 1; blink_and_select(); } - ,35000); + ,5000); } else if(response_text[j].includes("How about this example? What can you take away for yourself? Please type this in the chat.") || response_text[j].includes("The question was: What can you take away from this second example for yourself?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -415,7 +415,7 @@ function setBotResponse(response) { current_takeaway = 2; blink_and_select(); } - ,35000); + ,5000); } else if(response_text[j].includes("Please type your answer as a number with one decimal point.")){ @@ -427,7 +427,7 @@ function setBotResponse(response) { check_week_3 = true; blink_and_select(); } - ,35000); + ,5000); } else if(response_text[j].includes("You can see the first two weeks planned in detail.")){ var BotResponse = '

' + response_text[j] + '

'; @@ -438,7 +438,7 @@ function setBotResponse(response) { check_first_walk = true; blink_and_select(); } - ,35000); + ,5000); } else if(response_text[j].includes("User barrier: ")){ setTimeout(function(){ @@ -448,7 +448,7 @@ function setBotResponse(response) { barrier_type = response_text[j].split("User barrier: ")[1]; blink_and_select(); } - ,35000); + ,5000); } else if(response_text[j].includes("The question was: How can you overcome this barrier?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -459,7 +459,7 @@ function setBotResponse(response) { barrier_strategy = true; blink_and_select(); } - ,35000); + ,5000); } else if(response_text[j].includes("Would you mind briefly describing your barrier to me in the chat?") || response_text[j].includes("The question was: Would you mind briefly describing your barrier to me in the chat?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -470,7 +470,7 @@ function setBotResponse(response) { identified_barrier = true; blink_and_select(); } - ,35000); + ,5000); } else if(response_text[j].includes("Okay! Now, you have your approach to this barrier. Here is a strategy I thought about.") || response_text[j].includes("The question was: How can you overcome this barrier after having read my suggestion?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -481,7 +481,7 @@ function setBotResponse(response) { barrier_repeat = true; blink_and_select(); } - ,35000); + ,5000); } else if(response_text[j].includes("Good choice!") || response_text[j].includes("The question was: How do you think planning can help you do this?")){ var BotResponse = '

' + response_text[j] + '

'; @@ -492,7 +492,7 @@ function setBotResponse(response) { planning = true; blink_and_select(); } - ,35000); + ,5000); } // otherwise, display the message else{ From 452977b615a388492fd4fdaf083d34781a7e87e2 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Thu, 8 Jun 2023 12:42:04 +0200 Subject: [PATCH 134/159] Add model --- ...ore-20230608-083511-exothermic-action.tar.gz | Bin 24561 -> 0 bytes .../core-20230608-101919-light-core.tar.gz | Bin 0 -> 24501 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 backend/models/core-20230608-083511-exothermic-action.tar.gz create mode 100644 backend/models/core-20230608-101919-light-core.tar.gz diff --git a/backend/models/core-20230608-083511-exothermic-action.tar.gz b/backend/models/core-20230608-083511-exothermic-action.tar.gz deleted file mode 100644 index 8908df3e58fc509a77425dd274b439c2d523e40b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24561 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 BC}98q diff --git a/backend/models/core-20230608-101919-light-core.tar.gz b/backend/models/core-20230608-101919-light-core.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..33921c83a6ac053c1f964fc24275f8ca4dc70d3b GIT binary patch literal 24501 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�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 Date: Thu, 15 Jun 2023 15:06:10 +0200 Subject: [PATCH 135/159] Remove send button --- frontend/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/index.html b/frontend/index.html index a1caadb..7ac7b5d 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -37,7 +37,6 @@
-
From 8a280b83b44a5d85e8cd7dcd36539480395a9131 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:34:23 +0200 Subject: [PATCH 136/159] Extend scales --- backend/domain.yml | 164 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 157 insertions(+), 7 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index da25a9d..0b260ad 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -775,6 +775,16 @@ slots: type: categorical influence_conversation: false values: + - -10 + - -9 + - -8 + - -7 + - -6 + - -5 + - -4 + - -3 + - -2 + - -1 - 0 - 1 - 2 @@ -794,6 +804,16 @@ slots: type: categorical influence_conversation: false values: + - -10 + - -9 + - -8 + - -7 + - -6 + - -5 + - -4 + - -3 + - -2 + - -1 - 0 - 1 - 2 @@ -940,6 +960,16 @@ slots: type: categorical influence_conversation: false values: + - -10 + - -9 + - -8 + - -7 + - -6 + - -5 + - -4 + - -3 + - -2 + - -1 - 0 - 1 - 2 @@ -960,6 +990,16 @@ slots: type: categorical influence_conversation: false values: + - -10 + - -9 + - -8 + - -7 + - -6 + - -5 + - -4 + - -3 + - -2 + - -1 - 0 - 1 - 2 @@ -979,6 +1019,16 @@ slots: type: categorical influence_conversation: false values: + - -10 + - -9 + - -8 + - -7 + - -6 + - -5 + - -4 + - -3 + - -2 + - -1 - 0 - 1 - 2 @@ -1325,8 +1375,28 @@ responses: utter_state_perceived_usefulness: - buttons: + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-10"} + title: "-10 (I think it can hinder me very much)" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-9"} + title: "-9" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-8"} + title: "-8" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-7"} + title: "-7" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-6"} + title: "-6" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-5"} + title: "-5" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-4"} + title: "-4" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-3"} + title: "-3" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-2"} + title: "-2" + - payload: /confirm_perceived_usefulness{"perceived_usefulness":"-1"} + title: "-1" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"0"} - title: "0 (I think it can hinder me very much)" + title: "0" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"1"} title: "1" - payload: /confirm_perceived_usefulness{"perceived_usefulness":"2"} @@ -1362,8 +1432,28 @@ responses: utter_state_attitude: - buttons: + - payload: /confirm_attitude{"attitude":"-10"} + title: "-10 (Bad)" + - payload: /confirm_attitude{"attitude":"-9"} + title: "-9" + - payload: /confirm_attitude{"attitude":"-8"} + title: "-8" + - payload: /confirm_attitude{"attitude":"-7"} + title: "-7" + - payload: /confirm_attitude{"attitude":"-6"} + title: "-6" + - payload: /confirm_attitude{"attitude":"-5"} + title: "-5" + - payload: /confirm_attitude{"attitude":"-4"} + title: "-4" + - payload: /confirm_attitude{"attitude":"-3"} + title: "-3" + - payload: /confirm_attitude{"attitude":"-2"} + title: "-2" + - payload: /confirm_attitude{"attitude":"-1"} + title: "-1" - payload: /confirm_attitude{"attitude":"0"} - title: "0 (Bad)" + title: "0" - payload: /confirm_attitude{"attitude":"1"} title: "1" - payload: /confirm_attitude{"attitude":"2"} @@ -1627,8 +1717,28 @@ responses: utter_satisfaction: - buttons: + - payload: /confirm_satisfaction{"satisfaction":"-10"} + title: "-10 (I am very dissatisfied)" + - payload: /confirm_satisfaction{"satisfaction":"-9"} + title: "-9" + - payload: /confirm_satisfaction{"satisfaction":"-8"} + title: "-8" + - payload: /confirm_satisfaction{"satisfaction":"-7"} + title: "-7" + - payload: /confirm_satisfaction{"satisfaction":"-6"} + title: "-6" + - payload: /confirm_satisfaction{"satisfaction":"-5"} + title: "-5" + - payload: /confirm_satisfaction{"satisfaction":"-4"} + title: "-4" + - payload: /confirm_satisfaction{"satisfaction":"-3"} + title: "-3" + - payload: /confirm_satisfaction{"satisfaction":"-2"} + title: "-2" + - payload: /confirm_satisfaction{"satisfaction":"-1"} + title: "-1" - payload: /confirm_satisfaction{"satisfaction":"0"} - title: "0 (I am very dissatisfied)" + title: "0" - payload: /confirm_satisfaction{"satisfaction":"1"} title: "1" - payload: /confirm_satisfaction{"satisfaction":"2"} @@ -1653,8 +1763,28 @@ responses: utter_commitment_1: - buttons: + - payload: /confirm_commitment_1{"commitment_1":"-10"} + title: "-10 (I strongly disagree)" + - payload: /confirm_commitment_1{"commitment_1":"-9"} + title: "-9" + - payload: /confirm_commitment_1{"commitment_1":"-8"} + title: "-8" + - payload: /confirm_commitment_1{"commitment_1":"-7"} + title: "-7" + - payload: /confirm_commitment_1{"commitment_1":"-6"} + title: "-6" + - payload: /confirm_commitment_1{"commitment_1":"-5"} + title: "-5" + - payload: /confirm_commitment_1{"commitment_1":"-4"} + title: "-4" + - payload: /confirm_commitment_1{"commitment_1":"-3"} + title: "-3" + - payload: /confirm_commitment_1{"commitment_1":"-2"} + title: "-2" + - payload: /confirm_commitment_1{"commitment_1":"-1"} + title: "-1" - payload: /confirm_commitment_1{"commitment_1":"0"} - title: "0 (I strongly disagree)" + title: "0" - payload: /confirm_commitment_1{"commitment_1":"1"} title: "1" - payload: /confirm_commitment_1{"commitment_1":"2"} @@ -1679,8 +1809,28 @@ responses: utter_commitment_f: - buttons: + - payload: /confirm_commitment_f{"commitment_f":"-10"} + title: "-10 (I strongly disagree)" + - payload: /confirm_commitment_f{"commitment_f":"-9"} + title: "-9" + - payload: /confirm_commitment_f{"commitment_f":"-8"} + title: "-8" + - payload: /confirm_commitment_f{"commitment_f":"-7"} + title: "-7" + - payload: /confirm_commitment_f{"commitment_f":"-6"} + title: "-6" + - payload: /confirm_commitment_f{"commitment_f":"-5"} + title: "-5" + - payload: /confirm_commitment_f{"commitment_f":"-4"} + title: "-4" + - payload: /confirm_commitment_f{"commitment_f":"-3"} + title: "-3" + - payload: /confirm_commitment_f{"commitment_f":"-2"} + title: "-2" + - payload: /confirm_commitment_f{"commitment_f":"-1"} + title: "-1" - payload: /confirm_commitment_f{"commitment_f":"0"} - title: "0 (I strongly disagree)" + title: "0" - payload: /confirm_commitment_f{"commitment_f":"1"} title: "1" - payload: /confirm_commitment_f{"commitment_f":"2"} @@ -1726,8 +1876,8 @@ responses: - payload: /confirm_confidence_goal{"confidence_goal":"9"} title: "9" - payload: /confirm_confidence_goal{"confidence_goal":"10"} - title: "10 (I am sure that I can reach my goal)" - text: "How confident or unconfident are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" + title: "10 (I am very confident that I can reach my goal)" + text: "How confident are you that you can reach your goal of being able to take {goal} steps per day in six months from now?" utter_thank: - text: "Thank you for all your answers and for your time!" From b00229f3b975de802c95546ea916e04595790cdf Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:46:53 +0200 Subject: [PATCH 137/159] FIx logic errors --- actions/actions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index f78f2e6..b799e15 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -667,14 +667,14 @@ async def run(self, dispatcher: CollectingDispatcher, elif c in [7,8,9,10]: current_c = "high" - if pu in [0,1,2,3,4]: + if pu in range(-10,1): current_pu = "low" - elif pu in [5,6,7,8,9,10]: + elif pu in range(0,11): current_pu = "high" - if a in [0,1,2,3,4]: + if a in range(-10,1): current_a = "low" - elif a in [5,6,7,8,9,10]: + elif a in range(0,11): current_a = "high" # build current state From 24b74577c3c20100a44f30fb77bdb924f73cc4ad Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:49:00 +0200 Subject: [PATCH 138/159] Rewording --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 0b260ad..91dc458 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1168,7 +1168,7 @@ responses: - text: "Let me briefly reiterate what you previously read in the introduction part of this session." utter_intro_2: - - text: "My goal is to help people create plans for taking walks." + - text: "My objective is to help people create plans for taking walks." utter_intro_3: - text: "We'll set a goal for you to reach in 6 months from now, and then create a plan for doing so." From ddb5d02c48ce1852f30789318db2811e90d4af96 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:55:57 +0200 Subject: [PATCH 139/159] Change button layout for new scales --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 4f69827..c4f130d 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -967,7 +967,7 @@ function addSuggestion(textToAdd) { $('
').appendTo(".chats").hide().fadeIn(1000); - if (suggestions[0].title == "Happy"){ + if (suggestions[0].title == "Happy" || suggestions[0].title == "-10 (I think it can hinder me very much)" || suggestions[0].title == "-10 (Bad)" || suggestions[0].title == "-10 (I am very dissatisfied)" || suggestions[0].title == "-10 (I strongly disagree)"){ for (i = 0; i < suggLength; i++) { From 2ba6570461535adc9063febe364c1afefdddc54e Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 12:11:06 +0200 Subject: [PATCH 140/159] Add slots for free text input --- backend/domain.yml | 50 ++++++++++++++++++++++++++++++++++++ frontend/static/js/script.js | 12 ++++----- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 91dc458..a491c7f 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -309,6 +309,9 @@ entities: - explain_planning: influence_conversation: false +- planning_importance_explanation: + influence_conversation: false + - identify_barriers: influence_conversation: false @@ -324,6 +327,12 @@ entities: - barrier_description: influence_conversation: false +- barrier_strategy_1: + influence_conversation: false + +- barrier_strategy_2: + influence_conversation: false + - planning_relevance: influence_conversation: false @@ -339,6 +348,12 @@ entities: - testimonial_2_body: influence_conversation: false +- takeaway_1: + influence_conversation: false + +- takeaway_2: + influence_conversation: false + - action: influence_conversation: false @@ -874,6 +889,13 @@ slots: - type: from_entity entity: planning_relevance + planning_importance_explanation: + type: text + influence_conversation: false + mappings: + - type: from_entity + entity: planning_importance_explanation + identify_barriers: type: bool initial_value: false @@ -903,6 +925,20 @@ slots: - type: from_entity entity: barrier_description + barrier_strategy_1: + type: text + influence_conversation: false + mappings: + - type: from_entity + entity: barrier_strategy_1 + + barrier_strategy_2: + type: text + influence_conversation: false + mappings: + - type: from_entity + entity: barrier_strategy_2 + deal_with_barriers: type: bool initial_value: false @@ -947,6 +983,20 @@ slots: - type: from_entity entity: testimonial_2_body + takeaway_1: + type: text + influence_conversation: false + mappings: + - type: from_entity + entity: takeaway_1 + + takeaway_2: + type: text + influence_conversation: false + mappings: + - type: from_entity + entity: takeaway_2 + actions_done: type: bool diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index c4f130d..7630965 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -61,7 +61,7 @@ $(".usrInput").on("keyup keypress", function (e) { var message = "/takeaway_1_short"; } else{ - var message = "/confirm_takeaway_1"; + var message = `/confirm_takeaway_1{"takeaway_1":"${text}"}`; } setUserResponse(text); @@ -76,7 +76,7 @@ $(".usrInput").on("keyup keypress", function (e) { var message = "/takeaway_2_short"; } else{ - var message = "/confirm_takeaway_2"; + var message = `/confirm_takeaway_2{"takeaway_2":"${text}"}`; current_takeaway = 99; } @@ -128,10 +128,10 @@ $(".usrInput").on("keyup keypress", function (e) { } else{ if(barrier_type != "time" && barrier_type != "energy" && barrier_type != "people" && barrier_type != "equipment" && barrier_type != "family"){ - var message = "/confirm_continue_deal_with_barriers_skip_extra"; + var message = `/confirm_continue_deal_with_barriers_skip_extra{"barrier_strategy_1":"${text}"}`; } else{ - var message = "/confirm_continue_deal_with_barriers_2"; + var message = `/confirm_continue_deal_with_barriers_2{"barrier_strategy_1":"${text}"}`; } } @@ -167,7 +167,7 @@ $(".usrInput").on("keyup keypress", function (e) { var message = "/barrier_repeat_short"; } else{ - var message = "/confirm_continue_deal_with_barriers_3"; + var message = `/confirm_continue_deal_with_barriers_3{"barrier_strategy_2":"${text}"}`; } barrier_repeat = false; @@ -184,7 +184,7 @@ $(".usrInput").on("keyup keypress", function (e) { var message = "/planning_short"; } else{ - var message = "/confirm_planning_input"; + var message = `/confirm_planning_input{"planning_importance_explanation":"${text}"}`; } planning = false; From 07710b52a5e08fae3beca690ff5d37254248d1f3 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 12:31:02 +0200 Subject: [PATCH 141/159] Save more data to database --- actions/actions.py | 37 +++++++++++++++++++++++++++++++++---- db/rasadb.sql | 2 +- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index b799e15..cfa6bf7 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -855,9 +855,9 @@ async def run(self, dispatcher: CollectingDispatcher, return [] -def save_goal_plans_and_reward_to_db(cur, conn, prolific_id, time, goal, plan_1, plan_2, plan_3, reward): - query = "INSERT INTO users(prolific_id, time, goal, plan_1, plan_2, plan_3, reward) VALUES(%s, %s, %s, %s, %s, %s, %s)" - cur.execute(query, [prolific_id, time, goal, plan_1, plan_2, plan_3, reward]) +def save_goal_plans_and_reward_to_db(cur, conn, prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation): + query = "INSERT INTO users(prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" + cur.execute(query, [prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation]) conn.commit() class ActionSaveGoalPlansAndReward(Action): @@ -900,9 +900,38 @@ async def run(self, dispatcher: CollectingDispatcher, confidence_goal = tracker.get_slot("confidence_goal") + testimonial_1_intro = tracker.get_slot("testimonial_1_intro") + + testimonial_1_body = tracker.get_slot("testimonial_1_body") + + testimonial_2_intro = tracker.get_slot("testimonial_2_intro") + + testimonial_2_body = tracker.get_slot("testimonial_2_body") + + testimonial_1 = f"{testimonial_1_intro} {testimonial_1_body}" + + testimonial_2 = f"{testimonial_2_intro} {testimonial_2_body}" + + takeaway_1 = tracker.get_slot("takeaway_1") + + takeaway_2 = tracker.get_slot("takeaway_2") + + identified_barrier = tracker.get_slot("identified_barrier") + + barrier_descripion = tracker.get_slot("barrier_description") + + barrier_strategy_1 = tracker.get_slot("barrier_strategy_1") + + barrier_strategy_2 = tracker.get_slot("barrier_strategy_2") + + planning_relevance = tracker.get_slot("planning_relevance") + + planning_importance_explanation = tracker.get_slot("planning_importance_explanation") + + reward = f"Reward: satifaction = {satisfaction}, commitment_1 = {commitment_1}, commitment_f = {commitment_f}, confidence_goal = {confidence_goal}" - save_goal_plans_and_reward_to_db(cur, conn, prolific_id, formatted_date, goal, plan_1, plan_2, plan_3, reward) + save_goal_plans_and_reward_to_db(cur, conn, prolific_id, formatted_date, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation) except mysql.connector.Error as error: logging.info("Error in saving name to db: " + str(error)) diff --git a/db/rasadb.sql b/db/rasadb.sql index 04af3b9..f11dc79 100644 --- a/db/rasadb.sql +++ b/db/rasadb.sql @@ -3,7 +3,7 @@ use db; CREATE TABLE sessiondata(prolific_id TEXT, time DATETIME, event TEXT); -CREATE TABLE users(prolific_id TEXT, time DATETIME, goal TEXT, plan_1 TEXT, plan_2 TEXT, plan_3 TEXT, reward TEXT); +CREATE TABLE users(prolific_id TEXT, time DATETIME, goal TEXT, plan_1 TEXT, plan_2 TEXT, plan_3 TEXT, reward TEXT, testimonial_1 TEXT, takeaway_1 TEXT, testimonial_2 TEXT, takeaway_2 TEXT, identified_barrier TEXT, barrier_descripion TEXT, barrier_strategy_1 TEXT, barrier_strategy_2 TEXT, planning_relevance TEXT, planning_importance_explanation TEXT); CREATE TABLE state_action_state(prolific_id TEXT, time DATETIME, state_before TEXT, action TEXT, state_after TEXT); From 88840870651aade2c7d5303b84325f2a496e0ede Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:13:24 +0200 Subject: [PATCH 142/159] Set barrier type earlier --- frontend/static/js/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 7630965..594d761 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -444,8 +444,8 @@ function setBotResponse(response) { setTimeout(function(){ $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); - barrier_strategy = true; barrier_type = response_text[j].split("User barrier: ")[1]; + barrier_strategy = true; blink_and_select(); } ,5000); From 706f286e40076c95efe95cf7296ac20fd4178483 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:26:16 +0200 Subject: [PATCH 143/159] Print message for debugging --- frontend/static/js/script.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 594d761..546e18a 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -444,6 +444,7 @@ function setBotResponse(response) { setTimeout(function(){ $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); + console.log(response_text[j]); barrier_type = response_text[j].split("User barrier: ")[1]; barrier_strategy = true; blink_and_select(); From dc9aea557df4c1a0f3d177e1b4b3559fbdb0f0ae Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:44:29 +0200 Subject: [PATCH 144/159] Print message earlier --- frontend/static/js/script.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 546e18a..4935fd8 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -291,6 +291,8 @@ function setBotResponse(response) { if (response[0].hasOwnProperty("text")) { var response_text = response[0].text.split("\n") for (j = 0; j < response_text.length; j++){ + + console.log(response_text[j]); if(response_text[j].includes("Great! Take walks regularly and you'll be able to achieve your goal")){ var BotResponse = '

' + response_text[j] + '

'; @@ -441,6 +443,7 @@ function setBotResponse(response) { ,5000); } else if(response_text[j].includes("User barrier: ")){ + console.log(response_text[j]); setTimeout(function(){ $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); From dd56278ad132bced79e84372b4ac2659d92a54f8 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:56:11 +0200 Subject: [PATCH 145/159] Move statement --- frontend/static/js/script.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 4935fd8..248aa11 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -444,11 +444,11 @@ function setBotResponse(response) { } else if(response_text[j].includes("User barrier: ")){ console.log(response_text[j]); + barrier_type = response_text[j].split("User barrier: ")[1]; setTimeout(function(){ $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Type something..."); - console.log(response_text[j]); - barrier_type = response_text[j].split("User barrier: ")[1]; + console.log(response_text[j]); barrier_strategy = true; blink_and_select(); } From 7c1e928db8990429eed9c7f83ea86ae06611c30a Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 14:19:42 +0200 Subject: [PATCH 146/159] Remove logs in javascript, add display message to final db save --- actions/actions.py | 2 ++ frontend/static/js/script.js | 6 +----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index cfa6bf7..207f89b 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -880,6 +880,8 @@ async def run(self, dispatcher: CollectingDispatcher, port=DATABASE_PORT, database='db' ) + + dispatcher.utter_message(text=f"I am saving to db") cur = conn.cursor(prepared=True) prolific_id = tracker.current_state()['sender_id'] diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 248aa11..0b61195 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -291,8 +291,6 @@ function setBotResponse(response) { if (response[0].hasOwnProperty("text")) { var response_text = response[0].text.split("\n") for (j = 0; j < response_text.length; j++){ - - console.log(response_text[j]); if(response_text[j].includes("Great! Take walks regularly and you'll be able to achieve your goal")){ var BotResponse = '

' + response_text[j] + '

'; @@ -443,12 +441,10 @@ function setBotResponse(response) { ,5000); } else if(response_text[j].includes("User barrier: ")){ - console.log(response_text[j]); barrier_type = response_text[j].split("User barrier: ")[1]; setTimeout(function(){ $('.usrInput').attr("disabled",false); - $(".usrInput").prop('placeholder', "Type something..."); - console.log(response_text[j]); + $(".usrInput").prop('placeholder', "Type something..."); barrier_strategy = true; blink_and_select(); } From 6ac1079817ff86c10c4c8e3763dff5ddddbeedac Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 14:36:55 +0200 Subject: [PATCH 147/159] Add initial values for slots and print --- actions/actions.py | 3 ++- backend/domain.yml | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/actions/actions.py b/actions/actions.py index 207f89b..6414e71 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -881,7 +881,6 @@ async def run(self, dispatcher: CollectingDispatcher, database='db' ) - dispatcher.utter_message(text=f"I am saving to db") cur = conn.cursor(prepared=True) prolific_id = tracker.current_state()['sender_id'] @@ -930,6 +929,8 @@ async def run(self, dispatcher: CollectingDispatcher, planning_importance_explanation = tracker.get_slot("planning_importance_explanation") + dispatcher.utter_message(text=f"{prolific_id}, {formatted_date}, {goal}, {plan_1}, {plan_2}, {plan_3}, {reward}, {testimonial_1}, {takeaway_1}, {testimonial_2}, {takeaway_2}, {identified_barrier}, {barrier_descripion}, {barrier_strategy_1}, {barrier_strategy_2}, {planning_relevance}, {planning_importance_explanation}") + reward = f"Reward: satifaction = {satisfaction}, commitment_1 = {commitment_1}, commitment_f = {commitment_f}, confidence_goal = {confidence_goal}" diff --git a/backend/domain.yml b/backend/domain.yml index a491c7f..c742a8e 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -891,6 +891,7 @@ slots: planning_importance_explanation: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -920,6 +921,7 @@ slots: barrier_description: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -927,6 +929,7 @@ slots: barrier_strategy_1: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -934,6 +937,7 @@ slots: barrier_strategy_2: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -957,6 +961,7 @@ slots: testimonial_1_intro: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -964,6 +969,7 @@ slots: testimonial_1_body: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -971,6 +977,7 @@ slots: testimonial_2_intro: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -978,6 +985,7 @@ slots: testimonial_2_body: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -985,6 +993,7 @@ slots: takeaway_1: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity @@ -992,6 +1001,7 @@ slots: takeaway_2: type: text + initial_value: '' influence_conversation: false mappings: - type: from_entity From 6a493b2b84998427f9975f9b097ffa2b37b9c56f Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Fri, 23 Jun 2023 14:51:27 +0200 Subject: [PATCH 148/159] Move utter to the right place --- actions/actions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/actions/actions.py b/actions/actions.py index 6414e71..8986601 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -929,11 +929,12 @@ async def run(self, dispatcher: CollectingDispatcher, planning_importance_explanation = tracker.get_slot("planning_importance_explanation") - dispatcher.utter_message(text=f"{prolific_id}, {formatted_date}, {goal}, {plan_1}, {plan_2}, {plan_3}, {reward}, {testimonial_1}, {takeaway_1}, {testimonial_2}, {takeaway_2}, {identified_barrier}, {barrier_descripion}, {barrier_strategy_1}, {barrier_strategy_2}, {planning_relevance}, {planning_importance_explanation}") reward = f"Reward: satifaction = {satisfaction}, commitment_1 = {commitment_1}, commitment_f = {commitment_f}, confidence_goal = {confidence_goal}" + dispatcher.utter_message(text=f"{prolific_id}, {formatted_date}, {goal}, {plan_1}, {plan_2}, {plan_3}, {reward}, {testimonial_1}, {takeaway_1}, {testimonial_2}, {takeaway_2}, {identified_barrier}, {barrier_descripion}, {barrier_strategy_1}, {barrier_strategy_2}, {planning_relevance}, {planning_importance_explanation}") + save_goal_plans_and_reward_to_db(cur, conn, prolific_id, formatted_date, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation) except mysql.connector.Error as error: From db07723173ec096abadfb9745e1b381e676428cf Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 25 Jun 2023 13:28:53 +0200 Subject: [PATCH 149/159] Remove delay for debugging --- frontend/static/js/script.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 0b61195..1326903 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -272,7 +272,8 @@ function setBotResponse(response) { //display bot response after the number of miliseconds caputred by the variable 'delay_first_message' var delay_first_message = 500; if (response.length >=1) { - delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); + // delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); + delay_first_message = 1; } setTimeout(function () { hideBotTyping(); @@ -515,7 +516,8 @@ function setBotResponse(response) { //if there is more than 1 message from the bot if (response.length > 1){ //show typing symbol again - var delay_typing = 600 + delay_first_message; + // var delay_typing = 600 + delay_first_message; + var delay_typing = 1; setTimeout(function () { showBotTyping(); }, delay_typing) @@ -525,7 +527,7 @@ function setBotResponse(response) { for (var i = 1; i < response.length; i++){ //Add delay based on the length of the next message - summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); + // summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); doScaledTimeout(i, response, summed_timeout) } From b6771c8ec01cce49e05b0f5871f2c53801f45a12 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 25 Jun 2023 13:57:03 +0200 Subject: [PATCH 150/159] Fix typos, add back delay --- actions/actions.py | 12 ++++++------ db/rasadb.sql | 2 +- frontend/static/js/script.js | 7 ++----- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index 8986601..f51e27e 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -855,9 +855,9 @@ async def run(self, dispatcher: CollectingDispatcher, return [] -def save_goal_plans_and_reward_to_db(cur, conn, prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation): - query = "INSERT INTO users(prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" - cur.execute(query, [prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation]) +def save_goal_plans_and_reward_to_db(cur, conn, prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_description, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation): + query = "INSERT INTO users(prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_description, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" + cur.execute(query, [prolific_id, time, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_description, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation]) conn.commit() class ActionSaveGoalPlansAndReward(Action): @@ -919,7 +919,7 @@ async def run(self, dispatcher: CollectingDispatcher, identified_barrier = tracker.get_slot("identified_barrier") - barrier_descripion = tracker.get_slot("barrier_description") + barrier_description = tracker.get_slot("barrier_description") barrier_strategy_1 = tracker.get_slot("barrier_strategy_1") @@ -933,9 +933,9 @@ async def run(self, dispatcher: CollectingDispatcher, reward = f"Reward: satifaction = {satisfaction}, commitment_1 = {commitment_1}, commitment_f = {commitment_f}, confidence_goal = {confidence_goal}" - dispatcher.utter_message(text=f"{prolific_id}, {formatted_date}, {goal}, {plan_1}, {plan_2}, {plan_3}, {reward}, {testimonial_1}, {takeaway_1}, {testimonial_2}, {takeaway_2}, {identified_barrier}, {barrier_descripion}, {barrier_strategy_1}, {barrier_strategy_2}, {planning_relevance}, {planning_importance_explanation}") + dispatcher.utter_message(text=f"{prolific_id}, {formatted_date}, {goal}, {plan_1}, {plan_2}, {plan_3}, {reward}, {testimonial_1}, {takeaway_1}, {testimonial_2}, {takeaway_2}, {identified_barrier}, {barrier_description}, {barrier_strategy_1}, {barrier_strategy_2}, {planning_relevance}, {planning_importance_explanation}") - save_goal_plans_and_reward_to_db(cur, conn, prolific_id, formatted_date, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_descripion, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation) + save_goal_plans_and_reward_to_db(cur, conn, prolific_id, formatted_date, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_description, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation) except mysql.connector.Error as error: logging.info("Error in saving name to db: " + str(error)) diff --git a/db/rasadb.sql b/db/rasadb.sql index f11dc79..f1fafe5 100644 --- a/db/rasadb.sql +++ b/db/rasadb.sql @@ -3,7 +3,7 @@ use db; CREATE TABLE sessiondata(prolific_id TEXT, time DATETIME, event TEXT); -CREATE TABLE users(prolific_id TEXT, time DATETIME, goal TEXT, plan_1 TEXT, plan_2 TEXT, plan_3 TEXT, reward TEXT, testimonial_1 TEXT, takeaway_1 TEXT, testimonial_2 TEXT, takeaway_2 TEXT, identified_barrier TEXT, barrier_descripion TEXT, barrier_strategy_1 TEXT, barrier_strategy_2 TEXT, planning_relevance TEXT, planning_importance_explanation TEXT); +CREATE TABLE users(prolific_id TEXT, time DATETIME, goal TEXT, plan_1 TEXT, plan_2 TEXT, plan_3 TEXT, reward TEXT, testimonial_1 TEXT, takeaway_1 TEXT, testimonial_2 TEXT, takeaway_2 TEXT, identified_barrier TEXT, barrier_description TEXT, barrier_strategy_1 TEXT, barrier_strategy_2 TEXT, planning_relevance TEXT, planning_importance_explanation TEXT); CREATE TABLE state_action_state(prolific_id TEXT, time DATETIME, state_before TEXT, action TEXT, state_after TEXT); diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 1326903..07d8a7a 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -272,8 +272,6 @@ function setBotResponse(response) { //display bot response after the number of miliseconds caputred by the variable 'delay_first_message' var delay_first_message = 500; if (response.length >=1) { - // delay_first_message = Math.min(Math.max(response[0].text.length * 45, 800), 5000); - delay_first_message = 1; } setTimeout(function () { hideBotTyping(); @@ -516,8 +514,7 @@ function setBotResponse(response) { //if there is more than 1 message from the bot if (response.length > 1){ //show typing symbol again - // var delay_typing = 600 + delay_first_message; - var delay_typing = 1; + var delay_typing = 600 + delay_first_message; setTimeout(function () { showBotTyping(); }, delay_typing) @@ -527,7 +524,7 @@ function setBotResponse(response) { for (var i = 1; i < response.length; i++){ //Add delay based on the length of the next message - // summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); + summed_timeout += Math.min(Math.max(response[i].text.length * 45, 800), 5000); doScaledTimeout(i, response, summed_timeout) } From 09daa2781860532f13c11a8ff5d03c1130d06be3 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 25 Jun 2023 14:06:23 +0200 Subject: [PATCH 151/159] Remove final utter --- actions/actions.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index f51e27e..18695c9 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -933,8 +933,6 @@ async def run(self, dispatcher: CollectingDispatcher, reward = f"Reward: satifaction = {satisfaction}, commitment_1 = {commitment_1}, commitment_f = {commitment_f}, confidence_goal = {confidence_goal}" - dispatcher.utter_message(text=f"{prolific_id}, {formatted_date}, {goal}, {plan_1}, {plan_2}, {plan_3}, {reward}, {testimonial_1}, {takeaway_1}, {testimonial_2}, {takeaway_2}, {identified_barrier}, {barrier_description}, {barrier_strategy_1}, {barrier_strategy_2}, {planning_relevance}, {planning_importance_explanation}") - save_goal_plans_and_reward_to_db(cur, conn, prolific_id, formatted_date, goal, plan_1, plan_2, plan_3, reward, testimonial_1, takeaway_1, testimonial_2, takeaway_2, identified_barrier, barrier_description, barrier_strategy_1, barrier_strategy_2, planning_relevance, planning_importance_explanation) except mysql.connector.Error as error: From 867c8cc93ae181646e9386670c95ec3a7b920c9c Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 25 Jun 2023 14:07:13 +0200 Subject: [PATCH 152/159] Change confidence question --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index c742a8e..90792bd 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1420,7 +1420,7 @@ responses: title: "9" - payload: /confirm_confidence{"confidence":"10"} title: "10 (Very confident)" - text: "How confident are you that you can follow the plan for taking walks?" + text: "How confident are you that you can follow the whole plan for 3 months?" utter_confidence_repeat: - text: "So your confidence is {confidence}." From eb06f29a0fcd86628a1f23a0f40d0f21d7e2b6c0 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 25 Jun 2023 15:10:43 +0200 Subject: [PATCH 153/159] Add slot for first walk text --- backend/domain.yml | 11 +++++++++++ frontend/static/js/script.js | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 90792bd..2ffbf70 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -288,6 +288,10 @@ entities: - plan_check_first_walk: influence_conversation: false + +- first_walk: + influence_conversation: false + - goal: influence_conversation: false @@ -844,6 +848,13 @@ slots: - type: from_entity entity: attitude + first_walk: + type: text + influence_conversation: false + mappings: + - type: from_entity + entity: first_walk + last_action: type: text influence_conversation: false diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 07d8a7a..184dae9 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -89,10 +89,10 @@ $(".usrInput").on("keyup keypress", function (e) { if(text==first_walk){ - var message = "/first_walk_correct"; + var message = `/first_walk_correct{"first_walk":"${text}"}`; } else{ - var message = "/first_walk_incorrect"; + var message = `/first_walk_incorrect{"first_walk":"${text}"}`; } setUserResponse(text); send(message); From 7abcd2546052edd943a19b41dc10f8a7835a4d7b Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 25 Jun 2023 15:22:43 +0200 Subject: [PATCH 154/159] Add message for week 3 --- backend/domain.yml | 12 ++++++++++++ frontend/static/js/script.js | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/domain.yml b/backend/domain.yml index 2ffbf70..2e94d78 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -289,6 +289,10 @@ entities: influence_conversation: false +- first_walk: + influence_conversation: false + + - first_walk: influence_conversation: false @@ -855,6 +859,14 @@ slots: - type: from_entity entity: first_walk + + week_3: + type: text + influence_conversation: false + mappings: + - type: from_entity + entity: week_3 + last_action: type: text influence_conversation: false diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 184dae9..45ed377 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -107,10 +107,10 @@ $(".usrInput").on("keyup keypress", function (e) { text = parseFloat(text).toFixed(1); if(text==week_3_time){ - var message = "/week_3_correct"; + var message = `/week_3_correct{"week_3":"${text}"}`; } else{ - var message = "/week_3_incorrect"; + var message = `/week_3_incorrect{"week_3":"${text}"}`; } setUserResponse(text); From 60c9afac3aeba4beff53bd2d7cf766ba11138d77 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Sun, 25 Jun 2023 15:25:25 +0200 Subject: [PATCH 155/159] fix typo --- backend/domain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/domain.yml b/backend/domain.yml index 2e94d78..0b11814 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -293,7 +293,7 @@ entities: influence_conversation: false -- first_walk: +- week_3: influence_conversation: false - goal: From f0faee46b04554097bac7a63dc006b320f2b6fd7 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Mon, 26 Jun 2023 10:53:27 +0200 Subject: [PATCH 156/159] Change table display --- frontend/static/css/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 29d80e6..8099d74 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -48,8 +48,8 @@ body { .plan_table{ display: none; - width: 875px; - height: 700 px; + width: 57%; + height: 95%; left: 1%; bottom: 2%; top: 2%; From 1280099269fd3e46880c20b74dfc836e9015d862 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Mon, 3 Jul 2023 11:12:37 +0200 Subject: [PATCH 157/159] Fix ranges --- actions/actions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index 18695c9..eb10d02 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -667,12 +667,12 @@ async def run(self, dispatcher: CollectingDispatcher, elif c in [7,8,9,10]: current_c = "high" - if pu in range(-10,1): + if pu in range(-10,0): current_pu = "low" elif pu in range(0,11): current_pu = "high" - if a in range(-10,1): + if a in range(-10,0): current_a = "low" elif a in range(0,11): current_a = "high" From 07b7cdbac415fab880890727690c42cc8ddac814 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:05:41 +0100 Subject: [PATCH 158/159] Remove unused code --- actions/actions.py | 7 ------ backend/data/rules.yml | 26 ----------------------- backend/domain.yml | 40 ----------------------------------- frontend/static/css/style.css | 13 ------------ frontend/static/js/script.js | 2 -- 5 files changed, 88 deletions(-) diff --git a/actions/actions.py b/actions/actions.py index eb10d02..60e058a 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -236,9 +236,6 @@ def energy_levels(combination): energy_levels = {} - # for i in range(5): - # energy_levels[f"{i}"] = 0 - for [time, energy] in combination: if energy not in energy_levels: @@ -626,10 +623,6 @@ async def run(self, dispatcher: CollectingDispatcher, # we want to make at most 2 changes to the initial plan and to not change the plan twice in a row if last_action != "changes_to_plan" and changes_to_plan<=1: possible_actions.append("changes_to_plan") - # # we want to avoid a situation where people change the plan, do a different action, change the plan again, and then end - # if changes_to_plan == 1 and number_actions == 2: - # if "changes_to_plan" in possible_actions: - # possible_actions.remove("changes_to_plan") # we want to explain planning only once if explain_planning == False: possible_actions.append("explain_planning") diff --git a/backend/data/rules.yml b/backend/data/rules.yml index 9ef0213..dd715ea 100644 --- a/backend/data/rules.yml +++ b/backend/data/rules.yml @@ -80,27 +80,6 @@ rules: - action: utter_intro_4 -# - rule: confirm usage explain purpose -# steps: -# - intent: confirm_usage -# - action: utter_button -# - action: utter_purpose_1 -# - action: utter_purpose_2 -# - action: utter_continue_purpose_1 - -# - rule: continue purpose 1 -# steps: -# - intent: confirm_continue_purpose_1 -# - action: utter_purpose_3 -# - action: utter_confirm_purpose - -# - rule: confirm purpose explain planning -# steps: -# - intent: confirm_purpose -# - action: utter_explain_usefulness_planning_1 -# - action: utter_explain_usefulness_planning_2 -# - action: utter_explain_usefulness_planning_question - - rule: confirm usefulness planning explain goal steps: @@ -193,22 +172,18 @@ rules: - rule: confirm confidence ask perceived usefulness steps: - intent: confirm_confidence - # - action: utter_confidence_repeat - action: utter_thank_for_confidence - action: utter_state_perceived_usefulness - rule: confirm perceived usefulness ask attitude steps: - intent: confirm_perceived_usefulness - # - action: utter_perceived_usefulness_repeat - action: utter_thank_for_perceived_usefulness - action: utter_state_attitude - rule: confirm attitude do action ask confidence steps: - intent: confirm_attitude - # - action: utter_attitude_repeat\ - # - action: utter_thank_for_attitude - action: action_save_event_state - action: action_check_dialogue_done @@ -371,7 +346,6 @@ rules: - action: utter_changes_to_plan_4 - action: utter_changes_to_plan_5 - action: utter_changes_to_plan_6 - # - action: utter_changes_to_plan_7 - rule: receive modified plan diff --git a/backend/domain.yml b/backend/domain.yml index 0b11814..a03e9d0 100644 --- a/backend/domain.yml +++ b/backend/domain.yml @@ -1608,20 +1608,6 @@ responses: utter_thank_for_planning_explanation: - text: "I see. Thanks for sharing. Here is what I think planning can help with." - # utter_explain_planning_5: - # - text: "By creating a plan that is consistent across different weeks, it will be easier for you to form a habit of when you should go for a walk." - - # utter_explain_planning_6: - # - text: "Besides this, the plan shows you what you will be able to achieve in the end, so you have an idea of the goal you are working towards." - - # utter_explain_planning_7: - # - text: "Planning can also help you identify and deal with obstacles that might prevent you from going on your walks." - - # utter_explain_planning_8: - # - text: "By anticipating these obstacles and devising strategies for overcoming them ahead of time, it will be easier to deal with them when they happen." - - - utter_identify_barriers_1: - text: "That is good to know. Thank you. \n I think it might be useful to think of some barriers, or things that might stop or prevent you from taking walks regularly." @@ -1650,20 +1636,6 @@ responses: utter_identify_barriers_5: - text: "Thank you for telling me!" - # utter_identify_barriers_7: - # - text: "Maybe you don't have shoes that are comfortable to take longer walks in." - - # utter_identify_barriers_8: - # - text: "It could also be that you have young children to take care of and that leaves you with little time." - - # utter_identify_barriers_9: - # - text: "All of these are barriers which could prevent you from taking a walk. Think if these apply to you specifically." - - # utter_identify_barriers_10: - # - text: "You can also try to come up with some things that you know have been barriers in the past. Think about which of these barriers apply to you and let me know when you are ready to proceed." - - - utter_deal_with_barriers_1: - text: "Thank you for telling me! \n We've previously thought of barriers which might prevent you from taking walks regularly." @@ -1700,18 +1672,6 @@ responses: utter_deal_with_barriers_9: - text: "Great! Thank you for sharing!" - # utter_deal_with_barriers_10: - # - text: "In terms of energy, think back to when we talked about when you feel most energetic during the day. Aim to schedule walks at those times, since it will be easier for you that way." - - # utter_deal_with_barriers_11: - # - text: "Try to go to the gym when it's a bit quieter if you don't like it when other people can see you doing physical activity. It is not absolutely necessary to go to a gym, especially if you're only taking walks. Try walking in a park nearby or simply on the sidewalk." - - # utter_deal_with_barriers_12: - # - text: "Another common barrier is not having the right equipment. For walking in particular, the only thing you really need are shoes that are comfortable for you, so putting aside some money for that can be a relatively simple strategy." - - # utter_deal_with_barriers_13: - # - text: "If you have children to take care of, it might be a good idea to take them on regular walks with you. That way you can fulfill your family obligations and make progress towards your goal." - utter_show_testimonials_1: - text: "Thanks for letting me know. \n Seeing other people make plans and see how they succeed with regards to their goals is something that might help you." diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css index 8099d74..5801715 100644 --- a/frontend/static/css/style.css +++ b/frontend/static/css/style.css @@ -34,7 +34,6 @@ body { } .chats { - /* display: none; */ /* Set height of chat area within window in fullscreen mode*/ height: 81%; padding: 2px; @@ -117,9 +116,6 @@ body { div.chats::-webkit-scrollbar { overflow-y: hidden; width: 0px; - /* remove scrollbar space / - background: transparent; - / optional: just make scrollbar invisible */ } .clearfix { @@ -128,12 +124,10 @@ div.chats::-webkit-scrollbar { } .botAvatar { -/* border-radius: 50%; */ width: 1.5em; height: 1.5em; float: left; margin-left: 5px; - /* border: 2px solid #2ed59f ; */ } .botMsg { @@ -193,7 +187,6 @@ textarea-webkit-scrollbar { height: 1.5em; float: right; margin-right: 5px; - /* border: 2px solid #2ed59f ; */ } .usrInput { @@ -206,7 +199,6 @@ textarea-webkit-scrollbar { } .keypad { - /* display: none; */ background: white; height: 50px; position: absolute; @@ -495,9 +487,6 @@ div.content::-webkit-scrollbar { div.content_data::-webkit-scrollbar { overflow-y: hidden; width: 0px; - /* remove scrollbar space / - background: transparent; - / optional: just make scrollbar invisible */ } @@ -734,9 +723,7 @@ div.content_data::-webkit-scrollbar { display: inline-block; margin-bottom: 1px; font-size: 15px; - /* font-weight: 600; */ padding: 5px; - /* color: #2ed59f; */ color: #ffffff; cursor: pointer; } diff --git a/frontend/static/js/script.js b/frontend/static/js/script.js index 45ed377..f544d67 100644 --- a/frontend/static/js/script.js +++ b/frontend/static/js/script.js @@ -988,7 +988,6 @@ function addSuggestion(textToAdd) { // on click of suggestions, get the value and send to rasa $(document).on("click", ".menu .menuChips", function () { - // $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Use the buttons to communicate with Jamie."); var text = this.innerText; var payload = this.getAttribute('data-payload'); @@ -1004,7 +1003,6 @@ $(document).on("click", ".menu .menuChips", function () { // on click of suggestions, get the value and send to rasa $(document).on("click", ".menuCustom .menuChipsCustom", function () { - // $('.usrInput').attr("disabled",false); $(".usrInput").prop('placeholder', "Use the buttons to communicate with Jamie."); var text = this.innerText; var payload = this.getAttribute('data-payload'); From 6c570496221e211e1cce96463a450a9b9272ee89 Mon Sep 17 00:00:00 2001 From: Andrei <56655325+AndrewStefan@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:48:59 +0100 Subject: [PATCH 159/159] Update README and add images --- README.md | 385 +++++----------------------------- Readme_images/chat button.png | Bin 0 -> 11791 bytes Readme_images/chat.png | Bin 0 -> 73350 bytes Readme_images/dialogue.png | Bin 0 -> 121355 bytes 4 files changed, 55 insertions(+), 330 deletions(-) create mode 100644 Readme_images/chat button.png create mode 100644 Readme_images/chat.png create mode 100644 Readme_images/dialogue.png diff --git a/README.md b/README.md index f6dc10d..c080782 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,60 @@ -# rasa_example_project -Example for setting up a conversational agent based on Rasa Open Source on a Google Compute Engine instance. The conversational agent in this example interacts with people in 5 conversational sessions. +# Dyadic Physical Activity Planning with a Virtual Coach: Using Reinforcement Learning to Select Persuasive Strategies -Based on this Github repository (https://github.com/AmirStudy/Rasa_Deployment) as well as the work by Tom Jacobs (https://github.com/TomJ-EU/rasa/tree/dev). +This github repository contains the code for the virtual coach Jamie, that is created for the thesis project titled "Dyadic Physical Activity Planning with a Virtual Coach: Using Reinforcement Learning to Select Persuasive Strategies." Jamie was used to gather data dring an observational study. Please refer to the [OSF pre-registration](https://doi.org/10.17605/OSF.IO/8ADP9) for more details on the observational study. For the code used to create a reinforcement learning model based on the data gathered, and for the code used for the analysis of this model, please refer to the [published data and code](https://doi.org/10.4121/2796f502-0610-4a7d-a8ee-ebc36639e0b1). +## Dialogue flow -## Components +In the observational study, people talked to the virtual code in a single session. During this session, the virtual coach first introduced itself and asked the person how they are feeling. Then, the person could pick a goal for walking, after which they were asked to indicate when they are free and how their energy levels change throughout the day. Using this information, an initial plan for taking walks was created. To gather the data needed for the reinforcement learning model, the virtual coach then asked three questions about the person's situation, composed on confidence in following the plan, perceived usefulness of planning, and attitude towards planning. Next, the virtual coach would use a random persuasive strategy and ask these questions again. This repeated until at least two persuasive strategies were used and until the person's confidence, perceived usefulness and attitude were high enough to assume that they would commit to the plan. Before ending the conversation, the virtual coach asked four more questions to gather the reward signal, composed on the person's satisfaction with the dialogue, their commitment ot the firts two weeks and to the entire plan, and their confidence in reaching the goal. -This virtual coach consists of a backend based on Rasa Open Source (backend), a custom action server (actions), a frontend (frontend), a database (db), an SQLTrackerStore, and Nginx. + + + +## System architecture + +### Frontend + +The frontend is a html-page. Accessing the page via localhost requires to provide a user id and session number in the URL. For example, `localhost/?userid=1` opens the conversation for the user with id 1. + +Files: +- static/css/style.css contains the stylesheet for the html-page. +- static/js/script.js contains the functions for the interaction between the user and the chatbot and for the communication between front- and backend. +- index.html contains the code for the frontend html-page. +- server.js contains the code to start the server and initialize the correct session. + +### Backend + +The backend is a combination of files that split the logic of what the chatbot should say, what internal actions should be taken and which variables to keep during the session. + +Files: +- data/rules.yml contains the rules of the chatbot, stating what to do when something is triggered by the user or chatbot itself. +- models contains the trained models for the chatbot to use with all the rules, actions and other information. +- domain.yml contains the actual phrases of the chatbot and the variables that need to be tracked during the conversation. + +### Actions + +The actions is a file containing all the logic in relation to database access and calculations needed during the conversation which can be used by the backend files. + +Files: +- actions.py containing all the logic in relation to database access and calculations needed during the conversation. + +### Database (db) + +The database is a Mysql database storing all the relevant information from the conversation. +Meanwhile, a Postgres database stores all the session details, for example, every utterance of the chatbot and user. + +## Running the virtual coach locally + +To run the chatbot locally: +1. Install Docker (in case you have not), which you can do by following the instructions [here](https://docs.docker.com/get-docker/). +2. Install Docker-compose by running: + - `sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose` + - `sudo chmod +x /usr/local/bin/docker-compose` +3. Create a fork and clone this project. +4. Navigate to the root folder of this project (where this README is located). +5. Run `./run.sh` to build the rasa model, build docker and bootup the server for the chatbot. +6. Open `localhost/?userid=` and replace \ and \ with the user id. + +Note that the virtual coach checks if there is already data for a specific user in the database and will prevent the same user from starting the conversation multiple times. The first time data is saved to the database is after the virtual coach asks the three repeating questions, so if a cetrain user id got to that point, it is saved in the database and when trying to start the conversation again, the virtual coach will not let you start the conversation. ## Setup on Google Compute Engine @@ -59,73 +107,15 @@ To run this project on a Google Compute Engine, I followed these steps: - And if you are not using Nginx, you also need to open port 3000 on your Google Compute Engine instance for tcp. - Open the chat here: - + - The button can be very small on your phone. - The chat should look something like this: - + - - Right now I have set the code in frontend/static/css/style.css such that the chat is always opened in fullscreen. See this code: - - ```css - .widget { - display: none; - width: 98%; - right: 1%; - left: 1%; - height: 98%; - bottom: 2%; - position: fixed; - background: #f7f7f7; - border-radius: 10px 10px 10px 10px; - box-shadow: 0px 2px 10px 1px #b5b5b5; - } - ``` - - The code by Tom Jacobs (https://github.com/TomJ-EU/rasa/tree/dev) instead first opens the chat as a smaller window and adds a "fullscreen"-option to the drop-down used in [the code by Jitesh Gaikwad](https://github.com/AmirStudy/Rasa_Deployment). For example, like this in script.js: - ```js - //fullscreen function to toggle fullscreen. - $("#fullscreen").click(function () { - if ($('.widget').width() == 350) { - $('.widget').css("width" , "98%"); - $('.widget').css("height" , "100%"); - } else { - $('.widget').css("width" , "350px"); - $('.widget').css("height" , "500px"); - } - }); - ``` - - But then you also need to make sure to add the drop-down to the file index.html: - - ```html -
- - - Virtual Coach Mel - - - more_vert - - -
- ``` - - ```html - - - ``` - - - And further adapt script.js by adding code to `(document).ready(function ()`: - - ```js - //drop down menu - $('.dropdown-trigger').dropdown(); - ``` - This project uses an SQLTrackerStore (https://rasa.com/docs/rasa/tracker-stores/) to store the conversation history in a database: - A nice way to see the contents of this database is using the program DBeaver. - First also open port 5432 on your Google Compute Engine instance for tcp. There is no need to restart the instance after opening the port. @@ -174,271 +164,6 @@ Some errors I got during the setup: - When running the project locally on Windows: - I got an error for the SQLTrackerStore when running `docker-compose up –-build`. Just removing the information on `volumes` in docker-compose.yml helped. This removes the persistence though. - Since adding nginx, nginx does not work out of the box. To just quickly get the project to work locally, I ignored the nginx part. So I accessed the frontend via "localhost:3000/?..." and changed the url in the file script.js to `url: "http://localhost:5005/webhooks/rest/webhook",`. - - -## Frontend Styling - -Check the file frontend/static/css/style.css to adapt the styling of the frontend: - - .chats defines the chat area within the window in fullscreen mode. I tuned the height and width of this. - - .chat_header_title defines the chat header title. I set the color to #f7f7f7 so that the title is not visible in fullscreen mode. Change the margin-left to align the title to the center. Right now I have fully removed the title though. If you want to add the title again, your file frontend/index.html should contain `chat_header_title`: - - ```html - -
-
- - - Your Bot Name - -
- - -
-
-
- - -
- -
-
- -
- ``` - - - If you want to change the way that buttons are displayed, adapt `.menu` and `.menuChips` in the file style.css. - - For example, you may want to display the buttons like this: - - - - - This can be done with this code: - - ```css - .menu { - padding: 5px; - display: flex; - flex-wrap: wrap; - } - - .menuChips { - display: inline-block; - background: #2c53af; - color: #fff; - padding: 5px; - margin-bottom: 5px; - cursor: pointer; - border-radius: 15px; - font-size: 14px; - } - ``` - - - Important is that `display: flex` and `flex-wrap: wrap` in `.menu`. - - To further remove the background of the buttons and add a shadow to the individual buttons instead, set `box-shadow: 2px 5px 5px 1px #dbdade` for `.menuChips` and use this code for `.suggestions` in the file style.css: - - ```css - .suggestions { - padding: 5px; - width: 80%; - border-radius: 10px; - background: #f7f7f7; - } - ``` - - - Then buttons are displayed like this: - - - - - See [this post](https://stackoverflow.com/questions/73533611/how-to-put-two-chips-divs-next-to-each-other) for some other ideas for displaying buttons next to each other. - - Note that by default, buttons are displayed like this: - - - - - The corresponding code in the file style.css looks like this: - - ```css - .menu { - padding: 5px; - } - - .menuChips { - display: block; - background: #2c53af; - color: #fff; - text-align: center; - padding: 5px; - margin-bottom: 5px; - cursor: pointer; - border-radius: 15px; - font-size: 14px; - word-wrap: break-word; - } - ``` - -The files in frontend/static/img are used to display the chatbot and the user inside the chat, as well as to display the chatbot when the chat is still closed at the start. - -You can use "\n" in your utterances in domain.yml to display a single utterance as two (or more) separate messages. The resulting messages are not treated as separate messages when it comes to displaying the typing symbol though. - - -## HTTPS - -You might want to allow also for https traffic: - - I recommend looking at [this tutorial](https://datahive.ai/deploying-rasa-chatbot-on-google-cloud-with-docker/). Compared to allowing only http-traffic, you have to make changes in nginx.conf and docker-compose.yml and create an SSL certificate. - - For example, this is what the entry for nginx in docker-compose.yml may look like when allowing https traffic: - - ```yml - nginx: - container_name: "nginx" - image: nginx - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf - - ./certs:/etc/certs - ports: - - 80:80 - - 443:443 - depends_on: - - rasa - - action-server - - chatbotui - ``` - - - The folder "certs" on the Google compute engine instance stores the SSL certificate files in this example. - - - See [this post](https://adamtheautomator.com/https-nodejs/) for how to create a self-signed SSL certificate. - - If you use a self-signed SSL certificate and access your frontend via https, you may see a warning like this in your browser (here Google Chrome): - - - - - This might scare participants off. So I would recommend to either stick to http or to go all the way and get a proper certificate. - - - See [this page](https://cloud.google.com/load-balancing/docs/ssl-certificates/self-managed-certs) for more information on certificates on Google cloud. - - Info on registering a domain: https://cloud.google.com/dns/docs/tutorials/create-domain-tutorial#register-domain. - - Registering a domain for a year is quite cheap (you can get one for about 8 euros). - - Cloud DNS pricing info: https://cloud.google.com/dns/pricing. You need this if you get a domain and want to use it. - - -## Getting the user name -- It is not a good idea to just get and use the user name as in this example project. This is because many people reply with things such as "Hi, my name is Mary" when being asked about their name. -- So it might be a good idea to not ask for and use the name at all. -- Some steps to try to improve getting the name: - - Use an entity and an intent for getting the entity in domain.yml: - - ```yml - intents: - - user_name_intent - - entities: - - user_name_entity: - influence_conversation: false - - slots: - user_name_slot: - type: text - initial_value: '' - influence_conversation: false - mappings: - - type: from_entity - entity: user_name_entity - conditions: - - active_loop: user_name_form - ``` - - - Create some training data for the intent in the file nlu.yml (remember to create a lot of training data): - - ```yml - nlu: - - - intent: user_name_intent - examples: | - - "Hi Mel, I'm [PERSON](user_name_entity)" - - "My name is [PERSON](user_name_entity)" - - "I'm [PERSON](user_name_entity)" - - "[PERSON](user_name_entity)" - ``` - - - Use spacy in config.yml. See [here](https://spacy.io/models/en) for different English language models. - - ```yml - language: en - pipeline: - - name: SpacyNLP - model: en_core_web_lg - case_sensitive: false - - name: SpacyTokenizer - - name: SpacyFeaturizer - pooling: mean - - name: SpacyEntityExtractor - dimensions: - - PERSON - - name: RegexFeaturizer - - name: LexicalSyntacticFeaturizer - - name: CountVectorsFeaturizer - ``` - - - Now that you use spacy, you also need to adapt the Dockerfile for your backend: - - ``` - USER root - - COPY requirements.txt . - RUN pip install -r requirements.txt - - # Spacy language model - RUN python -m spacy download en_core_web_lg - - USER 1001 - ``` - - - And backend/requirements.txt needs to list `spacy` as a requirement. - - When rasa does not succeed in extracting a slot in the `user_name_form` (e.g., when you try a not-so-typical English name such as "Priyanka"), then an ActionExecutionRejected event is thrown. - - A work-around is to then just store the last user utterance as `user_name_slot`. - - To do this, you might create a rule like this one: - - ```yml - - rule: name session 1 failed fallback - condition: - - active_loop: user_name_form - steps: - - intent: nlu_fallback - - action: action_get_name_from_last_utterance - - action: utter_confirm_name - - action: action_deactivate_loop - - active_loop: null - - action: utter_ask_for_mood_session1 - ``` - - - The action `action_get_name_from_last_utterance` just gets the text from the last user utterance via `last_user_utterance = tracker.latest_message['text']` and stores this in the slot `user_name_slot`. - - Since you are using spacy, you also need to have spacy installed where you train your rasa model. To do this in an anaconda environment, use `conda install -c conda-forge spacy`. - - And then you also need to download the language model you use. - - I personally got package version conflicts with rasa 3.2.8, so I used rasa 3.5.3 for the training. - - This also means that I updated the Dockerfile for the custom actions to use `FROM rasa/rasa-sdk:3.3.0` and the Dockerfile for the backend to use `FROM rasa/rasa:3.5.3-full`. - - Now this setup MIGHT allow you to correctly handle responses such as "My name is John" or "Priyanka": - - It is quite difficult to get this setup to work well in all cases: - - For example, the DietClassifier may also extract (wrong) entities, in which case you may need to look through all entities in `tracker.latest_message['entities']` in a custom action and choose the entity for which `entity["extractor"] == "SpacyEntityExtractor"`. - - Sometimes, rasa recognizes "user_name_intent" for "Priyanka" but cannot extract an entity. - - If the user uses the chatbot name in their message, sometimes the chatbot name is extracted as the user name. - - Unless you are confident that the user has a common English (or whichever language model you use) name and/or types only their name, I would suggest to not use the user name. In my pilot study, 3 out of 8 people typed more than their name. - - You could of course also play back to the user what you got as their name and ask them for confirmation, but this might make the virtual coach look rather stupid if what they play back as the user name is "My name is Priyanka". - - -## Other Notes -- The frontend is not fully cleaned up yet (i.e., still contains quite some components that are not used by this project). -- The repository by Jitesh Gaikwad (https://github.com/AmirStudy/Rasa_Deployment) also contains code for displaying charts, drop-downs, and images in frontend/static/js/script.js (see the function `setBotResponse` for displaying responses from the rasa bot). I have removed this code in this example project, but if you need to send such kinds of messages, take a look. -- `"--debug"` in backend/Dockerfile prints a lot of debugging statements (e.g., for the action prediction). This is handy while you are still developing your agent, but can be removed. -- The Developer tools in Google Chrome show the logs from script.js (i.e., the result of `console.log()`)if you access the frontend via Google Chrome. -- Think carefully about how you deal with timed out sessions. You may want to customize the `action_session_start`: https://rasa.com/docs/rasa/default-actions#customization. -- If you have made changes and they do not reflect on your Google Compute Engine instance, check if you have run `docker-compose down --volumes` and `docker-compose up --build`. -- If you do not see the result of retraining your rasa model, it can sometimes help to delete all models and retrain from scratch. -- You might want to prevent people from typing while the chatbot is still sending more messages. You can adapt the file script.js to allow for this using statements such as `$('.usrInput').attr("disabled",true);` and `$(".usrInput").prop('placeholder', "Wait for Mel's response.");` -- Before running the chatbot on a Google Compute Engine instance for your experiment, make sure to get a paid account. Once the trial period ends or you have used up your free credit your instance will stop. And a billing account will also help to prevent Google from stopping your project when it thinks that you are mining crypto currencies (e.g., see [here](https://groups.google.com/g/gce-discussion/c/5prZHD3DEnQ)). -- When using the db, pay attention to closing connections. Also pay attention to the kind of cursor you use when you use fetchone(). It may be good to use a buffered cursor then (e.g., see [here](https://stackoverflow.com/questions/29772337/python-mysql-connector-unread-result-found-when-using-fetchone)). -- You might want to get more detailed logs for your mysql database. See [here](https://stackoverflow.com/questions/39708213/enable-logging-in-docker-mysql-container) for a useful discussion. - - You can add `- ./mysql_log:/var/log/mysql` to your mysql volumes in docker-compose.yml. - - Create a file called mysql.log in /var/log/mysql in your mysql container after running `docker exec -it [mysql_container_id] /bin/bash` (e.g., via `cat > mysql.log`). - - Give sufficient permissions to this newly created file (e.g., via `chmod a+crw mysql.log`). - - Run `SET global general_log = 1;`, `SET global general_log_file='/var/log/mysql/mysql.log';` and `SET global log_output = 'file';` (e.g., via the console in DBeaver under SQL Editor > Open SQL console). - - Now you can see the logs on your Google Compute Engine instance in mysql_log/mysql.log. -- Viewing google activity logs: https://cloud.google.com/compute/docs/logging/activity-logs. -- Listing sessions/active connections on mysql server: https://dataedo.com/kb/query/mysql/list-database-sessions (e.g., can execute a query in DBeaver). ## License diff --git a/Readme_images/chat button.png b/Readme_images/chat button.png new file mode 100644 index 0000000000000000000000000000000000000000..65509260458995b88739b1f6e9974549a0d64a72 GIT binary patch literal 11791 zcma)ihdaYsU;MUs<}&~Q)LO7(b4G>Yi5>=_Hp!M4@avtk`2?N!sVhz}h^MpH$t z{GuJeVkPbR9y`>ej@{~lK∋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
!1d=hDs;XS?F5N?xeS94244MJc(DlCX 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 literal 0 HcmV?d00001 diff --git a/Readme_images/chat.png b/Readme_images/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..35cc28a4e39cb2b1f52dff3ee225f9d6e4057c1a GIT binary patch literal 73350 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 F-vBVpmt_C| literal 0 HcmV?d00001 diff --git a/Readme_images/dialogue.png b/Readme_images/dialogue.png new file mode 100644 index 0000000000000000000000000000000000000000..3dbf82e4d9ef0c487fd3b734c3f01fc251c0b568 GIT binary patch literal 121355 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�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

b%>NeGUYJ9q)v#b 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

Week 1MondayTuesdayWednesdayThursdayFridaySaturdaySunday
Morning (6:00 - 10:00)
Midday (10:00 - 14:00)