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.

166 lines
3.4 KiB

/**
* Created by GoLand.
* User: link1st
* Date: 2019-07-30
* Time: 12:27
*/
package websocket
import (
"errors"
"fmt"
"github.com/go-redis/redis"
"gowebsocket/lib/cache"
"gowebsocket/models"
"gowebsocket/servers/grpcclient"
"time"
)
// 查询所有用户
func UserList(appId uint32) (userList []string) {
userList = make([]string, 0)
currentTime := uint64(time.Now().Unix())
servers, err := cache.GetServerAll(currentTime)
if err != nil {
fmt.Println("给全体用户发消息", err)
return
}
for _, server := range servers {
var (
list []string
)
if IsLocal(server) {
list = GetUserList(appId)
} else {
list, _ = grpcclient.GetUserList(server, appId)
}
userList = append(userList, list...)
}
return
}
// 查询用户是否在线
func CheckUserOnline(appId uint32, userId string) (online bool) {
// 全平台查询
if appId == 0 {
for _, appId := range GetAppIds() {
online, _ = checkUserOnline(appId, userId)
if online == true {
break
}
}
} else {
online, _ = checkUserOnline(appId, userId)
}
return
}
// 查询用户 是否在线
func checkUserOnline(appId uint32, userId string) (online bool, err error) {
key := GetUserKey(appId, userId)
userOnline, err := cache.GetUserOnlineInfo(key)
if err != nil {
if err == redis.Nil {
fmt.Println("GetUserOnlineInfo", appId, userId, err)
return false, nil
}
fmt.Println("GetUserOnlineInfo", appId, userId, err)
return
}
online = userOnline.IsOnline()
return
}
// 给用户发送消息
func SendUserMessage(appId uint32, userId string, msgId, message string) (sendResults bool, err error) {
data := models.GetTextMsgData(userId, msgId, message)
client := GetUserClient(appId, userId)
if client != nil {
// 在本机发送
sendResults, err = SendUserMessageLocal(appId, userId, data)
if err != nil {
fmt.Println("给用户发送消息", appId, userId, err)
}
return
}
key := GetUserKey(appId, userId)
info, err := cache.GetUserOnlineInfo(key)
if err != nil {
fmt.Println("给用户发送消息失败", key, err)
return false, nil
}
if !info.IsOnline() {
fmt.Println("用户不在线", key)
return false, nil
}
server := models.NewServer(info.AccIp, info.AccPort)
msg, err := grpcclient.SendMsg(server, msgId, appId, userId, models.MessageCmdMsg, models.MessageCmdMsg, message)
if err != nil {
fmt.Println("给用户发送消息失败", key, err)
return false, err
}
fmt.Println("给用户发送消息成功-rpc", msg)
sendResults = true
return
}
// 给本机用户发送消息
func SendUserMessageLocal(appId uint32, userId string, data string) (sendResults bool, err error) {
client := GetUserClient(appId, userId)
if client == nil {
err = errors.New("用户不在线")
return
}
// 发送消息
client.SendMsg([]byte(data))
sendResults = true
return
}
// 给全体用户发消息
func SendUserMessageAll(appId uint32, userId string, msgId, cmd, message string) (sendResults bool, err error) {
sendResults = true
currentTime := uint64(time.Now().Unix())
servers, err := cache.GetServerAll(currentTime)
if err != nil {
fmt.Println("给全体用户发消息", err)
return
}
for _, server := range servers {
if IsLocal(server) {
data := models.GetMsgData(userId, msgId, cmd, message)
AllSendMessages(appId, userId, data)
} else {
grpcclient.SendMsgAll(server, msgId, appId, userId, cmd, message)
}
}
return
}