# Eventos
> Reaja ao ciclo de vida do Discord com módulos pequenos, tipos do Discord.js e contexto de guild preservado.

- Área: Base do Core
- URL humana: https://ninenity.vercel.app/doc/eventos
- URL Markdown: https://ninenity.vercel.app/doc/markdown/eventos
- Pacotes e conceitos: Client.on, Client.once, Events

## Eventos contínuos e únicos

Use `Client.on()` para todas as emissões e `Client.once()` quando o handler deve rodar uma única vez.

### Discord/Events/Ready.ts

```text

import { ActivityType, Events } from '@ninenity/core'
import Client from '../../Shared/Settings/Client'

Client.once(Events.ClientReady, {
  execute: async readyClient => {
    readyClient.user.setPresence({
      activities: [
        { name: 'Ninenity', type: ActivityType.Watching }
      ],
      status: 'online'
    })

    console.log('[Ready] ' + readyClient.user.tag + ' online')
  }
})
```


### Discord/Events/MessageCreate.ts

```text

import { Events, type Message } from '@ninenity/core'
import Client from '../../Shared/Settings/Client'

Client.on(Events.MessageCreate, {
  execute: async (message: Message) => {
    if (message.author.bot) return
    if (message.content.trim().toLowerCase() !== 'hello') return

    await message.reply('Olá, ' + message.author.username + '!')
  }
})
```


## Entrada de membros

O evento recebe os objetos nativos e pode usar recursos configurados para a guild atual.

### Discord/Events/MemberJoin.ts

```text

import { Events, type GuildMember } from '@ninenity/core'
import Client from '../../Shared/Settings/Client'

Client.on(Events.GuildMemberAdd, {
  execute: async (member: GuildMember) => {
    const channels = Client.getAppChannels()
    const welcome = channels.welcome ?? member.guild.systemChannel

    if (!welcome?.isTextBased()) return

    await welcome.send(
      'Boas-vindas, ' + member.toString() + '! Leia as regras para começar.'
    )
  }
})
```


> **Contexto de guild:** Durante o evento, `Client.appConfig()` e os aliases de canais/cargos resolvem a guild do objeto emitido. Fora de qualquer contexto, informe o `guildId` explicitamente.

## Erros e avisos do Discord

Centralize mensagens técnicas sem esconder o contexto da origem.

### Discord/Events/Process.ts

```text

import { Events } from '@ninenity/core'
import Client from '../../Shared/Settings/Client'

Client.on(Events.Warn, {
  execute: async (message: string) => {
    console.log('[Discord:warn] ' + message)
  }
})

Client.on(Events.Error, {
  execute: async (error: Error) => {
    console.log('[Discord:error] ' + error.message)
  }
})
```


Use `console.log()` para os logs da aplicação. Se quiser cor no terminal, aplique `Color()` somente ao texto; não introduza uma segunda abstração de logger no código do bot.

## Boas práticas

- Retorne cedo para ignorar bots, DMs ou eventos que não interessam.
- Não faça tarefas longas em série dentro de eventos muito frequentes como `MessageCreate`.
- Extraia regras de negócio para `Utils` ou serviços e mantenha o handler como orquestrador.
- Capture falhas esperadas de rede ao enviar mensagens; uma permissão removida não deve derrubar o processo.
- Use um arquivo por evento ou por responsabilidade claramente relacionada.
