def incoming_call(): response = twiml.Response() response.say('hello!') response.gather(action="/incoming/call", method=["GET"]) return Response(str(response), mimetype='text/xml')
def voice(): response = twiml.Response() with response.dial(callerId=app.config['TWILIO_CALLER_ID'], timeLimit="600") as dial: dial.number(request.form['PhoneNumber']) return str(response)
def smsGet(): response = twiml.Response() response.sms('Welcome to RootRec! Your number has been added to the list. Reply with "Stop" at any time to be removed from this service!') return str(response)
def handle_sms(request): """ :param request: :return: """ trigger = None SEND_ERROR = False vendor_number = settings.BARHOP_NUMBER from_, body = parse_sms(request.POST) try: location = request.POST['FromCity'] except: location = '' from_ = '+919946341903' if body: body = str(body) if body.find('-') != -1: trigger = body.split('-')[1] trigger = trigger.strip() client_message = trigger else: trigger = body client_message = body #====== Checks text or number ========== checkType = RepresentsInt(client_message) if checkType: client_message_number = int(client_message) else: client_message_number = client_message #======================================= r = twiml.Response() # ====================================== # # Get Customer data using mobile number # # ====================================== # customer = get_user_by_mobile(from_) ref_user_obj = get_ref_user_by_mobile(from_) # ============================================ # # Check if the user already has a conversation # # ============================================ # try: conversation = Conversation.objects.get(customer=customer, closed=False,) except: conversation = None if not conversation: trigger_data = get_trigger_by_name(trigger) # ================================================== # # here we have to notify the client that there is no # such trigger name. # ================================================== # if trigger_data is None: message = 'That was not a valid trigger word. Please text a valid trigger word.' send_message(vendor_number, from_, message) return HttpResponse(str(r)) dealer = trigger_data.dealer try: trophy = TrophyModel.objects.get(dealer=dealer) except: trophy = None if customer is None: if ref_user_obj: # ================================================= # # Saving the current requested trigger for the user # ================================================= # ref_user_obj.current_trigger = trigger_data ref_user_obj.save() send_new_user_message(request, vendor_number, from_, ref_user_obj.id) else: ref_user = RefNewUser(dealer=dealer, dealer_mobile=vendor_number, mobile=from_, current_trigger=trigger_data) ref_user.save() #Send mail to user for signup send_new_user_message(request, vendor_number, from_, ref_user.id) else: if customer.is_active: # ===================================================# # Saving the current requested trigger for the user # # =================================================# if ref_user_obj: ref_user_obj.current_trigger = trigger_data ref_user_obj.save() conversation = Conversation.objects.create(dealer=dealer, trigger=trigger_data, customer=customer, trophy=trophy, process_stage=1) #==============================================# # Checking grid availability to place order # # if grid full return a message to try again # #===========================================# trigger_id = trigger_data.id grid_availability = check_grid_availability(trigger_id) if not grid_availability: message_to_client = "Sorry, Barhop is a maximum capacity. Please try again in few minutes, thank you." message_recieved_dealer = trigger_data.trigger_name save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) conversation.closed = True conversation.save() return HttpResponse(str(r)) #************************************# # random number creation order_code # #**********************************# # random_num = get_random_string(length=4, allowed_chars='QWERTYUIOP123ASDFGHJKL456ZXCVBNM7890') #order_code = str(random_num)+str(conversation.id) order_code = get_random_string(length=3, allowed_chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') purchaseOrder = PurchaseOrder.objects.create(order_code=order_code, conversation=conversation, dealer=dealer, customer=customer, trigger=trigger_data, order_status='PENDING', location = location ) # message_to_client = " Welcome to Barhop! Here is the menu for "+ str(trigger_data.trigger_name) +" Reply 'START' to start your order! " message_to_client = " Welcome to Barhop! Reply 'start' to start your order from "+ str(trigger_data.trigger_name) +"!" message_recieved_dealer = trigger_data.trigger_name save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) else: message = 'Your account is not active yet. Please activate your account by following the link your in your email.' send_message(vendor_number, from_, message) return HttpResponse(str(r)) else: trigger = conversation.trigger trigger_name = trigger.trigger_name process_stage = conversation.process_stage dealer = conversation.dealer customer = conversation.customer purchaseOrder = PurchaseOrder.objects.get(conversation=conversation) if not purchaseOrder.location: purchaseOrder.location = location purchaseOrder.save() if process_stage == 1 and client_message.lower() == "start" : #==============# # Menu list # #============# try: # menu_image = MenuListImages.objects.get(trigger=trigger_data) menu_image = get_menu_image(trigger, customer) image_url = menu_image.image.url url = get_current_url(request) media_url = url+image_url print("\n Media_url :"+str(media_url)) except: # old text # message_to_client = "Sorry for the inconvenience. No Menu added for this Bar. Thank you." message_to_client = "There is currently no menu for "+ str(trigger_name) +". Please try again later" message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) conversation.closed = True conversation.save() return HttpResponse(str(r)) # sending menu as MMS message_to_client = "Here is the Menu for "+ str(trigger_name)+" " send_multimedia_message(vendor_number, from_, message_to_client, media_url) conversation.process_stage = 2 conversation.save() message_to_client = "Text in the item number of the first item you want." message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) return HttpResponse(str(r)) elif process_stage == 2 and type(client_message_number) == int : #===========================# # Check menu item is valid # #=========================# try: menu_map_object = MenuCustomerMappping.objects.get(trigger=trigger,dealer=dealer,customer=customer) menu_data = menu_map_object.menu_data menu_id = menu_data[client_message_number] menu_object = MenuItems.objects.get(id=menu_id,dealer=dealer) except: menu_object = None if menu_object is None: # message_to_client = "Invalid input. Please check Item number" message_to_client = "Invalid input. Text in the item number of the item you want." message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) return HttpResponse(str(r)) #==================================# # Update menu item in order table # #================================# purchaseOrder = PurchaseOrder.objects.get(conversation=conversation,dealer=dealer,customer=customer,trigger=trigger,order_status='PENDING') order_menu_mapping = OrderMenuMapping.objects.create(order=purchaseOrder, menu_item=menu_object) message_to_client = "How many '"+ str(menu_object.item_name) +"' do you want?" message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) conversation.process_stage = 3 conversation.save() elif process_stage == 3 and type(client_message_number) == int : if client_message_number > 0: #================================# # Update quantity in order table # #================================# purchaseOrder = PurchaseOrder.objects.get(conversation=conversation, dealer=dealer,customer=customer,trigger=trigger,order_status='PENDING') order_menu_mapping_obj = OrderMenuMapping.objects.filter(order=purchaseOrder) order_menu_mapping_list = [ each_order_item for each_order_item in order_menu_mapping_obj] for each_order in order_menu_mapping_list: if not each_order.quantity: order_menu_mapping = each_order # ====================================== # # Checking the available quantity # ====================================== # available_quantity = order_menu_mapping.menu_item.quantity_available if available_quantity == 0: order_menu_mapping.delete() conversation.process_stage = 2 conversation.save() #===================# # Latest Menu list # #=================# try: menu_image = get_menu_image(trigger, customer) image_url = menu_image.image.url url = get_current_url(request) media_url = url+image_url print("\n Media_url :"+str(media_url)) except: message_to_client = "There is currently no menu for "+ str(trigger_name) +". Please try again later" message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) conversation.closed = True conversation.save() return HttpResponse(str(r)) message_to_client = "We're sorry, there are no more " + str(order_menu_mapping.menu_item.item_name) +". Enter the item number of the item you want." message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) message_to_client = "check updated menu of "+ str(trigger_name) send_multimedia_message(vendor_number, from_, message_to_client, media_url) return HttpResponse(str(r)) if available_quantity < client_message_number : conversation.process_stage = 3 conversation.save() # message_to_client = "Sorry, your order is higher than available stock. Available quantity of " + str(order_menu_mapping.menu_item.item_name) +" is "+str(available_quantity)+ ". Please enter the number of quantity again." message_to_client = "The quantity of '"+ str(order_menu_mapping.menu_item.item_name) +"'' is "+str(available_quantity)+ ", please text in the quantity of the item you want." message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) return HttpResponse(str(r)) order_menu_mapping.quantity = client_message #=============================# # Toatal amount for each item # #=============================# price = order_menu_mapping.menu_item.item_price quantity = client_message total_amount = float(price) * float(quantity) order_menu_mapping.total_item_amount = total_amount order_menu_mapping.save() message_to_client = "Text in the item number of the next item you want, or reply 'done' to checkout!" message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) conversation.process_stage = 4 conversation.save() else: message_to_client = "Please enter a valid quantity." message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) elif process_stage == 4 and client_message.lower() == "done" : url = get_current_url(request) payment_url = str(url) +"/payment/purchase_invoice/"+str(purchaseOrder.id) url_shorten = shorten(payment_url) message_to_client = "Pay for your drinks here "+ str(url_shorten) message_recieved_dealer = client_message purchaseOrder = PurchaseOrder.objects.get(conversation=conversation, dealer=dealer, customer=customer,trigger=trigger,order_status='PENDING') order_menu_mapping = OrderMenuMapping.objects.filter(order=purchaseOrder) tottal_amount = 0 for order_mapp in order_menu_mapping: #total amount tottal_amount += order_mapp.total_item_amount #==================================# # Checking Item availability and # # Updating Item quantity # #==================================# ordered_quantity = order_mapp.quantity item = MenuItems.objects.get(id=order_mapp.menu_item.id) available_quantity = item.quantity_available if available_quantity < ordered_quantity : # Updating conversation stage conversation.process_stage = 3 conversation.save() # message_to_client = "Sorry, your order is higher than available stock. Available quantity of " + str(item.item_name) +" is "+str(available_quantity)+ ". Please enter the number of quantity again." message_to_client = "The quantity of '"+ str(order_menu_mapping.menu_item.item_name) +"'' is "+str(available_quantity)+ ", please text in the quantity of the item you want" message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) return HttpResponse(str(r)) else: item.quantity_available = available_quantity - ordered_quantity item.save() purchaseOrder.total_amount_paid = tottal_amount purchaseOrder.save() save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) conversation.process_stage = 5 conversation.save() # remove customer menu map MenuCustomerMappping.objects.filter(trigger=trigger,dealer=dealer,customer=customer).delete() elif process_stage == 4 and type(client_message_number) == int: # ========================= # # Check menu item is valid # ========================= # try: menu_map_object = MenuCustomerMappping.objects.get(trigger=trigger,dealer=dealer,customer=customer) menu_data = menu_map_object.menu_data menu_id = menu_data[client_message_number] menu_object = MenuItems.objects.get(id=menu_id) except: menu_object = None if menu_object is None: message_to_client = "Invalid input. Please check the item number." message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) return HttpResponse(str(r)) #==================================# # Update menu item in order table # #================================# purchaseOrder = PurchaseOrder.objects.get(conversation=conversation,dealer=dealer,customer=customer,trigger=trigger,order_status='PENDING') order_menu_mapping = OrderMenuMapping.objects.create(order=purchaseOrder, menu_item=menu_object) message_to_client = "How many '"+ str(menu_object.item_name) +"' do you want?" message_recieved_dealer = client_message save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) send_message(vendor_number, from_, message_to_client) conversation.process_stage = 3 conversation.save() else: if process_stage == 5: message_to_client = "You have already one pending order to pay." message_recieved_dealer = client_message send_message(vendor_number, from_, message_to_client) save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) return HttpResponse(str(r)) message_to_client = "Invalid message. Please send the correct message." message_recieved_dealer = client_message send_message(vendor_number, from_, message_to_client) save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) return HttpResponse(str(r)) return HttpResponse(str(r))
def post(self): r = twiml.Response() r.sms( "We will contact you when we are ready, do not text this number again" ) self.response.out.write(str(r))
def voice(): response = twiml.Response() response.say("Welcome to RootRec. We do not support voice at this time. Sorry.") return str(response)
def ProviderIVR_Main(request): """ DEPRECATED - to be replaced by ProviderIVR_Main_New in views_provider_v2.py """ # TODO: This function needs to be broken down into sub-functions for both # maintenance, and so that we can sanely implement allowing users to check # their voicemail from foreign phones. # DEBUG: #if (not 'callCounts' in request.session): # request.session['callCounts'] = dict() #if (not 'ProviderIVR_Main' in request.session['callCounts']): # request.session['callCounts']['ProviderIVR_Main'] = 1 #else: # request.session['callCounts']['ProviderIVR_Main'] += 1 logger.info('%s: ProviderIVR_Main POST data is %s' % (request.session.session_key, str(request.POST))) if ('CallStatus' in request.POST and request.POST['CallStatus'] == 'completed'): # call ended #raise Exception('Ending inappropriately. Call # stack is %s'%(str(request.session['ivr_call_stack']),)) # Update the log entry with the duration of the call try: log = callLog.objects.get(callSID=request.POST['CallSid']) log.call_duration = None if ('Duration' in request.POST): log.call_duration = int(request.POST['Duration']) except ObjectDoesNotExist as odne: # voicemail won't have a call logger.warning( 'Call log does not exist for sid: %s. Caller may have ' 'hung up shortly after Twilio starts call process.' % str(odne)) r = twilio.Response() return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE) elif (not 'CallStatus' in request.POST): # call ended #raise Exception('Ending inappropriately. Call # stack is %s'%(str(request.session['ivr_call_stack']),)) r = twilio.Response() return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE) # ready to initialize this call, request.session[provider_id] in request stack provider, log = ProviderIVR_Init(request) # Check to see if the caller doesn't own this mailbox. # TODO: This is where we check to see which number of the user's we compare # against to assume that the user is calling in. (got it?) if (provider.user.mobile_phone != request.REQUEST['Caller']): return ProviderIVR_ForwardCall(request) log.call_source = 'VM' log.save() # Great, now we know that this is the owner calling in. First up, check to # see if the user has a configuration file and that they've completed setup. try: config = provider.vm_config.get() except MultipleObjectsReturned: raise Exception("Provider %s %s has multiple vm_config objects." % (provider.user.first_name, provider.user.last_name)) except ObjectDoesNotExist: request.session['ivr_call_stack'].append('ProviderIVR_Main') request.session.modified = True return ProviderIVR_Setup(request) else: request.session['config_id'] = config.id # Check to see if the PIN value exists in the configuration. If it doesn't, # then run the user through configuration. if (not config.pin): request.session['ivr_call_stack'].append('ProviderIVR_Main') request.session.modified = True return ProviderIVR_Setup(request) if (not 'authenticated' in request.session): request.session['ivr_call_stack'].append('ProviderIVR_Main') request.session.modified = True r = twilio.Response() #r.append(tts('Welcome to your voice mail box.')) # campy and wastes time. return authenticateSession(request, r) # Now, check to ensure that user voicemail configuration was completed successfully. if (not config.config_complete): request.session['ivr_call_stack'].append('ProviderIVR_Main') request.session.modified = True return ProviderIVR_Setup(request) return ProviderIVR_TreeRoot(request)
def call(): r = twiml.Response() r.enqueue('', workflowSid=WORKFLOW_SID) return Response(str(r), content_type='application/xml')
def ProviderIVR_ForwardCall(request): """Forward the call to the dialed user, as per the user's preferences. Uses the following session variables: ProviderIVR_ForwardCall_state: The most recent "state" of execution. May have the following values: - None/Undefined/Empty String: First execution of this function. - Getting_Name: Getting the caller's name, if one hasn't been defined. - Dialing: Phone(s) have been dialed, and waiting for a response Caller """ r = twilio.Response() request.session.modified = True provider = Provider.objects.get(id=request.session['provider_id']) if ('CallStatus' in request.POST and request.POST['CallStatus'] == 'completed'): if ('Duration' in request.POST): callSID = request.POST['CallSid'] log = callLog.objects.get(callSID=callSID) log.call_duration = request.POST['Duration'] log.save() if (not 'ProviderIVR_ForwardCall_forward' in request.session): request.session[ 'ProviderIVR_ForwardCall_forward'] = provider.forward_voicemail forward = provider.forward_voicemail if (forward == 'VM'): return ProviderIVR_LeaveMsg(request) if (not 'ProviderIVR_ForwardCall_state' in request.session or not request.session['ProviderIVR_ForwardCall_state']): # New call. First, check to see if we should go straight to voicemail # Okay, the call isn't going to voicemail directly. Now, set state. request.session['ProviderIVR_ForwardCall_state'] = 'Getting_Name' # Now, get the caller's name # Is the user a DoctorCom user with a recorded name? callSID = request.POST['CallSid'] log = callLog.objects.get(callSID=callSID) if (log.mdcom_caller and isinstance(log.mdcom_caller, Provider)): if (log.mdcom_caller.vm_config.count()): prov_vmconfig = log.mdcom_caller.vm_config.get() if (prov_vmconfig.config_complete): logger.debug('%s/%s: Found the caller\'s name!' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], )) log.caller_spoken_name = prov_vmconfig.name log.save() return ProviderIVR_ForwardCall( request) # restart execution of this function else: logger.debug('%s/%s: Caller\'s vm_config incomplete!' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], )) else: logger.debug( '%s/%s: An unsuitable number of vm_config objects found: %i' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], log.mdcom_caller.vm_config.count(), )) else: logger.debug( '%s/%s: mdcom_caller %s either isn\'t defined or doesn\'t ' 'seem to be a Provider' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], str(log.mdcom_caller), )) # Okay, it's not a user with a name recording. Get one. request.session['ivr_call_stack'].append('ProviderIVR_ForwardCall') request.session['ivr_makeRecording_prompt'] = \ tts('Please say your name after the tone.') request.session['ivr_makeRecording_maxLength'] = 4 request.session['ivr_makeRecording_timeout'] = 2 request.session['ivr_makeRecording_leadSilence'] = 1 return getQuickRecording(request) if (request.session['ProviderIVR_ForwardCall_state'] == 'Getting_Name'): request.session['ProviderIVR_ForwardCall_state'] = 'Dialed' logger.debug('%s/%s: Set session to %s' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], request.session['ProviderIVR_ForwardCall_state'], )) callSID = request.POST['CallSid'] log = callLog.objects.get(callSID=callSID) if (not log.caller_spoken_name): log.caller_spoken_name = request.session.pop( 'ivr_makeRecording_recording') log.save() logger.debug('%s/%s: got provider \'%s\' \'%s\' with id %s' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], provider.first_name, provider.last_name, provider.pk, )) logger.debug( '%s/%s: Provider phone is \'%s\' and forward_other is \'%s\'' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], provider.user.phone, str(provider.forward_other), )) # Okay, let's dial! user_number = None if (forward == 'MO'): logger.debug('%s/%s: provider.forward_mobile True' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], )) user_number = provider.user.mobile_phone logger.debug('%s/%s: Setting user_number to \'%s\'' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], provider.user.mobile_phone, )) elif (forward == 'OF'): logger.debug('%s/%s: provider.forward_office True' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], )) user_number = provider.office_phone logger.debug('%s/%s: Setting user_number to \'%s\'' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], provider.office_phone, )) elif (forward == 'OT'): logger.debug('%s/%s: provider.forward_other True' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], )) user_number = provider.user.phone logger.debug('%s/%s: Setting user_number to \'%s\'' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], provider.user.phone, )) logger.debug('%s/%s: Tried to get called\'s number. Got \'%s\'' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], user_number, )) logger.debug( '%s/%s: Provider phone is \'%s\' and forward_other is \'%s\'' % ( request.session.session_key, request.session['ProviderIVR_ForwardCall_state'], provider.user.phone, str(provider.forward_other), )) if (not user_number): # no flags were set. if (provider.user.mobile_phone): user_number = provider.user.mobile_phone else: return ProviderIVR_LeaveMsg(request) dial = twilio.Dial( action=reverse('ProviderIVR_ForwardCall'), timeout=22, timeLimit=14400, # 4 hours callerId=request.session['Caller']) dial.append( twilio.Number(user_number, url=reverse('ProviderIVR_ForwardCall_VetAnswer'))) r.append(dial) r.append(twilio.Redirect(reverse('ProviderIVR_LeaveMsg'))) return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE) if (request.session['ProviderIVR_ForwardCall_state'] == 'Dialed'): callSID = request.POST['CallSid'] log = callLog.objects.get(callSID=callSID) if (log.call_connected): r.append(twilio.Hangup()) return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE) return ProviderIVR_LeaveMsg(request) r = twilio.Response() if (request.POST['DialStatus'] != 'answered'): if (request.POST['DialStatus'] == 'failed'): # TODO: Figure out how to deal with connection problems. Most # likely, send an email to the user and administrators. subject = 'ProviderIVR_ForwardCall Call Forward DialStatus Fail' message = 'ProviderIVR_ForwardCall got DialStatus failed. Post data: %s' % \ (str(request.POST),) mail_admins(subject=subject, message=message, fail_silently=False) # else request.POST['DialStatus'] == 'busy' or request.POST['DialStatus'] == 'no-answer' return ProviderIVR_LeaveMsg(request) # else: Do nothing so that the call continues un-interrupted return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
def ProviderIVR_Setup(request, config=None): """ This function is heavily dependent upon request.session; Twilio is kind enough to keep session cookies for us. """ # DEBUG: #if (not 'ProviderIVR_Setup' in request.session['callCounts']): # request.session['callCounts']['ProviderIVR_Setup'] = 1 #else: # request.session['callCounts']['ProviderIVR_Setup'] += 1 # DEBUG: #if (not 'debug_semaphore' in request.session): # request.session['ivr_setup_stage'] = 1 # request.session['debug_semaphore'] = True #else: # raise Exception(request.session['ivr_call_stack']) if ('CallStatus' in request.POST and request.POST['CallStatus'] == 'completed'): # call ended #raise Exception('Ending inappropriately. Call stack is %s'%(str( # request.session['ivr_call_stack']),)) # DEBUG r = twilio.Response() return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE) elif (not 'CallStatus' in request.POST): # call ended #raise Exception('Ending inappropriately. Call stack is %s'%(str( # request.session['ivr_call_stack']),)) # DEBUG r = twilio.Response() return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE) if 'ivr_setup_stage' not in request.session: # Okay, this is the first time this function is being executed for this # call. #raise Exception(request.session['ivr_call_stack']) # DEBUG r = twilio.Response() # Set up our session variables. request.session['ivr_setup_stage'] = 1 request.session['ivr_call_stack'].append('ProviderIVR_Setup') request.session.modified = True provider = Provider.objects.get(id=request.session['provider_id']) if (not provider.vm_config.count()): # This user needs a voicemailbox configuration object config = VMBox_Config() config.owner = provider config.save() request.session['config_id'] = config.id r.append(twilio.Pause( )) # one second pause keeps the first words from getting cut off. r.append( tts("Welcome to your voicemail account. It looks like some " "setup is needed. Let's get started.")) r.append(tts("First, we need to set up your pin number.")) event = callEvent(callSID=request.POST['CallSid'], event='I_STR') event.save() #raise Exception(request.session['ivr_call_stack']) # DEBUG return changePin(request, r, True) elif (request.session['ivr_setup_stage'] == 1): # Record name request.session['ivr_call_stack'].append('ProviderIVR_Setup') request.session.modified = True request.session['ivr_setup_stage'] = 2 return changeName(request, 'Now, we need to record your name.') elif (request.session['ivr_setup_stage'] == 2): # Record a greeting request.session['ivr_call_stack'].append('ProviderIVR_Setup') request.session.modified = True request.session['ivr_setup_stage'] = 3 return changeGreeting(request, 'Finally, we need to set up a greeting.') elif (request.session['ivr_setup_stage'] == 3): # Configuration complete! #raise Exception(request.session['ivr_call_stack']) # DEBUG #raise Exception(request.session['callCounts']) # DEBUG # Automatically "log" this user in. request.session['authenticated'] = True config = VMBox_Config.objects.get(id=request.session['config_id']) config.config_complete = True config.save() r = twilio.Response() r.append( tts('Your voice mail account is now set up. You may hang up ' 'now, or stay on the line to be taken to your voice mail box home.' )) event = callEvent(callSID=request.POST['CallSid'], event='I_FIN') event.save() r.append( twilio.Redirect(reverse(request.session['ivr_call_stack'].pop()))) request.session.modified = True return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE) raise Exception( 'Reached the end of ProviderIVR_Setup. This should never happen.')
def ProviderIVR_LeaveMsg(request): """ Records a voicemail message. Arguments: request - The standard Django request argument request.session Keys: provider_id - The ID of the Provider user who owns this voicemail box. """ # TODO: Update this code so that users can hit the pound key to # pop back and log into their own voicemail box. provider = Provider.objects.get(id=request.session['provider_id']) config = None config_complete = provider.vm_config.count( ) == 1 and provider.vm_config.get().config_complete if (config_complete): config = provider.vm_config.get() if ('CallStatus' in request.POST and request.POST['CallStatus'] == 'completed'): try: callSID = request.POST['CallSid'] auth, uri, = client.auth, client.account_uri resp = make_twilio_request('GET', uri + '/Calls/%s' % callSID, auth=auth) content = json.loads(resp.content) log = callLog.objects.get(callSID=callSID) log.call_duration = content['TwilioResponse']['Call']['Duration'] log.save() except: pass # this is really ugly, but letting this exception fall through # destroys a message analytics will pick up the duration later on if it's missing if ('ivr_makeRecording_recording' in request.session): provider_qs = Provider.objects.filter( mobile_phone=request.session['Caller']) if (provider_qs): request.session['ivr_makeRecording_callbacknumber'] = provider_qs[ 0].mdcom_phone subject = "Voice Mail from %s %s" % (provider_qs[0].first_name, provider_qs[0].last_name) else: request.session[ 'ivr_makeRecording_callbacknumber'] = request.session['Caller'] subject = "Voice Mail from %s" % request.session[ 'ivr_makeRecording_callbacknumber'] save_message(request, subject, [provider.user], None, "VM", False) request.session.pop('ivr_makeRecording_recording') r = twilio.Response() r.append(tts('Good bye')) r.append(twilio.Hangup()) return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE) # Get the configuration file for this Provider if (not config_complete): # FIXME: # Probably not the best way to create the spoken number. We need to # break the number down so that there are spaces between each digit, and # so that there are commas after the third and sixth digits. if (not 'Called' in request.session or (not request.session['Called'])): # This will occur if click2call calls this function request.session['ivr_makeRecording_prompt'] = tts( 'The user is not available. ' 'Please leave a message after the beep. Press pound when finished for options.' ) else: number = request.session['Called'] spoken_number = [] [spoken_number.extend([i, ' ']) for i in number] spoken_number.pop() # drop the last element spoken_number.insert(5, ',') spoken_number.insert(12, ',') request.session['ivr_makeRecording_prompt'] = tts( 'The person at %s ' 'is not available. Please leave a message after the beep. Press pound ' 'when finished for options.' % (''.join(spoken_number), )) else: p = re.compile('http') if (p.match(config.greeting)): # This is a Twilio recording. request.session['ivr_makeRecording_prompt'] = twilio.Play( config.greeting) else: # TODO: raise Exception('Unimplemented playback of local files') request.session['ivr_makeRecording_maxLength'] = 120 # 2 minutes request.session['ivr_makeRecording_leadSilence'] = 2 request.session['ivr_makeRecording_promptOnce'] = True request.session['ivr_makeRecording_returnOnHangup'] = \ 'MHLogin.DoctorCom.IVR.views_provider.ProviderIVR_LeaveMsg' request.session['ivr_call_stack'].append('ProviderIVR_LeaveMsg') request.session.modified = True # Pass off the recording action to the getRecording function. return getRecording(request)
def ProviderIVR_TreeRoot(request): r = twilio.Response() provider = Provider.objects.get(id=request.session['provider_id']) if (request.method == 'POST' and 'Digits' in request.POST): digits = request.POST['Digits'] p = re.compile('[0-9#*]$') if (not p.match(digits)): r.append(tts('I\'m sorry, I didn\'t understand that.')) elif (digits == '1'): # play messages request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot') request.session.modified = True messages = MessageBodyUserStatus.objects.filter( user=provider.user, delete_flag=False, msg_body__message___resolved_by=None, msg_body__message__message_type__in=('ANS', 'VM')) return playMessages(request, messages, r) elif (digits == '2'): request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot') request.session.modified = True messages = MessageBodyUserStatus.objects.filter( user=provider.user, delete_flag=False, msg_body__message___resolved_by=None, msg_body__message__message_type__in=('ANS', )) return playMessages(request, messages, r) elif (digits == '3'): request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot') request.session.modified = True messages = MessageBodyUserStatus.objects.filter( user=provider.user, delete_flag=False, msg_body__message___resolved_by=None, msg_body__message__message_type__in=('VM', )) # fix for issue 2257 - if we go to playMessages, it will use 3 in its digit and try to replay # current message which fails if there are no messages if (messages == [] or len(messages) == 0): pass else: request.session['ivr_call_stack'].append( 'ProviderIVR_TreeRoot') return playMessages(request, messages, r) elif (digits == '4'): request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot') request.session.modified = True return ProviderIVR_Options(request, True) elif (digits == '*'): pass else: r.append(tts('I\'m sorry, I didn\'t understand that.')) gather = twilio.Gather(finishOnKey='', numDigits=1) # messages = MessageBodyUserStatus unread_anssvc_msg_count = MessageBodyUserStatus.objects.filter( user=provider.user, read_flag=False, delete_flag=False, msg_body__message___resolved_by=None, msg_body__message__message_type='ANS').count() unread_msg_count = MessageBodyUserStatus.objects.filter( user=provider.user, read_flag=False, delete_flag=False, msg_body__message___resolved_by=None, msg_body__message__message_type='VM').count() saved_msg_count = MessageBodyUserStatus.objects.filter( user=provider.user, read_flag=True, delete_flag=False, msg_body__message___resolved_by=None, msg_body__message__message_type='VM').count() saved_anssvc_msg_count = MessageBodyUserStatus.objects.filter( user=provider.user, read_flag=True, delete_flag=False, msg_body__message___resolved_by=None, msg_body__message__message_type='ANS').count() say_str = [] say_str.append('You have %i new, and %i saved urgent messages,' % (unread_anssvc_msg_count, saved_anssvc_msg_count)) say_str.append(' ') say_str.append('and %i new, and %i saved voice messages,' % (unread_msg_count, saved_msg_count)) if (any((unread_msg_count, unread_anssvc_msg_count, saved_msg_count, saved_anssvc_msg_count))): say_str.append('To listen to all your messages, press one. ') say_str.append('To listen to your urgent messages, press two. ') say_str.append('To listen to your voice mail, press three. ') gather.append(tts(''.join(say_str))) gather.append(tts('To manage your voicemail settings, press four.')) gather.append(tts('To repeat this menu, press star.')) r.append(gather) return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
def generate_twiml(message): response = twiml.Response() response.say(message) return str(response)
def inbound(): response = twiml.Response() response.play('/static/sounds/inbound.mp3') return str(response)
def respond_sms(): # Grab unix time epoch_time = int(time.time()) # Store the message from the request sent by twilio i_msg = request.form.get("Body") # Store the number the message was sent from from_number = request.values.get("From") # The counter keeps track of the number of messages from this number in the # past 4 hours. If none, default to 0 counter = session.get('counter', 0) counter += 1 session['counter'] = counter # Retrieve the stored state from twilio's servers. Again, default to 0 state = session.get('state', 0) # Record the message in the sqlite db sql_write(counter, epoch_time, from_number, i_msg) # The default message is ERROR. There should not be a point where there is # fall through and this happens msg = "ERROR" # If the person texts "RESET_ZER0", reset the state to zero. This is # just for debugging purposes if "RESET_ZER0" in i_msg: state = 0 if "Call" in i_msg: msg = "Okay! A human will call you shortly. Thank you for checking in." state = 200 if state == 0: msg = "Hello. I see that you are currently not checked into the airport X for flight #YYY. Are you currently at the airport? Please reply with Y or N" state = 1 # This is the state of responding to the inital text elif state == 1: if "Y" in i_msg: msg = "You have been checked in!" state = 200 elif "N" in i_msg: msg = "Uh oh! Will you be making the flight?" state = 2 else: msg = "I did not understand that, sorry! Please reply with either Y if you will be making the flight, or N if you will not" # This is the state of Not checked in elif state == 2: if "Y" in i_msg: msg = "Thanks! If you are not checked in within the hour, a human will be in contact with you." state = 200 elif "N" in i_msg: msg = "I'm sorry to hear that. A human will call you shortly in order to resolve any issue" state = 400 else: msg = "I did not understand that, sorry! Please reply with either Y if you will be making the flight, or N if you will not" # This is the "failure state". This means we need to involve humans elif state == 400: msg = "There has been an issue with our system. A human will be in contact with you in order to resolve any issue." state = 0 # Prepare and then send a twilio SMS respond resp = twiml.Response() resp.sms(msg) # This is the success state. Send a thank you text and switch back to the # beginning state if state == 200: msg = "Thank you for flying for Southwest! If you have an unresolved issue, please contact (ZZZ)-XXX-YYYY" state = 0 resp.sms(msg) # Store the state and time in the session cookie session['state'] = state session['time'] = epoch_time return str(resp)
# Download the Python helper library from twilio.com/docs/python/install from twilio import twiml r = twiml.Response() with r.dial() as d: d.queue("Queue Demo") print(str(r))
def hello(): response = twiml.Response() response.say('Hello there! You have successfully configured a web hook.') response.say('Good luck on your Twilio quest!', voice='woman') return Response(str(response), mimetype='text/xml')
def get_text(): team_leads = get_users_by_role('teamlead') state_leads = get_users_by_role('teamlead') regional_leads = get_teamleads_by_region("1") # Gets all members from database member = db.session.query(User).join(User.roles).filter(Role.name=="member").all() response = twiml.Response() # Save inbound number and message inbound_msg_body = request.form.get("Body") inbound_msg_from = request.form.get("From") # Menu /// Incomplete menu = "Press 1 to report an emergency \n Press 2 to report an emergency \n" # Gets callers role from the database # inc_msg_user_role = db.session.query(Role).join(User.roles).filter(User.phone_number==inbound_msg_from).first() # inc_msg_user_role = inc_msg_user_role.name # Gets caller's van number # inc_msg_van = db.session.query(User).join(User.roles).filter(User.phone_number==inbound_msg_from).first() # inc_msg_van = inc_msg_van.van # Gets sessions activate_session=session.get("activate_session") activation_step=session.get("activation_step") menu_session=session.get("menu_session") last_name_session = session.get("last_name_session") is_active = session.get("is_active") emergency = session.get("emergency_session") add_van = session.get("add_van_session") # session.pop("add_van_session") # session.pop("menu_session") # session.pop("activate_session") # Checks if the menu session is true and handles the responses # ========================================= # # ======= Emergencies and Alerts ========== # # ========================================= # menu = ["Press 1 for an emergency health care, residential, vehicle accident.", "Press 2 for a natural disaster tornadoes, thuderstorms, hailsotrms, extreme cold weather.", "Press 3 if violence or gunshot erupts.", "Press 4 for an accident or structual failure fire, building collapse, toll or bridge/tunnel accident.", "Press 5 for an utility incidents power outage, winter storms, severe cold/exposure."] if inbound_msg_body.replace(' ', '').lower()[:10]=="emergency": for x in menu: client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body=x) session['emergency_session'] = True elif emergency: print "Runs" if inbound_msg_body.replace(' ', '')[:2] == "1": user = get_caller_by_phone_number(inbound_msg_from) team = get_region(user.region) for x in team: emergency_message = "emergency health care, residential, vehicle accident" if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due to an emergency health care, residential, vehicle accident\nPhone Number: %s" %(user.first_name, user.phone_number)) elif inbound_msg_body.replace(' ', '')[:2] == "2": user = get_caller_by_phone_number(inbound_msg_from) team = get_region(user.region) for x in team: emergency_message = "natural disaster tornadoes, thuderstorms, hailsotrms, extreme cold weather" if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due to a natural disaster tornadoes, thuderstorms, hailsotrms, extreme cold weather. \nPhone Number: %s" %(user.first_name, user.phone_number)) elif inbound_msg_body.replace(' ', '')[:2] == "3": user = get_caller_by_phone_number(inbound_msg_from) team = get_region(user.region) for x in team: emergency_message = "violence or gunshot erupts" if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due to an eruption of violence or gunshots\nPhone Number: %s" %(user.first_name, user.phone_number)) elif inbound_msg_body.replace(' ', '')[:2] == "4": user = get_caller_by_phone_number(inbound_msg_from) team = get_region(user.region) for x in team: emergency_message = "accident or structual failure fire, building collapse, toll or bridge/tunnel accident" if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due to an accident or structual failure fire, building collapse, toll or bridge/tunnel accident.\nPhone Number: %s" %(user.first_name, user.phone_number)) elif inbound_msg_body.replace(' ', '')[:2] == "5": user = get_caller_by_phone_number(inbound_msg_from) team = get_region(user.region) for x in team: emergency_message = "utility incidents power outage, winter storms, severe cold/exposure" if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due an utility incidents power outage, winter storms, severe cold/exposure.\nPhone Number: %s" %(user.first_name, user.phone_number)) client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="All regional staff have been notified of you emergency and will contact you shortly.") new_emergency = Emergency(msg=emergency_message,time=datetime.now(),phone_number=inbound_msg_from) db.session.add(new_emergency) db.session.commit() session.pop("emergency_session") elif inbound_msg_body.lower().replace(' ', '')[:7] == "urgent": inbound_msg_body = inbound_msg_body.lower().replace("urgent","") inbound_msg_body.capitalize() new_emergency = Emergency(msg=inbound_msg_body,time=datetime.now(),phone_number=inbound_msg_from) db.session.add(new_emergency) db.session.commit() user = db.session.query(User).filter(User.phone_number == inbound_msg_from).one() team = get_team(user.region, user.van) for x in team: print x.phone_number if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: URGENT %s" %(user.first_name,inbound_msg_body)) # =========================================== # # ================ ACTIVATE ================= # # =========================================== # # If the caller text "Activate", a response will be sent elif inbound_msg_body.lower().replace(" ","")[:9] == "activate": try: # Queries the User table user = User.query.filter(User.phone_number == inbound_msg_from).one() on_shift = user.on_shift # If user has already activate their number of the shift we'll send a welcome messase if on_shift == True: client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="Welcome back!") # Else if the caller is in the DB, but 'on_shift' is False, we'll will update the callers # status in the database to True and welcome them caller and ask for their Van Number else: db.session.query(User).filter(User.phone_number == inbound_msg_from).update({"on_shift":(True)}) db.session.commit() client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="You've been activated, what is your van number?") # Creates an 'add_van_session' session.get("add_van_session") session['add_van_session'] = True # If python throws an error, the caller's number isn't in our database and we begin the text-based registration except: client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="What is your first name?") #starts activate session session["activate_session"] = True session['activation_step'] = 1 # The callers first name response is handled elif activate_session: if activation_step == 1: #the msg received after the first name will be used as their first name user_first_name = inbound_msg_body.replace(" ","") first_name = [user_first_name] session["last_name_session"] = first_name message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="What is your Last name") session['activation_step'] = 2 # The callers first name response is handled elif activation_step == 2: last_name = inbound_msg_body last_name_session.append(last_name) # Sends confromation text client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="What is your FOUR digit van number? ") session["is_active"] = True session['activation_step'] = 3 elif activation_step == 3: region = inbound_msg_body.replace(' ','').lower()[:2] van = inbound_msg_body.replace(' ','').lower()[-2:] new_users = User(first_name=last_name_session[0], last_name=last_name_session[1], phone_number=inbound_msg_from, van = van, region = region, on_shift=True) new_role = db.session.query(Role).filter_by(name="member").first() new_users.roles.append(new_role) db.session.add(new_users) db.session.commit() # Sends confromation text message = client.messages.create(to=inbound_msg_from,from_=TWILIO_NUMBER,body="You are now active") session.pop('activation_step') session.pop('activate_session') session.pop('last_name_session') # =========================================== # # ============== DEACTIVATE ================ # # =========================================== # elif inbound_msg_body.lower().replace(" ","")[:11] == "deactivate": try: user = User.query.filter(User.phone_number== inbound_msg_from).one() if user.on_shift == True: db.session.query(User).filter(User.phone_number == inbound_msg_from).update({"on_shift":(False)}) db.session.query(User).filter(User.phone_number == inbound_msg_from).update({"van":(0)}) db.session.commit() client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="Good Bye") else: message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="You're not active.") except: message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="This number is not registered in our system") # ============================================ # # ========== TEAM LEADS MESSASING ============ # # ============================================ # elif (inbound_msg_body[:3].lower()).replace(" ","") == "tl": if get_caller_role(inbound_msg_from) == 'member': sender = get_caller_by_phone_number(inbound_msg_from) teamlead = get_teamlead(sender.region, sender.van) client.messages.create(to=teamlead.phone_number, from_=TWILIO_NUMBER,body=inbound_msg_body) elif get_caller_role(inbound_msg_from) == 'teamlead': teamleaders = get_teamleads_by_region(user.region) for leads in teamleaders: if leads.phone_number != inbound_msg_from: client.messages.create(to=leads.phone_number, from_=TWILIO_NUMBER,body=inbound_msg_body) # ============================================= # # ======== Regional Leader Messaging ========== # # ============================================= # elif get_caller_role(inbound_msg_from) == 'regional': user = db.session.query(User).filter(User.phone_number == inbound_msg_from).one() team_leads = get_teamleads_by_region(user.region) for x in team_leads: client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: %s" %(user.first_name,inbound_msg_body)) # elif add_van == True: # print "got to add van script" # try: # db.session.query(User).filter(User.phone_number==inbound_msg_from).update({'van':int(inbound_msg_body)}) # db.session.commit() # session.pop("add_van_session") # except: # message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, # body="Please provide us with the correct van number") # session[add_van]= True # elif inbound_msg_body[:7].lower().replace(" ","") == "roster" and inc_msg_user_role == "teamlead": # roster = db.session.query(User).filter(User.van==inc_msg_van).filter(User.on_shift==True).all() # roster_list = [] # for x in roster: # print roster_list.append(x.first_name) # message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body=("You're current van members are %s"%roster_list)) # message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body=menu) # menu_session = session.get("menu_session") # message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body=["What is your emergency?"]) # session["menu_session"] = "save emergency" # elif menu_session == "save emergency": # new_emergency = Emergency(msg=inbound_msg_body,time=datetime.now(),phone_number=inbound_msg_from) # db.session.add(new_emergency) # db.session.commit() # session.pop("menu_session") else: if get_caller_role(inbound_msg_from) == 'state': user = get_caller_role(inbound_msg_from) team = get_state() for x in team: print x.phone_number if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: %s" %(user.first_name,inbound_msg_body)) elif get_caller_role(inbound_msg_from) == 'regional': user = get_caller_by_phone_number(inbound_msg_from) team = get_region(user.region) for x in team: print x.phone_number if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: %s" %(user.first_name,inbound_msg_body)) else: user = db.session.query(User).filter(User.phone_number == inbound_msg_from).one() team = get_team(user.region, user.van) for x in team: if inbound_msg_from != x.phone_number: message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: %s" %(user.first_name,inbound_msg_body)) return "Done"
def recognize(): if 'RecordingUrl' in request.args: recording_url = request.args['RecordingUrl'] else: recording_url = request.form['RecordingUrl'] r = twiml.Response() try: text = _recognize(recording_url) name_matches = _lookup_name(text) district_matches = _lookup_district(text) name = None if u'老母' in text: _say(r, 'NO_MOTHER') if len(name_matches) > 0: name = name_matches[0] app.logger.info("evt=match_name sid=%s name=%s", request.form['CallSid'], name) _say(r, 'WILL_CALL') elif len(district_matches) > 0: district = district_matches[0] name = random.choice(district_dir[district]) app.logger.info("evt=match_district sid=%s district=%s name=%s", request.form['CallSid'], district, name) _say(r, 'WILL_CALL') _say(r, district) _say(r, 'FROM_DISTRICT') if name is not None: attr = name_dir[name] desc = attr.get('desc', name) tel = attr.get('tel') _say(r, desc) _say(r, 'DONT_HANG_UP') if tel is not None and type(tel) is list and len(tel) > 0: if DEBUG_DIAL_NUMBER is None: tel = tel[0] else: tel = DEBUG_DIAL_NUMBER _say(r, 'THE_NUMBER_IS') _say(r, ''.join([' ' + d for d in tel])) tel_with_prefix = COUNTRY_PREFIX + tel app.logger.info("evt=dial_start sid=%s name=%s tel=%s", request.form['CallSid'], name, tel_with_prefix) r.dial(tel_with_prefix, action=url_for('goodbye')) else: app.logger.info("evt=tel_not_found sid=%s name=%s", request.form['CallSid'], name) _say(r, 'TEL_NOT_FOUND') r.redirect(url_for('retry')) r.hangup() else: app.logger.warn("evt=match_miss sid=%s text=%s", request.form['CallSid'], text) _say(r, 'PLACE_NOT_FOUND') r.redirect(url_for('retry')) except ValueError: _say(r, 'CANNOT_HEAR') r.redirect(url_for('retry')) return str(r), 200, {'Content-Type': 'text/xml'}
def _appointment_error(language): resp = twiml.Response() resp.play(audio_filename('registration_id_error', language)) resp.redirect(url_with_params('ivr/registration', language=language)) return HttpResponse(resp)
def get_text(): from flask import Flask, request, session, Response from twilio import twiml from twilio.rest import TwilioRestClient SECRET_KEY = "u092i3049034" app = Flask(__name__) app.config.from_object(__name__) # Find these values at https://twilio.com/user/account account_sid = "ACaaaadf1975e4dcc6dde6d42ddda6743e" auth_token = "8b17826f30ea9747c8a3c381e198b196" client = TwilioRestClient(account_sid, auth_token) TWILIO_NUMBER = "+13474078862" team_leads_contact = db.session.query(User).join( User.roles).filter(Role.name == "team lead").all() # print team_leads_contact state_leader = db.session.query(User).join( User.roles).filter(Role.name == "state").all() team_lead = db.session.query(User).join( User.roles).filter(Role.name == "teamlead").all() # print team_lead reg_lead = db.session.query(User).join( User.roles).filter(Role.name == "regional").all() if len(reg_lead) >= 1: for x in reg_lead: reg_lead_numbers = [] reg_lead_numbers.append(x.phone_number) print reg_lead_numbers else: print "there are no reg_lead" member = db.session.query(User).join( User.roles).filter(Role.name == "member").all() response = twiml.Response() inbound_msg_body = request.form.get("Body") inbound_msg_from = request.form.get("From") menu = "Press 1 to report an emergency \n Press 2 to report an emergency \n" inc_msg_user_role = db.session.query(Role).join( User.roles).filter(User.phone_number == inbound_msg_from).first() inc_msg_user_role = inc_msg_user_role.name inc_msg_van = db.session.query(User).join( User.roles).filter(User.phone_number == inbound_msg_from).first() inc_msg_van = inc_msg_van.van activate_session = session.get("activate_session") menu_session = session.get("menu_session") last_name_session = session.get("last_name_session") is_active = session.get("is_active") emergency = session.get("emergency_session") add_van = session.get("add_van_session") # session.pop("add_van_session") # session.pop("menu_session") # session.pop("activate_session") # ACTIVATE SESSION BEGINS HERE if menu_session == True: if inbound_msg_body == "1": session.get("emergency_session") elif inbound_msg_body[:9].lower().replace(" ", "") == "activate": try: user = User.query.filter( User.phone_number == inbound_msg_from).one() on_shift = user.on_shift if on_shift == True: message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, body="Welcome back!") else: db.session.query(User).filter( User.phone_number == inbound_msg_from).update( {"on_shift": (True)}) db.session.commit() message = client.messages.create( to=inbound_msg_from, from_=TWILIO_NUMBER, body="You've been activated, what is your van number?") a = True session.get("add_van_session") session['add_van_session'] = a print a except: message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, body="What is your first name?") #starts activate session activate_session = True session["activate_session"] = activate_session elif inc_msg_user_role == "teamlead" and inbound_msg_body[:3] == "tl": fellow_tl = db.session.query(User).join(User.roles).filter( Role.name == "teamlead").filter(User.van == inc_msg_van).all() elif add_van == True: print "got to add van script" try: db.session.query(User).filter( User.phone_number == inbound_msg_from).update( {'van': int(inbound_msg_body)}) db.session.commit() session.pop("add_van_session") except: message = client.messages.create( to=inbound_msg_from, from_=TWILIO_NUMBER, body="Please provide us with the correct van number") session[add_van] = True elif activate_session == True: a = [] #the msg received after the first name will be used as their first name user_first_name = inbound_msg_body.replace(" ", "") user_phone = inbound_msg_from #Starts session to get last name activate_last_name_session = True a.append(user_first_name) #takes list and saves it in session session["last_name_session"] = a message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, body="What is your Last name") session.pop("activate_session") elif last_name_session: if len(last_name_session) == 1: print "*****SESION RAN" user_last_name = inbound_msg_body user_first_name = session["last_name_session"][0] user_phone = inbound_msg_from new_users = User(first_name=user_first_name, last_name=user_last_name, phone_number=user_phone, on_shift=True) new_role = db.session.query(Role).filter_by(name="member").first() new_users.roles.append(new_role) db.session.add(new_users) db.session.commit() message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, body="You are now active") session.pop("last_name_session") session["is_active"] = True elif (inbound_msg_body[:11].lower()).replace(" ", "") == "deactivate": try: user = User.query.filter( User.phone_number == inbound_msg_from).one() if user.on_shift == True: db.session.query(User).filter( User.phone_number == inbound_msg_from).update( {"on_shift": (False)}) db.session.query(User).filter( User.phone_number == inbound_msg_from).update({"van": (0)}) db.session.commit() message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, body="Good Bye") else: message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, body="You're not active.") except: message = client.messages.create( to=inbound_msg_from, from_=TWILIO_NUMBER, body="This number is not registered in our system") elif inbound_msg_body[:5].lower() == "menu": message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, body=menu) menu_session = session.get("menu_session") print menu_session message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER, body=["What is your emergency?"]) a = "save emergency" session["menu_session"] = a elif menu_session == "save emergency": # session["emergency_session"] = inbound_msg_body new_emergency = Emergency(msg=inbound_msg_body, time=datetime.now(), phone_number=inbound_msg_from) db.session.add(new_emergency) db.session.commit() session.pop("menu_session") elif (inbound_msg_body[:7].lower()) == "urgent": print "*****caught emergency msg" inbound_msg_body = inbound_msg_body.lower().replace("urgent", "") inbound_msg_body.capitalize() print inbound_msg_body new_emergency = Emergency(msg=inbound_msg_body, time=datetime.now(), phone_number=inbound_msg_from) db.session.add(new_emergency) db.session.commit() user = db.session.query(User).filter( User.phone_number == inbound_msg_from).one() team_members = db.session.query(User).filter( User.van == user.van).all() for x in team_members: print x.phone_number if inbound_msg_from != x.phone_number: message = client.messages.create( to=x.phone_number, from_=TWILIO_NUMBER, body="%s: %s" % (user.first_name, inbound_msg_body)) elif inbound_msg_body[:7].lower().replace( " ", "") == "roster" and inc_msg_user_role == "teamlead": roster = db.session.query(User).filter(User.van == inc_msg_van).filter( User.on_shift == True).all() roster_list = [] for x in roster: print roster_list.append(x.first_name) message = client.messages.create( to=inbound_msg_from, from_=TWILIO_NUMBER, body=("You're current van members are %s" % roster_list)) #For Regional Managers to send msgs to respective TLs & Members elif inbound_msg_from in reg_lead_numbers: if inbound_msg_body[:2].lower() == "tl": user = db.session.query(User).filter( User.phone_number == inbound_msg_from).one() print user.phone_number team_leads = db.session.query(User).filter( User.van == user.van).join( User.roles).filter(Role.name == "teamlead").all() for x in team_leads: print x.van message = client.messages.create( to=x.phone_number, from_=TWILIO_NUMBER, body="%s: %s" % (user.first_name, inbound_msg_body)) else: user = db.session.query(User).filter( User.phone_number == inbound_msg_from).one() team_members = db.session.query(User).filter( User.van == user.van).all() for x in team_members: print x.phone_number if inbound_msg_from != x.phone_number: message = client.messages.create( to=x.phone_number, from_=TWILIO_NUMBER, body="%s: %s" % (user.first_name, inbound_msg_body)) # elif inbound_msg_body[:2].lower()=="tl": # team_leads_contact = db.session.query(User).filter(team_number).join(User.roles).filter(Role.name=="teamlead").all() # for number in leads_numbers: # if inbound_msg_from != number: # message = client.messages.create(to=number, from_=TWILIO_NUMBER, # body="%s: %s" %(team_leads[inbound_msg_from],inbound_msg_body)) else: user = db.session.query(User).filter( User.phone_number == inbound_msg_from).one() team_members = db.session.query(User).filter( User.van == user.van).all() for x in team_members: print x.phone_number if inbound_msg_from != x.phone_number: message = client.messages.create( to=x.phone_number, from_=TWILIO_NUMBER, body="%s: %s" % (user.first_name, inbound_msg_body)) return "Done"
def sms(): response = twiml.Response() response.sms("Nothing here") return str(response)
def respond_with_sms(to, message): resp = twiml.Response() resp.message('Hello {}: {}'.format(number, message_body))
def hello_monkey(): """Respond to incoming calls with a simple text message.""" resp = twiml.Response() resp.say("""Hello. It's me. I've been wondering if after this guide you'd like to meet.""") return str(resp)
def sms(): response = twiml.Response() response.sms("Congratulations! You deployed the Twilio Hackpack " "for Heroku and Flask.") return str(response)
if __name__ == "__main__": app.run(debug=True) # Message 8, 9 (continuation of Mesasage 6, or 7 if message9 == 3) elif messagecount == 5 and message9 == 3: def incoming_sms(): body = request.values.get('Body', None) savings_balance = 1200 goal_achievement_ratio = (savings_balance / goal_amount * 100) point_balance = 260 jackpot_amount = 80 bigmac_cost = 3 bigmac_number = jackpot_amount / bigmac_cost resp=twiml.Response() resp.message("You've saved $%r: %r of the way to that %r you wanted." % (savings_balance, goal_achievement_ratio, goal_name)) resp.message("You have %r money.days and have about the same chance of winning the jackpot as a grown-up ordering a big-mac when he goes to Micky Dees! Incidentally, you could buy %r Big Macs with that Jackpot, but don't!" % (point_balance, bigmac_number)) return str(resp) if __name__ == "__main__": app.run(debug=True) # alt elif messagecount == 4 and message9 != 3: def incoming_sms(): body = request.values.get('Body', None)
def incoming_message(): response = twiml.Response() response.sms('I just responded to a text message. Huzzah!') return Response(str(response), mimetype='text/xml')