Pular para o conteúdo

Referência do SDK

Toda a superfície pública do @trivo/sdk numa página: o que se importa, o que cada objeto oferece e onde o assunto é ensinado.

O que a fachada exporta

import {
  createApp, TrivoApp, TrivoClient,          // o ciclo de vida
  TrivoRest,                                  // o cliente REST, se você o montar à mão
  TrivoInteraction,                           // o objeto de uma interação
  TrivoError,                                 // toda recusa do Trivo
  InteractionVerifier, interactionResponse,   // o endpoint HTTP
  BASE_URL_ENV_VAR, TOKEN_ENV_VAR,
  DEFAULT_DEDUPE_MAX_ENTRIES, DEFAULT_TIMESTAMP_TOLERANCE_SECONDS,
} from "@trivo/sdk";

TrivoClient é o mesmo TrivoApp, sob o nome que quem vem de outra plataforma procura primeiro. É um apelido, e não uma segunda classe: duas implementações da mesma coisa seriam a ambiguidade que este SDK evita no resto todo.

O ciclo de vida: createApp e TrivoApp

MembroO que faz
createApp(options?)Monta o App. Sem argumento, lê as duas variáveis de ambiente. As opções estão em Instalar e configurar.
app.applicationIdO id público, extraído do próprio token. É o que o verificador exige.
app.connect()Abre o gateway e resolve quando a conexão está de pé. Rejeita quando tentar de novo não conserta: credencial inválida, intent que não existe, endereço errado.
app.disconnect()Fecha e devolve a vaga do teto.
app.on(tipo, handler)Assina um evento e devolve a função que desassina. Só compila com tipo que um App de fato recebe — evento endereçado a conta é recusado pelo compilador.
app.onStatus(handler)O ciclo da conexão. Sem nenhum ouvinte, uma desistência vira uma linha de console.error — nunca silêncio.
app.onError(handler)O seu handler lançou. Não derruba a conexão: um erro no seu código não pode desligar o bot.
app.onInteraction(handler)Alguém acionou algo deste App, pelo caminho do gateway. Ver Interações.
app.interaction(payload)Monta o mesmo objeto a partir de um payload já verificado — é o caminho do endpoint HTTP.
app.stateO estado da conexão.
app.pendingEventsEnfileirados mais em voo. É o número que a sua métrica quer exportar.

app.rest, método a método

MétodoDevolveOnde é ensinado
whoAmI(){ app: { publicId, name } }Autenticação
getSigningKeys()As chaves públicas da plataformaAssinatura das entregas
getServerO retrato: server, channels, categories, roles, revision, can, myRank, isOwnerREST
listMembersmembers, roles, truncatedREST
listMessagesmessages e reactions, 50 por páginaREST
sendMessagemessage, e moderationWarning quando houverREST
editMessagemessage. Só alcança mensagem do próprio AppREST
deleteMessage{ ok: true }REST
toggleReactioncount e reacted — é alternância, e não um par de métodosREST
createChannelchannels e revisionREST
updateChannelchannels e revisionREST
moveChannelchannels, categories e revisionREST
archiveChannelchannels e revision. Arquiva: some do produto, fica para a moderaçãoREST
createRoleroles e revisionPermissões e escopos
updateRoleroles e revisionPermissões e escopos
deleteRoleroles e revisionPermissões e escopos
addMemberRoleroles e revisionPermissões e escopos
removeMemberRoleroles e revisionPermissões e escopos
addAppRoleapps e revision. Repare: apps, não rolesPermissões e escopos
removeAppRoleapps e revisionPermissões e escopos
listCommandscommands e truncatedComandos
createCommandcommand. Sem serverId, é globalComandos
updateCommandcommand. Substitui a definição inteiraComandos
deleteCommandNada: 204 sem corpoComandos
request()A porta para o que ainda não virou método, com o mesmo tratamento de 429 e o mesmo erroREST

TrivoInteraction

MembroO que faz
reply(content, options?)Confirma e responde. options é ReplyOptions, e leva private ou components, nunca os dois. O desfecho traz interaction.messageId quando a resposta foi pública — é por ele que se edita ou apaga o que acabou de ser escrito.
defer()Confirma sem responder ainda, e abre a janela de 60 s. É também o lock de quem não guarda estado entre execuções.
deferredReply(content, options?)A resposta de verdade, depois do defer. Traz messageId como o reply público.
followUp(content, options?)Até 5, em 10 minutos. Não muda o estado.
decline()Confirma dizendo que não faz. Diferente de sumir, e quem acionou vê a frase certa.
showModal(modal)Abre um formulário. O envio chega como uma interação nova, do tipo form.
suggest(choices)Só em autocomplete, e é a única resposta que ele aceita junto de decline().
id, type, serverId, channelId, userIdQuem acionou e onde. userId é sempre de uma conta: App não aciona interação.
dataunknown de propósito: a carga muda com o tipo, e o Trivo não a congela. Estreite antes de ler, e nunca a mande para log.
expiresInMs, expiresAtA duração é o contrato; expiresAt é o mesmo prazo pelo relógio daqui, para log. Quem decide continua sendo o servidor.

Os tipos que você vai querer nomear

Estes atravessam as assinaturas públicas, e por isso têm nome na fachada: sem eles, fatorar createRole({ permissions }) numa função sua não teria como tipar o parâmetro, e a saída natural seria any bem no lugar em que o vocabulário é fechado.

import type {
  Permission,               // "gerenciar_canais" | "banir_membros" | …
  ReactionEmoji,            // o emoji de uma reação
  GatewayIntent,            // "messages" | "reactions" | …
  InteractionType,          // "command" | "autocomplete" | …
  CommandOption,            // uma opção da árvore de um comando
  AutocompleteSuggestions,  // o que suggest() aceita
  AppModal,                 // o que showModal() aceita
} from "@trivo/sdk";

function darCargo(nome: string, permissions: readonly Permission[]) {
  return app.rest.createRole({ serverId, name: nome, permissions, revision });
}

Além destes, a fachada exporta as formas de resposta de cada método (o retrato do servidor, a mensagem, o cargo, o comando registrado), TrivoAppOptions, ErrorCode, GatewayStatus, InteractionOutcome, ReplyOptions e os tipos do verificador. Os nomes públicos são em inglês pela mesma régua que faz o evento se chamar message_create.

ReplyOptions é o segundo argumento de interaction.reply e o de interactionResponse.reply — uma definição só, e não um gêmeo por caminho de entrega. É o que permite fatorar function responder(texto: string, opcoes: ReplyOptions) sem cair no any.

TrivoError e o verificador

Toda recusa do Trivo vira TrivoError, com code de vocabulário fechado, status, is(...) para comparar sem escrever a string duas vezes e os extras da recusa: retryAfterSeconds é campo, e currentRevision e resetAt são acessores que leem o corpo — os três valem null ou undefined na recusa que não os traz. O corpo inteiro continua em erro.body, e o catálogo está em Erros.

InteractionVerifier e interactionResponse são o par do endpoint HTTP: verify decide se a entrega é do Trivo, e interactionResponse monta o corpo da resposta. As duas constantes de configuração — DEFAULT_TIMESTAMP_TOLERANCE_SECONDS e DEFAULT_DEDUPE_MAX_ENTRIES — são exportadas porque quem dimensiona o processo precisa dos números sem abrir o nosso código. O mecanismo está em Assinatura das entregas.