Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions actions/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from actions.resources import (form_regist_event, form_history_event)

348 changes: 174 additions & 174 deletions actions/actions.py

Large diffs are not rendered by default.

8 changes: 7 additions & 1 deletion actions/models/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
27 changes: 27 additions & 0 deletions actions/resources/chatbot_helper.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,34 @@
from datetime import datetime

class ChatbotHelper():

def get_event_index(self, tracker_event):
i = len(tracker_event) - 1
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
1 change: 1 addition & 0 deletions actions/resources/chatbot_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}$'
Expand Down
2 changes: 1 addition & 1 deletion actions/resources/db_helper.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from firebase_admin import credentials,firestore
from firebase_admin import credentials, firestore
import firebase_admin

import uuid
Expand Down
74 changes: 74 additions & 0 deletions actions/resources/form_history_event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
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, EventHelper
from actions.models import user, event

chatbot_validator = ChatbotValidator()
chatbot_helper = ChatbotHelper()
event_helper = EventHelper()

user = user.User()
event = event.Event()

class HistoryForm(FormAction):

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:
return [SlotSet('email', email)]
dispatcher.utter_message(chatbot_validator.email_not_found)
return []
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['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(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)]
193 changes: 193 additions & 0 deletions actions/resources/form_regist_event.py
Original file line number Diff line number Diff line change
@@ -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)]
9 changes: 9 additions & 0 deletions data/nlu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ nlu:
- yup
- yes
- benar
- sudah benar
- sudah
- bersedia
- lanjut
- lanjutkan
Expand All @@ -106,6 +108,13 @@ nlu:
- jangan
- jangan dilanjutkan

- intent: event_history
examples: |
- riwayat
- history
- history event
- riwayat event

- intent: thanks
examples: |
- terima kasih
Expand Down
8 changes: 7 additions & 1 deletion data/stories.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 2 additions & 0 deletions domain.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ intents:
- regist_event
- affirm
- deny
- event_history

slots:
event_conf:
Expand All @@ -30,6 +31,7 @@ actions:

forms:
- regist_form
- history_form

responses:
utter_greet:
Expand Down