You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

436 lines
12 KiB
Python

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

import random
import features
import json
api = features.API()
debug = False
def handle_command(sender, message):
state = api.get_user_state(sender)
for command in commands:
if message.find(command) == 0:
result = commands[command](state, message, sender)
return result
if len(state) > 0:
if debug == 1:
return commands[state[0]](state, message, sender)
try:
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⚠\n{e}"
}
return {
"response": "",
}
def get_faq_string():
return api.get_faq_string()
def nevermind(state, message, sender):
api.update_user_state(sender, [])
return {
"response": "starting over."
}
# faq
def get_faq(state, message, sender):
if len(state) == 0:
return {
"response": api.get_faq_string()
}
return {
"response": api.get_faq_string()
}
def add_question(state, message, sender):
if len(state) == 0:
api.update_user_state(sender, ["!add question"])
return {
'response': "Please enter the question title."
}
elif len(state) == 1:
state.append(message)
api.update_user_state(sender, state)
return {
'response': 'Please enter the answer to the question.'
}
elif len(state) == 2:
state.append(message)
api.update_user_state(sender, state)
state = api.get_user_state(sender)
return {
'response': f"Your question is:\n---\n# {state[1]}\n{state[2]}\n\n---\nIf this is what you want respond with `confirm`\n If you'd like to start over respond with `restart`\n Respond with `nevermind` to cancel entirely"
}
elif len(state) == 3:
if message == 'confirm':
api.add_question({
'question': state[1],
'answer': state[2]
})
api.update_user_state(sender, [])
return {
'response': 'Question added.'
}
elif message == 'restart':
api.update_user_state(sender, ['!add question'])
return {
'response': 'Please enter the question title.'
}
else:
return {
'response': f"Your question is:\n# {state[1]}\n{state[2]}\n\nIf this is what you want respond with `confirm`\n If you'd like to start over respond with `restart`\n Respond with `nevermind` to cancel entirely"
}
return {
'response': None
}
def update_question(state, message, sender):
if len(api.data['faq']['questions']) == 0:
api.update_user_state(sender, [])
return {
'response': "No questions registered."
}
elif len(state)==0:
api.update_user_state(sender,"!update question")
return {
"response":f"Choose a question to update:\n {api.get_faq_questions}"
}
return {
'response': None,
}
def remove_question(state, message, sender):
if len(api.data['faq']['questions']) == 0:
api.update_user_state(sender, [])
return {
'response': "No questions registered."
}
elif len(state)==0:
api.update_user_state(sender,["!remove question"])
return {
"response":f"Choose a question to remove:\n {api.get_faq_questions()}"
}
elif len(state) == 1:
try:
int(message)
except:
return {"response":"Please enter a number."}
state.append(message)
if int(state[1]) < len(api.data['faq']['questions']) and int(state[1]) >=0:
if debug == True:
api.remove_question(int(state[1]))
api.update_user_state(sender,[])
return {
'response':'Question removed'
}
else:
try:
api.update_user_state(sender,[])
api.remove_question(int(state[1]))
return {
'response':'Question removed'
}
except:
pass
api.update_user_state(sender,["!remove question"])
return {
'response':'Please enter the correct question #'
}
return {
'response': None,
}
def update_header(state, message, sender):
return {
'response': None,
}
def remove_header(state, message, sender):
return {
'response': None,
}
def update_footer(state, message, sender):
return {
'response': None,
}
def remove_footer(state, message, sender):
return {
'response': None,
}
def add_admin(state, message, sender):
return {
'response': None,
}
def remove_admin(state, message, sender):
return {
'response': None,
}
def meetings(state,message,sender):
return {
'response':api.appointments.list_upcoming_appointments(sender)
}
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?'
}
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?**\nIf so, respond with:Yes\nIf not, to restart respond with :No\nYou 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\nTo 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\nTo 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,
"!faq": get_faq,
"!add question": add_question,
"!remove question": remove_question,
"!update question": update_question,
"!update header": update_header,
"!remove header": remove_header,
"!update footer": update_footer,
"!remove footer": remove_footer,
"!add admin": add_admin,
"!remove admin": remove_admin,
"!meetings":meetings,
"!register":register_customer,
"!register2":register_customer,
"!book":booking,
"!services":services
}
if __name__ == '__main__':
user = "admin"
msg = ""
debug = True
while msg != "exit":
msg = input("user:")
print("bot:"+handle_command(user, msg)['response'])
# print("state:",user)