2021-04-26 15:13:52 +02:00
from SystemAct import SystemAct
from SystemActType import SystemActType
2021-06-03 17:48:12 +02:00
from UserActType import UserActType
2021-06-18 15:26:21 +02:00
import random
2021-04-26 15:13:52 +02:00
2021-04-26 00:29:07 +02:00
class NLG :
2021-06-03 17:48:12 +02:00
def __init__ ( self , dst ) :
self . DST = dst
2021-06-18 15:26:21 +02:00
def format_meeting ( self , date , time , place , participants , description , format_type ) :
if participants :
participants = ' , ' . join ( participants )
if format_type == ' create ' :
return f ' Data: { date } \n Czas: { time } \n Miejsce: { place } \n Uczestnicy: { participants } \n Opis: { description } ' . replace ( ' None ' , ' BRAK ' )
elif format_type == ' update ' :
return f ' Data: { date } \n Czas: { time } \n Miejsce: { place } \n Uczestnicy: { participants } \n Opis: { description } ' . replace ( ' None ' , ' BEZ ZMIAN ' )
else :
return f ' Data: { date } \n Czas: { time } \n Miejsce: { place } \n Uczestnicy: { participants } \n Opis: { description } '
def generate_response ( self , systemAct : SystemAct ) - > str :
dialogue_state , _ , _ = self . DST . get_dialogue_state ( )
2021-06-03 17:48:12 +02:00
if dialogue_state == UserActType . CREATE_MEETING :
if systemAct . getActType ( ) == SystemActType . REQUEST :
2021-06-18 15:26:21 +02:00
if ' date ' in systemAct . getActParams ( ) :
return random . choice ( [ ' W jakim dniu ma się odbyć to spotkanie? ' , ' Jakiego dnia odbędzie się to spotkanie? ' ] )
elif ' time ' in systemAct . getActParams ( ) :
return random . choice ( [ ' W jakim czasie ma się zacząć to spotkanie? ' , ' O której godzinie rozpoczyna się to spotkanie? ' ] )
elif ' place ' in systemAct . getActParams ( ) :
return random . choice ( [ ' W jakim miejscu odbywać się będzie to spotkanie? ' , ' Gdzie ma się odbyć to spotkanie? ' ] )
elif ' description ' in systemAct . getActParams ( ) :
return random . choice ( [ ' Czy mam dodać jakiś opis do tego spotkania? ' , ' Czy to spotkanie ma posiadać jakiś opis? ' ] )
elif ' participants ' in systemAct . getActParams ( ) :
return random . choice ( [ ' Kto będzie brał udział w spotkaniu? ' , ' Kto będzie uczestnikiem tego spotkania? ' ] )
elif systemAct . getActType ( ) == SystemActType . CONFIRM_DOMAIN :
slots = systemAct . getActParams ( )
meeting = self . format_meeting ( slots [ ' date ' ] , slots [ ' time ' ] , slots [ ' place ' ] , slots [ ' participants ' ] , slots [ ' description ' ] , ' create ' )
return random . choice ( [ f ' Czy mam dodać te spotkanie do kalendarza? \n { meeting } ' , f ' Czy chcesz, abym dodał to spotkanie do kalendarza? \n { meeting } ' ] )
2021-06-03 17:48:12 +02:00
elif dialogue_state == UserActType . UPDATE_MEETING :
if systemAct . getActType ( ) == SystemActType . REQUEST :
2021-06-18 15:26:21 +02:00
if False in systemAct . getActParams ( ) :
if ' date ' in systemAct . getActParams ( ) :
return random . choice ( [ ' W jakim dniu odbywa się spotkanie, które chcesz edytować? ' , ' Podaj datę spotkania, które chcesz zmienić. ' ] )
elif ' time ' in systemAct . getActParams ( ) :
return random . choice ( [ ' O której godzinie zaczyna się spotkanie, które chcesz zmienić? ' , ' Podaj godzinę spotkania, które chcesz edytować. ' ] )
elif True in systemAct . getActParams ( ) :
if ' date ' in systemAct . getActParams ( ) :
slot_name = ' datę '
slot_question = ' podaj nową datę. '
elif ' time ' in systemAct . getActParams ( ) :
slot_name = ' godzinę '
slot_question = ' podaj nową godzinę rozpoczęcia tego spotkania. '
elif ' place ' in systemAct . getActParams ( ) :
slot_name = ' miejsce '
slot_question = ' podaj nowe miejsce, w jakim odbywa się to spotkanie. '
elif ' description ' in systemAct . getActParams ( ) :
slot_name = ' opis '
slot_question = ' podaj nowy opis tego spotkania. '
else :
slot_name = ' uczestników '
slot_question = ' podaj kim będą nowi uczestnicy tego spotkania. '
return f ' Czy chcesz zmienić { slot_name } tego spotkania? Jeśli tak, to { slot_question } '
2021-06-03 17:48:12 +02:00
if systemAct . getActType ( ) == SystemActType . CONFIRM_DOMAIN :
2021-06-18 15:26:21 +02:00
if ' meeting_to_update ' in systemAct . getActParams ( ) :
response = random . choice ( [ f ' Czy to jest spotkanie które chcesz edytować? ' , f ' Czy chcesz wprowadzić zmiany do następującego spotkania? ' ] )
# TODO: pokazać prawdziwe spotkanie po ew. dodaniu DB
meeting = self . format_meeting ( ' 24.06.2021 ' , ' 10:00 ' , ' Kawiarnia Portowa ' , [ ' Andrzej Duda ' , ' Aleksander Kwaśniewski ' ] , ' Spotkanie biznesowe w sprawie tarczy antyrakietowej ' , None )
return f ' { response } \n { meeting } '
else :
slots = systemAct . getActParams ( )
meeting = self . format_meeting ( slots [ ' date ' ] , slots [ ' time ' ] , slots [ ' place ' ] , slots [ ' participants ' ] , slots [ ' description ' ] , ' update ' )
return random . choice ( [ f ' Czy chcesz wprowadzić następujące zmiany do tego spotkania? \n { meeting } ' , f ' Czy potwierdzasz następujące zmiany w tym spotkaniu? \n { meeting } ' ] )
2021-06-03 17:48:12 +02:00
elif dialogue_state == UserActType . CANCEL_MEETING :
if systemAct . getActType ( ) == SystemActType . REQUEST :
2021-06-18 15:26:21 +02:00
if ' date ' in systemAct . getActParams ( ) :
return random . choice ( [ ' W jakim dniu odbywa się spotkanie, które chcesz anulować? ' , ' Podaj datę spotkania, które chcesz usunąć z kalendarza. ' ] )
elif ' time ' in systemAct . getActParams ( ) :
return random . choice ( [ ' O której godzinie zaczyna się spotkanie, które chcesz usunąć z kalendarza? ' , ' Podaj godzinę spotkania, które chcesz anulować. ' ] )
2021-06-03 17:48:12 +02:00
# TODO dopracować po dodaniu DB
if systemAct . getActType ( ) == SystemActType . CONFIRM_DOMAIN :
2021-06-18 15:26:21 +02:00
response = random . choice ( [ f ' Czy na pewno chcesz anulować następujące spotkanie? ' , f ' Czy potwierdzasz usunięcie następującego spotkania? ' ] )
# TODO: pokazać prawdziwe spotkanie po ew. dodaniu DB
meeting = self . format_meeting ( ' 24.06.2021 ' , ' 10:00 ' , ' Kawiarnia Portowa ' , [ ' Andrzej Duda ' , ' Aleksander Kwaśniewski ' ] , ' Spotkanie biznesowe w sprawie tarczy antyrakietowej ' , None )
return f ' { response } \n { meeting } '
2021-06-03 17:48:12 +02:00
elif dialogue_state == UserActType . MEETING_LIST :
if systemAct . getActType ( ) == SystemActType . REQUEST :
if " date " in systemAct . getActParams ( ) :
2021-06-18 15:26:21 +02:00
return random . choice ( [ ' Z jakiego dnia chcesz przejrzeć spotkania? ' , ' Spotkania z jakiego dnia chciałbyś zobaczyć? ' ] )
elif systemAct . getActType ( ) == SystemActType . MEETING_LIST :
date = systemAct . getActParams ( ) [ ' date ' ]
response = random . choice ( [ f ' Dnia { date } masz zaplanowane następujące spotkania: ' , f ' W dniu { date } odbywają się następujące spotkania: ' ] )
# TODO: pokazać prawdziwe spotkania po ew. dodaniu DB
meetings = self . format_meeting ( date , ' 10:00 ' , ' Kawiarnia Portowa ' , [ ' Andrzej Duda ' , ' Aleksander Kwaśniewski ' ] , ' Spotkanie biznesowe w sprawie tarczy antyrakietowej ' , None )
self . DST . clear ( )
return f ' { response } \n { meetings } '
2021-06-03 17:48:12 +02:00
elif dialogue_state == UserActType . FREE_TIME :
if systemAct . getActType ( ) == SystemActType . REQUEST :
2021-06-18 15:26:21 +02:00
if ' date ' in systemAct . getActParams ( ) :
return random . choice ( [ ' Z jakiego dnia chcesz zobaczyć wolne godziny? ' , ' Z jakiego dnia chciałbyś zobaczyć godziny, w których nie masz spotkań? ' ] )
elif systemAct . getActType ( ) == SystemActType . FREE_TIME :
date = systemAct . getActParams ( ) [ ' date ' ]
response = random . choice ( [ f ' W następujących godzinach, dnia { date } nie masz zaplanowanych spotkań: ' , f ' W dniu { date } następujące godziny są wolne od spotkań: ' ] )
# TODO: pokazać prawdziwe godziny po ew. dodaniu DB
meeting_hours = ' 00:00-08:00 \n 10:00-16:00 \n 18:00-24:00 '
self . DST . clear ( )
return f ' { response } \n { meeting_hours } '
2021-06-03 17:48:12 +02:00
elif systemAct . getActType ( ) == SystemActType . AFFIRM :
if " update_meeting " in systemAct . getActParams ( ) :
2021-06-18 15:26:21 +02:00
task_type_1 = ' zaktualizowane '
task_type_2 = ' Zaktualizowanie '
elif " cancel_meeting " in systemAct . getActParams ( ) :
task_type_1 = ' odwołane '
task_type_2 = ' Odwołanie '
else :
task_type_1 = ' dodane '
task_type_2 = ' Dodanie '
return random . choice ( [ f ' Spotkanie zostało pomyślnie { task_type_1 } . ' , f ' { task_type_2 } spotkania przebiegło pomyślnie. ' ] )
2021-06-03 17:48:12 +02:00
elif systemAct . getActType ( ) == SystemActType . REQMORE :
if " create_meeting " in systemAct . getActParams ( ) :
2021-06-18 15:26:21 +02:00
response = ' Tworzenie spotkania zostało przerwane. '
elif " update_meeting " in systemAct . getActParams ( ) :
response = ' Aktualizacja spotkania została przerwana. '
elif " cancel_meeting " in systemAct . getActParams ( ) :
response = ' Odwoływanie spotkania zostało przerwane. '
else :
response = ' '
return random . choice ( [ f ' { response } Czy mogę Ci w czymś jeszcze pomóc? ' , f ' { response } Czy jest jeszcze coś co mogę dla Ciebie zrobić? ' ] )
2021-06-03 17:48:12 +02:00
else :
if systemAct . getActType ( ) == SystemActType . WELCOME_MSG :
2021-06-18 15:26:21 +02:00
introduction = ' Nazywam się Janusz i jestem twoim asystentem kalendarza spotkań. '
return random . choice ( [ f ' Cześć. { introduction } ' , f ' Dzień dobry. { introduction } ' , f ' Witam. { introduction } ' ] )
elif systemAct . getActType ( ) == SystemActType . BYE :
return random . choice ( [ ' Do widzenia. ' , ' Miłego dnia. ' ] )
elif systemAct . getActType ( ) == SystemActType . NOT_UNDERSTOOD :
try_again = ' Spróbuj swoją wypowiedź sformułować w inny sposób. '
return random . choice ( [ f ' Nie rozumiem o czym mówisz. { try_again } ' , f ' Nie zrozumiałem twojej ostatniej wypowiedzi. { try_again } ' , f ' Twoja ostatnia prośba była dla mnie nie zrozumiała. { try_again } ' ] )
2021-04-26 15:13:52 +02:00
raise Exception ( " SystemAct: {} not recognized " . format ( systemAct ) )