Documentação/Base do Core
BASE DO CORE / PRIMEIROS PASSOS

Começando com o Core

Entenda o papel do runtime, a estrutura do Template Bot e o caminho percorrido até o primeiro comando responder.

@ninenity/coreTypeScriptDiscord.js

O modelo mental#

O Core não substitui o Discord.js. Ele organiza o ciclo de vida ao redor dele.

1

Você declara

Cada arquivo registra um comando, evento, task ou interação no Client.

2

O Core carrega

O auto-loader percorre settings.baseDir, importa os módulos e valida os registros.

3

O runtime executa

Cooldown, fila, contexto de guild e respostas são preparados antes do seu execute.

Estrutura do Template Bot#

A estrutura já separa código carregado automaticamente de helpers importados explicitamente.

TEXTestrutura do projeto
src/├─ Bot.ts                         # ponto de entrada├─ Discord/│  ├─ Commands/                  # slash, prefixo e menus de contexto│  ├─ Events/                    # eventos do Discord.js│  ├─ Interactions/              # modais, callbacks, prompts e paginações│  └─ Tasks/                     # rotinas periódicas├─ Shared/│  ├─ Settings/Client.ts         # LibsClient, token e intents│  ├─ Settings/Database.ts       # plugin opcional de banco│  ├─ Emojis/                    # emojis do aplicativo│  └─ Translate/                 # idiomas└─ Utils/                        # regras e helpers importados por módulos
PastaCarregamentoUse para
Discord/CommandsAutomáticoComandos slash, prefixados e menus de contexto
Discord/EventsAutomáticoEventos emitidos pelo Discord.js
Discord/InteractionsAutomáticoModais, prompts, paginações e callbacks registrados
Discord/TasksAutomáticoRotinas globais ou executadas por servidor
Shared e UtilsExplícitoConfiguração, serviços e regras reutilizáveis

Configure o Client#

O LibsClient estende o cliente do Discord.js e adiciona os registradores do ecossistema.

TSsrc/Shared/Settings/Client.ts
import {  GatewayIntentBits,  LibsClient,  type AppConfig} from '@ninenity/core'const Client = new LibsClient<AppConfig>({  intents: [    GatewayIntentBits.Guilds,    GatewayIntentBits.GuildMessages,    GatewayIntentBits.MessageContent,    GatewayIntentBits.GuildMembers  ],  token: process.env.BOT_TOKEN || process.env.DISCORD_TOKEN,  config: {}})export default Client
IntentNecessário quando
GuildsQuase sempre: slash commands, canais, cargos e configuração por servidor
GuildMessagesO bot observa mensagens ou usa comandos prefixados
MessageContentO conteúdo textual das mensagens precisa ser lido
GuildMembersEntradas, saídas, cargos ou dados completos de membros são usados

Inicialize o runtime#

Ninenity.init() prepara plugins e auto-loader antes de Client.login() abrir a conexão com o Discord.

TSsrc/Bot.ts
import 'dotenv/config'import { Ninenity } from '@ninenity/core'import Client from './Shared/Settings/Client'import { databasePlugin } from './Shared/Settings/Database'Ninenity.init({  bots: [Client],  plugins: databasePlugin ? { database: databasePlugin } : undefined,  settings: { baseDir: __dirname }})Client.login()
  1. 1
    Variáveis são carregadas

    O import de dotenv/config disponibiliza o token e integrações antes de criar o Client.

  2. 2
    O runtime recebe os bots

    bots aceita mais de um Client, mas cada bot mantém seus próprios registradores e timers.

  3. 3
    Módulos são encontrados

    baseDir aponta para src em desenvolvimento e para dist após o build.

  4. 4
    O login começa

    Depois dos registros, Client.login() conecta e conclui as etapas de bootstrap.

Crie o primeiro módulo#

O arquivo só precisa importar o Client compartilhado e fazer seu registro no escopo do módulo.

TSsrc/Discord/Commands/Ping.ts
import {  SlashCommandBuilder,  type SlashInputCommandInteraction} from '@ninenity/core'import Client from '../../Shared/Settings/Client'Client.slash({  data: new SlashCommandBuilder()    .setName('ping')    .setDescription('Mostra a latência atual.'),  cooldown: '3s',  execute: async (interaction: SlashInputCommandInteraction) => {    await interaction.reply('Pong!')  }})

Você não importa Ping.ts em Bot.ts. O auto-loader encontra o arquivo, executa o módulo uma vez e o Client.slash() guarda a definição para deploy e execução.

Variáveis de ambiente#

Comece com o mínimo e adicione integrações somente quando forem usadas.

DOTENV.env
BOT_TOKEN=seu_token_do_discord# Opcionais: integração com API e HUBAPI_KEY=API_SECRET=# Opcional: banco de dadosDATABASE_URL=
  • Nunca envie .env para o Git; mantenha apenas um .env.example sem secrets.
  • Use um token de bot, não o client secret da aplicação.
  • A ausência de API_KEY e API_SECRET desativa a hidratação remota, mas não impede o bot de conectar ao Discord.
  • Mantenha src e dist com a mesma árvore para o auto-loader funcionar após o build.