feat: list & block online users

This commit is contained in:
naiba
2024-12-22 01:08:07 +08:00
parent 653d0cf2e9
commit 4af7e83004
10 changed files with 167 additions and 12 deletions

View 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)
}

View File

@@ -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