From 11bd082d8f886de54b1d28331bd1ac9fa2393491 Mon Sep 17 00:00:00 2001 From: Serega71RUS Date: Thu, 28 May 2026 14:35:11 +0300 Subject: [PATCH] Fix Telegram bot client lookup without traffic rows --- web/service/inbound.go | 55 ++++++++++++++++++++++++ web/service/tgbot_client_traffic_test.go | 19 ++++---- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/web/service/inbound.go b/web/service/inbound.go index f7bc6f8e..5b087951 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -2301,6 +2301,48 @@ func (s *InboundService) GetClientInboundByEmail(email string) (traffic *xray.Cl inbound, err = s.GetInbound(traffics[0].InboundId) return traffics[0], inbound, err } + + type linkedClient struct { + InboundId int + Email string + Enable bool + TotalGB int64 + ExpiryTime int64 + Reset int + } + var linked linkedClient + err = db.Table("clients"). + Select(`client_inbounds.inbound_id, + clients.email, + clients.enable, + clients.total_gb, + clients.expiry_time, + clients.reset`). + Joins("JOIN client_inbounds ON client_inbounds.client_id = clients.id"). + Joins("JOIN inbounds ON inbounds.id = client_inbounds.inbound_id"). + Where("clients.email = ?", email). + Order("client_inbounds.inbound_id ASC"). + Limit(1). + Scan(&linked).Error + if err != nil { + logger.Warningf("Error retrieving linked client with email %s: %v", email, err) + return nil, nil, err + } + if linked.Email != "" { + inbound, err = s.GetInbound(linked.InboundId) + if err != nil { + return nil, nil, err + } + return &xray.ClientTraffic{ + InboundId: linked.InboundId, + Email: linked.Email, + Enable: linked.Enable, + Total: linked.TotalGB, + ExpiryTime: linked.ExpiryTime, + Reset: linked.Reset, + }, inbound, nil + } + return nil, nil, nil } @@ -2313,6 +2355,19 @@ func (s *InboundService) GetClientByEmail(clientEmail string) (*xray.ClientTraff return nil, nil, common.NewError("Inbound Not Found For Email:", clientEmail) } + linkedClients, err := s.clientService.ListForInbound(nil, inbound.Id) + if err != nil { + return nil, nil, err + } + for _, client := range linkedClients { + if client.Email == clientEmail { + traffic.Enable = client.Enable + traffic.UUID = client.ID + traffic.SubId = client.SubID + return traffic, &client, nil + } + } + clients, err := s.GetClients(inbound) if err != nil { return nil, nil, err diff --git a/web/service/tgbot_client_traffic_test.go b/web/service/tgbot_client_traffic_test.go index 230f619b..8752bafd 100644 --- a/web/service/tgbot_client_traffic_test.go +++ b/web/service/tgbot_client_traffic_test.go @@ -53,14 +53,6 @@ func TestGetClientTrafficTgBotUsesNormalizedRemoteNodeClients(t *testing.T) { }}); err != nil { t.Fatalf("SyncInbound: %v", err) } - if err := db.Create(&xray.ClientTraffic{ - InboundId: inbound.Id, - Email: email, - Enable: true, - Total: 1024, - }).Error; err != nil { - t.Fatalf("create traffic: %v", err) - } traffics, err := (&InboundService{}).GetClientTrafficTgBot(tgID) if err != nil { @@ -72,6 +64,17 @@ func TestGetClientTrafficTgBotUsesNormalizedRemoteNodeClients(t *testing.T) { if traffics[0].Email != email || traffics[0].UUID != uuid || traffics[0].SubId != subID { t.Fatalf("unexpected traffic: %#v", traffics[0]) } + + traffic, client, err := (&InboundService{}).GetClientByEmail(email) + if err != nil { + t.Fatalf("GetClientByEmail: %v", err) + } + if traffic == nil || client == nil { + t.Fatalf("expected linked client without traffic row, got traffic=%#v client=%#v", traffic, client) + } + if client.Email != email || client.ID != uuid || client.SubID != subID { + t.Fatalf("unexpected linked client: %#v", client) + } } func TestGetClientTrafficTgBotFallsBackToCompactSettingsJSON(t *testing.T) {