|
|
|
package gate
|
|
|
|
|
|
|
|
import (
|
|
|
|
pbRelay "Open_IM/pkg/proto/relay"
|
|
|
|
"Open_IM/src/common/config"
|
|
|
|
"Open_IM/src/common/constant"
|
|
|
|
"Open_IM/src/common/log"
|
|
|
|
"Open_IM/src/grpc-etcdv3/getcdv3"
|
|
|
|
"Open_IM/src/utils"
|
|
|
|
"context"
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
"google.golang.org/grpc"
|
|
|
|
"net"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type RPCServer struct {
|
|
|
|
rpcPort int
|
|
|
|
rpcRegisterName string
|
|
|
|
etcdSchema string
|
|
|
|
etcdAddr []string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *RPCServer) onInit(rpcPort int) {
|
|
|
|
r.rpcPort = rpcPort
|
|
|
|
r.rpcRegisterName = config.Config.RpcRegisterName.OpenImOnlineMessageRelayName
|
|
|
|
r.etcdSchema = config.Config.Etcd.EtcdSchema
|
|
|
|
r.etcdAddr = config.Config.Etcd.EtcdAddr
|
|
|
|
}
|
|
|
|
func (r *RPCServer) run() {
|
|
|
|
ip := utils.ServerIP
|
|
|
|
registerAddress := ip + ":" + utils.IntToString(r.rpcPort)
|
|
|
|
listener, err := net.Listen("tcp", registerAddress)
|
|
|
|
if err != nil {
|
|
|
|
log.ErrorByArgs(fmt.Sprintf("fail to listening consumer, err:%v\n", err))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
defer listener.Close()
|
|
|
|
srv := grpc.NewServer()
|
|
|
|
defer srv.GracefulStop()
|
|
|
|
pbRelay.RegisterOnlineMessageRelayServiceServer(srv, r)
|
|
|
|
err = getcdv3.RegisterEtcd4Unique(r.etcdSchema, strings.Join(r.etcdAddr, ","), ip, r.rpcPort, r.rpcRegisterName, 10)
|
|
|
|
if err != nil {
|
|
|
|
log.ErrorByKv("register push message rpc to etcd err", "", "err", err.Error())
|
|
|
|
}
|
|
|
|
err = srv.Serve(listener)
|
|
|
|
if err != nil {
|
|
|
|
log.ErrorByKv("push message rpc listening err", "", "err", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func (r *RPCServer) MsgToUser(_ context.Context, in *pbRelay.MsgToUserReq) (*pbRelay.MsgToUserResp, error) {
|
|
|
|
log.InfoByKv("PushMsgToUser is arriving", in.OperationID, "args", in.String())
|
|
|
|
var resp []*pbRelay.SingleMsgToUser
|
|
|
|
var RecvID string
|
|
|
|
msg := make(map[string]interface{})
|
|
|
|
mReply := make(map[string]interface{})
|
|
|
|
mReply["reqIdentifier"] = constant.WSPushMsg
|
|
|
|
mReply["errCode"] = 0
|
|
|
|
mReply["errMsg"] = ""
|
|
|
|
msg["sendID"] = in.SendID
|
|
|
|
msg["recvID"] = in.RecvID
|
|
|
|
msg["msgFrom"] = in.MsgFrom
|
|
|
|
msg["contentType"] = in.ContentType
|
|
|
|
msg["sessionType"] = in.SessionType
|
|
|
|
msg["senderNickName"] = in.SenderNickName
|
|
|
|
msg["senderFaceUrl"] = in.SenderFaceURL
|
|
|
|
msg["clientMsgID"] = in.ClientMsgID
|
|
|
|
msg["serverMsgID"] = in.ServerMsgID
|
|
|
|
msg["content"] = in.Content
|
|
|
|
msg["seq"] = in.RecvSeq
|
|
|
|
msg["sendTime"] = in.SendTime
|
|
|
|
msg["senderPlatformID"] = in.PlatformID
|
|
|
|
mReply["data"] = msg
|
|
|
|
bMsg, _ := json.Marshal(mReply)
|
|
|
|
switch in.GetSessionType() {
|
|
|
|
case constant.SingleChatType:
|
|
|
|
RecvID = in.GetRecvID()
|
|
|
|
case constant.GroupChatType:
|
|
|
|
RecvID = strings.Split(in.GetRecvID(), " ")[0]
|
|
|
|
}
|
|
|
|
log.InfoByKv("test", in.OperationID, "wsUserToConn", ws.wsUserToConn)
|
|
|
|
for key, conn := range ws.wsUserToConn {
|
|
|
|
UIDAndPID := strings.Split(key, " ")
|
|
|
|
if UIDAndPID[0] == RecvID {
|
|
|
|
resultCode := sendMsgToUser(conn, bMsg, in, UIDAndPID[1], UIDAndPID[0])
|
|
|
|
temp := &pbRelay.SingleMsgToUser{
|
|
|
|
ResultCode: resultCode,
|
|
|
|
RecvID: UIDAndPID[0],
|
|
|
|
RecvPlatFormID: utils.PlatformNameToID(UIDAndPID[1]),
|
|
|
|
}
|
|
|
|
resp = append(resp, temp)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//switch in.GetContentType() {
|
|
|
|
//case constant.SyncSenderMsg:
|
|
|
|
// log.InfoByKv("come sync", in.OperationID, "args", in.String())
|
|
|
|
// RecvID = in.GetSendID()
|
|
|
|
// if in.MsgFrom != constant.SysMsgType {
|
|
|
|
// for key, conn := range ws.wsUserToConn {
|
|
|
|
// UIDAndPID := strings.Split(key, " ")
|
|
|
|
// if UIDAndPID[0] == RecvID && utils.PlatformIDToName(in.GetPlatformID()) != UIDAndPID[1] {
|
|
|
|
// resultCode := sendMsgToUser(conn, bMsg, in, UIDAndPID[1], UIDAndPID[0])
|
|
|
|
// temp := &pbRelay.SingleMsgToUser{
|
|
|
|
// ResultCode: resultCode,
|
|
|
|
// RecvID: UIDAndPID[0],
|
|
|
|
// RecvPlatFormID: utils.PlatformNameToID(UIDAndPID[1]),
|
|
|
|
// }
|
|
|
|
// resp = append(resp, temp)
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//default:
|
|
|
|
// log.InfoByKv("not come sync", in.OperationID, "args", in.String())
|
|
|
|
// switch in.SessionType {
|
|
|
|
// case constant.SingleChatType:
|
|
|
|
// log.InfoByKv("come single", in.OperationID, "args", in.String())
|
|
|
|
// RecvID = in.GetRecvID()
|
|
|
|
// case constant.GroupChatType:
|
|
|
|
// RecvID = strings.Split(in.GetRecvID(), " ")[0]
|
|
|
|
// default:
|
|
|
|
// }
|
|
|
|
// log.InfoByKv("come for range", in.OperationID, "args", in.String())
|
|
|
|
//
|
|
|
|
// for key, conn := range ws.wsUserToConn {
|
|
|
|
// UIDAndPID := strings.Split(key, " ")
|
|
|
|
// if UIDAndPID[0] == RecvID {
|
|
|
|
// resultCode := sendMsgToUser(conn, bMsg, in, UIDAndPID[1], UIDAndPID[0])
|
|
|
|
// temp := &pbRelay.SingleMsgToUser{
|
|
|
|
// ResultCode: resultCode,
|
|
|
|
// RecvID: UIDAndPID[0],
|
|
|
|
// RecvPlatFormID: utils.PlatformNameToID(UIDAndPID[1]),
|
|
|
|
// }
|
|
|
|
// resp = append(resp, temp)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
return &pbRelay.MsgToUserResp{
|
|
|
|
Resp: resp,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func sendMsgToUser(conn *websocket.Conn, bMsg []byte, in *pbRelay.MsgToUserReq, RecvPlatForm, RecvID string) (ResultCode int64) {
|
|
|
|
err := ws.writeMsg(conn, websocket.TextMessage, bMsg)
|
|
|
|
if err != nil {
|
|
|
|
log.ErrorByKv("PushMsgToUser is failed By Ws", "", "Addr", conn.RemoteAddr().String(),
|
|
|
|
"error", err, "senderPlatform", utils.PlatformIDToName(in.PlatformID), "recvPlatform", RecvPlatForm, "args", in.String(), "recvID", RecvID)
|
|
|
|
ResultCode = -2
|
|
|
|
return ResultCode
|
|
|
|
} else {
|
|
|
|
log.InfoByKv("PushMsgToUser is success By Ws", in.OperationID, "args", in.String())
|
|
|
|
ResultCode = 0
|
|
|
|
return ResultCode
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|