Não consigo enviar um comando pelo front end

Já tem 4 dias que estou tentando enviar um comando pelo front end para trocar o usuário de bloco (change user State), conferi a documentação tentei fazer da forma como sugerido:

client.sendCommand({  
        id: Lime.Guid(),
        to: 'postmaster@msging.net',
        method: Lime.CommandMethod.SET,
        uri: '/contexts/30e26f51-25e5-4dfc-b2bf-6c0ba80027a8.docstest@0mn.io/stateid%400',
        type: 'text/plain',
        resource: 'state-one'
    });

Sendo que meu código ficou assim:

blipChat.sendCommand({
        id: Math.random() * Math.random(),
        method: 'set',
        type: 'text/plain',
        uri:
          '/contexts/5ffc04d1-c5e5-4ec3-bf2a-e4e5249548ce.rosieinstitucional@0mn.io/stateid%400',
        resource: 'd8dbba2f-4631-4a67-8e09-23ba14bd4676',
      })

Por hora estou usando o user ID de forma hard coded.
Mas mesmo assim não funciona.

Também tentei de outra forma que encontrei na documentação, aonde se tem que passar o ID_DO_Fluxo no uri apos ‘state%40’:

        id: Math.random() * Math.random(),
        method: 'set',
        type: 'text/plain',
        uri:
          '/contexts/5ffc04d1-c5e5-4ec3-bf2a-e4e5249548ce.rosieinstitucional@0mn.io/stateid%409a7b55a6-7d48-4c54-bb5a-f72fe9b4b0b2',
        resource: 'd8dbba2f-4631-4a67-8e09-23ba14bd4676',
      })

O bizzarro é que quando faço o mesmo comando como uma ação global no builder ele funciona:

Mas enviar pelo builder não resolve meu problema.

POr favor ajudem ai, já estou travado nisso por tempo de mais, tenho um plano pago, já enviei um ticket de atendimento mas obtive uma resposta alguns dias depois muito rasa, aonde me mandaram somente o link da documentação, que eu já li e reli mais de 10 vezes.

1 Curtida

Olá @Leandro_Parisi, tudo bem?

Segue resposta que acredito possa te ajudar:

Não entendi a motivação do envio de comando no início do fluxo do usuário, poderia explicar melhor? :thinking:

Caso você esteja enviando uma mensagem no início do fluxo e queria redirecionar para um bloco que dá match com a mensagem de início, você pode fazer de uma forma diferente :man_technologist:t5:

Por exemplo, você pode criar condições de saída a partir da mensagem recebida no bloco de início, veja um exemplo abaixo:

Essa solução atende sua necessidade? :thinking:

Primeiramente muito obrigado pelo retorno.
Estava já sem entender o pq a requisição nunca dava certo quando feita no front e, cheguei a testar no postman e funcionava.

Pois bem, sobre sua sugestão: Sabe pq não funcionaria… pq o nosso bot é programado para manter o usuário no fluxo que ele estiver mesmo quando feche o chat, ou seja eu teria que colocar a condição de saida em todos os blocos.

Para que entenda melhor nossa ideia é a seguinte:

  1. Caso o usuário não abra o chat ele vai abrir sozinho (já implementado)
  2. Caso ele abra sozinho o usuário deve ser direcionado para um bloco específico do builder com um tipo diferente de abordagem.

Eu até tive o seguinte aproach:
Quando o chat abre sozinho mandei pelo front uma hidden message e coloquei uma ação global que faria o redirecionamento (change user state, o mesmo que tentei fazer no front, mas que no builder funciona). Essa ação tem como gatilho a ‘resposta do usuário’ com valor especifico, este valor é o content da hidden message que envio…
Dessa forma ele até direcionou o usuário para o bloco que eu queria.
O problema é o seguinte: Como o usuário já estava em outro bloco quando o chat foi aberto sozinho a hidden message enviada ativou não só a ação global mas também ativou a excessão do bloco que ele estava, dai o flow fica meio avacalhado e rola um problema de redirecionamento, pois o chat meio que redireciona o usuário primeiro pra excesao do bloco que ele estava e, depois do usuário dar outra resposta qualquer ele redireciona para o bloco especificado na ação global sendCommand… deu pra entender??

Pensando nesse cenario, me sugere algum outro approach para o problema?

1 Curtida

@Leandro_Parisi,

Consegui entender …

Até consigo pensar em algumas estratégias diferentes, mas preciso entender alguns detalhes da sua regra de negócio. :man_technologist:t5:

Como funcionaria esse passo em específico? Esta logica de ser direcionado para um bloco especifico, estes blocos são definidos/estáticos, isto é, caso o usuário esteja no “bloco A”, o redirecionamento sempre será para o “bloco B”? :thinking:

1 Curtida

Então meu caro a lógica é a seguinte:
INDEPENDENTE de qual bloco o usuário esteja eu quero que, ao chat ser aberto automaticamente via setTimeout no front, ele seja redirecionado para um bloco específico, sempre o mesmo bloco:

      const { isOpen } = blipChat.widget
      if (isOpen) return null
      blipChat.sendMessage({
        type: 'text/plain',
        content: 'autoOpenChat',
        metadata: {
          '#blip.hiddenMessage': true,
        },
      })
      return blipChat.toogleChat()
    }, 4000)

Ou seja, nesse setTimeout, além de abrir o chat (toogle) eu também envio uma hidden message com o content ‘autoOpenChat’… por isso eu havia tentado fazer uma ação global que tivesse como gatilho esse content de mensagem e fizesse um sendCommand para mudar o usuário de bloco, o problema foi:

Com a ação global a hidden message ‘autoOpenChat’ não só ativava a ação global (como esperado), mas também ativava a saída padrão do bloco aonde o usuário estava. E isso gerava uma confusão no bot que acabava ficando com uma ‘fila de redirecionamentos’.

A solução seria setar manualmente em TODOS os blocos a saída para o bloco que queremos tendo o ‘autoOpenChat’ como gatilho?

ou você vê uma forma menos ‘manual’ de fazer isso?

Ei @Leandro_Parisi,

Após essas novas informações, andei pensando de como seria possível realizar essa ação :thinking:

Para cada solução tem que imaginei este um esforço considerável e/ou um empecilho. Mas antes te apresentar essas soluções, tenho uma questão:

Se sempre que um usuário retorna na conversa que ele abandonou anteriormente você deseja redirecionar para um bloco específico, porque não usar o tempo expiração de sessão invés de manter o usuário sempre no mesmo bloco que ele parou? :thinking: :thinking:

Enfim, segue uma solução que pensei, mas ela só funciona se para todas as entradas de usuario no seu bot, existir apenas condições de saida no qual há uma validação do que foi digitado, isto é, não pode existir condições de saída da forma abaixo:

image

Garantindo esse pré requisito, você pode enviar uma hiddenMessage única que não seja aceita por nenhuma condição de saída, dessa forma, essa hiddenMessage levará a saída padrão que precisa ser o bloco de “Exceções” sempre!

image

No bloco de Exceção, haverá uma regra que valida se a mensagem é igual a hiddenMessage, se sim, encaminha para o bloco desejado. Veja um exemplo desse fluxo abaixo:

Isso te atenderia? Tenho uma outra possível solução, mas a implementação é bem mais complexa :slightly_frowning_face: