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
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
|
|
}
|