# Sintaxe de expressões

A sintaxe de expressão refere-se à estrutura de declarações na linguagem de código usada para incorporar conteúdo dinâmico, variáveis ou funções internas específicas no seu chatbot.&#x20;

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2Fglldzoi45FWG8tJXeQ2M%2FScreenshot%202024-01-23%20at%2015.45.18.png?alt=media&#x26;token=75f20331-754f-4d13-88f8-df375af3a622" alt="" width="375"><figcaption><p>Exemplo de sintaxe de expressão dentro de uma mensagem de texto.</p></figcaption></figure>

{% hint style="warning" %}
Por favor, note que **a sintaxe de expressão precisa ser habilitada na sua conta**. Para habilitar a sintaxe de expressão na sua conta, por favor [entre em contato com o suporte](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/support/get-in-touch)..&#x20;
{% endhint %}

{% hint style="danger" %}
Por favor, esteja também ciente sobre as [**mudanças que quebram compatibilidade**](#breaking-changes) ocorrendo para bots existentes.&#x20;
{% endhint %}

Ao contrário das ações de código tradicionais, que requerem conhecimento de JavaScript e podem consumir muitos recursos, a sintaxe de expressão no Chatlayer torna funcionalidades avançadas acessíveis sem a necessidade de habilidades extensas de codificação.&#x20;

{% hint style="info" %}
Neste artigo, o termo 'expressão' refere-se à combinação de identificadores usando funções, operadores, constantes e valores ao programar. Portanto, não deve ser confundido com o conceito de [expressões](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/navegacao/natural-language-processing-nlp/intents) no seu modelo de PNL.
{% endhint %}

## Como usar a sintaxe de expressão

A sintaxe de expressão pode ser usada dentro de [Passos de Texto](#text-step) e [Condições](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/buildabot/flow-logic/dialog-state/plugins), usando [tipos de dados](#data-types), [operadores](#operators) e [funções](#functions).

### Use funções da sintaxe no seu bot

Para usar a sintaxe de expressão no seu chatbot:

1. Abra seu [bloco](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/buildabot/flow-logic/dialog-state).
2. Vá para o seu campo de texto.
3. Digite '{' dentro de um campo de texto ou digite o nome de uma função interna. Alguns casos de uso são mostrados abaixo.

#### **Passo de Texto**

Use a sintaxe de expressão dentro de um passo de texto para exibir o resultado dentro da mensagem do seu bot.

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2FJaqE0IfhRjPfM0Q8O7vk%2FScreenshot%202024-01-19%20at%2013.37.34.png?alt=media&#x26;token=e21486f3-a925-4756-9731-fbb36b52b955" alt="" width="188"><figcaption><p>Use funções da sintaxe de expressão dentro de um passo de Texto</p></figcaption></figure>

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2FjRusMHLkPWvO6e8fkXeV%2FScreenshot%202024-01-19%20at%2013.39.16.png?alt=media&#x26;token=3e7e74e8-cbb4-4a45-98ac-d1669a529a20" alt="" width="188"><figcaption><p>Use variável da sintaxe de expressão dentro de um passo de Texto</p></figcaption></figure>

#### **Bloco de Condição**

Use a sintaxe de expressão dentro de uma [bloco de Condição](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/buildabot/flow-logic/dialog-state/plugins) declaração como um [variável](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/navegacao/settings/secure-variables-gdpr).

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2FGYsGRWjKScvb85Q2kCOX%2FScreenshot%202024-01-19%20at%2013.41.59.png?alt=media&#x26;token=1cb5408b-d7b0-4d84-a8e0-0039a0562f68" alt="" width="188"><figcaption><p>Use uma variável da sintaxe de expressão como uma variável dentro de uma declaração de Condição.</p></figcaption></figure>

Leia abaixo para exemplos de casos de uso:

* [Obter a hora atual](#get-the-current-time)
* [Converter para minúsculas](#downcase)
* [Criar uma lista](#create-a-list)

### **Funções**

Funções, sejam [internas](#built-in-functions) ou [personalizadas](#custom-functions), formam a espinha dorsal da sintaxe de expressão. Elas executam tarefas e operações específicas dentro do fluxo conversacional do seu chatbot.&#x20;

#### Funções internas

Aqui está a lista de funções internas que você pode usar:&#x20;

<table><thead><tr><th width="191">Nome</th><th>Resumo</th><th>Exemplo</th></tr></thead><tbody><tr><td>ABS</td><td>Retorna o valor absoluto de um número.</td><td>operação: (n: any) => Math.abs(n)</td></tr><tr><td>APPEND</td><td>Adiciona um ou mais itens ao final de uma lista.</td><td>operação: (arr: any, ...items: any[]) => arr.concat(...items)</td></tr><tr><td>BASE64_DECODE</td><td>Decodifica texto codificado em Base64.</td><td>operação: (text: any) => Buffer.from(text, 'base64').toString('utf8')</td></tr><tr><td>BASE64_ENCODE</td><td>Codifica texto usando o algoritmo de codificação Base64.</td><td>operação: (text: any) => Buffer.from(text + '', 'utf8').toString('base64')</td></tr><tr><td>CAPITALIZE</td><td>Torna a primeira letra do texto maiúscula e converte os caracteres restantes para minúsculas.</td><td>operação: (value: any) => lodash.capitalize(value)</td></tr><tr><td>CEIL</td><td>Arredonda para cima e retorna o menor inteiro maior ou igual a um dado número.</td><td>operação: (n: any) => Math.ceil(n)</td></tr><tr><td>DAY</td><td>Retorna o dia a partir da data fornecida ou o dia atual se nenhuma data for fornecida (1-12).</td><td>operação: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).day</td></tr><tr><td>DOWNCASE</td><td>Converte cada caractere do texto para minúsculo.</td><td>operação: (value: any) => lodash.toLower(value)</td></tr><tr><td>FIRST</td><td>Retorna o primeiro elemento de uma lista.</td><td>operação: (value: any) => lodash.first(value)</td></tr><tr><td>FLOOR</td><td>Arredonda para baixo e retorna o maior inteiro menor ou igual a um dado número.</td><td>operação: (n: any) => Math.floor(n)</td></tr><tr><td>FORMAT</td><td>Retorna a data formatada de acordo com a string de formato.</td><td>operação: (d: any, format: any, locale: any) => DateTime.fromMillis(d).toFormat(format, { locale: locale || 'en' })</td></tr><tr><td>HOUR</td><td>Retorna a hora a partir da data fornecida ou a hora atual se nenhuma data for fornecida (0-23).</td><td>operação: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).hour</td></tr><tr><td>INCLUDES</td><td>Retorna TRUE se o alvo (que pode ser texto, um objeto ou um array) inclui o valor, caso contrário retorna FALSE.</td><td>operação: (haystack: any, needle: string) => lodash.includes(haystack, needle)</td></tr><tr><td>JSON_PARSE</td><td>Analisa um valor JSON serializado.</td><td>operação: (value: any) => JSON.parse(value)</td></tr><tr><td>LAST</td><td>Retorna o último elemento de uma lista.</td><td>operação: (value: any) => lodash.last(value)</td></tr><tr><td>MAX</td><td>Retorna o valor máximo a partir dos argumentos fornecidos.</td><td>operação: (...args: any) => Math.max(...args)</td></tr><tr><td>MD5</td><td>Calcula o hash MD5 codificado em hexadecimal de um texto.</td><td>operação: (t: any) => crypto.createHash('md5').update(t + '').digest('hex')</td></tr><tr><td>MINUTE</td><td>Retorna o minuto a partir da data fornecida ou o minuto atual se nenhuma data for fornecida (0-59).</td><td>operação: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).minute</td></tr><tr><td>MONTH</td><td>Retorna o mês a partir da data fornecida ou o mês atual se nenhuma data for fornecida (1-12).</td><td>operação: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).month</td></tr><tr><td>NOW</td><td>Retorna a data e hora atuais.</td><td>operação: () => DateTime.now().toMillis()</td></tr><tr><td>PARSE</td><td>Analisa uma data formatada de acordo com a string de formato.</td><td>operação: (d: string, format: any, locale: any) => DateTime.fromFormat(d, format, { locale }).toMillis()</td></tr><tr><td>ROUND</td><td>Retorna o valor de um número arredondado para a precisão mais próxima.</td><td>operação: (n: any, precision = 0) => Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision)</td></tr><tr><td>SPLIT</td><td>Divide o texto de entrada em uma lista usando o delimitador como separador.</td><td>operação: (text: any, delimiter: any) => (text + '').split(delimiter + '')</td></tr><tr><td>STRINGIFY</td><td>Serializa um valor em uma string JSON.</td><td>operação: (value: any) => stringify(value, null, 0)</td></tr><tr><td>TODAY</td><td>Retorna a data de hoje com a hora definida para 00:00.</td><td>operação: () => DateTime.now().startOf('day').toMillis()</td></tr><tr><td>TOMORROW</td><td>Retorna a data de amanhã com a hora definida para 00:00.</td><td>operação: () => DateTime.now().startOf('day').plus({ days: 1 }).toMillis()</td></tr><tr><td>TO_NUMBER</td><td>Converte um valor para número.</td><td>operação: (value: any) => value - 0</td></tr><tr><td>TO_STRING</td><td>Converte um valor para string.</td><td>operação: (value: any) => value?.toString()</td></tr><tr><td>UUID</td><td>Gera um identificador único universal (V4).</td><td>operação: () => uuid()</td></tr><tr><td>WEEKDAY</td><td>Obtém o dia da semana. 1 é segunda-feira e 7 é domingo.</td><td>operação: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).weekday</td></tr><tr><td>YEAR</td><td>Retorna o ano da data fornecida ou o mês atual se nenhuma data for fornecida.</td><td>operação: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).year</td></tr><tr><td>YESTERDAY</td><td>Retorna a data de ontem com a hora definida para 00:00.</td><td>operação: () => DateTime.now().startOf('day').plus({ days: -1 }).toMillis()</td></tr></tbody></table>

