From aed96c775fa5423db66612db320d0c823b3f8496 Mon Sep 17 00:00:00 2001 From: Fahmi Salman Nurfikri Date: Sun, 13 Dec 2020 17:40:47 +0700 Subject: [PATCH 1/3] Init for event history --- actions/__init__.py | 2 + actions/actions.py | 348 ++++++++++++------------ actions/resources/form_history_event.py | 65 +++++ actions/resources/form_regist_event.py | 193 +++++++++++++ data/nlu.yml | 9 + data/stories.yml | 8 +- domain.yml | 2 + 7 files changed, 452 insertions(+), 175 deletions(-) create mode 100644 actions/resources/form_history_event.py create mode 100644 actions/resources/form_regist_event.py diff --git a/actions/__init__.py b/actions/__init__.py index e69de29..9f21e78 100644 --- a/actions/__init__.py +++ b/actions/__init__.py @@ -0,0 +1,2 @@ +from actions.resources import (form_regist_event) + diff --git a/actions/actions.py b/actions/actions.py index 5adf787..31214b0 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -1,193 +1,193 @@ -from typing import Any, Text, Dict, List, Union -import re - -from rasa_sdk import Action, Tracker, FormValidationAction -from rasa_sdk.executor import CollectingDispatcher -from rasa_sdk.forms import FormAction -from rasa_sdk.events import SlotSet, UserUtteranceReverted - -from actions.resources.chatbot_validator import ChatbotValidator -from actions.resources.chatbot_helper import ChatbotHelper -from actions.models import user, event - -chatbot_validator = ChatbotValidator() -chatbot_helper = ChatbotHelper() - -user = user.User() -event = event.Event() - -class RegistForm(FormAction): - - already_registered: bool = False - updated: bool = False - id_: str = '' - - def name(self): - return "regist_form" - - @staticmethod - def required_slots(tracker): - return [ - 'event_conf', - 'email', - 'nama', - 'no_telfon', - 'pekerjaan', - 'data_conf', - 'data_valid' - ] - - def validate(self, - dispatcher: CollectingDispatcher, - tracker: Tracker, - domain: Dict[Text, Any]) -> List[Dict]: - - ask_nama = domain['responses']['utter_ask_nama'][0]['text'] - ask_email = domain['responses']['utter_ask_email'][0]['text'] - ask_telfon = domain['responses']['utter_ask_no_telfon'][0]['text'] - ask_pekerjaan = domain['responses']['utter_ask_pekerjaan'][0]['text'] - ask_data_conf = domain['responses']['utter_ask_data_conf'][0]['text'] - ask_wrong_data = domain['responses']['utter_ask_data_valid'][0]['text'] - ask_event_conf = domain['responses']['utter_ask_event_conf'][0]['text'] - - idx = chatbot_helper.get_event_index(tracker.events) - intent, confidence = tracker.latest_message['intent']['name'], tracker.latest_message['intent']['confidence'] - tracker_event, tracker_text, latest_message = tracker.events[idx]['event'], tracker.events[idx]['text'], tracker.latest_message['text'] - - if latest_message == '/cancel': - return [SlotSet(row, 0) for row in self.required_slots(tracker)] - - if tracker_event == 'bot': - if tracker_text == ask_event_conf: - if confidence > 0.8: - if intent == 'affirm': - return [SlotSet('event_conf', 'yes')] - if intent == 'deny': - return [SlotSet(row, 0) for row in self.required_slots(tracker)] - dispatcher.utter_message(chatbot_validator.not_valid_general) - - if tracker_text == ask_email: - email = chatbot_validator.email_validation(latest_message) - if email: - res, status_code = user.read(email) - if res and status_code == 200: - doc = res[0].to_dict() - self.id_ = res[0].id - self.already_registered = True - return [SlotSet(key, doc[key]) for key in doc] - return [SlotSet('email', email)] - dispatcher.utter_message(chatbot_validator.not_valid_email) - - if tracker_text == ask_nama: - dispatcher.utter_message('Hai {}'.format(latest_message)) - return [SlotSet('nama', latest_message)] - - if tracker_text == ask_telfon: - no_telfon = chatbot_validator.phone_number_validation(latest_message) - if no_telfon: - return [SlotSet('no_telfon', no_telfon)] - dispatcher.utter_message(chatbot_validator.not_valid_phone_number) - - if tracker_text == ask_pekerjaan: - return [SlotSet('pekerjaan', latest_message)] - - if '\n' in tracker_text: - if tracker_text.split('\n')[-1] == ask_data_conf.split('\n')[-1]: - if confidence > 0.8: - if intent == 'affirm': - return [ - SlotSet('data_conf', 'yes'), - SlotSet('data_valid', 'yes') - ] - if intent == 'deny': - self.updated = True - return [SlotSet('data_conf', 'no')] - dispatcher.utter_message(chatbot_validator.not_valid_general) - - if tracker_text == ask_wrong_data: - if intent == 'affirm' and confidence > 0.9: - return [SlotSet('data_conf', None)] - slots = chatbot_validator.slot_validator(latest_message) - if slots: - return [SlotSet(slot, None) for slot in slots] - - return [] - - def submit(self, dispatcher: CollectingDispatcher, - tracker: Tracker, - domain: Dict[Text, Any],) -> List[Dict]: - - if tracker.slots['event_conf'] == 0: - dispatcher.utter_message('Terima kasih sudah memberikan tanggapan.') - return [SlotSet(row, None) for row in self.required_slots(tracker)] - - if not self.already_registered: - res, status_code = user.read(tracker.slots['email']) - if not res and status_code == 200: - res, status_code = user.create({ - 'nama': tracker.slots['nama'], - 'email': tracker.slots['email'], - 'no_telfon': tracker.slots['no_telfon'], - 'pekerjaan': tracker.slots['pekerjaan'] - }) - - if status_code != 200: - dispatcher.utter_message('Maaf, data kamu gagal disimpan. Silahkan coba beberapa saat lagi!') +# from typing import Any, Text, Dict, List, Union +# import re + +# from rasa_sdk import Action, Tracker, FormValidationAction +# from rasa_sdk.executor import CollectingDispatcher +# from rasa_sdk.forms import FormAction +# from rasa_sdk.events import SlotSet, UserUtteranceReverted + +# from actions.resources.chatbot_validator import ChatbotValidator +# from actions.resources.chatbot_helper import ChatbotHelper +# from actions.models import user, event + +# chatbot_validator = ChatbotValidator() +# chatbot_helper = ChatbotHelper() + +# user = user.User() +# event = event.Event() + +# class RegistForm(FormAction): + +# already_registered: bool = False +# updated: bool = False +# id_: str = '' + +# def name(self): +# return "regist_form" + +# @staticmethod +# def required_slots(tracker): +# return [ +# 'event_conf', +# 'email', +# 'nama', +# 'no_telfon', +# 'pekerjaan', +# 'data_conf', +# 'data_valid' +# ] + +# def validate(self, +# dispatcher: CollectingDispatcher, +# tracker: Tracker, +# domain: Dict[Text, Any]) -> List[Dict]: + +# ask_nama = domain['responses']['utter_ask_nama'][0]['text'] +# ask_email = domain['responses']['utter_ask_email'][0]['text'] +# ask_telfon = domain['responses']['utter_ask_no_telfon'][0]['text'] +# ask_pekerjaan = domain['responses']['utter_ask_pekerjaan'][0]['text'] +# ask_data_conf = domain['responses']['utter_ask_data_conf'][0]['text'] +# ask_wrong_data = domain['responses']['utter_ask_data_valid'][0]['text'] +# ask_event_conf = domain['responses']['utter_ask_event_conf'][0]['text'] + +# idx = chatbot_helper.get_event_index(tracker.events) +# intent, confidence = tracker.latest_message['intent']['name'], tracker.latest_message['intent']['confidence'] +# tracker_event, tracker_text, latest_message = tracker.events[idx]['event'], tracker.events[idx]['text'], tracker.latest_message['text'] + +# if latest_message == '/cancel': +# return [SlotSet(row, 0) for row in self.required_slots(tracker)] + +# if tracker_event == 'bot': +# if tracker_text == ask_event_conf: +# if confidence > 0.8: +# if intent == 'affirm': +# return [SlotSet('event_conf', 'yes')] +# if intent == 'deny': +# return [SlotSet(row, 0) for row in self.required_slots(tracker)] +# dispatcher.utter_message(chatbot_validator.not_valid_general) + +# if tracker_text == ask_email: +# email = chatbot_validator.email_validation(latest_message) +# if email: +# res, status_code = user.read(email) +# if res and status_code == 200: +# doc = res[0].to_dict() +# self.id_ = res[0].id +# self.already_registered = True +# return [SlotSet(key, doc[key]) for key in doc] +# return [SlotSet('email', email)] +# dispatcher.utter_message(chatbot_validator.not_valid_email) + +# if tracker_text == ask_nama: +# dispatcher.utter_message('Hai {}'.format(latest_message)) +# return [SlotSet('nama', latest_message)] + +# if tracker_text == ask_telfon: +# no_telfon = chatbot_validator.phone_number_validation(latest_message) +# if no_telfon: +# return [SlotSet('no_telfon', no_telfon)] +# dispatcher.utter_message(chatbot_validator.not_valid_phone_number) + +# if tracker_text == ask_pekerjaan: +# return [SlotSet('pekerjaan', latest_message)] + +# if '\n' in tracker_text: +# if tracker_text.split('\n')[-1] == ask_data_conf.split('\n')[-1]: +# if confidence > 0.8: +# if intent == 'affirm': +# return [ +# SlotSet('data_conf', 'yes'), +# SlotSet('data_valid', 'yes') +# ] +# if intent == 'deny': +# self.updated = True +# return [SlotSet('data_conf', 'no')] +# dispatcher.utter_message(chatbot_validator.not_valid_general) + +# if tracker_text == ask_wrong_data: +# if intent == 'affirm' and confidence > 0.9: +# return [SlotSet('data_conf', None)] +# slots = chatbot_validator.slot_validator(latest_message) +# if slots: +# return [SlotSet(slot, None) for slot in slots] + +# return [] + +# def submit(self, dispatcher: CollectingDispatcher, +# tracker: Tracker, +# domain: Dict[Text, Any],) -> List[Dict]: + +# if tracker.slots['event_conf'] == 0: +# dispatcher.utter_message('Terima kasih sudah memberikan tanggapan.') +# return [SlotSet(row, None) for row in self.required_slots(tracker)] + +# if not self.already_registered: +# res, status_code = user.read(tracker.slots['email']) +# if not res and status_code == 200: +# res, status_code = user.create({ +# 'nama': tracker.slots['nama'], +# 'email': tracker.slots['email'], +# 'no_telfon': tracker.slots['no_telfon'], +# 'pekerjaan': tracker.slots['pekerjaan'] +# }) + +# if status_code != 200: +# dispatcher.utter_message('Maaf, data kamu gagal disimpan. Silahkan coba beberapa saat lagi!') - return [SlotSet(row, None) for row in self.required_slots(tracker)] +# return [SlotSet(row, None) for row in self.required_slots(tracker)] - dispatcher.utter_message('Data kamu sudah berhasil disimpan') +# dispatcher.utter_message('Data kamu sudah berhasil disimpan') - res, status_code = event.create({ - 'nama': tracker.slots['nama'], - 'email': tracker.slots['email'], - 'no_telfon': tracker.slots['no_telfon'], - 'pekerjaan': tracker.slots['pekerjaan'] - }) +# res, status_code = event.create({ +# 'nama': tracker.slots['nama'], +# 'email': tracker.slots['email'], +# 'no_telfon': tracker.slots['no_telfon'], +# 'pekerjaan': tracker.slots['pekerjaan'] +# }) - if status_code != 200: - dispatcher.utter_message('Maaf, ada kendala teknis. Silahkan coba beberapa saat lagi!') +# if status_code != 200: +# dispatcher.utter_message('Maaf, ada kendala teknis. Silahkan coba beberapa saat lagi!') - return [SlotSet(row, None) for row in self.required_slots(tracker)] +# return [SlotSet(row, None) for row in self.required_slots(tracker)] - dispatcher.utter_message('Kamu sudah terdaftar sebagai peserta Ngemil. Untuk tautan (link) Zoom akan diberitahukan melalui Email.') +# dispatcher.utter_message('Kamu sudah terdaftar sebagai peserta Ngemil. Untuk tautan (link) Zoom akan diberitahukan melalui Email.') - return [SlotSet(row, None) for row in self.required_slots(tracker)] +# return [SlotSet(row, None) for row in self.required_slots(tracker)] - if self.already_registered: +# if self.already_registered: - if self.updated: - res, status_code = user.edit(self.id_, { - 'nama': tracker.slots['nama'], - 'email': tracker.slots['email'], - 'no_telfon': tracker.slots['no_telfon'], - 'pekerjaan': tracker.slots['pekerjaan'] - }) +# if self.updated: +# res, status_code = user.edit(self.id_, { +# 'nama': tracker.slots['nama'], +# 'email': tracker.slots['email'], +# 'no_telfon': tracker.slots['no_telfon'], +# 'pekerjaan': tracker.slots['pekerjaan'] +# }) - self.updated = False - self.id_ = '' +# self.updated = False +# self.id_ = '' - if status_code != 200: - dispatcher.utter_message('Maaf, data kamu gagal diperbarui. Silahkan coba beberapa saat lagi!') +# if status_code != 200: +# dispatcher.utter_message('Maaf, data kamu gagal diperbarui. Silahkan coba beberapa saat lagi!') - return [SlotSet(row, None) for row in self.required_slots(tracker)] +# return [SlotSet(row, None) for row in self.required_slots(tracker)] - dispatcher.utter_message('Data kamu sudah berhasil diperbarui') +# dispatcher.utter_message('Data kamu sudah berhasil diperbarui') - self.already_registered = False +# self.already_registered = False - res, status_code = event.create({ - 'nama': tracker.slots['nama'], - 'email': tracker.slots['email'], - 'no_telfon': tracker.slots['no_telfon'], - 'pekerjaan': tracker.slots['pekerjaan'] - }) +# res, status_code = event.create({ +# 'nama': tracker.slots['nama'], +# 'email': tracker.slots['email'], +# 'no_telfon': tracker.slots['no_telfon'], +# 'pekerjaan': tracker.slots['pekerjaan'] +# }) - if status_code != 200: - dispatcher.utter_message('Maaf, ada kendala teknis. Silahkan coba beberapa saat lagi!') +# if status_code != 200: +# dispatcher.utter_message('Maaf, ada kendala teknis. Silahkan coba beberapa saat lagi!') - return [SlotSet(row, None) for row in self.required_slots(tracker)] +# return [SlotSet(row, None) for row in self.required_slots(tracker)] - dispatcher.utter_message('Kamu sudah terdaftar sebagai peserta Ngemil. Untuk tautan (link) Zoom akan diberitahukan melalui Email.') +# dispatcher.utter_message('Kamu sudah terdaftar sebagai peserta Ngemil. Untuk tautan (link) Zoom akan diberitahukan melalui Email.') - return [SlotSet(row, None) for row in self.required_slots(tracker)] +# return [SlotSet(row, None) for row in self.required_slots(tracker)] diff --git a/actions/resources/form_history_event.py b/actions/resources/form_history_event.py new file mode 100644 index 0000000..b4684cc --- /dev/null +++ b/actions/resources/form_history_event.py @@ -0,0 +1,65 @@ +from typing import Any, Text, Dict, List, Union +import re + +from rasa_sdk import Action, Tracker, FormValidationAction +from rasa_sdk.executor import CollectingDispatcher +from rasa_sdk.forms import FormAction +from rasa_sdk.events import SlotSet + +from actions.resources.chatbot_validator import ChatbotValidator +from actions.resources.chatbot_helper import ChatbotHelper +from actions.models import user, event + +chatbot_validator = ChatbotValidator() +chatbot_helper = ChatbotHelper() + +user = user.User() +event = event.Event() + +class HistoryForm(FormAction): + + self.events: list = [] + + def name(self): + return "history_form" + + @staticmethod + def required_slots(tracker): + return [ + 'email' + ] + + def validate(self, + dispatcher: CollectingDispatcher, + tracker: Tracker, + domain: Dict[Text, Any]) -> List[Dict]: + + ask_email = domain['responses']['utter_ask_email'][0]['text'] + + idx = chatbot_helper.get_event_index(tracker.events) + tracker_event, tracker_text, latest_message = tracker.events[idx]['event'], tracker.events[idx]['text'], tracker.latest_message['text'] + + if latest_message == '/cancel': + return [SlotSet(row, 0) for row in self.required_slots(tracker)] + + if tracker_event == 'bot': + if tracker_text == ask_email: + email = chatbot_validator.email_validation(latest_message) + if email: + res, status_code = user.read(email) + if res and status_code == 200: + doc = res[0].to_dict() + return [SlotSet(key, doc[key]) for key in doc] + return [SlotSet('email', email)] + dispatcher.utter_message(chatbot_validator.not_valid_email) + + return [] + + def submit(self, dispatcher: CollectingDispatcher, + tracker: Tracker, + domain: Dict[Text, Any],) -> List[Dict]: + + if tracker.slots['event_conf'] == 0: + dispatcher.utter_message('Terima kasih sudah memberikan tanggapan.') + + return [SlotSet(row, None) for row in self.required_slots(tracker)] \ No newline at end of file diff --git a/actions/resources/form_regist_event.py b/actions/resources/form_regist_event.py new file mode 100644 index 0000000..5adf787 --- /dev/null +++ b/actions/resources/form_regist_event.py @@ -0,0 +1,193 @@ +from typing import Any, Text, Dict, List, Union +import re + +from rasa_sdk import Action, Tracker, FormValidationAction +from rasa_sdk.executor import CollectingDispatcher +from rasa_sdk.forms import FormAction +from rasa_sdk.events import SlotSet, UserUtteranceReverted + +from actions.resources.chatbot_validator import ChatbotValidator +from actions.resources.chatbot_helper import ChatbotHelper +from actions.models import user, event + +chatbot_validator = ChatbotValidator() +chatbot_helper = ChatbotHelper() + +user = user.User() +event = event.Event() + +class RegistForm(FormAction): + + already_registered: bool = False + updated: bool = False + id_: str = '' + + def name(self): + return "regist_form" + + @staticmethod + def required_slots(tracker): + return [ + 'event_conf', + 'email', + 'nama', + 'no_telfon', + 'pekerjaan', + 'data_conf', + 'data_valid' + ] + + def validate(self, + dispatcher: CollectingDispatcher, + tracker: Tracker, + domain: Dict[Text, Any]) -> List[Dict]: + + ask_nama = domain['responses']['utter_ask_nama'][0]['text'] + ask_email = domain['responses']['utter_ask_email'][0]['text'] + ask_telfon = domain['responses']['utter_ask_no_telfon'][0]['text'] + ask_pekerjaan = domain['responses']['utter_ask_pekerjaan'][0]['text'] + ask_data_conf = domain['responses']['utter_ask_data_conf'][0]['text'] + ask_wrong_data = domain['responses']['utter_ask_data_valid'][0]['text'] + ask_event_conf = domain['responses']['utter_ask_event_conf'][0]['text'] + + idx = chatbot_helper.get_event_index(tracker.events) + intent, confidence = tracker.latest_message['intent']['name'], tracker.latest_message['intent']['confidence'] + tracker_event, tracker_text, latest_message = tracker.events[idx]['event'], tracker.events[idx]['text'], tracker.latest_message['text'] + + if latest_message == '/cancel': + return [SlotSet(row, 0) for row in self.required_slots(tracker)] + + if tracker_event == 'bot': + if tracker_text == ask_event_conf: + if confidence > 0.8: + if intent == 'affirm': + return [SlotSet('event_conf', 'yes')] + if intent == 'deny': + return [SlotSet(row, 0) for row in self.required_slots(tracker)] + dispatcher.utter_message(chatbot_validator.not_valid_general) + + if tracker_text == ask_email: + email = chatbot_validator.email_validation(latest_message) + if email: + res, status_code = user.read(email) + if res and status_code == 200: + doc = res[0].to_dict() + self.id_ = res[0].id + self.already_registered = True + return [SlotSet(key, doc[key]) for key in doc] + return [SlotSet('email', email)] + dispatcher.utter_message(chatbot_validator.not_valid_email) + + if tracker_text == ask_nama: + dispatcher.utter_message('Hai {}'.format(latest_message)) + return [SlotSet('nama', latest_message)] + + if tracker_text == ask_telfon: + no_telfon = chatbot_validator.phone_number_validation(latest_message) + if no_telfon: + return [SlotSet('no_telfon', no_telfon)] + dispatcher.utter_message(chatbot_validator.not_valid_phone_number) + + if tracker_text == ask_pekerjaan: + return [SlotSet('pekerjaan', latest_message)] + + if '\n' in tracker_text: + if tracker_text.split('\n')[-1] == ask_data_conf.split('\n')[-1]: + if confidence > 0.8: + if intent == 'affirm': + return [ + SlotSet('data_conf', 'yes'), + SlotSet('data_valid', 'yes') + ] + if intent == 'deny': + self.updated = True + return [SlotSet('data_conf', 'no')] + dispatcher.utter_message(chatbot_validator.not_valid_general) + + if tracker_text == ask_wrong_data: + if intent == 'affirm' and confidence > 0.9: + return [SlotSet('data_conf', None)] + slots = chatbot_validator.slot_validator(latest_message) + if slots: + return [SlotSet(slot, None) for slot in slots] + + return [] + + def submit(self, dispatcher: CollectingDispatcher, + tracker: Tracker, + domain: Dict[Text, Any],) -> List[Dict]: + + if tracker.slots['event_conf'] == 0: + dispatcher.utter_message('Terima kasih sudah memberikan tanggapan.') + return [SlotSet(row, None) for row in self.required_slots(tracker)] + + if not self.already_registered: + res, status_code = user.read(tracker.slots['email']) + if not res and status_code == 200: + res, status_code = user.create({ + 'nama': tracker.slots['nama'], + 'email': tracker.slots['email'], + 'no_telfon': tracker.slots['no_telfon'], + 'pekerjaan': tracker.slots['pekerjaan'] + }) + + if status_code != 200: + dispatcher.utter_message('Maaf, data kamu gagal disimpan. Silahkan coba beberapa saat lagi!') + + return [SlotSet(row, None) for row in self.required_slots(tracker)] + + dispatcher.utter_message('Data kamu sudah berhasil disimpan') + + res, status_code = event.create({ + 'nama': tracker.slots['nama'], + 'email': tracker.slots['email'], + 'no_telfon': tracker.slots['no_telfon'], + 'pekerjaan': tracker.slots['pekerjaan'] + }) + + if status_code != 200: + dispatcher.utter_message('Maaf, ada kendala teknis. Silahkan coba beberapa saat lagi!') + + return [SlotSet(row, None) for row in self.required_slots(tracker)] + + dispatcher.utter_message('Kamu sudah terdaftar sebagai peserta Ngemil. Untuk tautan (link) Zoom akan diberitahukan melalui Email.') + + return [SlotSet(row, None) for row in self.required_slots(tracker)] + + if self.already_registered: + + if self.updated: + res, status_code = user.edit(self.id_, { + 'nama': tracker.slots['nama'], + 'email': tracker.slots['email'], + 'no_telfon': tracker.slots['no_telfon'], + 'pekerjaan': tracker.slots['pekerjaan'] + }) + + self.updated = False + self.id_ = '' + + if status_code != 200: + dispatcher.utter_message('Maaf, data kamu gagal diperbarui. Silahkan coba beberapa saat lagi!') + + return [SlotSet(row, None) for row in self.required_slots(tracker)] + + dispatcher.utter_message('Data kamu sudah berhasil diperbarui') + + self.already_registered = False + + res, status_code = event.create({ + 'nama': tracker.slots['nama'], + 'email': tracker.slots['email'], + 'no_telfon': tracker.slots['no_telfon'], + 'pekerjaan': tracker.slots['pekerjaan'] + }) + + if status_code != 200: + dispatcher.utter_message('Maaf, ada kendala teknis. Silahkan coba beberapa saat lagi!') + + return [SlotSet(row, None) for row in self.required_slots(tracker)] + + dispatcher.utter_message('Kamu sudah terdaftar sebagai peserta Ngemil. Untuk tautan (link) Zoom akan diberitahukan melalui Email.') + + return [SlotSet(row, None) for row in self.required_slots(tracker)] diff --git a/data/nlu.yml b/data/nlu.yml index 13414d1..8bda223 100644 --- a/data/nlu.yml +++ b/data/nlu.yml @@ -80,6 +80,8 @@ nlu: - yup - yes - benar + - sudah benar + - sudah - bersedia - lanjut - lanjutkan @@ -106,6 +108,13 @@ nlu: - jangan - jangan dilanjutkan +- intent: event_history + examples: | + - riwayat + - history + - history event + - riwayat event + - intent: thanks examples: | - terima kasih diff --git a/data/stories.yml b/data/stories.yml index 43496d9..f114dfb 100644 --- a/data/stories.yml +++ b/data/stories.yml @@ -22,8 +22,14 @@ stories: - intent: faq - action: utter_faq -- story: Regist_event_succeed +- story: Regist event steps: - intent: regist_event - action: regist_form - active_loop: regist_form + +- story: History event + steps: + - intent: event_history + - action: history_form + - active_loop: history_form diff --git a/domain.yml b/domain.yml index c25e809..cdf3da3 100644 --- a/domain.yml +++ b/domain.yml @@ -8,6 +8,7 @@ intents: - regist_event - affirm - deny + - event_history slots: event_conf: @@ -30,6 +31,7 @@ actions: forms: - regist_form + - history_form responses: utter_greet: From fc2989ac0411c703ac7a8348622a818b1d77dbac Mon Sep 17 00:00:00 2001 From: fahmisalman Date: Mon, 21 Dec 2020 19:43:10 +0700 Subject: [PATCH 2/3] Add event history --- actions/__init__.py | 2 +- actions/resources/chatbot_validator.py | 1 + actions/resources/db_helper.py | 32 ++++++++++++++++++++++++- actions/resources/form_history_event.py | 19 ++++++++++----- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/actions/__init__.py b/actions/__init__.py index 9f21e78..a5eef49 100644 --- a/actions/__init__.py +++ b/actions/__init__.py @@ -1,2 +1,2 @@ -from actions.resources import (form_regist_event) +from actions.resources import (form_regist_event, form_history_event) diff --git a/actions/resources/chatbot_validator.py b/actions/resources/chatbot_validator.py index 00c4e00..48d5a1d 100644 --- a/actions/resources/chatbot_validator.py +++ b/actions/resources/chatbot_validator.py @@ -6,6 +6,7 @@ class ChatbotValidator(object): not_valid_general: str = 'Jawaban yang kamu masukan salah' not_valid_email: str = 'Email yang kamu masukan tidak valid' not_valid_phone_number: str = 'Nomor telfon yang kamu masukan tidak valid' + email_not_found: str = 'Email yang kamu masukan tidak terdaftar' def email_validation(self, text: str): regex_validator = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$' diff --git a/actions/resources/db_helper.py b/actions/resources/db_helper.py index 2456ca2..78bbcb2 100644 --- a/actions/resources/db_helper.py +++ b/actions/resources/db_helper.py @@ -1,4 +1,4 @@ -from firebase_admin import credentials,firestore +from firebase_admin import credentials, firestore import firebase_admin import uuid @@ -34,3 +34,33 @@ def put(self, id_: str, payload: dict, collection_name: str): return {'message': 'success'}, 200 except Exception as e: return {'message': e}, 400 + +# import re +# from datetime import datetime + +# if __name__ == '__main__': +# a = [] +# tanggal = '2020-12-08 19:44:34.849431' +# # tanggal_split = tanggal.split(':') +# # tanggal_split[-1] = str(round(float(tanggal_split[-1]))) + +# datetime_format = '%Y-%m-%d %H:%M:%S.%f' +# datetime_object = datetime.strptime(tanggal, datetime_format) +# print(type(datetime_object)) +# print(datetime_object) +# a.append(datetime_object) +# # tanggal_final = ':'.join(tanggal_split) + + +# from datetime import datetime + +# datetime_str = '09/19/18 13:55:26' + +# datetime_object = datetime.strptime(datetime_str, '%m/%d/%y %H:%M:%S') + +# print(type(datetime_object)) +# print(datetime_object) # printed in default format + +# a.append(datetime_object) + +# print(sorted(a, reverse=True)[:1]) \ No newline at end of file diff --git a/actions/resources/form_history_event.py b/actions/resources/form_history_event.py index b4684cc..71c72fc 100644 --- a/actions/resources/form_history_event.py +++ b/actions/resources/form_history_event.py @@ -18,7 +18,7 @@ class HistoryForm(FormAction): - self.events: list = [] + events: list = [] def name(self): return "history_form" @@ -48,9 +48,9 @@ def validate(self, if email: res, status_code = user.read(email) if res and status_code == 200: - doc = res[0].to_dict() - return [SlotSet(key, doc[key]) for key in doc] - return [SlotSet('email', email)] + return [SlotSet('email', email)] + dispatcher.utter_message(chatbot_validator.email_not_found) + return [] dispatcher.utter_message(chatbot_validator.not_valid_email) return [] @@ -59,7 +59,14 @@ def submit(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any],) -> List[Dict]: - if tracker.slots['event_conf'] == 0: + if tracker.slots['email'] == 0: dispatcher.utter_message('Terima kasih sudah memberikan tanggapan.') - + + res, status_code = event.read(tracker.slots['email']) + if res and status_code == 200: + for doc in res: + self.events.append(doc.to_dict()) + dispatcher.utter_message(str(self.events)) + + self.events = [] return [SlotSet(row, None) for row in self.required_slots(tracker)] \ No newline at end of file From 000c3652475cc98122f03af0514e71d6372a6dfc Mon Sep 17 00:00:00 2001 From: fahmisalman Date: Sat, 26 Dec 2020 09:46:20 +0700 Subject: [PATCH 3/3] Update custom actions --- actions/models/event.py | 8 ++++++- actions/resources/chatbot_helper.py | 27 ++++++++++++++++++++++ actions/resources/db_helper.py | 30 ------------------------- actions/resources/form_history_event.py | 6 +++-- 4 files changed, 38 insertions(+), 33 deletions(-) diff --git a/actions/models/event.py b/actions/models/event.py index b0b2658..79863ea 100644 --- a/actions/models/event.py +++ b/actions/models/event.py @@ -11,7 +11,13 @@ def create(self, data: dict): payload = { u'user': data, - u'tanggal': datetime.datetime.now().__str__() + u'email': data['email'], + u'tanggal': datetime.datetime.now().__str__(), + u'detail': { + 'nama': 'Judul event', + 'jenis': 'Ngemil', + 'kategori': 'Hacker' + } } return db_helper.post(payload, self.collection) diff --git a/actions/resources/chatbot_helper.py b/actions/resources/chatbot_helper.py index b1d5583..c043df5 100644 --- a/actions/resources/chatbot_helper.py +++ b/actions/resources/chatbot_helper.py @@ -1,3 +1,5 @@ +from datetime import datetime + class ChatbotHelper(): def get_event_index(self, tracker_event): @@ -5,3 +7,28 @@ def get_event_index(self, tracker_event): while i >= 0 and tracker_event[i]["event"] != "bot": i -= 1 return i + +class EventHelper(): + + datetime_format = '%Y-%m-%d %H:%M:%S.%f' + + def get_events(self, event_list): + data = [] + + for row in event_list: + if 'tanggal' in row and 'detail' in row: + data.append(row) + + result = [] + + if data: + sorted_data = sorted(data, key=lambda k: datetime.strptime(k['tanggal'], self.datetime_format), reverse=True) + for data in sorted_data[:5]: + result.append('- {} - {}/{}/{}'.format(data['tanggal'], + data['detail']['nama'], + data['detail']['jenis'], + data['detail']['kategori'])) + + return '\n\n'.join(result) + + return diff --git a/actions/resources/db_helper.py b/actions/resources/db_helper.py index 78bbcb2..3a5dad2 100644 --- a/actions/resources/db_helper.py +++ b/actions/resources/db_helper.py @@ -34,33 +34,3 @@ def put(self, id_: str, payload: dict, collection_name: str): return {'message': 'success'}, 200 except Exception as e: return {'message': e}, 400 - -# import re -# from datetime import datetime - -# if __name__ == '__main__': -# a = [] -# tanggal = '2020-12-08 19:44:34.849431' -# # tanggal_split = tanggal.split(':') -# # tanggal_split[-1] = str(round(float(tanggal_split[-1]))) - -# datetime_format = '%Y-%m-%d %H:%M:%S.%f' -# datetime_object = datetime.strptime(tanggal, datetime_format) -# print(type(datetime_object)) -# print(datetime_object) -# a.append(datetime_object) -# # tanggal_final = ':'.join(tanggal_split) - - -# from datetime import datetime - -# datetime_str = '09/19/18 13:55:26' - -# datetime_object = datetime.strptime(datetime_str, '%m/%d/%y %H:%M:%S') - -# print(type(datetime_object)) -# print(datetime_object) # printed in default format - -# a.append(datetime_object) - -# print(sorted(a, reverse=True)[:1]) \ No newline at end of file diff --git a/actions/resources/form_history_event.py b/actions/resources/form_history_event.py index 71c72fc..914732c 100644 --- a/actions/resources/form_history_event.py +++ b/actions/resources/form_history_event.py @@ -7,11 +7,12 @@ from rasa_sdk.events import SlotSet from actions.resources.chatbot_validator import ChatbotValidator -from actions.resources.chatbot_helper import ChatbotHelper +from actions.resources.chatbot_helper import ChatbotHelper, EventHelper from actions.models import user, event chatbot_validator = ChatbotValidator() chatbot_helper = ChatbotHelper() +event_helper = EventHelper() user = user.User() event = event.Event() @@ -66,7 +67,8 @@ def submit(self, dispatcher: CollectingDispatcher, if res and status_code == 200: for doc in res: self.events.append(doc.to_dict()) - dispatcher.utter_message(str(self.events)) + dispatcher.utter_message(str(event_helper.get_events(self.events))) + # dispatcher.utter_message(str(self.events)) self.events = [] return [SlotSet(row, None) for row in self.required_slots(tracker)] \ No newline at end of file