Esempio n. 1
0
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)
Esempio n. 2
0
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 {}
Esempio n. 3
0
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 {}
Esempio n. 4
0
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 {}
Esempio n. 5
0
 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)
Esempio n. 6
0
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 {}