/* ** description(""). ** copyright('open-im,www.open-im.io'). ** author("fg,Gordon@open-im.io"). ** time(2021/3/5 14:31). */ package logic import ( pusher "Open_IM/internal/push" "Open_IM/internal/push/getui" jpush "Open_IM/internal/push/jpush" "Open_IM/pkg/common/config" "Open_IM/pkg/common/constant" "Open_IM/pkg/common/log" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbPush "Open_IM/pkg/proto/push" pbRelay "Open_IM/pkg/proto/relay" "Open_IM/pkg/utils" "context" "encoding/json" "google.golang.org/grpc" "strings" ) type OpenIMContent struct { SessionType int `json:"sessionType"` From string `json:"from"` To string `json:"to"` Seq uint32 `json:"seq"` } type AtContent struct { Text string `json:"text"` AtUserList []string `json:"atUserList"` IsAtSelf bool `json:"isAtSelf"` } var grpcCons []*grpc.ClientConn func MsgToUser(pushMsg *pbPush.PushMsgReq) { var wsResult []*pbRelay.SingleMsgToUserPlatform isOfflinePush := utils.GetSwitchFromOptions(pushMsg.MsgData.Options, constant.IsOfflinePush) log.Debug(pushMsg.OperationID, "Get msg from msg_transfer And push msg", pushMsg.String()) if len(grpcCons) == 0 { log.NewWarn(pushMsg.OperationID, "first GetConn4Unique ") grpcCons = getcdv3.GetConn4Unique(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOnlineMessageRelayName) } //Online push message log.Debug(pushMsg.OperationID, "len grpc", len(grpcCons), "data", pushMsg.String()) for _, v := range grpcCons { msgClient := pbRelay.NewOnlineMessageRelayServiceClient(v) reply, err := msgClient.OnlinePushMsg(context.Background(), &pbRelay.OnlinePushMsgReq{OperationID: pushMsg.OperationID, MsgData: pushMsg.MsgData, PushToUserID: pushMsg.PushToUserID}) if err != nil { log.NewError("SuperGroupOnlineBatchPushOneMsg push data to client rpc err", pushMsg.OperationID, "err", err) continue } if reply != nil && reply.Resp != nil { wsResult = append(wsResult, reply.Resp...) } } log.NewInfo(pushMsg.OperationID, "push_result", wsResult, "sendData", pushMsg.MsgData) count++ if isOfflinePush && pushMsg.PushToUserID != pushMsg.MsgData.SendID { for _, v := range wsResult { if v.ResultCode == 0 { if utils.IsContainInt32(v.RecvPlatFormID, pushTerminal) { break } continue } if utils.IsContainInt32(v.RecvPlatFormID, pushTerminal) { //Use offline push messaging var UIDList []string UIDList = append(UIDList, v.RecvID) customContent := OpenIMContent{ SessionType: int(pushMsg.MsgData.SessionType), From: pushMsg.MsgData.SendID, To: pushMsg.MsgData.RecvID, Seq: pushMsg.MsgData.Seq, } bCustomContent, _ := json.Marshal(customContent) jsonCustomContent := string(bCustomContent) var content string if pushMsg.MsgData.OfflinePushInfo != nil { content = pushMsg.MsgData.OfflinePushInfo.Title log.NewDebug(pushMsg.OperationID, utils.GetSelfFuncName(), "xxxx OfflinePushInfo", content) } else { log.NewDebug(pushMsg.OperationID, utils.GetSelfFuncName(), "xxxx2222 OfflinePushInfo", content) switch pushMsg.MsgData.ContentType { case constant.Text: content = constant.ContentType2PushContent[constant.Text] case constant.Picture: content = constant.ContentType2PushContent[constant.Picture] case constant.Voice: content = constant.ContentType2PushContent[constant.Voice] case constant.Video: content = constant.ContentType2PushContent[constant.Video] case constant.File: content = constant.ContentType2PushContent[constant.File] case constant.AtText: a := AtContent{} _ = utils.JsonStringToStruct(string(pushMsg.MsgData.Content), &a) if utils.IsContain(v.RecvID, a.AtUserList) { content = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common] } else { content = constant.ContentType2PushContent[constant.GroupMsg] } default: content = constant.ContentType2PushContent[constant.Common] } } var offlinePusher pusher.OfflinePusher if config.Config.Push.Getui.Enable { log.NewInfo(pushMsg.OperationID, utils.GetSelfFuncName(), config.Config.Push.Getui) offlinePusher = getui.GetuiClient } if config.Config.Push.Jpns.Enable { offlinePusher = jpush.JPushClient } if offlinePusher == nil { offlinePusher = jpush.JPushClient } pushResult, err := offlinePusher.Push(UIDList, content, jsonCustomContent, pushMsg.OperationID) if err != nil { log.NewError(pushMsg.OperationID, "offline push error", pushMsg.String(), err.Error()) } else { log.NewDebug(pushMsg.OperationID, "offline push return result is ", pushResult, pushMsg.MsgData) } break } } } } func MsgToSuperGroupUser(pushMsg *pbPush.PushMsgReq) { return //var wsResult []*pbRelay.SingelMsgToUserResultList //isOfflinePush := utils.GetSwitchFromOptions(pushMsg.MsgData.Options, constant.IsOfflinePush) //log.Debug(pushMsg.OperationID, "Get msg from msg_transfer And push msg", pushMsg.String()) //if len(grpcCons) == 0 { // log.NewWarn(pushMsg.OperationID, "first GetConn4Unique ") // grpcCons = getcdv3.GetConn4Unique(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOnlineMessageRelayName) //} ////Online push message //log.Debug("test", pushMsg.OperationID, "len grpc", len(grpcCons), "data", pushMsg.String()) //for _, v := range grpcCons { // msgClient := pbRelay.NewOnlineMessageRelayServiceClient(v) // reply, err := msgClient.OnlineBatchPushOneMsg(context.Background(), &pbRelay.OnlineBatchPushOneMsgReq{OperationID: pushMsg.OperationID, MsgData: pushMsg.MsgData, PushToUserIDList: pushMsg.PushToUserID}) // if err != nil { // log.NewError("push data to client rpc err", pushMsg.OperationID, "err", err) // continue // } // if reply != nil && reply.SinglePushResult != nil { // wsResult = append(wsResult, reply.SinglePushResult...) // } //} //log.NewInfo(pushMsg.OperationID, "push_result", wsResult, "sendData", pushMsg.MsgData) //successCount++ //if isOfflinePush && pushMsg.PushToUserID != pushMsg.MsgData.SendID { // for _, v := range wsResult { // if v.ResultCode == 0 { // if utils.IsContainInt32(v.RecvPlatFormID, pushTerminal) { // break // } // continue // } // if utils.IsContainInt32(v.RecvPlatFormID, pushTerminal) { // //Use offline push messaging // var UIDList []string // UIDList = append(UIDList, v.RecvID) // customContent := OpenIMContent{ // SessionType: int(pushMsg.MsgData.SessionType), // From: pushMsg.MsgData.SendID, // To: pushMsg.MsgData.RecvID, // Seq: pushMsg.MsgData.Seq, // } // bCustomContent, _ := json.Marshal(customContent) // jsonCustomContent := string(bCustomContent) // var content string // if pushMsg.MsgData.OfflinePushInfo != nil { // content = pushMsg.MsgData.OfflinePushInfo.Title // // } else { // switch pushMsg.MsgData.ContentType { // case constant.Text: // content = constant.ContentType2PushContent[constant.Text] // case constant.Picture: // content = constant.ContentType2PushContent[constant.Picture] // case constant.Voice: // content = constant.ContentType2PushContent[constant.Voice] // case constant.Video: // content = constant.ContentType2PushContent[constant.Video] // case constant.File: // content = constant.ContentType2PushContent[constant.File] // case constant.AtText: // a := AtContent{} // _ = utils.JsonStringToStruct(string(pushMsg.MsgData.Content), &a) // if utils.IsContain(v.RecvID, a.AtUserList) { // content = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common] // } else { // content = constant.ContentType2PushContent[constant.GroupMsg] // } // default: // content = constant.ContentType2PushContent[constant.Common] // } // } // callbackResp := callbackOfflinePush(pushMsg.OperationID, UIDList[0], pushMsg.MsgData.OfflinePushInfo, v.RecvPlatFormID) // log.NewDebug(pushMsg.OperationID, utils.GetSelfFuncName(), "offline callback Resp") // if callbackResp.ErrCode != 0 { // log.NewError(pushMsg.OperationID, utils.GetSelfFuncName(), "callbackOfflinePush result: ", callbackResp) // } // if callbackResp.ActionCode != constant.ActionAllow { // log.NewDebug(pushMsg.OperationID, utils.GetSelfFuncName(), "offlinePush stop") // break // } // // if offlinePusher == nil { // offlinePusher = jpush.JPushClient // } // pushResult, err := offlinePusher.Push(UIDList, content, jsonCustomContent, pushMsg.OperationID) // if err != nil { // log.NewError(pushMsg.OperationID, "offline push error", pushMsg.String(), err.Error()) // } else { // log.NewDebug(pushMsg.OperationID, "offline push return result is ", pushResult, pushMsg.MsgData) // } // break // } // // } // //} }