🤖 SDK de bots para JavaScript v1.0

Crie bots para o Codec.

Comandos com /, cartões, botões e eventos — com um arquivo JavaScript e poucas linhas de código. Você programa, o Codec mostra para a sua comunidade.

index.js
const { Client, Embed } = require("./codec-bot");
const client = new Client({ token: process.env.CODEC_TOKEN });

client.command({ name: "enquete", description: "Sim ou não" }, (ctx) =>
  ctx.reply({
    embed: new Embed().setTitle("📊 Enquete").setDescription(ctx.args),
    buttons: [
      { id: "sim", label: "Sim", style: "success" },
      { id: "nao", label: "Não", style: "danger" },
    ],
  }),
);

client.login();
🤖
Ana usou /enquete Pizza hoje?
Enquetinha Bot
📊 Enquete
Pizza hoje?
SimNão
⌘

Comandos com /

Registre comandos no código: eles aparecem nas sugestões do chat de quem digita /.

▤

Cartões

Título, descrição, campos, imagem e cor — respostas bonitas sem esforço.

◉

Botões

Até 5 por mensagem. O clique chega no seu código na hora.

⚡

Eventos

Mensagens, membros que entram e saem, servidores que adicionam o bot.

●

Online de verdade

O Codec mostra quando o bot está rodando e avisa quando está offline.

★

Comunidade

Ligue a opção e mande para análise: o bot aparece em Bots da Comunidade.

01 Começar em 5 minutos

Um bot do Codec é um programa em Node.js que roda no seu computador (ou num servidor) e conversa com o Codec pelo SDK oficial, o arquivo codec-bot.js.

Instale o Node.js 20.6 ou mais novo

Baixe em nodejs.org (versão LTS).

Crie o bot no Codec

No app: Bots › Desenvolvedor › Novo bot. Dê nome, foto e clique em Gerar token.

Baixe o projeto inicial

Extraia o codec-bot-starter.zip, renomeie .env.example para .env e cole o token.

Ligue o bot

Na pasta do projeto: npm install e depois npm start.

Adicione a um servidor e teste

No Codec, clique em Adicionar a um servidor e digite /ping no chat.

02 Criar o bot no Codec

Tudo que é do perfil do bot fica no app, na aba Bots › Desenvolvedor:

  • Nome, frase curta, descrição, tags e cor — o que aparece no cartão do bot.
  • Foto — PNG, JPG ou WEBP (vira uma imagem pequena, que vai em cada mensagem).
  • Token — a senha do bot. Aparece uma vez só; se perder, gere outro (o antigo para de funcionar).
  • Comandos — são registrados pelo seu código e aparecem aqui quando o bot liga.
  • Online/offline — o bot fica online enquanto o programa está rodando.
🔑

Nunca mostre o token nem suba o arquivo .env para o GitHub. Quem tiver o token controla o seu bot. Vazou? Clique em Gerar token de novo.

03 Instalar o SDK

Usando só o SDK num projeto seu, instale a única dependência:

terminal
npm install firebase

E coloque o codec-bot.js na pasta do projeto. O token vem da variável de ambiente CODEC_TOKEN (o projeto inicial lê do arquivo .env).

04 Primeiro bot

index.js
const { Client } = require("./codec-bot");

const client = new Client({ token: process.env.CODEC_TOKEN });

// Comando com / (aparece nas sugestões do chat)
client.command({ name: "ping", description: "Mostra se o bot está vivo" }, async (ctx) => {
  const ms = await client.ping();
  await ctx.reply(`🏓 Pong! ${ms} ms`);
});

// Mensagens comuns
client.on("message", async (message) => {
  if (message.content === "oi bot") await message.reply(`Oi, ${message.author.name}! 👋`);
});

client.on("ready", () => console.log(`✅ ${client.bot.name} online!`));

client.login();
terminal
node --env-file=.env index.js
💡

Aperte Ctrl+C para desligar: o SDK avisa o Codec e o bot fica offline na hora.


05 Comandos com /

Registre com client.command(definição, função). Quando alguém usa o comando, a resposta aparece com “Fulano usou /comando” em cima — igual aos bots do Codec.

js
client.command(
  { name: "dado", description: "Rola um dado", args: "[lados]" },
  async (ctx) => {
    const lados = Number(ctx.options[0]) || 6;
    const n = 1 + Math.floor(Math.random() * lados);
    await ctx.reply(`🎲 ${ctx.user.name} tirou **${n}**`);
  },
);

Definição

CampoDescrição
nameNome do comando: letras, números e hífen (até 24). Acentos e maiúsculas são tirados.
descriptionAparece nas sugestões do chat (até 100 caracteres).
argsOpcional. Dica do que vem depois, ex.: "@pessoa [motivo]".

O que a função recebe (ctx)

