mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-12 21:20:07 +00:00
feat: persist client last online and expose API
This commit is contained in:
parent
d0796b26c9
commit
3f1438bea1
4 changed files with 22 additions and 0 deletions
|
@ -47,6 +47,7 @@ func (a *APIController) initRouter(g *gin.RouterGroup) {
|
||||||
{"POST", "/resetAllClientTraffics/:id", a.inboundController.resetAllClientTraffics},
|
{"POST", "/resetAllClientTraffics/:id", a.inboundController.resetAllClientTraffics},
|
||||||
{"POST", "/delDepletedClients/:id", a.inboundController.delDepletedClients},
|
{"POST", "/delDepletedClients/:id", a.inboundController.delDepletedClients},
|
||||||
{"POST", "/onlines", a.inboundController.onlines},
|
{"POST", "/onlines", a.inboundController.onlines},
|
||||||
|
{"POST", "/lastOnline", a.inboundController.lastOnline},
|
||||||
{"POST", "/updateClientTraffic/:email", a.inboundController.updateClientTraffic},
|
{"POST", "/updateClientTraffic/:email", a.inboundController.updateClientTraffic},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -340,6 +340,11 @@ func (a *InboundController) onlines(c *gin.Context) {
|
||||||
jsonObj(c, a.inboundService.GetOnlineClients(), nil)
|
jsonObj(c, a.inboundService.GetOnlineClients(), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *InboundController) lastOnline(c *gin.Context) {
|
||||||
|
data, err := a.inboundService.GetClientsLastOnline()
|
||||||
|
jsonObj(c, data, err)
|
||||||
|
}
|
||||||
|
|
||||||
func (a *InboundController) updateClientTraffic(c *gin.Context) {
|
func (a *InboundController) updateClientTraffic(c *gin.Context) {
|
||||||
email := c.Param("email")
|
email := c.Param("email")
|
||||||
|
|
||||||
|
|
|
@ -967,6 +967,7 @@ func (s *InboundService) addClientTraffic(tx *gorm.DB, traffics []*xray.ClientTr
|
||||||
// Add user in onlineUsers array on traffic
|
// Add user in onlineUsers array on traffic
|
||||||
if traffics[traffic_index].Up+traffics[traffic_index].Down > 0 {
|
if traffics[traffic_index].Up+traffics[traffic_index].Down > 0 {
|
||||||
onlineClients = append(onlineClients, traffics[traffic_index].Email)
|
onlineClients = append(onlineClients, traffics[traffic_index].Email)
|
||||||
|
dbClientTraffics[dbTraffic_index].LastOnline = time.Now().UnixMilli()
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -2187,6 +2188,20 @@ func (s *InboundService) GetOnlineClients() []string {
|
||||||
return p.GetOnlineClients()
|
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) {
|
func (s *InboundService) FilterAndSortClientEmails(emails []string) ([]string, []string, error) {
|
||||||
db := database.GetDB()
|
db := database.GetDB()
|
||||||
|
|
||||||
|
|
|
@ -11,4 +11,5 @@ type ClientTraffic struct {
|
||||||
ExpiryTime int64 `json:"expiryTime" form:"expiryTime"`
|
ExpiryTime int64 `json:"expiryTime" form:"expiryTime"`
|
||||||
Total int64 `json:"total" form:"total"`
|
Total int64 `json:"total" form:"total"`
|
||||||
Reset int `json:"reset" form:"reset" gorm:"default:0"`
|
Reset int `json:"reset" form:"reset" gorm:"default:0"`
|
||||||
|
LastOnline int64 `json:"lastOnline" form:"lastOnline" gorm:"default:0"`
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue