---
title: "Canais de voz temporários no Discord: o sistema entre para criar"
description: "Crie canais de voz temporários com discord.js v14: a pessoa entra no gatilho, ganha uma sala só dela e o bot apaga quando esvazia, limpando órfãos ao reiniciar."
url: "https://streethosting.com.br/guias/bots-discord/bot-discord-canais-voz-temporarios"
category: "bots-discord"
slug: "bot-discord-canais-voz-temporarios"
datePublished: "2026-11-13"
dateModified: "2026-11-13"
author: "Equipe StreetHosting"
difficulty: "intermediario"
language: "pt-BR"
keywords:
  - "canais de voz temporários discord"
  - "bot discord entre para criar"
  - "voiceStateUpdate discord.js"
  - "criar canal de voz automaticamente discord"
  - "join to create discord bot"
---

# Canais de voz temporários no Discord: como fazer o entre para criar

Em vez de manter dezenas de salas de voz vazias, deixe um único canal gatilho. Quando alguém entra, o bot cria uma sala com o nome da pessoa, move ela para lá e apaga o canal quando todo mundo sai.

> **Resposta rápida**
>
> Escute o evento `voiceStateUpdate` com as intents `Guilds` e `GuildVoiceStates`. Quando alguém entrar no canal gatilho, crie um canal de voz com o nome da pessoa, dê a ela a permissão de gerenciar essa sala, mova ela com `member.voice.setChannel` e apague o canal quando o último ocupante sair. Guarde os IDs das salas em arquivo ou banco para limpar as órfãs ao reiniciar.

## Como o entre para criar funciona

Servidores com muita gente em call costumam ter uma lista enorme de canais de voz vazios: Sala 1, Sala 2, Sala 3, e assim por diante. Ninguém sabe qual está livre, ninguém consegue trancar uma sala para o grupo de amigos e a barra lateral vira bagunça. O sistema de salas temporárias resolve isso com um único canal de voz, chamado de gatilho, normalmente com um nome como "Entre para criar".

1. A pessoa entra no canal gatilho.
2. O bot recebe o evento de mudança de estado de voz e cria um canal novo na mesma categoria.
3. O bot dá ao dono permissão para gerenciar aquele canal e move ele para dentro.
4. Quando todo mundo sai, o bot apaga o canal.

O Discord não tem um recurso nativo para isso. Tudo depende de um bot reagindo ao evento `voiceStateUpdate`, que dispara toda vez que alguém entra, sai, troca de canal, muta ou liga a câmera. Por isso o código precisa comparar o estado antigo com o novo para saber o que de fato mudou.

## Preparar intents, permissões e o canal gatilho

Antes de escrever código, três preparativos. Primeiro, crie uma categoria só para as salas temporárias, por exemplo "Salas privadas", e dentro dela o canal de voz gatilho. Segundo, copie o ID do gatilho (com o modo desenvolvedor ligado nas configurações do Discord, clique com o botão direito no canal e escolha copiar ID) e guarde no arquivo `.env`, junto do token, como `CANAL_GATILHO_ID`.

Terceiro, a parte de permissões. O bot precisa destas na categoria, e é mais simples liberar no cargo dele, ali mesmo:

| Permissão | Para que serve aqui |
| --- | --- |
| Gerenciar Canais (Manage Channels) | Criar o canal temporário, ajustar permissões dele e apagar quando esvaziar |
| Mover Membros (Move Members) | Levar a pessoa do canal gatilho até a sala recém criada |
| Gerenciar Permissões (Manage Permissions) | Criar na sala a regra de permissão que dá controle ao dono. No cargo do servidor ela se chama Gerenciar Cargos |
| Ver Canal e Conectar | Enxergar o canal gatilho e as salas. Mover alguém exige que o bot possa conectar no canal de destino |

Nas intents, use `GatewayIntentBits.Guilds` e `GatewayIntentBits.GuildVoiceStates`. Nenhuma é privilegiada, então basta declarar no código. Sem a segunda o bot nunca recebe o evento, e é por isso que o erro mais comum desse tutorial é "o código está certo e nada acontece".

## O código completo

Abaixo está o núcleo do sistema, em um único arquivo. A lista de canais temporários fica em um `Map` (ID do canal para ID do dono) e é salva em disco a cada mudança, o que vai servir na limpeza de órfãos mais adiante.

```
const fs = require('node:fs');
const { Client, GatewayIntentBits, ChannelType, Events } = require('discord.js');

const GATILHO_ID = process.env.CANAL_GATILHO_ID;
const ARQUIVO = './temporarios.json';

const client = new Client({
  intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates],
});

// ID do canal temporário -> ID do dono
const temporarios = new Map();
// Quem está com uma sala sendo criada agora (evita criar duas)
const criando = new Set();

function carregar() {
  try {
    const dados = JSON.parse(fs.readFileSync(ARQUIVO, 'utf8'));
    for (const [canalId, donoId] of Object.entries(dados)) {
      temporarios.set(canalId, donoId);
    }
  } catch {
    // arquivo ainda não existe, começa vazio
  }
}

function salvar() {
  fs.writeFileSync(ARQUIVO, JSON.stringify(Object.fromEntries(temporarios)));
}

// Conta quem está de fato no canal, usando os estados de voz do servidor
function ocupantes(canal) {
  return canal.guild.voiceStates.cache.filter((v) => v.channelId === canal.id).size;
}

async function criarSala(membro, gatilho) {
  if (criando.has(membro.id)) return;
  criando.add(membro.id);

  let sala;
  try {
    sala = await membro.guild.channels.create({
      name: ('Sala de ' + membro.displayName).slice(0, 100),
      type: ChannelType.GuildVoice,
      parent: gatilho.parentId,
    });

    await sala.permissionOverwrites.edit(membro, {
      ManageChannels: true,
      MoveMembers: true,
    });

    temporarios.set(sala.id, membro.id);
    salvar();

    await membro.voice.setChannel(sala);
  } catch (erro) {
    console.error('Falha ao criar a sala temporária:', erro);
    if (sala) {
      temporarios.delete(sala.id);
      salvar();
      await sala.delete().catch(() => {});
    }
  } finally {
    criando.delete(membro.id);
  }
}

client.on(Events.VoiceStateUpdate, async (antes, depois) => {
  // 1. Entrou no canal gatilho
  if (depois.channelId === GATILHO_ID && antes.channelId !== GATILHO_ID) {
    await criarSala(depois.member, depois.channel);
  }

  // 2. Saiu de uma sala temporária
  const saiuDe = antes.channelId;
  if (saiuDe && saiuDe !== depois.channelId && temporarios.has(saiuDe)) {
    const sala = antes.channel;
    if (sala && ocupantes(sala) === 0) {
      temporarios.delete(saiuDe);
      salvar();
      await sala.delete().catch(() => {});
    }
  }
});

// Se apagarem a sala na mão, esquece o registro
client.on(Events.ChannelDelete, (canal) => {
  if (temporarios.delete(canal.id)) salvar();
});

client.login(process.env.DISCORD_TOKEN);
```

Alguns pontos desse código merecem atenção. O trecho `antes.channelId !== GATILHO_ID` garante que mutar o microfone dentro do gatilho não crie salas repetidas. O Set `criando` cobre o caso de alguém entrar e sair do gatilho várias vezes em sequência, antes de a primeira criação terminar. E se a pessoa já tiver desconectado quando o bot tentar levar a pessoa até a sala, o `setChannel` falha e o bloco de erro apaga a sala que acabou de nascer, em vez de deixar a sala vazia para sempre.

> **Dica**
>
> O nome do canal aceita no máximo 100 caracteres, por isso o `slice(0, 100)`. Se quiser outro padrão, troque por algo como "Call do " mais o nome, ou use um contador. O que o Discord não aceita é nome vazio.

## Dar ao dono o controle da sala

A linha com `permissionOverwrites.edit` é o que transforma uma sala qualquer em uma sala do dono. Ela cria uma exceção de permissões só para aquele membro e só naquele canal:

- **Gerenciar Canais:** o dono pode renomear a sala e trocar o limite de usuários e a taxa de bits pelo próprio Discord, no menu do canal.
- **Mover Membros:** o dono pode puxar ou expulsar membros da sala sem ter essa permissão no servidor inteiro.

Como o canal nasce dentro da categoria do gatilho sem permissões próprias, ele herda as regras da categoria, o que mantém tudo coerente com o resto do servidor. Se quiser que a sala seja trancada por padrão, adicione também uma regra negando `Connect` para o cargo `@everyone` (o ID desse cargo é o mesmo ID do servidor) e libere `Connect` para o dono e para o próprio bot, que sem isso não consegue mover ninguém para a sala. Depois o dono puxa para dentro quem quiser.

> **Atenção**
>
> O bot só consegue conceder uma permissão que ele mesmo tem naquele canal. Se aparecer o erro 50013 (Missing Permissions) na hora de editar as permissões, revise o cargo do bot na categoria: precisa de Gerenciar Canais, Mover Membros e Gerenciar Permissões ali.

## Limpar canais órfãos ao reiniciar

Esse é o ponto em que a maioria dos tutoriais para. O bot guarda a lista de canais temporários na memória, e memória some quando o processo reinicia, seja por deploy, queda ou atualização. As salas criadas antes ficam no servidor para sempre, vazias, e o bot nem sabe que elas existem. Por isso o código acima grava os IDs em `temporarios.json`. Falta só usar esse arquivo quando o bot ligar:

```
client.once(Events.ClientReady, async () => {
  carregar();

  for (const canalId of [...temporarios.keys()]) {
    const canal = await client.channels.fetch(canalId).catch(() => null);

    if (!canal) {
      // já foi apagado, só esquece
      temporarios.delete(canalId);
      continue;
    }

    if (ocupantes(canal) === 0) {
      await canal.delete().catch(() => {});
      temporarios.delete(canalId);
    }
    // se ainda tem gente, mantém: o evento de saída apaga depois
  }

  salvar();
  console.log('Limpeza concluída, ' + temporarios.size + ' sala(s) em uso.');
});
```

Assim o bot apaga o que ficou vazio durante a queda e continua acompanhando as salas que ainda têm gente, sem derrubar a call de ninguém. Usamos `Events.ClientReady` em vez do texto fixo do evento porque o nome dele mudou nas versões recentes do discord.js, e a constante acompanha a versão instalada.

