@ -1,5 +1,6 @@
import random
import features
import json
api = features . API ( )
debug = False
@ -17,8 +18,11 @@ def handle_command(sender, message):
result = commands [ state [ 0 ] ] ( state , message , sender )
return result
except Exception as e :
if __name__ != ' __main__ ' :
state = [ ]
api . update_user_state ( sender , state )
return {
" response " : f " ⚠️ Error⚠️ "
" response " : f " ⚠️ Error⚠️ \n { e } "
}
return {
@ -202,13 +206,202 @@ def meetings(state,message,sender):
' response ' : api . appointments . list_upcoming_appointments ( sender )
}
def appointments ( ) :
def register_customer ( state , message , sender ) :
if api . appointments . is_customer ( sender ) :
return { ' response ' : " Already registered. " }
if state == [ ' !register2 ' ] :
return {
' response ' : ' What is your first name? '
}
return {
" response " : None ,
state : [ ]
if state == [ ] :
state = [ ' !register ' ]
api . update_user_state ( sender , state )
return {
' response ' : ' What is your first name? '
}
if len ( state ) == 1 :
state . append ( message )
api . update_user_state ( sender , state )
return {
' response ' : ' What is your last name? '
}
if len ( state ) == 2 :
state . append ( message )
api . update_user_state ( sender , state )
return {
' response ' : ' What is your e-mail? '
}
if len ( state ) == 3 :
state . append ( message )
api . update_user_state ( sender , state )
return {
' response ' : " What is your phone number? "
}
if len ( state ) == 4 :
state . append ( message )
api . update_user_state ( sender , state )
resp = f " You ' ve entered: ` { state [ 1 ] } { state [ 2 ] } ( { state [ 3 ] } / { state [ 4 ] } )` \n **Is this correct?** \n If so, respond with:Yes \n If not, to restart respond with :No \n You can always cancel with:nevermind "
return {
' response ' : resp
}
if len ( state ) == 5 :
if " yes " in message . lower ( ) :
data = {
" firstName " : state [ 1 ] ,
" lastName " : state [ 2 ] ,
" email " : state [ 3 ] ,
" phone " : state [ 4 ] ,
" notes " : f " matrix: { sender } "
}
if sender == " admin " :
dat = json . dumps ( data )
print ( f " Data: \n { dat } " )
if api . appointments . register_customer ( data ) :
if ( state [ 0 ] == ' !register2 ' ) :
state = [ ' !book ' ]
api . update_user_state ( sender , state )
return { ' response ' : " Successfully registered. \n \n " + booking ( [ ' !book ' ] , ' ' , sender ) [ ' response ' ] }
state = [ ]
api . update_user_state ( sender , state )
return { ' response ' : " Successfully registered. " }
else :
return { ' response ' : " Error, please try again. " }
api . update_user_state ( sender , [ ] )
return {
' response ' : ' '
}
def select_service ( state , message , sender ) :
if len ( state ) > = 2 :
return select_provider ( state , message , sender )
# ['!book','select-service']
if message == " !book " :
return { ' response ' : api . select_service ( ) }
else :
try :
state . append ( api . appointments . get_services ( ) [ int ( message ) ] [ ' id ' ] )
api . update_user_state ( sender , state )
return booking ( state , " " , sender )
except :
return { ' response ' : ' Error selecting service \n To cancel type:nevermind ' }
def select_provider ( state , message , sender ) :
if len ( state ) > = 3 :
return select_time ( state , message , sender )
if message == " " :
return { ' response ' : api . select_provider ( ) }
try :
state . append ( api . appointments . get_providers ( ) [ int ( message ) ] [ ' id ' ] )
api . update_user_state ( sender , state )
return booking ( state , " " , sender )
except :
return { ' response ' : ' Error selecting provider \n To cancel type:nevermind ' }
def select_time ( state , message , sender ) :
if len ( state ) > = 5 :
return booking ( state , message , sender )
api . update_data ( )
# ['!book','select-time']
if len ( state ) == 3 :
msg = api . select_times ( state [ 1 ] , state [ 2 ] , message )
if msg == False :
return { ' response ' : " Please enter a date you ' d like to book ( \" YYYY-MM-DD \" format) " }
state . append ( message )
api . update_user_state ( sender , state )
return { ' response ' : msg }
if len ( state ) == 4 :
times = api . appointments . get_availabilities ( state [ 1 ] , state [ 2 ] , state [ 3 ] )
if message in times :
state . append ( message )
time = None
try :
time = times [ int ( message ) - 1 ]
state . append ( time )
api . update_user_state ( sender , state )
return booking ( state , message , sender )
except :
return { ' response ' : api . select_times ( state [ 1 ] , state [ 2 ] , state [ 3 ] ) }
return { ' response ' : error }
def booking ( state , message , sender ) :
if len ( state ) > 5 :
state = [ ]
if state == [ ] :
state . append ( " !book " )
api . update_user_state ( sender , state )
"""
To book an appointment , you need ( in order ) :
* the customer ID ( now mapped to mxid ) ( 0 ? )
* The service id ( 1 )
* the provider id ( 2 )
* the start date & time ( 3 )
"""
#Quick checks
customer = api . appointments . is_customer ( sender )
if customer == False :
return register_customer ( [ ] , " " , sender )
#Service check
service = None
if len ( api . appointments . services ) == 0 :
return { ' response ' : " Error: there are no services " }
if len ( api . appointments . services ) == 1 :
service = api . appointments . get_services ( ) [ 0 ]
state . append ( service )
api . update_user_state ( sender , state )
return booking ( state , message , sender )
if len ( state ) > = 2 :
service = state [ 1 ]
if service == None :
return select_service ( state , message , sender )
#Provider check
provider = None
if len ( api . appointments . providers ) == 0 :
return { ' response ' : ' error: there are no providers ' }
if len ( state ) > = 3 :
provider = state [ 2 ]
elif len ( api . appointments . providers ) == 1 :
provider = api . appointments . get_providers ( ) [ 0 ] [ ' id ' ]
if service != None :
state . append ( provider )
api . update_user_state ( sender , state )
if provider == None :
return select_provider ( state , message , sender )
time = None
if len ( state ) == 5 :
time = state [ 4 ]
if time == None :
return select_time ( state , message , sender )
data = {
" start " : state [ 3 ] + " " + state [ 4 ] + " :00 " ,
" customerId " : int ( customer ) ,
" providerId " : int ( provider ) ,
" serviceId " : int ( service )
}
result = api . appointments . register_appointment ( data )
if result != False :
state = [ ]
api . update_user_state ( sender , state )
return { ' response ' : ' Successfully registered appointment! ' }
else :
state = [ ]
api . update_user_state ( sender , state )
print ( result )
return { ' response ' : " Error: please try again " }
return { ' response ' : " Error: please try again " }
def services ( state , message , sender ) :
return {
' response ' : api . list_services ( )
}
commands = {
" nevermind " : nevermind ,
@ -222,7 +415,11 @@ commands = {
" !remove footer " : remove_footer ,
" !add admin " : add_admin ,
" !remove admin " : remove_admin ,
" meetings " : meetings
" !meetings " : meetings ,
" !register " : register_customer ,
" !register2 " : register_customer ,
" !book " : booking ,
" !services " : services
}
@ -235,3 +432,4 @@ if __name__ == '__main__':
msg = input ( " user: " )
print ( " bot: " + handle_command ( user , msg ) [ ' response ' ] )
# print("state:",user)