123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- package internal
- import (
- "server/common"
- "server/msg"
- "server/user"
- "time"
- "github.com/name5566/leaf/gate"
- "github.com/name5566/leaf/log"
- )
- func init() {
- skeleton.RegisterChanRPC("NewAgent", rpcNewAgent)
- skeleton.RegisterChanRPC("CloseAgent", rpcCloseAgent)
- skeleton.RegisterChanRPC("handleAuth", handleAuth)
- }
- func rpcNewAgent(args []interface{}) {
- agent := args[0].(gate.Agent)
- // 将新连接放入未认证池
- pendingConns[agent] = &PendingConn{
- Agent: agent,
- CreateTime: time.Now().Unix(),
- Status: ConnStatusUnauth,
- }
- go checkTimeout(agent)
- }
- func rpcCloseAgent(args []interface{}) {
- log.Debug("rpcCloseAgent")
- agent := args[0].(gate.Agent)
- // 清理未认证连接
- _, exists := pendingConns[agent]
- if exists {
- delete(pendingConns, agent)
- }
- // 清理已认证连接
- for userID, a := range authedUsers {
- if a == agent {
- a.SetUserData(&common.UserData{
- Id: userID,
- Nickname: userID,
- Status: 0,
- })
- delete(authedUsers, userID)
- break
- }
- }
- }
- // 处理认证消息
- func handleAuth(args []interface{}) {
- // 收到的登录消息
- m := args[0].(*msg.ResLogin)
- // 消息的发送者
- a := args[1].(gate.Agent)
- log.Debug("handleAuth: nikeName=%v, userId=%v", m.NikeName, m.UserId)
- // 找到未认证连接
- if pending, exists := pendingConns[a]; exists {
- // 认证成功,移动到已认证池
- delete(pendingConns, a)
- authedUsers[m.UserId] = a
- pending.Status = ConnStatusAuthed
- // 处理可能的重复登录
- if oldAgent, exists := authedUsers[m.UserId]; exists && oldAgent != a {
- oldAgent.Close()
- delete(authedUsers, m.UserId)
- }
- // 获取用户信息 ,如果新用户则创建一个
- userData := user.GetUserInfoById(m.UserId)
- a.SetUserData(&common.UserData{
- Id: m.UserId,
- Nickname: m.UserId,
- Status: 1,
- })
- // 发送登录成功响应
- a.WriteMsg(&msg.ReqLogin{
- NikeName: m.UserId,
- UserId: m.UserId,
- Points: int32(userData.Points),
- GameStatus: "online",
- })
- }
- }
- // 定时检查超时连接
- 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)
- }
- }
- }
- }
|