PropriedadeDescrição
ctx.nameNome do comando usado.
ctx.argsTodo o texto depois do comando.
ctx.optionsO mesmo texto separado por espaços (array).
ctx.user{ id, name } de quem usou.
ctx.memberQuem usou, como Member (cargos, dono…).
ctx.channel / ctx.serverOnde o comando foi usado.
ctx.reply(conteúdo)Responde. Aceita texto ou opções.
⚠️

Se o bot estiver offline, o Codec avisa quem digitou o comando e não manda nada. Nomes de comandos dos bots by Codec (como /tocar) respondem primeiro.

06 Ler mensagens

O evento message dispara para cada mensagem nova nos canais de texto dos servidores onde o bot está. Mensagens de outros bots são ignoradas (mude com new Client({ ignoreBots: false })).

js
client.on("message", async (message) => {
  if (message.content.includes("bom dia")) {
    await message.react("☀️");
  }
  if (message.content === "!quem") {
    const m = message.member;
    await message.reply(`${m.mention} · dono: ${m.isOwner ? "sim" : "não"} · cargos: ${m.roles.length}`);
  }
});
MessageDescrição
idId da mensagem.
contentTexto (com a formatação do Codec: **negrito**, *itálico*, `código`…).
author{ id, name, color, bot }.
memberO autor como Member do servidor.
channel / serverOnde foi mandada.
replyToSe respondia outra mensagem: { id, authorId, name, content }.
attachmentsArquivos: [{ id, name, type, size }].
createdAtData em milissegundos.
reply(conteúdo)Responde (aparece “respondendo a …”).
react(emoji)Reage com um emoji.
edit(conteúdo) / delete()Só nas mensagens do próprio bot.

07 Mandar mensagens

reply e send aceitam um texto ou um objeto de opções, e devolvem a mensagem enviada (dá para edit e delete depois).

js
const canal = server.channel("avisos");          // por nome ou id
const enviada = await canal.send("Reunião às 20h! 📅");

await enviada.edit("Reunião adiada para 21h ⏰");
setTimeout(() => enviada.delete(), 60_000);        // apaga depois de 1 min
OpçãoDescrição
contentTexto (até 2000 caracteres).
embedUm cartão (Embed ou objeto).
buttonsAté 5 botões.
replyToUma Message para responder.

Para marcar alguém, use member.mention no texto (vira @nome em destaque).

08 Cartões

Cartões (embeds) organizam a resposta com título, texto, campos e imagens.

js
const { Embed } = require("./codec-bot");

const card = new Embed()
  .setTitle("🏆 Ranking da semana")
  .setDescription("Quem mais conversou no servidor")
  .setColor("#f59e0b")
  .addField("1º", "Ana — 320 mensagens", true)
  .addField("2º", "Leo — 290 mensagens", true)
  .setThumbnail("https://exemplo.com/trofeu.png")
  .setFooter("Atualizado agora");

await ctx.reply({ embed: card });
MétodoLimite
setTitle(texto)256 caracteres
setDescription(texto)4000 caracteres (aceita formatação)
setColor(cor)"#rrggbb" ou número (0xff00aa)
addField(nome, valor, inline)até 25 campos; inline põe lado a lado
setImage(url) / setThumbnail(url)só endereços https://
setFooter(texto)rodapé pequeno

Também dá para passar um objeto direto: { embed: { title: "Oi", description: "…" } }.

09 Botões

Até 5 botões por mensagem, sozinhos ou embaixo de um cartão. Quando alguém clica, chega o evento button com o id do botão.

js
await canal.send({
  content: "Aceita as regras do servidor?",
  buttons: [
    { id: "regras:sim", label: "Aceito", style: "success", emoji: "✅" },
    { id: "regras:nao", label: "Não aceito", style: "danger" },
    { label: "Ler as regras", style: "link", url: "https://meusite.com/regras" },
  ],
});

client.on("button", async (click) => {
  if (click.customId === "regras:sim") {
    await click.update({ content: `✅ ${click.user.name} aceitou as regras.` });
  }
});
CampoDescrição
idObrigatório (menos em link). Chega como click.customId.
labelTexto do botão (até 80).
styleprimary, secondary, success, danger ou link.
urlSó no link: abre o endereço, sem avisar o bot.
emojiEmoji antes do texto.
disabledtrue deixa o botão apagado.
Clique (click)Descrição
customIdO id do botão clicado.
messageIdA mensagem que tinha o botão.
user / memberQuem clicou.
channel / serverOnde foi.
reply(conteúdo)Manda uma mensagem nova no canal.
update(conteúdo)Troca a mensagem do botão. Para manter os botões, mande buttons de novo.

10 Eventos