#### **Funções personalizadas**

Você pode criar suas próprias [funções](#functions) como desejar, usando as [operadores](#operators).&#x20;

Alguns exemplos de funções personalizadas:

* **`1 + 2`**
* **`1 + (2 * 3)`**
* **`MAX(1,2)`**
* **`a ? b : c`**
* **`a.b.c.d`**

### **Operadores**

Operações englobam uma variedade de ações, cálculos e manipulações de dados no código. Usar operadores proporciona respostas mais dinâmicas e contextualmente conscientes ao seu chatbot.

<table><thead><tr><th width="124">Precedência</th><th>Operador</th><th>Descrição</th><th>Associatividade</th></tr></thead><tbody><tr><td>1</td><td>()</td><td>Chamada de função</td><td>Esquerda-para-direita</td></tr><tr><td></td><td>.</td><td>Nome qualificado ou acesso a campo</td><td></td></tr><tr><td></td><td>[]</td><td>Indexação</td><td></td></tr><tr><td>2</td><td>- (unário)</td><td>Negação</td><td>Direita-para-esquerda</td></tr><tr><td></td><td>!</td><td>NOT lógico</td><td></td></tr><tr><td>3</td><td>*</td><td>Multiplicação</td><td>Esquerda-para-direita</td></tr><tr><td></td><td>/</td><td>Divisão</td><td></td></tr><tr><td></td><td>%</td><td>Resto</td><td></td></tr><tr><td>4</td><td>+</td><td>Adição</td><td></td></tr><tr><td></td><td>- (binário)</td><td>Subtração</td><td></td></tr><tr><td>5</td><td>== != &#x3C; > &#x3C;= >=</td><td>Relações</td><td></td></tr><tr><td>6</td><td>&#x26;&#x26;</td><td>E lógico</td><td></td></tr><tr><td>7</td><td>?:</td><td>Condicional</td><td>Direita-para-esquerda</td></tr></tbody></table>

### **Tipos de dados**

Nós suportamos um subconjunto de tipos JavaScript para fornecer flexibilidade na sua jornada de criação de bots:

* número
* string
* booleano
* mapa
* lista
* nulo

## Casos de uso da sintaxe de expressão

Nesta seção, encontre alguns exemplos de casos de uso onde a sintaxe de expressão é utilizada

### Obter a hora

Existem várias maneiras de retornar informações sobre o tempo com funções da sintaxe de expressão.

#### Obter a hora atual

Imagine que você quer que seu bot saiba ou exiba a hora atual. A hora é fácil de obter com as seguintes funções:

* `FORMAT()` retorna a hora de acordo com uma string.
* `NOW()` retorna a data e hora atuais com base no fuso horário UTC.

Combine estas para criar uma função que retorne a hora com horas e minutos:

```javascript
 {FORMAT(NOW(), "T")}
```

{% hint style="info" %}
Para saber mais sobre formatação de tempo, dê uma olhada em [esta tabela](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).
{% endhint %}

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2FsKllhtWYvUxC0KZrqmHS%2FScreenshot%202024-01-23%20at%2015.32.04.png?alt=media&#x26;token=bada43ee-136f-4043-bb40-6b448d0d5240" alt=""><figcaption><p>Use a sintaxe de expressão para retornar a hora atual dentro de uma conversa.</p></figcaption></figure>

#### Obter um fuso horário UTC+1

Imagine um cenário em que seus usuários finais estão localizados em um fuso horário UTC+1. Para que eles saibam se sua loja está aberta agora, seu bot precisa determinar que horas são na Bélgica.

Você pode usar as funções:

* `NOW()` retorna a data e hora atuais com base no fuso horário UTC.
* `HOUR()` extrai a hora do horário atual.
* `HOUR(NOW())` extrai o componente de hora do fuso horário UTC atual.
* `+1` adiciona 1.

Combine essas funções na seguinte expressão personalizada:

```jsx
{HOUR(NOW())+1}
```

Esta expressão extrai a hora do fuso horário UTC atual e adiciona 1 a ela para que corresponda ao horário belga.

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2FujyBg6iriibASiDwtSL2%2FScreenshot%202024-01-19%20at%2012.46.38.png?alt=media&#x26;token=49a75575-fa23-4048-b056-2ff3133633bf" alt=""><figcaption><p>Use uma expressão personalizada para obter a hora atual no fuso horário do seu cliente.</p></figcaption></figure>

### Converter para minúsculas

Digamos que seu cliente forneceu seu nome em letras maiúsculas. Você quer converter todos os caracteres de entrada para minúsculas para que possa seguir um processo padronizado.

* &#x20;`DOWNCASE()`  converte todos os caracteres em um texto dado para minúsculas.&#x20;
* `@username` é o nome da variável sob o qual o nome do seu cliente é salvo.

Combine esses elementos em uma função personalizada que transforma todos os caracteres do nome do usuário em minúsculas:

```javascript
DOWNCASE(@userName)
```

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2FhItP1ZuUKIPFz3OLkYxs%2FScreenshot%202024-01-19%20at%2013.00.36.png?alt=media&#x26;token=a55fd417-61b7-4115-b014-c2c45a836c68" alt=""><figcaption><p>Use a sintaxe de expressão para padronizar a entrada do usuário.</p></figcaption></figure>

### Criar uma lista

Digamos que você tem uma mensagem que consiste em uma lista de elementos que você gostaria de tratar separadamente, por exemplo, uma lista de frutas.

Sua mensagem de exemplo seria a seguinte string:

```javascript
"Apple Banana Orange"
```

* `SPLIT()`  divide uma string em uma lista
* `FIRST()` e `LAST()` recuperam, respectivamente, o primeiro e o último elementos de uma lista

Combine essas funções para retornar o primeiro e o último elemento da lista de frutas:

```jsx
{FIRST(SPLIT("Apple Banana Orange"," "))}
{LAST(SPLIT("Apple Banana Orange"," "))}
```

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2F09Nf4BHqVPycucZfJiJD%2FScreenshot%202024-01-19%20at%2013.26.54.png?alt=media&#x26;token=560b402d-9d95-48d1-9cce-07c4b499fd65" alt=""><figcaption><p>Recupere elementos de lista usando a sintaxe de expressão.</p></figcaption></figure>

## 🚨 Mudanças que quebram compatibilidade&#x20;

Para garantir uma transição suave para a sintaxe de expressão, é crucial abordar algumas mudanças que quebram compatibilidade e que podem impactar os fluxos atuais do seu bot.&#x20;

### **Restrição de nomes de variáveis**

Nomes de variáveis existentes como `a-b`, `a b`, número ou uso de '-' em Ir para variáveis não são mais compatíveis.&#x20;

Por favor, certifique-se de ajustar seus nomes de variáveis de acordo com a nova sintaxe de expressão.

<figure><img src="https://181262846-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LLTwFwbOqJj4dDhg8Ju%2Fuploads%2FuFsdvkidZYueu6mftQuE%2FScreenshot%202024-01-22%20at%2015.50.45.png?alt=media&#x26;token=3ec9d827-55eb-4cb6-89c0-e852f8aa0801" alt=""><figcaption><p>Exemplos de nomes de variáveis que não são mais compatíveis com a sintaxe de expressão.</p></figcaption></figure>

### **Requisito de identificador JavaScript**

Apenas identificadores JavaScript válidos são suportados. Se suas variáveis não estiverem em conformidade, ajuste-as agora para evitar problemas. Consulte esta documentação para [diretrizes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types) detalhadas.

### **Remoção do`|` operador**&#x20;

O `|`  o operador não é mais suportado. Se ele fizer parte do fluxo do seu bot, faça os ajustes necessários para alinhar-se com a nova sintaxe.

Antes da atualização, se o fluxo do seu bot envolvia o uso do operador |, ele poderia ser assim:

```
notUnderstoodCounter|increment
```

Com a atualização da sintaxe de expressão, o `|` operador não será mais suportado. Por favor, modifique o nome da sua variável.&#x20;

### **`JSON.stringif` não mais compatível**

Certifique-se de revisar suas variáveis anteriores e confirmar que nenhuma delas dependa de `JSON.stringify`. Por favor, use STRINGIFY ou TO\_STRING em vez disso.
