75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/perfect-panel/server/internal/model/node"
|
|
"github.com/perfect-panel/server/internal/svc"
|
|
"github.com/perfect-panel/server/internal/types"
|
|
"github.com/perfect-panel/server/pkg/logger"
|
|
)
|
|
|
|
type PushOnlineUsersLogic struct {
|
|
logger.Logger
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
}
|
|
|
|
// NewPushOnlineUsersLogic Push online users
|
|
func NewPushOnlineUsersLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PushOnlineUsersLogic {
|
|
return &PushOnlineUsersLogic{
|
|
Logger: logger.WithContext(ctx),
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
}
|
|
}
|
|
|
|
func (l *PushOnlineUsersLogic) PushOnlineUsers(req *types.OnlineUsersRequest) error {
|
|
// 验证请求数据
|
|
if req.ServerId <= 0 || len(req.Users) == 0 {
|
|
return errors.New("invalid request parameters")
|
|
}
|
|
|
|
// 验证用户数据
|
|
for _, user := range req.Users {
|
|
if user.SID <= 0 || user.IP == "" {
|
|
return fmt.Errorf("invalid user data: uid=%d, ip=%s", user.SID, user.IP)
|
|
}
|
|
}
|
|
|
|
// Find server info
|
|
_, err := l.svcCtx.NodeModel.FindOneServer(l.ctx, req.ServerId)
|
|
if err != nil {
|
|
l.Errorw("[PushOnlineUsers] FindOne error", logger.Field("error", err))
|
|
return fmt.Errorf("server not found: %w", err)
|
|
}
|
|
|
|
var onlineUsers node.OnlineUserSubscribe
|
|
for _, user := range req.Users {
|
|
if online, ok := onlineUsers[user.SID]; ok {
|
|
// If user already exists, update IP if different
|
|
online = append(online, user.IP)
|
|
onlineUsers[user.SID] = online
|
|
} else {
|
|
// New user, add to map
|
|
onlineUsers[user.SID] = []string{user.IP}
|
|
}
|
|
}
|
|
err = l.svcCtx.NodeModel.UpdateOnlineUserSubscribe(l.ctx, req.ServerId, req.Protocol, onlineUsers)
|
|
if err != nil {
|
|
l.Errorw("[PushOnlineUsers] cache operation error", logger.Field("error", err))
|
|
return err
|
|
}
|
|
|
|
err = l.svcCtx.NodeModel.UpdateOnlineUserSubscribeGlobal(l.ctx, onlineUsers)
|
|
|
|
if err != nil {
|
|
l.Errorw("[PushOnlineUsers] cache operation error", logger.Field("error", err))
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|