Seu primeiro bot
Um bot que responde pong quando alguém manda !ping, em JavaScript, sem nenhuma biblioteca, para ver como o gateway funciona por dentro. Para um bot de verdade, a biblioteca faz isso tudo (e reconecta, guarda o estado e toca áudio) em poucas linhas.
Roda em Bun ou Node.js 22 ou mais novo, que já têm WebSocket e fetch.
1. Crie o bot e coloque num servidor
Em dev.zynko.org, crie o bot e copie o token. Na seção Convite, deixe marcado Ver canais, Enviar mensagens e Ler o histórico, copie o link, abra e escolha um servidor que você gerencia.
2. O código
js
// bot.js — bun bot.js (ou: node bot.js)
const TOKEN = process.env.ZYNKO_TOKEN;
const API = 'https://zynko.org/api';
// Uma chamada à API com o token do bot.
async function api(method, path, body) {
const res = await fetch(API + path, {
method,
headers: { Authorization: `Bot ${TOKEN}`, 'Content-Type': 'application/json' },
body: body && JSON.stringify(body),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
return res.json();
}
function connect() {
const ws = new WebSocket('wss://zynko.org/api/gateway');
let beat;
let me;
ws.onmessage = async ({ data }) => {
const { op, t, d } = JSON.parse(data);
if (op === 10) {
// HELLO: identifique-se e mande um heartbeat no intervalo pedido.
// intents 8 = só mensagens; veja /api/gateway#intents
ws.send(JSON.stringify({ op: 2, d: { token: TOKEN, intents: 8 } }));
beat = setInterval(() => ws.send(JSON.stringify({ op: 1 })), d.heartbeat_interval);
} else if (t === 'READY') {
me = d.user;
console.log(`Conectado como ${me.username}, em ${d.guilds.length} servidores`);
} else if (t === 'MESSAGE_CREATE') {
if (d.author.id === me.id) return; // não responder a si mesmo
if (d.content === '!ping') {
await api('POST', `/channels/${d.channel_id}/messages`, { content: 'pong' });
}
}
};
ws.onclose = (e) => {
clearInterval(beat);
if (e.code === 4004) return console.error('Token inválido');
// Caiu: conecte de novo. O READY traz o estado inteiro outra vez.
setTimeout(connect, 5000);
};
}
connect();3. Rode
sh
ZYNKO_TOKEN=bot_... bun bot.jsMande !ping num canal onde o bot está. Ele responde pong.