Pular para o conteúdo principal

O que é o nescord

O nescord é o SDK de bots do Concord. São dois pacotes que trabalham em par:

  • concord.js — o cliente. Fala o protocolo do Concord por inteiro: o WebSocket de /ws, as rotas /api/*, permissões, anexos e voz pelo SFU. Não depende do NestJS e pode ser usado sozinho.
  • nescord — o módulo NestJS em volta dele. Transforma métodos decorados com @On e @SlashCommand em handlers ligados ao cliente, com injeção de dependência, guards e ciclo de vida do Nest.

Se você já escreveu bot com discord.js ou Necord, a forma vai parecer familiar. O conteúdo não é: o Concord tem o protocolo dele, e este SDK não finge o contrário.

Para que serve​

Para tudo que um bot faz num servidor do Concord sem abrir o navegador:

  • responder a mensagens em canais de texto, de voz e em tópicos;
  • ler o histórico, editar, apagar, reagir, fixar e abrir tópicos;
  • moderar — expulsar, banir, mexer em cargos, ler o log de auditoria;
  • criar canais, salas temporárias e convites;
  • entrar num canal de voz e tocar áudio de verdade, via ffmpeg e uma stack WebRTC fora do navegador;
  • reagir a presença, entrada e saída de gente na voz, mudanças de canal e de cargo.

Um bot inteiro​

Isto é um bot completo. Responde a oi bot no chat e a /ping como comando.

src/app.module.ts
import { Injectable, Module } from '@nestjs/common';
import { NescordModule, On, SlashCommand, Ctx, type EventContext, type SlashCommandContext } from 'nescord';

@Injectable()
class Bot {
@On('messageCreate')
async onMessage(@Ctx() [msg]: EventContext<'messageCreate'>) {
if (!msg.fromMe && msg.content === 'oi bot') await msg.reply('oi!');
}

@SlashCommand({ name: 'ping', description: 'Mede a ida e volta até o gateway' })
async ping(@Ctx() [ctx]: SlashCommandContext) {
await ctx.reply(`pong em ${ctx.client.ping} ms`);
}
}

@Module({ imports: [NescordModule.forRoot({ token: process.env.CONCORD_TOKEN })], providers: [Bot] })
export class AppModule {}

Falta só o main.ts com três linhas de bootstrap. Está em Primeiro bot.

O que você precisa saber antes​

Quatro coisas do Concord que mudam como o bot é escrito. Elas aparecem de novo, em detalhe, nas páginas do guia — mas é melhor saber desde já:

O token sai do portal, e do ambiente​

No Concord um bot nasce de uma aplicação, criada no portal de desenvolvedores. A aplicação já cria a conta do bot, e o id dela é o id desse usuário — como no Discord. A credencial é o token que o portal mostra uma vez só: ele vai no cabeçalho Authorization: Bot do handshake e nunca no código.

Bot é usuário de verdade por aqui: entra na lista de membros com a etiqueta BOT, recebe cargo e fala na voz pelos mesmos caminhos de qualquer pessoa.

export CONCORD_TOKEN="..."
export CONCORD_URL="https://app.concord.win"
Há uma segunda credencial, e ela é outra coisa

As rotas /api/bots/* usam Authorization: Bot <token>, que é uma credencial de instalação: vale num servidor só, numa lista fixa de canais, limitada por escopos. Ela não autentica o gateway nem o SFU. Veja Primeiro bot.

state é snapshot, não delta​

O servidor reenvia o estado inteiro — servidores, canais, membros, cargos, presenças — a cada mudança. Quem calcula o diff e emite channelCreate, memberUpdate, voiceStateUpdate e companhia é o concord.js. Você consome os eventos; o snapshot fica como detalhe de implementação.

Uma conexão por usuário​

Abrir um segundo WebSocket com o mesmo token derruba o primeiro, que recebe replaced. O SDK não reconecta nesse caso — se reconectasse, as duas sessões ficariam se derrubando em loop. Em desenvolvimento, isso significa: não deixe o bot rodando em dois terminais.

Não existe evento de interação​

O gateway do Concord não empurra interações. O @SlashCommand do nescord é despachado de messageCreate, por prefixo de texto (/ por padrão) — é um comando por mensagem, com tipagem e validação em cima. Quem tem credencial de instalação pode ligar a caixa REST (GET /api/bots/interactions), que é polling. Detalhes em Comandos.

Por onde seguir​

Você querVá para
Instalar e conferir requisitosInstalação
Sair do zero até o bot respondendoPrimeiro bot
Saber que eventos existemEventos
Escrever comandosComandos
Checar permissões sem errar o bitPermissões
Tocar áudio numa salaVoz
Ler a API do clienteReferência: Client
Ver um bot grande de verdadeBot de música