mirror of
https://github.com/Buriburizaem0n/nezha_domains.git
synced 2026-02-04 12:40:07 +00:00
feat: list & block online users
This commit is contained in:
68
service/singleton/online_user.go
Normal file
68
service/singleton/online_user.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package singleton
|
||||
|
||||
import (
|
||||
"slices"
|
||||
"sync"
|
||||
|
||||
"github.com/nezhahq/nezha/model"
|
||||
)
|
||||
|
||||
var (
|
||||
OnlineUserMap = make(map[string]*model.OnlineUser)
|
||||
OnlineUserMapLock = new(sync.Mutex)
|
||||
)
|
||||
|
||||
func AddOnlineUser(connId string, user *model.OnlineUser) {
|
||||
OnlineUserMapLock.Lock()
|
||||
defer OnlineUserMapLock.Unlock()
|
||||
OnlineUserMap[connId] = user
|
||||
}
|
||||
|
||||
func RemoveOnlineUser(connId string) {
|
||||
OnlineUserMapLock.Lock()
|
||||
defer OnlineUserMapLock.Unlock()
|
||||
delete(OnlineUserMap, connId)
|
||||
}
|
||||
|
||||
func BlockByIPs(ipList []string) error {
|
||||
OnlineUserMapLock.Lock()
|
||||
defer OnlineUserMapLock.Unlock()
|
||||
|
||||
for _, ip := range ipList {
|
||||
if err := model.BlockIP(DB, ip, model.WAFBlockReasonTypeManual, model.BlockIDManual); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, user := range OnlineUserMap {
|
||||
if user.IP == ip && user.Conn != nil {
|
||||
user.Conn.Close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetOnlineUsers(limit, offset int) []*model.OnlineUser {
|
||||
OnlineUserMapLock.Lock()
|
||||
defer OnlineUserMapLock.Unlock()
|
||||
var users []*model.OnlineUser
|
||||
for _, user := range OnlineUserMap {
|
||||
users = append(users, user)
|
||||
}
|
||||
slices.SortFunc(users, func(i, j *model.OnlineUser) int {
|
||||
return i.ConnectedAt.Compare(j.ConnectedAt)
|
||||
})
|
||||
if offset > len(users) {
|
||||
return nil
|
||||
}
|
||||
if offset+limit > len(users) {
|
||||
return users[offset:]
|
||||
}
|
||||
return users[offset : offset+limit]
|
||||
}
|
||||
|
||||
func GetOnlineUserCount() int {
|
||||
OnlineUserMapLock.Lock()
|
||||
defer OnlineUserMapLock.Unlock()
|
||||
return len(OnlineUserMap)
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package singleton
|
||||
import (
|
||||
_ "embed"
|
||||
"log"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/patrickmn/go-cache"
|
||||
@@ -24,7 +23,6 @@ var (
|
||||
Loc *time.Location
|
||||
FrontendTemplates []model.FrontendTemplate
|
||||
DashboardBootTime = uint64(time.Now().Unix())
|
||||
OnlineUsers = new(atomic.Uint64)
|
||||
)
|
||||
|
||||
//go:embed frontend-templates.yaml
|
||||
|
||||
Reference in New Issue
Block a user