[Resolvido] Salvar o nome do usuário em uma conversa do BlipChat - NodeJS


#1

Olá Pessoal,

Uma dúvida… Se formos usar o BlipChat eu não vou ter o nome do usuário na conversa. Porém vou perguntar a ele qual o nome, e assim que ele responder quero salvar esse nome na Thread que ele está, pelo BlipWeb eu vi que nas informações do usuário eu tenho disponível Nome, Telefone, E-mail e Gênero. Minha dúvida é como salvar esses dados.

// Aqui pegamos a thread do usuário que está rolando no momento
await client.sendCommand({
    id: Lime.Guid(),
    method: "get",
    uri: `/threads/${message.from}`
})
.then( async res => {

    if (res) {

        // Pegamos a última mensagem enviada PELO ChatBot
        let sent = res.resource.items.find(item => {
            return item.direction == 'sent';
        });

        // Pegamos a última mensagem enviada PELO Usuário
        let received = res.resource.items.find(item => {
            return item.direction == 'received';
        });

        // Legal, agora pegou a última mensagem enviada PELO ChatBot
        if (sent) {

            if (sent.content == 'Qual é o nome?') {
            	let name = received.content;

            	// E agora...

            }

        }

    }

}).catch(err => {
    console.log(err);
});

#2

@odirleiborgert, vc precisa adicionar (e manter atualizado) as informações do cliente na agenda de contatos do seu bot.
Para isso utilize o comando SET de contato. Veja este link.

Exemplo:

{  
  "id": "1",
  "method": "set",
  "uri": "/contacts",
  "type": "application/vnd.lime.contact+json",
  "resource": {
    "identity": "11121023102013021@messenger.gw.msging.net",
    "name": "João da Silva",
    "gender":"male",
    "group":"amigos",
    "extras": {
      "plan":"Gold",
      "code":"1111"      
    }
  }
}

Após enviado este comando vc conseguirá ver o nome do usuário no BLiP Web ou em qualquer outro lugar do portal.

A extensão de Threads é utilizada apenas para buscar o histórico de conversa de algum cliente com o bot.


#3

Legal @rafaelpa,

Funcionou, porém fazendo uns testes surgiu uma dúvida. Cada vez que rodo sobrescreve os dados do resource.

Vamos supor que em um determinado fluxo da conversa pergunto o nome da pessoa e salvo, e depois vou pedir o telefone e quando eu salvar somente o telefone sobrescreve o nome.

Existe alguma maneira de contornar essa situação?

Talvez salvar tudo no Buckets e depois no final pegar os dados do buckets e salvar no contacts?

Outra opção talvez seria antes de salvar a nova propriedade, pegar os dados do usuário e adicionar a nova propriedade e salvar…


#4

Uma outra solução que encontrei foi:

  1. Fazer um get dos dados do usuário e atribuir a um objeto
  2. Adicionar a nova propriedade nesse objeto
  3. Salvar os dados do usuário no contato dele…

#5

Solução encontrada

let contact = {};

from = from.replace('/web', '');

// Pegamos os dados do usuário
await client.sendCommand({
    id: Lime.Guid(),
    method: "get",
    uri: `/contacts/${from}`  //
}).then(res => {
    if (res) {
        contact = res.resource;
    }
}).catch(err => {
    console.log('err', err);
});

// Atribuindo a propriedade
Object.assign(contact, { name: 'João' });
Object.assign(contact, { identity: from });

// Salvando os dados
await client.sendCommand({
    id: Lime.Guid(),
    method: "set",
    uri: "/contacts",
    type: "application/vnd.lime.contact+json",
    resource: contact
}).then(res => {
    console.log('success');
}).catch(err => {
    console.log('err', err);
});

#6

Perfeito @odirleiborgert, essas são as duas soluções possíveis :blush: