架構
最後更新
go-bot 把每個聊天平台放在
core/ 下各自的套件;彼此唯一共用的是回覆慣例。系統概覽
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
- 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 不提供 |