def twilio_voicemail(matrix_id,send_notification): twilio_client = util.getTwilioClient(matrix_id) call = twilio_client.calls(request.values["CallSid"]).fetch() to_number = call.to from_number = call.from_ try: call_status = request.values["DialCallStatus"] except: call_status = request.values["CallStatus"] json_config = util.getIncomingNumberConfig(matrix_id, to_number) url = util.getAppserviceAddress().rstrip('/') + urllib.parse.urlparse(request.url).path response = VoiceResponse() if json_config["voicemail_enabled"] and call_status != "completed": room_id = util.findRoomId(matrix_id,[to_number] + [from_number]) author = util.getBotMatrixId() if send_notification: util.sendMsgToRoom(room_id,author, "missed call") response.say(json_config["voicemail_tts"]) kwargs = { "timeout": json_config["voicemail_timeout"], "transcribe": json_config["voicemail_transcribe"], "playBeep": True, "recordingStatusCallback": util.adjustUrl(url,"voicemail_recording"), "action": util.adjustUrl(url,"reject"), "transcribeCallback": util.adjustUrl(url,"voicemail_transcription") } response.record(**kwargs) else: response.reject() return str(response)
def twilio_voicemail_transcription(matrix_id): twilio_client = util.getTwilioClient(matrix_id) call = twilio_client.calls(request.values["CallSid"]).fetch() to_number = call.to from_number = call.from_ json_config = util.getIncomingNumberConfig(matrix_id, to_number) recording_url = request.values["RecordingUrl"] r = requests.get(recording_url+".mp3") room_id = util.findRoomId(matrix_id,[to_number] + [from_number]) author = util.getBotMatrixId() util.sendMsgToRoom(room_id,author, request.values.get("TranscriptionText","(No transcription available)")) return {}
def twilio_voicemail_recording(matrix_id): twilio_client = util.getTwilioClient(matrix_id) call = twilio_client.calls(request.values["CallSid"]).fetch() to_number = call.to from_number = call.from_ json_config = util.getIncomingNumberConfig(matrix_id, to_number) recording_url = request.values["RecordingUrl"] r = requests.get(recording_url+".mp3") room_id = util.findRoomId(matrix_id,[to_number] + [from_number]) author = util.getBotMatrixId() util.postFileToRoom(room_id, author, r.headers["content-type"], r.content, "voicemail.mp3") return {}
def matrix_user_exists(userId): confirm_auth(request) user_data = { "type": "m.login.application_service", "username": userId.split(':')[0].removeprefix('@') } r = requests.post(util.getHomeserverAddress() + '/_matrix/client/r0/register', headers=util.getMatrixHeaders(), json=user_data, params={"user_id": util.getBotMatrixId()}) if r.status_code != 200: abort(500) return {}
def decorated_function(*args, **kwargs): (matrix_id,auth) = db.getMatrixIdAuthFromSid(request.form["AccountSid"]) validator = RequestValidator(auth) twilio_signature = '' for (hdr,val) in request.headers.items(): if hdr.lower() == 'x-twilio-signature': twilio_signature = val url = util.getAppserviceAddress().rstrip('/') + urllib.parse.urlparse(request.url).path request_valid = validator.validate( url, request.form, twilio_signature) if request_valid and util.isMatrixIdAllowed(matrix_id): try: return f(matrix_id, *args, **kwargs) except: error_msg = str(request) + '\n' + str(request.headers) + '\n' + traceback.format_exc() util.sendNoticeToRoom(db.getBotRoom(matrix_id), util.getBotMatrixId(), error_msg) abort(500) else: return abort(403)
def matrix_event(txnId): confirm_auth(request) json = request.get_json() for event in json["events"]: sender = event["sender"] room_id = event["room_id"] if "state_key" in event: if event["type"] == "m.room.member" and event["content"][ "membership"] == "invite": username = event["state_key"] if util.isTwilioUser(username) or util.isTwilioBot(username): r = requests.post(util.getHomeserverAddress() + '/_matrix/client/r0/rooms/' + room_id + '/join', headers=util.getMatrixHeaders(), params={"user_id": username}) return {} room_members = util.get_room_members(room_id) room_contains_phone = False room_contains_bot = False for member in room_members: if util.isTwilioUser(member): room_contains_phone = True if util.isTwilioBot(member): room_contains_bot = True if util.isTwilioUser(sender) or util.isTwilioBot(sender): return {} if room_contains_phone: try: if not util.isMatrixIdAllowed(sender): raise Exception( 'You are not allowed access to the bridge. ') twilio_auth = db.getTwilioAuthPair(sender) (conversation, twilio_author) = util.findConversationAndAuthor( sender, room_id) if event["type"] == "m.room.message": if event["content"].get("msgtype", "") == "m.text": text = event["content"]["body"] room_id = event["room_id"] conversation.messages.create(author=twilio_author, body=text) elif event["content"].get("msgtype", "") in [ "m.image", "m.file", "m.audio", "m.video" ]: url = event["content"]["url"] if url is None or not url.startswith("mxc://"): return {} url = url[6:] chat_service_sid = conversation.fetch( ).chat_service_sid r = requests.get(util.getHomeserverAddress() + '/_matrix/media/r0/download/' + url, headers=util.getMatrixHeaders(), stream=True) file_bytes = r.content hdrs = {"Content-Type": r.headers["content-type"]} r = requests.post( 'https://mcs.us1.twilio.com/v1/Services/' + chat_service_sid + '/Media', data=file_bytes, auth=twilio_auth, headers=hdrs) media_sid = r.json()["sid"] conversation.messages.create(author=twilio_author, media_sid=media_sid) except: exc1 = traceback.format_exc() try: util.addUserToRoom(room_id, util.getBotMatrixId()) util.sendNoticeToRoom(room_id, util.getBotMatrixId(), traceback.format_exc()) except: print(exc1) traceback.print_exc() elif room_contains_bot: if event["type"] == "m.room.message": if event["content"].get("msgtype", "") == "m.text": if not util.isMatrixIdAllowed(sender): util.sendNoticeToRoom( room_id, util.getBotMatrixId(), 'You are not allowed access to the bridge. ') return {} db.setBotRoom(sender, room_id) text = event["content"]["body"] if text == "config" or text == "!config": config_url = util.getAppserviceAddress( ) + "/config/" + db.updateAuthToken(sender) + "/" util.sendNoticeToRoom(room_id, util.getBotMatrixId(), config_url) else: util.sendNoticeToRoom( room_id, util.getBotMatrixId(), """config: Get a url for web config interface """) return {}