refactor: QQ → OBv11 重命名 + 平台格式统一抽象

- 所有对外称呼从 QQ 改为 OBv11(注释/提示词/日志/配置项)
- 新增 PlatformFormat 结构体,统一管理平台消息标记格式
- defaultPlatformFormats() 注册表替代硬编码 qqTargetRe
- extractProactiveMessage 改为 Thinker 方法,遍历格式注册表匹配
- 配置项重命名: QQ_BOT_PORT → OBV11_BOT_PORT, QQBotPort → OBv11BotPort
- 标记格式: 【QQ群聊】→【OBv11群聊】、【QQ私聊】→【OBv11私聊】

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-06-22 20:48:07 +08:00
parent 70dbb23234
commit 41f653b672
25 changed files with 1609 additions and 82 deletions
@@ -21,7 +21,7 @@ type PlatformAdapter interface {
}
// ProactiveSender is an optional interface for adapters that can
// proactively send messages (e.g., QQ bot sending without prior request).
// proactively send messages (e.g., OBv11 bot sending without prior request).
type ProactiveSender interface {
SendProactive(chatType string, userID, groupID int64, content string) error
}
@@ -14,7 +14,7 @@ type Config struct {
InternalToken string
// Platform-specific.
QQBotPort string // port for QQ OBv11 reverse WebSocket
OBv11BotPort string // port for OBv11 reverse WebSocket
TelegramToken string // Telegram Bot API token
TelegramWebhookURL string // public webhook URL for Telegram
@@ -34,7 +34,7 @@ func Load() *Config {
Env: "development",
GatewayURL: "http://localhost:8080",
AICoreURL: "http://localhost:8081",
QQBotPort: "8096",
OBv11BotPort: "8096",
}
if v := os.Getenv("PORT"); v != "" {
cfg.Port = v
@@ -51,8 +51,8 @@ func Load() *Config {
if v := os.Getenv("INTERNAL_SERVICE_TOKEN"); v != "" {
cfg.InternalToken = v
}
if v := os.Getenv("QQ_BOT_PORT"); v != "" {
cfg.QQBotPort = v
if v := os.Getenv("OBV11_BOT_PORT"); v != "" {
cfg.OBv11BotPort = v
}
if v := os.Getenv("TELEGRAM_BOT_TOKEN"); v != "" {
cfg.TelegramToken = v
@@ -180,7 +180,7 @@ func (h *BridgeHandler) sendProactive(w http.ResponseWriter, r *http.Request) {
return
}
// Map chat type to QQ message_type
// Map chat type to OBv11 message_type
msgType := req.ChatType
if msgType != "private" && msgType != "group" {
writeJSON(w, http.StatusBadRequest, errResp("chat_type must be private or group"))
@@ -196,7 +196,7 @@ func (h *BridgeHandler) sendProactive(w http.ResponseWriter, r *http.Request) {
content = fmt.Sprintf("[CQ:at,qq=%s] %s", req.AtUserID, content)
}
// Find the adapter. For QQ, use "qq" as the default adapter name.
// Find the adapter. For OBv11, use the platform name as adapter name.
adapterName := req.Platform
err := h.router.SendProactive(adapterName, msgType, userID, groupID, content)
if err != nil {