Como mudar o usuário de bloco (change user state)?

Bom dia,
Estamos com uma demanda aqui de mudar o usuário de um bloco para outro caso o chat seja aberto de uma forma específica em nosso front end.

Inicialmente tentei seguir as instruções da documentação
Sem sucesso

Pesquisei bastante aqui no forum e achei diversos post relacionados.
Tentei diversas abordagens mas não consegui.
Nossa maneira de autenticação é GUEST

Na documentação oficial temos a seguinte instrução para a requisição:

id Unique identifier of the command.
method set
uri /contexts/{{user-identity}}/stateid%40{{flow-identifier}}
to postmaster@msging.net (not required)
type text/plain
resource {{state-id}}

A última tentativa que fiz foi a seguinte:
blipChat.sendCommand({
id: ‘1’,
method: ‘set’,
uri:
‘/contexts/5ffc04d1-c5e5-4ec3-bf2a-e4e5249548ce.rosieinstituciona/stateid%40651ea71d-2d53-4ae6-9253-3a27d93d594d’,
type: ‘text/plain’,
resource: ‘db9ca09f-fc13-4007-91e2-4e85643f8a49’,
})

Aonde o user ID eu peguei do dashboard de usuários (por hora estou tentando hard coded)

Alguém conseguiria me ajudar?

@Leandro_Parisi

Você tem mais de um bot? Ou o fluxo ocorre em apenas um bot?

Se for a segunda opção:

Talvez o problema seja o Id passado no comando (No seu exemplo esta sendo passado 1), ele precisa ser único a cada request. Eu já usei o pacote NPM Uuid (https://www.npmjs.com/package/uuid) que ajuda a gerar uma chave aleatória a cada chamada.

Outro ponto é o id do usuário, parece incompleto. Depois do 5ffc04d1-c5e5-4ec3-bf2a-e4e5249548ce.rosieinstituciona geralmente tem um @algo.dominio, o meu contato para testes está assim aqui: 236a3d07-8c7e-4365-afd5-92a98c78df0f.bottal@0mn.io

Pode ser isso.

Caso esteja utilizando vários bots com router, talvez a minha resposta neste tópico possa ajudar: Change State User não redireciona para o bloco escolhido no fluxo (Canal de WhatsApp)

1 Curtida

Olá meu caro,
Primeiramente muito obrigado pela resposta e auxílio.
Bom que você comentou sobre a questão do id do usuário, eu sinceramente tive dificuldade de achar esse ID, no nosso caso estamos usando a autenticação para todos os usuários com Guest.
Imagino que tenha alguma forma de fazer uma requisição para receber o id do usuário corrente, certo? Eu simplesmente foi no GUI do blip em usuários e copiei o código do usuário que estou usando para test e coloquei hard coded, para testar, mas na situação real acredito que deveria ter uma forma de recuperar esse usuário de maneira dinamica, certo? Conseguiria me ajudar nisso?

Tentei mudar minha abordagem:

Estou tentando enviar o comando para redirecionamento diretamente pelo Builder, via ‘configurações gerais / ações globais’. Criei uma requisição HTTP nas ações globais de entrada para fazer a requisição de Change User State.

Foi uma abordagem mais promissora, uma vez que a requisição está funcionando… mas o bot não está sendo redirecionado, será que estou passando algum parametro errado?

Abaixo algumas imagens:

Outra pergunta, como faço para usar uma variável do Builder (biblioteca de variaveis) dentro de um corpo de uma requisição HTTP feita diretamento pelo builder?

Essa nova abordagem é mais fácil mesmo, eu geralmente sigo assim, mas em vez de usar a ação Requisição HTTP eu uso a Processar comando (Quando quero usar a API do Blip), pois já resolve parte do trabalho da requisição:

Para pegar o id do usuário, usei a variável contact.identity, dai agora é só substituir o ID_DO_FLOW pelo id do seu fluxo e no resource passar o id do bloco dentro das aspas.

Acho que assim vai funcionar

1 Curtida

Até que deu certo fazendo o comando pelo Builder.
Entretando o problema é o seguinte, eu preciso que esse comando seja ativado em uma situação específica e, para isso estou enviando pelo front uma mensagem hidden com um certo texto que será o gatilho do comando do builder…
O problemas é que, como estou fazendo o gatilho como uma mensagem e verificando a ‘resposta do usuário’ não é somente o gatilho que está sendo disparado, mas também as ações de saída do bloco aonde o usuário está e isso está me causando conflitos.

Entendo que a melhor maneira seria enviar o comando pelo front mesmo, mas já tentei de tudo quanto é forma e não entendo por que o comando não é processado quando enviado pelo front

Quando altera o bloco, se existir conteúdo ele é enviado? Estou com um pouco de dificuldade para utilizar o change user state, utilizando o builder tanto como “processar comando” como por requisições na API o state do cliente é alterado mas nada acontece, é como se ele ficasse no mesmo bloco, único comando que consegui processar foi o reset user state.

Bom dia Adriano, tudo certo?

Nenhuma ação do bloco é executada quando você faz a troca de estado do usuário, portanto, se existir uma mensagem no bloco ela não será enviada!
Um possível workaround para o seu cenário seria, além de mudar o estado do usuário, dar um send message com o conteúdo do bloco desejado.

{  
  "id": "{{$guid}}",
  "to": "{{user_id}}",
  "type": "text/plain",
  "content": "{{conteúd_do_bloco}}"
}
3 Curtidas

Perfeito @Luis_Araujo, era isso mesmo que eu precisava. Obrigado!

1 Curtida

@Luis_Araujo , mas em um caso onde existem 3 mensagens dentro desse bloco. Como eu passo as 3? Não consegui identificar uma forma.

Pensando de uma forma dinâmica, pois a intenção é que isso ocorra em qualquer momento do fluxo, mas que meu cliente volte pro bloco onde digitou algo inesperado e receba as mensagens desse bloco.

Neste caso, você pode enviar uma collection de mensagens, ficaria da seguinte forma:

{
    "to": {{user_id}},
    "type": "application/vnd.lime.collection+json",
    "content": {
        "itemType": "text/plain",
        "items": [
            "Messagem 1",
            "Message 2",
            "Messagem 3"
        ]
    }
}
1 Curtida

Mas não teria uma forma dinâmica? Ao invés de eu digitar a “Mensagem 1”, “Mensagem 2”, e “Mensagem 3”, a própria Requisição capturar quais são as mensagens do meu bloco em questão e enviá-las?