EventoQuandoRecebe
readyO bot entrou e já conhece os servidores.client
messageMensagem nova num canal de texto.Message
commandQualquer comando com / do bot (antes da função dele).ctx
buttonClique num botão do bot.click
memberJoinAlguém entrou num servidor do bot.Member
memberLeaveAlguém saiu.{ id, server }
serverJoinAdicionaram o bot num servidor.Server
serverLeaveTiraram o bot de um servidor.Server
errorErro dentro de um comando ou evento.Error
js
client.on("memberJoin", async (member) => {
  const canal = member.server.channel("geral") ?? member.server.textChannels[0];
  await canal?.send(`🎉 Bem-vindo(a), ${member.mention}!`);
});

client.on("serverJoin", (server) => console.log(`Entrei em ${server.name}`));
client.on("error", (err) => console.error(err));

11 Client

ClientDescrição
new Client(opções)token (ou a variável CODEC_TOKEN) e ignoreBots (padrão true).
login(token?)Entra no Codec. Dá erro se o token for inválido.
command(def, fn)Registra um comando com /.
on(evento, fn)Escuta um evento.
bot{ id, name, color, avatarUrl } — muda na hora quando você edita no app.
serversMap de id → Server.
channel(id)Acha um canal em qualquer servidor do bot.
ping()Latência até o Codec, em ms.
destroy()Desliga o bot (fica offline).

12 Servidor, canal e membro

ServerDescrição
id, name, ownerIdDados do servidor.
channelsMap de canais (texto e voz).
textChannelsSó os canais de texto (array).
membersMap de membros.
channel(idOuNome) / member(id)Busca um canal ou membro.
ChannelDescrição
id, name, type, topictype é "text" ou "voice".
send(conteúdo)Manda uma mensagem.
fetchMessages(limite)Últimas mensagens (até 100).
MemberDescrição
id, name, color, avatarUrlDados da pessoa no servidor.
rolesIds dos cargos.
isOwner / isAdmin / isBotVerdadeiro ou falso.
joinedAtQuando entrou (ms).
mentionTexto que marca a pessoa (@nome).

13 Deixar online 24 horas

O bot só responde enquanto o programa estiver rodando. Para não depender do seu PC ligado:

  • Hospedagens de bots (Discloud, Square Cloud e parecidas): envie a pasta do projeto sem node_modules e coloque o token nas variáveis de ambiente do painel (CODEC_TOKEN).
  • VPS (Linux): use o pm2 para religar sozinho se cair.
terminal
npm install -g pm2
CODEC_TOKEN=seu-token pm2 start index.js --name meu-bot
pm2 save

14 Bots da Comunidade

Por padrão, só você consegue adicionar o seu bot (nos servidores que você gerencia). Para ele aparecer para todo mundo em Bots da Comunidade:

Ligue “Aparecer em Bots da Comunidade”

Em Bots › Desenvolvedor. Dá para desligar quando quiser — o bot some da lista na hora (quem já adicionou continua usando).

Envie para análise

A equipe do Codec testa o bot. Deixe ele online durante a análise.

Aprovado!

Com a opção ligada, ele aparece na lista e em Bots Populares conforme for adicionado.

📋

O que olhamos: o bot funciona, a descrição diz o que ele faz, não manda spam, não pede senhas nem dados pessoais e respeita as regras do Codec.

15 Limites e regras

O quêLimite
Mensagens por canal5 a cada 5 segundos (o SDK segura o excesso e manda depois)
Texto2000 caracteres
Botões5 por mensagem
Campos do cartão25
Imagenssó https://
Editar / apagarsó as mensagens do próprio bot
  • Não faça o bot mandar mensagens sem ninguém pedir em vários canais (spam).
  • Não guarde nem peça senhas, tokens ou dados pessoais das pessoas.
  • Bots que quebram as regras são tirados da comunidade.

16 Perguntas frequentes

Preciso pagar alguma coisa?

Não. O SDK e a criação de bots são grátis. Você só paga se escolher uma hospedagem paga para deixar o bot online 24h.

Funciona em Python ou outra linguagem?

Por enquanto o SDK oficial é para JavaScript (Node.js). Outras linguagens podem chegar depois.

O comando não aparece no chat.

Os comandos são registrados quando o bot liga. Confira se o bot está online em Bots › Desenvolvedor e se ele foi adicionado ao servidor em que você está.

“Token inválido” ao ligar.

O token foi trocado ou copiado errado. Gere um novo em Bots › Desenvolvedor e cole no .env sem espaços.

O bot vê mensagens de canais privados?

O bot vê os canais de texto dos servidores em que foi adicionado. Quem adiciona um bot confia nele — por isso a equipe analisa os bots da comunidade.

Posso ter mais de um bot?

Pode. Cada bot tem o próprio token e roda num programa separado (ou no mesmo, com dois Client).