# 架構

go-bot 把每個聊天平台放在 `core/` 下各自的套件；彼此唯一共用的是回覆慣例。

## 系統概覽

```mermaid
flowchart LR
  App[你的應用程式] -->|New / Reply / Start| TG[core/telegram]
  App -->|New / Reply / Start| DC[core/discord]
  App -->|New / Reply / Start| LN[core/line]
  TG -->|long polling，向外連線| TGA[Telegram Bot API]
  DC -->|WebSocket gateway + REST，向外連線| DGA[Discord API]
  LNA[LINE Messaging API] -->|HTTPS webhook，向內推送| LN
  LN -->|reply / push| LNA
```

## 分層

| 層 | 套件 | 職責 |
|---|---|---|
| 應用程式 | 你的程式碼 | 每個 bot 註冊一個 `ReplyHandler`，呼叫 `Send*` 方法 |
| 平台 adapter | `core/telegram`、`core/discord`、`core/line` | 傳輸生命週期、把事件轉成 `Input` 派送、傳送、媒體下載、互動狀態 |
| 平台 SDK | `go-telegram/bot` v1.20.0、`bwmarrin/discordgo` v0.29.0、`line-bot-sdk-go/v8/linebot` v8.18.0 | 線路協定；仍可透過 `Input.Raw` 取用 |
| 共用工具 | `github.com/pardnchiu/go-pkg/utils` | 為落地檔名與 Discord component ID 產生 UUID |

`go-telegram-bot-api/telegram-bot-api` 與 `tucnak/telebot`（Telegram）、`bwmarrin/discordgo`（Discord）、`line/line-bot-sdk-go`（LINE）這類 Go 函式庫各自涵蓋單一平台的 API。go-bot 建立在 `go-telegram/bot`、`discordgo` 與 `line-bot-sdk-go` 之上，讓 Telegram、Discord、LINE 機器人共用同一套 `New`／`Reply`／`Start`／`Close` 生命週期；每則收到的訊息，其原始 SDK 事件仍保留在 `Input.Raw`。

## 跨切原則

| 原則 | 效果 |
|---|---|
| 不設共用 `internal` 套件 | 各套件自行宣告 `Input`、`ReplyHandler`、`Status`；識別碼型別不同（Telegram 為 `int64` chat ID、Discord 為字串 snowflake、LINE 為 source ID） |
| 單一 handler、同步呼叫 | `Reply(handler)` 會取代先前的 handler；非空回傳自動送回 |
| 每個網路呼叫都帶 `context.Context` | 所有 `Send*`、`Delete`、`Save` 與 status 呼叫都接收 `ctx` |
| 用 `Close` 而非 `Stop` | 對齊 `io.Closer`；可重複呼叫 |
| 平台原生互動 | Telegram 用 inline keyboard 與 ForceReply，Discord 用 component 與 modal，LINE 不提供 |

## 相關頁面

- [Bot 生命週期](/zh/core-concepts)
- [Reply Handler](/zh/reply-handler)
- [API 參考](/zh/api-reference)
- 完整模組圖：[doc/architecture.zh.md](https://github.com/pardnchiu/go-bot/blob/master/doc/architecture.zh.md)
