# Discord 設定

本頁說明如何建立 `core/discord` bot、它要求的 gateway intents，以及 handler 收到的 `Input`。

## 建構子

```go
bot, err := discord.New(token)
```

token 為空時 `New` 回 `token is required`。它以 `Bot <token>` 建立 `discordgo.Session`、註冊訊息與 interaction handler，不會連線。沒有任何選項。

## Gateway intents

| Intent | 要求原因 |
|---|---|
| `IntentGuilds` | 讓 gateway 推送 `GUILD_CREATE`，填滿 discordgo 的 state cache；缺少時 `Input.ChannelName` 永遠是 `""` |
| `IntentsGuildMessages` | 伺服器頻道內的訊息 |
| `IntentDirectMessages` | 傳給 bot 的私訊 |
| `IntentMessageContent` | 訊息文字與附件 |

`IntentMessageContent` 屬於 privileged intent。請在 Discord Developer Portal 的 Bot 設定開啟 **Message Content Intent**；否則多數訊息的 `Input.Text` 會是空的（Discord 只對私訊與提及 bot 的訊息附上內容）。

## Start

`Start(ctx)` 先以 REST `User("@me")` 驗證 token，再以 `Session.Open()` 連上 WebSocket。token 錯誤會在第一步失敗，不會留下已開啟的連線。bot 自己送出的訊息會依 discordgo 的 session state 過濾，不會進到 handler。

## Input

| 欄位 | 型別 | 內容 |
|---|---|---|
| `ChannelID` | `string` | 訊息或 prompt 所在 channel |
| `ChannelName` | `string` | 從 state cache 讀取，不額外發 request；私訊或 cache 未命中為 `""` |
| `GuildID` | `string` | 伺服器 ID；私訊為 `""` |
| `MessageID` | `string` | 使用者的訊息；modal 與 select 答案時為 prompt 訊息 |
| `UserID` / `Username` | `string` | 傳送者；interaction 時取自 guild member，私訊時取自 user |
| `Text` | `string` | 訊息內容、modal 答案或單選結果 |
| `Attachments` | `[]*discordgo.MessageAttachment` | 所有上傳檔案（圖片、檔案、音訊）；以 `ContentType` 區分 |
| `CallbackPicks` | `[]string` | `SendMultiSelect` 選單中選取的值 |
| `Raw` | `*discordgo.MessageCreate` | 一般訊息的 SDK 事件；interaction 答案時為 `nil` |

所有 ID 都是 Discord snowflake 字串。

## 相關頁面

- [Discord 訊息](/zh/discord-messages)
- [Discord 互動](/zh/discord-interactions)
- [媒體落地](/zh/media-save)
- [Discord API](/zh/api-reference-discord)
