This repository has been archived on 2026-08-12. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Cyrene/_fix_bridge.py
T
AskaEth 45fac267fe feat: 平台配置唯一ID — PlatformConfig.ID + adapter全链路传播
- PlatformConfig 新增 ID 字段 (8字节hex,创建时自动生成)
- QQ adapter 新增 configID + ConfigID() 访问器
- ChannelInfo 新增 AdapterID + AdapterName
- createSingleAdapter 接受 configID 参数
- 同一个平台类型的多个配置实例通过 ID 唯一区分

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-23 17:59:37 +08:00

98 lines
2.9 KiB
Python

with open('d:/Project/Code/Uni/Cyrene/backend/platform-bridge/internal/handler/bridge_handler.go', 'r', encoding='utf-8') as f:
lines = f.readlines()
# 1. Add sync and time to imports
for i, line in enumerate(lines):
if line.strip() == '"strconv"':
lines.insert(i+1, '\t"sync"\n')
lines.insert(i+2, '\t"time"\n')
print('1. Imports added')
break
# 2. Add fields to struct
for i, line in enumerate(lines):
if 'internalToken string' in line:
lines.insert(i+1, '\tchannelsMu sync.RWMutex\n')
lines.insert(i+2, '\tcachedChannels []bridge.ChannelInfo\n')
print('2. Struct fields added')
break
# 3. Add route
for i, line in enumerate(lines):
if 'send-proactive' in line:
lines.insert(i+1, '\tmux.HandleFunc("/api/v1/channels", h.listChannels)\n')
print('3. Route added')
break
# 4. Add listChannels handler (before func health)
for i, line in enumerate(lines):
if line.strip().startswith('func (h *BridgeHandler) health('):
handler = '''// listChannels returns cached channels from all adapters (groups + friends).
// GET /api/v1/channels
func (h *BridgeHandler) listChannels(w http.ResponseWriter, r *http.Request) {
\th.channelsMu.RLock()
\tchannels := h.cachedChannels
\th.channelsMu.RUnlock()
\tif channels == nil {
\t\tchannels = []bridge.ChannelInfo{}
\t}
\twriteJSON(w, http.StatusOK, map[string]interface{}{
\t\t"channels": channels,
\t\t"total": len(channels),
\t})
}
'''
lines[i:i] = [handler]
print('4. listChannels added')
break
# 5. Add refresh methods at end
for i in range(len(lines)-1, 0, -1):
if lines[i].rstrip() == '}':
last = i
break
refresh = '''
// StartChannelRefresh periodically queries all adapters for their channel lists.
func (h *BridgeHandler) StartChannelRefresh(interval time.Duration) {
\tif interval <= 0 {
\t\tinterval = 10 * time.Minute
\t}
\tgo func() {
\t\tticker := time.NewTicker(interval)
\t\tdefer ticker.Stop()
\t\tlog.Printf("[channel-refresh] 频道缓存刷新已启动 (间隔=%v)", interval)
\t\th.refreshChannels()
\t\tfor range ticker.C {
\t\t\th.refreshChannels()
\t\t}
\t}()
}
func (h *BridgeHandler) refreshChannels() {
\tvar all []bridge.ChannelInfo
\tfor _, name := range h.router.ListAdapters() {
\t\ta, err := h.router.GetAdapter(name)
\t\tif err != nil {
\t\t\tcontinue
\t\t}
\t\tif lister, ok := a.(bridge.ChannelLister); ok {
\t\t\tchannels := lister.ListChannels()
\t\t\tall = append(all, channels...)
\t\t}
\t}
\th.channelsMu.Lock()
\th.cachedChannels = all
\th.channelsMu.Unlock()
\tlog.Printf("[channel-refresh] 频道缓存已更新: %d 个频道", len(all))
}
'''
lines.insert(last, refresh)
print('5. Refresh methods added')
with open('d:/Project/Code/Uni/Cyrene/backend/platform-bridge/internal/handler/bridge_handler.go', 'w', encoding='utf-8') as f:
f.write(''.join(lines))
print('DONE')