예제 #1
0
    def post(self, request, *args, **kwargs):
        logger.info(f'Chat POST received: {json.dumps(request.data)}')

        if 'EventType' in request.data:
            if request.data['EventType'] == 'onMessageSent':
                logger.info('Processing onMessageSent')

                attributes = json.loads(
                    messageutils.cleanup_json(request.data['Attributes']))

                # TODO: detect the originating channel of the inbound (ex. SMS)
                channel = enums.CHANNEL_SMS
                contact = Contact.objects.get(uuid=attributes['To'])

                # TODO: here you would execute different "sends" for different originating channels
                if channel == enums.CHANNEL_SMS:
                    twilioservice.send_sms(
                        contact.phone_number,
                        f"{request.data['Body']} - {request.data['ClientIdentity']}"
                    )

                # Store (or update, if this message is redundant) the message in the database
                Message.objects.update_or_create(
                    sid=request.data['MessageSid'],
                    defaults={
                        "timestamp": parser.parse(request.data['DateCreated']),
                        "channel": channel,
                        "sender": settings.TWILIO_PHONE_NUMBER,
                        "recipient": contact.uuid,
                        "direction": enums.MESSAGE_OUTBOUND,
                        "status": enums.MESSAGE_STATUS_SENT,
                        "text": request.data['Body'],
                        "raw": json.dumps(request.data),
                    })

        return viewutils.get_empty_messaging_webhook_response()
    def post(self, request, *args, **kwargs):
        logger.info('SMS POST received: {}'.format(json.dumps(request.data)))

        # Store (or update, if this redundant) the contact and message in the database
        contact, created = Contact.objects.get_or_create(
            phone_number=request.data['From'],
            defaults={
                "sid": request.data['MessageSid'],
                "phone_number": request.data['From'],
            })

        message, created = Message.objects.update_or_create(
            sid=request.data['MessageSid'],
            defaults={
                "timestamp":
                timezone.now(),
                "channel":
                enums.CHANNEL_SMS,
                "sender":
                contact.sid,
                "recipient":
                request.data['To'],
                "direction":
                enums.MESSAGE_INBOUND,
                "status":
                request.data['SmsStatus'],
                "text":
                request.data['Body'],
                "addons":
                messageutils.cleanup_json(request.data['AddOns'])
                if 'AddOns' in request.data else None,
                "raw":
                json.dumps(request.data),
            })

        channel = twilioservice.get_or_create_channel(contact.phone_number,
                                                      contact.sid)

        # Check if the other messages exist from this sender that are associated with an open Task
        sender_messages_with_tasks = Message.objects.not_resolved().inbound(
        ).for_contact(contact.sid).has_task()
        task = None
        if sender_messages_with_tasks.exists():
            db_task = sender_messages_with_tasks[0]

            try:
                task = twilioservice.get_task(db_task.task_sid)

                if task.assignment_status not in [
                        'pending', 'reserved', 'assigned'
                ]:
                    task = None
                else:
                    logger.info('Found an open Task: {}'.format(task.sid))

                    message.task_sid = db_task.task_sid
                    message.worker_sid = db_task.worker_sid

                    message.save()
            except TwilioRestException as e:
                if e.status != 404:
                    raise e

                for message in sender_messages_with_tasks.iterator():
                    message.resolve = True
                    message.save()

        # If no open Task was found, create a new one
        if not task:
            attributes = {"from": message.sender}

            message_addons = json.loads(message.addons)
            if message_addons and \
                            "results" in message_addons and \
                            "ibm_watson_insights" in message_addons["results"] and \
                            "result" in message_addons["results"]["ibm_watson_insights"] and \
                            "language" in message_addons["results"]["ibm_watson_insights"]["result"]:
                attributes["language"] = message_addons["results"][
                    "ibm_watson_insights"]["result"]["language"]

            attributes["channel"] = channel.unique_name

            twilioservice.create_task(attributes)

            twilioservice.send_sms(
                contact.phone_number,
                "Hey, your question has been received. Sit tight and we'll get you an answer ASAP!"
            )

        twilioservice.send_chat_message(channel, message)

        return viewutils.get_empty_webhook_response()
    def post(self, request, *args, **kwargs):
        logger.info(f'Workspace POST received: {json.dumps(request.data)}')

        if 'EventType' in request.data:
            if request.data['EventType'] == 'reservation.accepted':
                logger.info('Processing reservation.accepted')

                task_attributes = json.loads(
                    messageutils.cleanup_json(request.data['TaskAttributes']))

                if 'from' in task_attributes:
                    for message in Message.objects.not_resolved(
                    ).for_channel('sms').inbound().for_contact(
                            task_attributes['from']).no_worker().iterator():
                        message.worker_sid = request.data['WorkerSid']

                        message.save()
            elif request.data['EventType'] == 'task.created':
                logger.info('Processing task.created')

                task_attributes = json.loads(
                    messageutils.cleanup_json(request.data['TaskAttributes']))

                if 'from' in task_attributes:
                    for message in Message.objects.not_resolved(
                    ).for_channel('sms').inbound().for_contact(
                            task_attributes['from']).no_worker().iterator():
                        message.task_sid = request.data['TaskSid']

                        message.save()
            elif request.data['EventType'] == 'task.canceled':
                logger.info('Processing task.canceled')

                task_attributes = json.loads(
                    messageutils.cleanup_json(request.data['TaskAttributes']))

                # TODO: detect other types of originating channels
                task_channel = request.data.get('TaskChannelUniqueName',
                                                'default')
                if task_channel == 'voice':
                    channel = enums.CHANNEL_VOICE
                else:
                    channel = enums.CHANNEL_SMS
                contact = Contact.objects.get(uuid=task_attributes['channel'])

                # TODO: here you would execute different "sends" for different originating channels
                cancelled_message = 'Sorry, your question could not be answered because the agent assigned to it is ' \
                                    'no longer available. Try submitting it again!'
                if channel == enums.CHANNEL_SMS:
                    twilioservice.send_sms(contact.phone_number,
                                           cancelled_message)
            elif request.data['EventType'] == 'task.completed':
                logger.info('Processing task.completed')

                # TODO: once TaskRouter supports Task transfer, we could utilize that here instead
                if 'TaskCompletedReason' in request.data and request.data[
                        'TaskCompletedReason'].startswith('User logged out'):
                    task_attributes = json.loads(
                        messageutils.cleanup_json(
                            request.data['TaskAttributes']))

                    twilioservice.create_task(task_attributes)

                for message in Message.objects.for_task(
                        request.data['TaskSid']).iterator():
                    message.worker_sid = None
                    message.resolved = True
                    message.save()
            elif request.data['EventType'] == 'worker.deleted':
                try:
                    user = get_user_model().objects.get(
                        worker_sid=request.data['WorkerSid'])
                    authservice.delete_user(user)
                except get_user_model().DoesNotExist:
                    pass

        return Response(status=status.HTTP_204_NO_CONTENT)
