protected override Task ReceiveAsync(Message message, Contact contact, CancellationToken cancellationToken)
 => _flowManager.ProcessInputAsync(message, _settings.Flow, cancellationToken);
Esempio n. 2
0
 public virtual Task ReceiveAsync(Message envelope, CancellationToken cancellationToken)
 => _flowManager.ProcessInputAsync(envelope.Content, envelope.From.ToIdentity(), _settings.Flow, cancellationToken);
        protected override async Task ReceiveAsync(Message message, Contact contact, CancellationToken cancellationToken = new CancellationToken())
        {
            var inputMessage = message;

            // Check if is a message from a desk agent to the customer
            if (message.From.Name != null &&
                message.From.Domain != null &&
                message.From.Domain.Equals(HelpDeskExtension.DEFAULT_DESK_DOMAIN, StringComparison.OrdinalIgnoreCase))
            {
                // Check for ticket transfer
                if (message.Content is Ticket ticket &&
                    ticket.Status == TicketStatusEnum.Transferred)
                {
                    return;
                }

                var originator = Node.Parse(Uri.UnescapeDataString(message.From.Name));

                // If the content is a ticket or redirect, change the message originator
                if (message.Content is Ticket ||
                    message.Content is Redirect)
                {
                    inputMessage      = inputMessage.ShallowCopy();
                    inputMessage.From = originator;
                }
                else
                {
                    // If not, just forward the message directly to the originator, which is the ticket customer
                    await _sender.SendMessageAsync(
                        new Message()
                    {
                        Id       = GetForwardId(message.Id),
                        To       = originator,
                        Content  = message.Content,
                        Metadata = message.Metadata
                    },
                        cancellationToken);

                    return;
                }
            }

            // Check for redirects (from desk or a tunnel)
            if (inputMessage.Content is Redirect redirect)
            {
                if (redirect.Context?.Value == null)
                {
                    return;
                }

                inputMessage         = inputMessage.ShallowCopy();
                inputMessage.Content = redirect.Context.Value;
            }

            // Ignore chatstate composing and paused messages when not on desk
            if (message.Content is ChatState chatState &&
                (chatState.State == ChatStateEvent.Composing || chatState.State == ChatStateEvent.Paused))
            {
                // Determine if the current flow state is a desk state
                var state = await GetCurrentStateAsync(inputMessage, cancellationToken);

                if (state == null ||
                    !state.StartsWith("desk:", StringComparison.OrdinalIgnoreCase))
                {
                    return;
                }
            }

            await _flowManager.ProcessInputAsync(inputMessage, _settings.Flow, cancellationToken);
        }
Esempio n. 4
0
 public virtual Task ReceiveAsync(Message envelope, CancellationToken cancellationToken)
 => _flowManager.ProcessInputAsync(envelope, _settings.Flow, cancellationToken);