123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- package agentmanager
- import (
- "server/common"
- "server/console"
- "time"
- "github.com/name5566/leaf/gate"
- "github.com/name5566/leaf/log"
- )
- var (
-
- pendingConns = make(map[gate.Agent]*PendingConn)
-
- authedUsers = make(map[string]gate.Agent)
- )
- const (
- ConnStatusUnauth = iota
- ConnStatusAuthed
- )
- type PendingConn struct {
- Agent gate.Agent
- CreateTime int64
- Status int
- }
- func NewAgent(args []interface{}) {
- agent := args[0].(gate.Agent)
-
- pendingConns[agent] = &PendingConn{
- Agent: agent,
- CreateTime: time.Now().Unix(),
- Status: ConnStatusUnauth,
- }
- go checkTimeout(agent)
- }
- func CloseAgent(args []interface{}) {
- agent := args[0].(gate.Agent)
-
- _, exists := pendingConns[agent]
- if exists {
- delete(pendingConns, agent)
- }
- console.Log("CloseAgent:", args...)
-
- for userID, a := range authedUsers {
-
- common.UpdateUserOnlineStatus(0, userID)
- if a == agent {
-
-
-
-
-
- delete(authedUsers, userID)
- break
- }
- }
- }
- func checkTimeout(agent gate.Agent) {
- timeout := 30 * time.Second
- timer := time.NewTimer(timeout)
- defer timer.Stop()
- select {
- case <-timer.C:
-
- if conn, exists := pendingConns[agent]; exists {
- if conn.Status == ConnStatusUnauth {
-
- log.Debug("Connection timeout without auth, closing...")
- agent.Close()
- delete(pendingConns, agent)
- }
- }
- }
- }
- func IsAuthedUsers(userID string, agent gate.Agent) (bool, gate.Agent) {
-
- if oldAgent, exists := authedUsers[userID]; exists && oldAgent != agent {
- return true, oldAgent
- }
- return false, nil
- }
- func KickAgent(userID string) {
-
- if oldAgent, exists := authedUsers[userID]; exists {
- oldAgent.Close()
- delete(authedUsers, userID)
- }
- }
- func AgentConnStatusAuthed(agent gate.Agent) {
- pendingConns[agent].Status = ConnStatusAuthed
- }
- func AddAuthedUsers(userID string, agent gate.Agent) {
- authedUsers[userID] = agent
- }
- func GetAgentByUserID(userID string) gate.Agent {
- return authedUsers[userID]
- }
- func GetUserIDByAgent(agent gate.Agent) string {
- for k, v := range authedUsers {
- if v == agent {
- return k
- }
- }
- return ""
- }
|