예제 #4
0
    def post(self, request, *args, **kwargs):
        logger.info('Workspace POST received: {}'.format(
            json.dumps(request.data)))

        if 'EventType' in request.data:
            if request.data['EventType'] == 'reservation.accepted':
                logger.info('Processing reservation.accepted')

                task_attributes = json.loads(
                    messageutils.cleanup_json(request.data['TaskAttributes']))

                for message in Message.objects.not_resolved().for_channel(
                        'sms').inbound().for_contact(
                            task_attributes['from']).no_worker().iterator():
                    message.worker_sid = request.data['WorkerSid']

                    message.save()
            elif request.data['EventType'] == 'task.created':
                logger.info('Processing task.created')

                task_attributes = json.loads(
                    messageutils.cleanup_json(request.data['TaskAttributes']))

                for message in Message.objects.not_resolved().for_channel(
                        'sms').inbound().for_contact(
                            task_attributes['from']).no_worker().iterator():
                    message.task_sid = request.data['TaskSid']

                    message.save()
            elif request.data['EventType'] == 'task.canceled':
                logger.info('Processing task.canceled')

                task_attributes = json.loads(
                    messageutils.cleanup_json(request.data['TaskAttributes']))

                # TODO: detect the originating channel of the inbound (ex. SMS)
                channel = enums.CHANNEL_SMS
                contact = Contact.objects.get(sid=task_attributes['from'])

                # TODO: here you would execute different "sends" for different originating channels
                cancelled_message = 'Sorry, your question could not be answered because the agent assigned to it is ' \
                                    'no longer available. Try submitting it again!'
                if channel == enums.CHANNEL_SMS:
                    twilioservice.send_sms(contact.phone_number,
                                           cancelled_message)
            elif request.data['EventType'] == 'task.completed':
                logger.info('Processing task.completed')

                # TODO: once TaskRouter supports Task transfer, we would want to utilize that instead here
                if 'TaskCompletedReason' in request.data and request.data[
                        'TaskCompletedReason'].startswith('User logged out'):
                    task_attributes = json.loads(
                        messageutils.cleanup_json(
                            request.data['TaskAttributes']))

                    twilioservice.create_task(task_attributes)

                for message in Message.objects.for_task(
                        request.data['TaskSid']).iterator():
                    message.worker_sid = None
                    message.resolved = True
                    message.save()

        return Response(status=status.HTTP_204_NO_CONTENT)