agentManager.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package agentmanager
  2. import (
  3. "server/common"
  4. "server/console"
  5. "time"
  6. "github.com/name5566/leaf/gate"
  7. "github.com/name5566/leaf/log"
  8. )
  9. var (
  10. // 未认证连接池
  11. pendingConns = make(map[gate.Agent]*PendingConn)
  12. // 已认证用户
  13. authedUsers = make(map[string]gate.Agent) // key: userID
  14. )
  15. const (
  16. ConnStatusUnauth = iota // 未认证
  17. ConnStatusAuthed // 已认证
  18. )
  19. // 未认证连接管理
  20. type PendingConn struct {
  21. Agent gate.Agent
  22. CreateTime int64
  23. Status int
  24. }
  25. func NewAgent(args []interface{}) {
  26. agent := args[0].(gate.Agent)
  27. //将新连接放入未认证池
  28. pendingConns[agent] = &PendingConn{
  29. Agent: agent,
  30. CreateTime: time.Now().Unix(),
  31. Status: ConnStatusUnauth,
  32. }
  33. go checkTimeout(agent)
  34. }
  35. func CloseAgent(args []interface{}) {
  36. agent := args[0].(gate.Agent)
  37. // 清理未认证连接
  38. _, exists := pendingConns[agent]
  39. if exists {
  40. delete(pendingConns, agent)
  41. }
  42. console.Log("CloseAgent:", args...)
  43. // 清理已认证连接
  44. for userID, a := range authedUsers {
  45. //设置为离线状态
  46. common.UpdateUserOnlineStatus(0, userID)
  47. if a == agent {
  48. // a.SetUserData(&common.UserData{
  49. // Id: userID,
  50. // Nickname: userID,
  51. // Status: 0,
  52. // })
  53. delete(authedUsers, userID)
  54. break
  55. }
  56. }
  57. }
  58. // 定时检查超时连接
  59. func checkTimeout(agent gate.Agent) {
  60. timeout := 30 * time.Second
  61. timer := time.NewTimer(timeout)
  62. defer timer.Stop()
  63. select {
  64. case <-timer.C:
  65. // 检查是否仍在未认证池中
  66. if conn, exists := pendingConns[agent]; exists {
  67. if conn.Status == ConnStatusUnauth {
  68. // 超时未认证,关闭连接
  69. log.Debug("Connection timeout without auth, closing...")
  70. agent.Close()
  71. delete(pendingConns, agent)
  72. }
  73. }
  74. }
  75. }
  76. // 是否有账号登陆
  77. func IsAuthedUsers(userID string, agent gate.Agent) (bool, gate.Agent) {
  78. // 处理可能的重复登录
  79. if oldAgent, exists := authedUsers[userID]; exists && oldAgent != agent {
  80. return true, oldAgent
  81. }
  82. return false, nil
  83. }
  84. // 踢出玩家
  85. func KickAgent(userID string) {
  86. // 处理可能的重复登录
  87. if oldAgent, exists := authedUsers[userID]; exists {
  88. oldAgent.Close()
  89. delete(authedUsers, userID)
  90. }
  91. }
  92. // 设置认证状态
  93. func AgentConnStatusAuthed(agent gate.Agent) {
  94. pendingConns[agent].Status = ConnStatusAuthed
  95. }
  96. // 添加到用户列表
  97. func AddAuthedUsers(userID string, agent gate.Agent) {
  98. authedUsers[userID] = agent
  99. }
  100. func GetAgentByUserID(userID string) gate.Agent {
  101. return authedUsers[userID]
  102. }
  103. func GetUserIDByAgent(agent gate.Agent) string {
  104. for k, v := range authedUsers {
  105. if v == agent {
  106. return k
  107. }
  108. }
  109. return ""
  110. }