From a9b814278c3233bafa52814df5588b56f1283a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=83=E9=9A=A8=E7=B7=A3=E5=8B=95?= Date: Wed, 8 Oct 2025 00:03:03 +0800 Subject: [PATCH] New features: TG Telegram robot terminal [One-click configuration] and [Subscription conversion] --- web/service/inbound.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/web/service/inbound.go b/web/service/inbound.go index 383937d3..4927030e 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -19,6 +19,17 @@ import ( type InboundService struct { xrayApi xray.XrayAPI + tgService TelegramService +} + +// 【新增方法】: 用于从外部注入 XrayAPI 实例 +func (s *InboundService) SetXrayAPI(api xray.XrayAPI) { + s.xrayApi = api +} + +// 【新增方法】: 用于从外部注入 TelegramService 实例 +func (s *InboundService) SetTelegramService(tgService TelegramService) { + s.tgService = tgService } func (s *InboundService) GetInbounds(userId int) ([]*model.Inbound, error) { @@ -259,6 +270,34 @@ func (s *InboundService) AddInbound(inbound *model.Inbound) (*model.Inbound, boo tx := db.Begin() defer func() { if err == nil { + // 【修改位置】: 在事务提交前,执行我们的新逻辑 + // ================================================================= + // 〔中文注释〕: 新增逻辑 - 判断是否为【一键配置】创建的入站 + // 我们通过备注(remark)是否为一个8位的随机字符串来做一个简单识别 + // 只有来自【一键配置】的添加入站操作,才会触发 TG 通知 + // ================================================================= + isOneClick := false + if len(inbound.Remark) == 8 { + // 假设8位随机备注大概率是一键配置生成的 + isOneClick = true + } + + if isOneClick && s.tgService != nil && s.tgService.IsRunning() { + // 〔中文注释〕: 使用 goroutine 异步发送通知,避免阻塞正常的 API 返回 + go func(ib *model.Inbound) { + // 等待5秒,确保事务已经完全提交 + time.Sleep(5 * time.Second) + logger.Infof("检测到一键配置创建成功 (备注: %s),准备发送 TG 通知...", ib.Remark) + + // 【修改位置】: 将 global.TgBot 替换为 s.tgService + // 〔中文注释〕: 调用注入的服务实例的方法来发送消息。 + err := s.tgService.SendOneClickConfig(ib, true, 0) + if err != nil { + logger.Warningf("发送【一键配置】TG 通知失败: %v", err) + } + }(inbound) // 将 inbound 对象的副本传入 goroutine + } + // 中文注释:如果没有错误,提交事务 tx.Commit() } else {