Fix Telegram bot client lookup without traffic rows

This commit is contained in:
Serega71RUS 2026-05-28 14:35:11 +03:00
parent c64cdbb0ed
commit 11bd082d8f
2 changed files with 66 additions and 8 deletions

View file

@ -2301,6 +2301,48 @@ func (s *InboundService) GetClientInboundByEmail(email string) (traffic *xray.Cl
inbound, err = s.GetInbound(traffics[0].InboundId) inbound, err = s.GetInbound(traffics[0].InboundId)
return traffics[0], inbound, err 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 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) 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) clients, err := s.GetClients(inbound)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View file

@ -53,14 +53,6 @@ func TestGetClientTrafficTgBotUsesNormalizedRemoteNodeClients(t *testing.T) {
}}); err != nil { }}); err != nil {
t.Fatalf("SyncInbound: %v", err) 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) traffics, err := (&InboundService{}).GetClientTrafficTgBot(tgID)
if err != nil { 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 { if traffics[0].Email != email || traffics[0].UUID != uuid || traffics[0].SubId != subID {
t.Fatalf("unexpected traffic: %#v", traffics[0]) 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) { func TestGetClientTrafficTgBotFallsBackToCompactSettingsJSON(t *testing.T) {