You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* Created by GoLand.
* User: link1st
* Date: 2019-07-27
* Time: 13:12
*/
package websocket
import (
"encoding/json"
"fmt"
"github.com/go-redis/redis"
"gowebsocket/common"
"gowebsocket/lib/cache"
"gowebsocket/models"
"time"
)
// ping
func PingController(client *Client, seq string, message []byte) (code uint32, msg string, data interface{}) {
code = common.OK
fmt.Println("webSocket_request ping接口", client.Addr, seq, message)
data = "pong"
return
}
// 用户登录
func LoginController(client *Client, seq string, message []byte) (code uint32, msg string, data interface{}) {
code = common.OK
currentTime := uint64(time.Now().Unix())
request := &models.Login{}
if err := json.Unmarshal(message, request); err != nil {
code = common.ParameterIllegal
fmt.Println("用户登录 解析数据失败", seq, err)
return
}
fmt.Println("webSocket_request 用户登录", seq, "ServiceToken", request.ServiceToken)
// TODO::进行用户权限认证一般是客户端传入TOKEN然后检验TOKEN是否合法通过TOKEN解析出来用户ID
// 本项目只是演示所以直接过去客户端传入的用户ID
if request.UserId == "" || len(request.UserId) >= 20 {
code = common.UnauthorizedUserId
fmt.Println("用户登录 非法的用户", seq, request.UserId)
return
}
if !InAppIds(request.AppId) {
code = common.Unauthorized
fmt.Println("用户登录 不支持的平台", seq, request.AppId)
return
}
if client.IsLogin() {
fmt.Println("用户登录 用户已经登录", client.AppId, client.UserId, seq)
code = common.OperationFailure
return
}
client.Login(request.AppId, request.UserId, currentTime)
// 存储数据
userOnline := models.UserLogin(serverIp, serverPort, request.AppId, request.UserId, client.Addr, currentTime)
err := cache.SetUserOnlineInfo(client.GetKey(), userOnline)
if err != nil {
code = common.ServerError
fmt.Println("用户登录 SetUserOnlineInfo", seq, err)
return
}
// 用户登录
login := &login{
AppId: request.AppId,
UserId: request.UserId,
Client: client,
}
clientManager.Login <- login
fmt.Println("用户登录 成功", seq, client.Addr, request.UserId)
return
}
// 心跳接口
func HeartbeatController(client *Client, seq string, message []byte) (code uint32, msg string, data interface{}) {
code = common.OK
currentTime := uint64(time.Now().Unix())
request := &models.HeartBeat{}
if err := json.Unmarshal(message, request); err != nil {
code = common.ParameterIllegal
fmt.Println("心跳接口 解析数据失败", seq, err)
return
}
fmt.Println("webSocket_request 心跳接口", client.AppId, client.UserId)
if !client.IsLogin() {
fmt.Println("心跳接口 用户未登录", client.AppId, client.UserId, seq)
code = common.NotLoggedIn
return
}
userOnline, err := cache.GetUserOnlineInfo(client.GetKey())
if err != nil {
if err == redis.Nil {
code = common.NotLoggedIn
fmt.Println("心跳接口 用户未登录", seq, client.AppId, client.UserId)
return
} else {
code = common.ServerError
fmt.Println("心跳接口 GetUserOnlineInfo", seq, client.AppId, client.UserId, err)
return
}
}
client.Heartbeat(currentTime)
userOnline.Heartbeat(currentTime)
err = cache.SetUserOnlineInfo(client.GetKey(), userOnline)
if err != nil {
code = common.ServerError
fmt.Println("心跳接口 SetUserOnlineInfo", seq, client.AppId, client.UserId, err)
return
}
return
}