Skip to content

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.js

Mande !ping num canal onde o bot está. Ele responde pong.

Próximos passos ​

  • Gateway: os opcodes, os intents e quando a conexão fecha.
  • Eventos: tudo o que o bot pode receber.
  • Rotas: o que o bot pode fazer pela API.

Zynko · zynko.org