O arquivo JSON é suficiente para um servidor só. Se o bot atende vários servidores ou você já usa banco de dados, guarde a mesma informação em uma tabela, como mostra o guia de [conectar o bot a um banco MongoDB](https://streethosting.com.br/guias/bots-discord/conectar-bot-discord-banco-mongodb). Uma alternativa que dispensa qualquer registro é tratar a categoria inteira como área temporária: na inicialização, apague todo canal de voz dela que estiver vazio e que não seja o gatilho.

## Cuidados e limites da API

- **Limite de canais:** uma categoria aceita até 50 canais e o servidor até 500. Se a criação falhar por isso, trate o erro e avise a pessoa em vez de deixar o bot em silêncio.
- **Taxa de requisições:** criar e apagar canais tem limite de taxa próprio, e o discord.js enfileira as chamadas sozinho. Em servidores muito movimentados, um intervalo mínimo por usuário evita abuso de quem entra e sai do gatilho sem parar. Se aparecerem erros 429, veja [como corrigir o rate limit do Discord](https://streethosting.com.br/guias/bots-discord/corrigir-rate-limit-discord-429).
- **Dono que sai primeiro:** o código mantém a sala enquanto houver alguém dentro, mesmo que o dono tenha saído. Se preferir passar a posse, guarde o novo dono no Map quando o antigo sair.
- **Registro de ações:** para saber quem criou o quê, envie uma linha para um canal de logs a cada criação. O guia de [logs e auditoria do servidor](https://streethosting.com.br/guias/bots-discord/bot-discord-logs-auditoria-servidor) mostra como montar isso.

## Onde hospedar esse bot

Esse bot precisa estar ligado o tempo todo: se ele cair, ninguém cria sala nova e as vazias se acumulam. Na [hospedagem de bots da StreetHosting](https://streethosting.com.br/bots) o projeto Node.js roda em um container com painel, e o plano Discord Essential, por R$ 9,99 por mês, tem 1 GB de RAM, 0,5 vCPU, 2 GB de NVMe e até 2 bots, mais que o suficiente para um sistema de salas temporárias. Para o passo a passo de manter o processo vivo, veja [hospedagem de bot Discord 24/7](https://streethosting.com.br/guias/bots-discord/hospedagem-bot-discord-24-7).

## Perguntas frequentes

### Quais intents o bot precisa para canais de voz temporários?

Guilds e GuildVoiceStates. A segunda é a que entrega o evento voiceStateUpdate, que avisa quando alguém entra, sai ou troca de canal de voz. Nenhuma das duas é privilegiada, então não precisa ativar nada no portal de desenvolvedores além de marcar a intent no código.

### Que permissões o bot precisa ter?

Gerenciar Canais (Manage Channels) para criar e apagar as salas, Mover Membros (Move Members) para levar a pessoa do canal gatilho até a sala nova e Gerenciar Permissões (Manage Permissions, que no cargo aparece como Gerenciar Cargos) para criar a regra que dá ao dono o controle da sala. Todas precisam valer na categoria onde as salas ficam, porque o bot só consegue conceder ao dono uma permissão que ele mesmo tem ali.

### O que acontece com as salas se o bot reiniciar?

Sem cuidado, as salas criadas antes da queda ficam para sempre, porque a lista de canais temporários estava só na memória. A solução é gravar os IDs em arquivo ou banco e, ao ligar, apagar as que estiverem vazias e voltar a acompanhar as que ainda têm gente.

### Quantas salas temporárias posso ter ao mesmo tempo?

Uma categoria comporta até 50 canais e o servidor inteiro até 500. Se a categoria encher, a criação falha. Vale tratar o erro e avisar a pessoa, ou espalhar as salas em mais de uma categoria.

### O dono pode renomear a sala e limitar vagas?

Pode, se receber a permissão Gerenciar Canais só naquela sala. Isso permite renomear e mudar o limite de usuários, sem dar nenhum poder sobre o resto do servidor. Editar as permissões da sala é outra permissão (Gerenciar Permissões), que este tutorial não entrega ao dono.

## Guias relacionados

- [Contador de membros em canal de voz no Discord: como fazer com bot](https://streethosting.com.br/guias/bots-discord/bot-discord-contador-membros-canal-voz.md)
- [Como criar bot Discord com slash commands](https://streethosting.com.br/guias/bots-discord/criar-bot-discord-slash-commands.md)
- [Como registrar logs e auditoria do servidor de Discord com um bot](https://streethosting.com.br/guias/bots-discord/bot-discord-logs-auditoria-servidor.md)
- [Deploy de bot Discord Node.js com PM2: variáveis de ambiente e restart automático](https://streethosting.com.br/guias/bots-discord/deploy-bot-discord-nodejs-pm2.md)
- [Hospedagem de bot Discord 24/7 no Brasil](https://streethosting.com.br/guias/bots-discord/hospedagem-bot-discord-24-7.md)

## Produtos citados

- https://streethosting.com.br/bots

## Dados estruturados

```json
[
  {
    "@context": "https://schema.org",
    "@type": [
      "Article",
      "TechArticle"
    ],
    "headline": "Canais de voz temporários no Discord: como fazer o entre para criar",
    "name": "Canais de voz temporários no Discord: o sistema entre para criar",
    "abstract": "Em vez de manter dezenas de salas de voz vazias, deixe um único canal gatilho. Quando alguém entra, o bot cria uma sala com o nome da pessoa, move ela para lá e apaga o canal quando todo mundo sai.",
    "description": "Crie canais de voz temporários com discord.js v14: a pessoa entra no gatilho, ganha uma sala só dela e o bot apaga quando esvazia, limpando órfãos ao reiniciar.",
    "datePublished": "2026-11-13",
    "dateModified": "2026-11-13",
    "author": {
      "@type": "Organization",
      "name": "Equipe StreetHosting"
    },
    "publisher": {
      "@type": "Organization",
      "name": "StreetHosting",
      "url": "https://streethosting.com.br"
    },
    "inLanguage": "pt-BR",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://streethosting.com.br/guias/bots-discord/bot-discord-canais-voz-temporarios"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Quais intents o bot precisa para canais de voz temporários?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Guilds e GuildVoiceStates. A segunda é a que entrega o evento voiceStateUpdate, que avisa quando alguém entra, sai ou troca de canal de voz. Nenhuma das duas é privilegiada, então não precisa ativar nada no portal de desenvolvedores além de marcar a intent no código."
        }
      },
      {
        "@type": "Question",
        "name": "Que permissões o bot precisa ter?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Gerenciar Canais (Manage Channels) para criar e apagar as salas, Mover Membros (Move Members) para levar a pessoa do canal gatilho até a sala nova e Gerenciar Permissões (Manage Permissions, que no cargo aparece como Gerenciar Cargos) para criar a regra que dá ao dono o controle da sala. Todas precisam valer na categoria onde as salas ficam, porque o bot só consegue conceder ao dono uma permissão que ele mesmo tem ali."
        }
      },
      {
        "@type": "Question",
        "name": "O que acontece com as salas se o bot reiniciar?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Sem cuidado, as salas criadas antes da queda ficam para sempre, porque a lista de canais temporários estava só na memória. A solução é gravar os IDs em arquivo ou banco e, ao ligar, apagar as que estiverem vazias e voltar a acompanhar as que ainda têm gente."
        }
      },
      {
        "@type": "Question",
        "name": "Quantas salas temporárias posso ter ao mesmo tempo?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Uma categoria comporta até 50 canais e o servidor inteiro até 500. Se a categoria encher, a criação falha. Vale tratar o erro e avisar a pessoa, ou espalhar as salas em mais de uma categoria."
        }
      },
      {
        "@type": "Question",
        "name": "O dono pode renomear a sala e limitar vagas?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Pode, se receber a permissão Gerenciar Canais só naquela sala. Isso permite renomear e mudar o limite de usuários, sem dar nenhum poder sobre o resto do servidor. Editar as permissões da sala é outra permissão (Gerenciar Permissões), que este tutorial não entrega ao dono."
        }
      }
    ]
  }
]
```
