From 4a0914cb1e271ab4f076cb1bd68c9f07cc025e92 Mon Sep 17 00:00:00 2001 From: Ali Golzar <57574919+aliglzr@users.noreply.github.com> Date: Sun, 31 Aug 2025 20:03:50 +0330 Subject: feat: add "Last Online" column to client list and modal (Closes #3402) (#3405) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: persist client last online and expose API * feat(ui): show client last online in table and info modal * i18n: add “Last Online” across locales * chore: format timestamps as HH:mm:ss --- web/service/inbound.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'web/service') diff --git a/web/service/inbound.go b/web/service/inbound.go index 0621cdea..b494d502 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -967,6 +967,7 @@ func (s *InboundService) addClientTraffic(tx *gorm.DB, traffics []*xray.ClientTr // Add user in onlineUsers array on traffic if traffics[traffic_index].Up+traffics[traffic_index].Down > 0 { onlineClients = append(onlineClients, traffics[traffic_index].Email) + dbClientTraffics[dbTraffic_index].LastOnline = time.Now().UnixMilli() } break } @@ -2187,6 +2188,20 @@ func (s *InboundService) GetOnlineClients() []string { return p.GetOnlineClients() } +func (s *InboundService) GetClientsLastOnline() (map[string]int64, error) { + db := database.GetDB() + var rows []xray.ClientTraffic + err := db.Model(&xray.ClientTraffic{}).Select("email, last_online").Find(&rows).Error + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + result := make(map[string]int64, len(rows)) + for _, r := range rows { + result[r.Email] = r.LastOnline + } + return result, nil +} + func (s *InboundService) FilterAndSortClientEmails(emails []string) ([]string, []string, error) { db := database.GetDB() -- cgit v1.2.3