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.
Baixe em nodejs.org (versão LTS).
No app: Bots › Desenvolvedor › Novo bot. Dê nome, foto e clique em Gerar token.
Extraia o codec-bot-starter.zip, renomeie .env.example para .env e cole o token.
Na pasta do projeto: npm install e depois npm start.
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:
npm install firebaseE 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
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();node --env-file=.env index.jsAperte 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.
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
| Campo | Descrição |
|---|---|
name | Nome do comando: letras, números e hífen (até 24). Acentos e maiúsculas são tirados. |
description | Aparece nas sugestões do chat (até 100 caracteres). |
args | Opcional. Dica do que vem depois, ex.: "@pessoa [motivo]". |
O que a função recebe (ctx)
| Propriedade | Descrição |
|---|---|
ctx.name | Nome do comando usado. |
ctx.args | Todo o texto depois do comando. |
ctx.options | O mesmo texto separado por espaços (array). |
ctx.user | { id, name } de quem usou. |
ctx.member | Quem usou, como Member (cargos, dono…). |
ctx.channel / ctx.server | Onde 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 })).
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}`);
}
});| Message | Descrição |
|---|---|
id | Id da mensagem. |
content | Texto (com a formatação do Codec: **negrito**, *itálico*, `código`…). |
author | { id, name, color, bot }. |
member | O autor como Member do servidor. |
channel / server | Onde foi mandada. |
replyTo | Se respondia outra mensagem: { id, authorId, name, content }. |
attachments | Arquivos: [{ id, name, type, size }]. |
createdAt | Data 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).
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ção | Descrição |
|---|---|
content | Texto (até 2000 caracteres). |
embed | Um cartão (Embed ou objeto). |
buttons | Até 5 botões. |
replyTo | Uma 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.
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étodo | Limite |
|---|---|
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.
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.` });
}
});| Campo | Descrição |
|---|---|
id | Obrigatório (menos em link). Chega como click.customId. |
label | Texto do botão (até 80). |
style | primary, secondary, success, danger ou link. |
url | Só no link: abre o endereço, sem avisar o bot. |
emoji | Emoji antes do texto. |
disabled | true deixa o botão apagado. |
Clique (click) | Descrição |
|---|---|
customId | O id do botão clicado. |
messageId | A mensagem que tinha o botão. |
user / member | Quem clicou. |
channel / server | Onde 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
| Evento | Quando | Recebe |
|---|---|---|
ready | O bot entrou e já conhece os servidores. | client |
message | Mensagem nova num canal de texto. | Message |
command | Qualquer comando com / do bot (antes da função dele). | ctx |
button | Clique num botão do bot. | click |
memberJoin | Alguém entrou num servidor do bot. | Member |
memberLeave | Alguém saiu. | { id, server } |
serverJoin | Adicionaram o bot num servidor. | Server |
serverLeave | Tiraram o bot de um servidor. | Server |
error | Erro dentro de um comando ou evento. | Error |
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
| Client | Descriçã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. |
servers | Map 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
| Server | Descrição |
|---|---|
id, name, ownerId | Dados do servidor. |
channels | Map de canais (texto e voz). |
textChannels | Só os canais de texto (array). |
members | Map de membros. |
channel(idOuNome) / member(id) | Busca um canal ou membro. |
| Channel | Descrição |
|---|---|
id, name, type, topic | type é "text" ou "voice". |
send(conteúdo) | Manda uma mensagem. |
fetchMessages(limite) | Últimas mensagens (até 100). |
| Member | Descrição |
|---|---|
id, name, color, avatarUrl | Dados da pessoa no servidor. |
roles | Ids dos cargos. |
isOwner / isAdmin / isBot | Verdadeiro ou falso. |
joinedAt | Quando entrou (ms). |
mention | Texto 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_modulese coloque o token nas variáveis de ambiente do painel (CODEC_TOKEN). - VPS (Linux): use o
pm2para religar sozinho se cair.
npm install -g pm2
CODEC_TOKEN=seu-token pm2 start index.js --name meu-bot
pm2 save14 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:
Em Bots › Desenvolvedor. Dá para desligar quando quiser — o bot some da lista na hora (quem já adicionou continua usando).
A equipe do Codec testa o bot. Deixe ele online durante a análise.
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 canal | 5 a cada 5 segundos (o SDK segura o excesso e manda depois) |
| Texto | 2000 caracteres |
| Botões | 5 por mensagem |
| Campos do cartão | 25 |
| Imagens | só https:// |
| Editar / apagar | só 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).