|
|
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)
|
|
|
|