Discussão sobre o módulo RECURSOS

Dando continuidade no assunto sobre o módulo CONTEÚDOS > RECURSOS


Resposta do @Bruno em: https://youtu.be/Uv_x1qhxs34?t=1115


Bom, primeiramente obrigado pela resposta @Bruno, já deu pra pensar em algumas aplicações e claro, preciso aprofundar um pouco mais a respeito.

Uma dúvida enorme que eu fiquei é, se eu não utilizar CONTEXTO DO ROUTER ATIVADO, eu precisaria utilizar a API “Get Resources” (https://docs.blip.ai/#resources) nos meus subbots ? Ou teria outra forma? Ultimamente estou tendo péssimas experiências com o contexto ativado.

Aproveito para convocar o @costa e @Rafael_dos_Anjos , vocês utilizam o módulo RECURSOS?

4 Curtidas

fala @GabrielPetrone ótimo ponto.
ainda não uso este recurso, mas vou apreder com vcs e com certeza será útil. Li rapidamente a documentação e deu para entender um pouco. Bora aprender mais :rocket:

1 Curtida

Sim, @GabrielPetrone. Uma vez que o contexto está desabilitado, a única forma seria via API.

3 Curtidas

E como prometido, vou deixar aqui como fazer pra aproveitar os scripts como recursos

  1. Crie um Recurso do tipo texto e adicione todas as funções (incluindo a run):

  2. Na ação de executar script, passe esse recurso como parâmetro de entrada, neste caso usando {{resource.funcao}}

  3. Dentro do Script, você precisa pegar o texto do recurso e transformar ele em funções executáveis. Por isso, use a função eval().

   function run (resource) {
    eval(resource);
    return Hello(); //uma das funcoes definidas no recurso
   }

Assim vocês conseguem ter Scripts escaláveis e de fácil manutenção para todos os seus blocos (ou todos os bots, se for em roteadores).

5 Curtidas

@GabrielPetrone não utilizo mas vou dar uma atenção especial e entender como funciona…
vlw

2 Curtidas

Já começou detonando! Perfeito @Bruno , muito obrigado por essa dica!
Quero ver o que mais podemos fazer com isso, então fica o desafio pra mim, @Pedro_Lucas @Costa e @Rafael_dos_Anjos

E você @caiof dá uma dica pra nós de como usar esse módulo

3 Curtidas

Olá pessoal, tudo bom?

@GabrielPetrone, a ideia principal desse módulo e é o mais legal dele é a possibilidade de separar informações que normalmente estariam em seu fluxo, dessa forma, seu bot fica extremamente mais escalável, principalmente, porque não será mais necessário sempre mexer no fluxo para mudar algo.

Imagine, por exemplo, nos seguintes pontos:

  • Horário de atendimento: Você pode adicionar um JSON com seu horário de atendimento e criar uma verificação baseada nessa informação no fluxo, assim sendo, para mudar o horário de atendimento não seria necessário publicar o fluxo, além de você poder adicionar esse JSON via API direto do seu sistema.
  • Lista de palavras bloqueadas: Você pode cadastrar uma base de palavras bloqueadas que podem ser utilizar como verificação no seu fluxo, via regex ou script.
  • Conteúdo dinâmico: Pense em criar um conteúdo dinâmico que recebe esse recurso que é facilmente mutável para exibir uma promoção ou um alerta que varia de tempos em tempos no seu fluxo, tal como uma instabilidade.
  • Reaproveitamento de script: Esse aqui o @Bruno já mostrou um exemplo haha

Dentro de cada bot tenho certeza que existe uma infinidade de utilização neste módulo, muito legal a movimentação dessa discussão :smile:

1 Curtida

Fala pessoal, até aqui muito obrigado pelas contribuições. Vamos encher com mais coisas hein!? :wink:

Agora respondendo a minha pergunta :gabrielpetrone:

Sim e não, meu querido! Precisa usar a API mas não é essa que você colocou. A correta é: https://docs.blip.ai/#get-a-specific-resource

Certo, depois de criar o Recurso lá no seu Router, você pega a Key dele e chama essa API passando a chave (nome) do recurso criado. Salve o corpo de resposta da sua requisição HTTP em uma variável (básico do blip né).

Agora pra acessar o conteúdo é simples, basta usar a variável: {{variavel_de_resposta_do_corpo_da_sua_requisicao_HTTP@resource}}

Não é tão bom quanto quando se usa o contexto do roteador, mas num cenário com 2 subbots ++, elimina um ~puta~ trabalho pra atualizar tudo. O trabalho é só na primeira vez pra fazer o que citei acima.

@Bruno neste seu exemplo, como eu usaria uma função que passa uma variável? Eu fiz um teste aqui e não funcionou passando “return Hello(variavel);” :frowning:

É possível? Deveria ter funcionado?

Fala @GabrielPetrone,
dentro do resource, deve passar um parâmetro para a função hello()

function Hello(nomeDaVariavel){
    //sua função
}

após isso, dentro da function

function run(resource){
    eval(resource);
    return Hello(nomeDaVariavel);
}

isso deve funcionar.

Bom dia Costa!
Se não estou enganado, eu fiz isso mesmo!
Eu acho que o erro foi na minha variável e to comendo bola, vou ter que testar novamente mais tarde.

No caso, eu tenho que passar na entrada do script as duas variáveis né? {{resource.funcao}} e {{nomeDaVariavel}} ?

Portanto o correto seria:

function run(resource, nomeDaVariavel){
    eval(resource);
    return Hello(nomeDaVariavel);
}

Eu havia feito dessa forma, seria isso?

É isso mesmo que o @costa falou, @GabrielPetrone

Eu por exemplo fiz essa função aqui, oh:

function hello(string){
	var aux = "Hello, ";
	return ss.concat(string);
}

No Blip, eu fiz da seguinte forma, com uma variável xtring, com valor World:

function run(func, xtring) {
   eval(func);
   return hello(xtring);
}

E o resultado foi Hello, World".

Depois fala pra gente se funcionou! Pode ser que você esteja comendo alguma mosca por aí.

Meu exemplo de utilização:

Criei um recurso chamado “helpers” no Router.

No BOT que eu desejo utilizar o recuso, fiz uma chamada HTTP para o Recuso e salvei o seu retorno em na variável helpresData.

E utilizar ele assim:

/**
 * @param helpersData
 * @param contact.source
 * 
 * @return {string}
 */
function run(helpersData, channel) {

    const helpers = JSON.parse(helpersData);

    eval(helpers.resource);

    return textStrong(channel, "Texto aqui...");
}
2 Curtidas

Entendi certo? Com isso você trata o texto em negrito conforme o formato de cada canal, sem precisar criar dois blocos separados?

Ou seja, que o Bruno me prometeu e até hoje nada? :heart_eyes: Só coisa boa hoje…

1 Curtida

Estou só te ensinando a pescar e não te dando o peixe :rofl: :rofl:

eu esqueci mesmo

1 Curtida

@GrazianiMartins eu já tinha feito uma solução dessa, mas eu retornava só as tags e não adicionava os textos - vendo a sua, me pergunto o motivo de eu não ter pensado assim :joy:

Aí eu fazia tipo assim:

{{tag1}} Texto {{tag2}}

Onde {{tag1}} era a tag de abertura (<b> ou *) e {{tag2}} era a de fechamento {</b> ou *)

A refatoração de código nunca acaba rsrsrs.

Logo alguém vem como uma abordagem melhor ou que faça mais sentimo no contexto dele(a).

Bora! Compartilhar!!!

1 Curtida

Então…
Segue função para alterar determinados textos de uma frase em negrito:

replaceTextToStrong

/**
 * @param contact.source
 * @param text
 * 
 * @return {string}
 */
function textStrong(channel, text) {
    switch (channel) {
        case '0mn.io':
            return "<b>" + text + "</b>";
        case 'WhatsApp':
            return "*" + text + "*";
        default:
            return text;
    }
}

/**
 * @param contact.source
 * @param phrase string
 * @param words string Texts separated by |
 * 
 * @return {string}
 */
function replaceTextToStrong(channel, phrase, words) {

  const regExp = new RegExp(words, 'gi');

  return phrase.replace(regExp, function(word) {
    return textStrong(channel, word);
  });
}

Utilização:

function run(helpersData, channel) {
    
    const helpers = JSON.parse(helpersData);

    eval(helpers.resource);

    phrase  = "Mr Blue has a blue house and a blue car";
    words   = 'blue|house|car';

    return replaceTextToStrong(channel, phrase, words);
}
2 Curtidas