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@One@SlashCommandem 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.
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"
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ê quer | Vá para |
|---|---|
| Instalar e conferir requisitos | Instalação |
| Sair do zero até o bot respondendo | Primeiro bot |
| Saber que eventos existem | Eventos |
| Escrever comandos | Comandos |
| Checar permissões sem errar o bit | Permissões |
| Tocar áudio numa sala | Voz |
| Ler a API do cliente | Referência: Client |
| Ver um bot grande de verdade | Bot de música |