# Discord 訊息

本頁說明如何用 `core/discord` 傳送與刪除訊息，以及上傳附件與音訊。

本頁所有方法都透過 `ChannelMessageSendComplex`（或對應的 REST 呼叫）並帶 `discordgo.WithContext(ctx)` 送出；channel ID 為空時回 `channelID is required`。`replyTo` 非空時訊息以 reply 方式掛在同 channel 的該訊息下；`""` 為獨立訊息。

## 文字

```go
msg, err := bot.Send(ctx, channelID, replyTo, "**hello**")
```

Discord 對所有訊息都渲染 Markdown，因此沒有 parse mode 選項。

`Delete(ctx, channelID, messageID)` 刪除一則訊息；`messageID` 為空時回 `messageID is required`，API 錯誤包成 `Session.ChannelMessageDelete: ...`。

## 附件

```go
msg, err := bot.SendFiles(ctx, channelID, replyTo, []string{"a.png", "b.pdf"}, "files")
```

| 規則 | 行為 |
|---|---|
| 數量 | 1 到 10 個路徑，全部放在同一則訊息；否則回 `paths must be 1-10` |
| 空路徑 | 回 `path is required` |
| 上傳 | 每個檔案以 `os.Open` 開啟並串流；檔名為 `filepath.Base(path)`；Discord 依副檔名判斷類型 |
| Caption | 第一個 `caption` 字串作為訊息文字，所有附件共用 |

## 音訊

```go
msg, err := bot.SendVoice(ctx, channelID, replyTo, "./reply.ogg", "caption")
```

`SendVoice` 把既有檔案以 content type `audio/ogg` 上傳為單一附件。Discord 顯示為附播放器的音訊附件，而不是波形語音訊息：discordgo v0.29.0 無法送出語音訊息旗標所需的 `duration_secs` 與 `waveform` 欄位。空路徑回 `path is required`。

為 v0.4.x 撰寫的 `SendVoice(ctx, channelID, replyTo, text, apiKey)` 在 v0.5.0 仍可編譯，但會把 `text` 當成檔案路徑上傳，並把 `apiKey` 當成 caption 發出。見[已移除 API](/zh/removed-apis)。

## 相關頁面

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