From 988824f3f15ef1319184d9c8ee5d055d2ac4597a Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Thu, 1 Sep 2022 20:51:53 +0800 Subject: [PATCH 1/4] change log file mode --- pkg/common/log/logrus.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/common/log/logrus.go b/pkg/common/log/logrus.go index b1f26855a..2514de055 100644 --- a/pkg/common/log/logrus.go +++ b/pkg/common/log/logrus.go @@ -35,7 +35,8 @@ func loggerInit(moduleName string) *Logger { //All logs will be printed logger.SetLevel(logrus.Level(config.Config.Log.RemainLogLevel)) //Close std console output - src, err := os.OpenFile(os.DevNull, os.O_APPEND|os.O_WRONLY, os.ModeAppend) + //os.O_WRONLY | os.O_CREATE | os.O_APPEND + src, err := os.OpenFile(os.DevNull, os.O_APPEND|os.O_RDWR|os.O_CREATE, os.ModeAppend) if err != nil { panic(err.Error()) } From 67e5e3b56b1298e9e5f601a90486a60a3ae0c493 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Thu, 1 Sep 2022 21:05:16 +0800 Subject: [PATCH 2/4] fcm ios push badge --- internal/push/fcm/push.go | 92 +++++++----- internal/push/getui/push.go | 12 +- internal/push/jpush/push.go | 4 +- internal/push/logic/callback.go | 4 +- internal/push/logic/init.go | 2 - internal/push/logic/push_to_client.go | 166 +++++++++------------- internal/push/push_interface.go | 6 +- internal/rpc/conversation/conversaion.go | 11 +- internal/utils/local_cache.go | 2 +- pkg/base_info/conversation_api_struct.go | 7 +- pkg/common/db/RedisModel.go | 10 ++ pkg/proto/conversation/conversation.proto | 1 + 12 files changed, 162 insertions(+), 155 deletions(-) diff --git a/internal/push/fcm/push.go b/internal/push/fcm/push.go index cedccbebe..55f655bd4 100644 --- a/internal/push/fcm/push.go +++ b/internal/push/fcm/push.go @@ -5,7 +5,6 @@ import ( "Open_IM/pkg/common/config" "Open_IM/pkg/common/db" "Open_IM/pkg/common/log" - "Open_IM/pkg/tools/splitter" "context" "path/filepath" "strconv" @@ -47,53 +46,68 @@ func newFcmClient() *Fcm { return &Fcm{FcmMsgCli: fcmMsgClient} } -func (f *Fcm) Push(accounts []string, alert, detailContent, operationID string, opts push.PushOpts) (string, error) { +func (f *Fcm) Push(accounts []string, title, detailContent, operationID string, opts push.PushOpts) (string, error) { // accounts->registrationToken - Tokens := make([]string, 0) + allTokens := make(map[string][]string, 0) for _, account := range accounts { - IosfcmToken, IosErr := db.DB.GetFcmToken(account, 1) - AndroidfcmToken, AndroidErr := db.DB.GetFcmToken(account, 2) - - if IosErr == nil { - Tokens = append(Tokens, IosfcmToken) - } - if AndroidErr == nil { - Tokens = append(Tokens, AndroidfcmToken) + var personTokens []string + for _, v := range push.PushTerminal { + Token, err := db.DB.GetFcmToken(account, v) + if err == nil { + personTokens = append(personTokens, Token) + } } + allTokens[account] = personTokens } Success := 0 Fail := 0 - result := splitter.NewSplitter(SinglePushCountLimit, Tokens).GetSplitResult() - Msg := new(messaging.MulticastMessage) - Msg.Notification = &messaging.Notification{} - Msg.Notification.Body = detailContent - Msg.Notification.Title = alert - Msg.APNS = &messaging.APNSConfig{Payload: &messaging.APNSPayload{Aps: &messaging.Aps{}}} - if opts.IOSBadgeCount { - i := 1 - Msg.APNS.Payload.Aps.Badge = &i - } - if opts.IOSPushSound != "" { - Msg.APNS.Payload.Aps.Sound = opts.IOSPushSound - } + notification := &messaging.Notification{} + notification.Body = detailContent + notification.Title = title + var messages []*messaging.Message ctx := context.Background() - for _, v := range result { - Msg.Tokens = v.Item - //SendMulticast sends the given multicast message to all the FCM registration tokens specified. - //The tokens array in MulticastMessage may contain up to 500 tokens. - //SendMulticast uses the `SendAll()` function to send the given message to all the target recipients. - //The responses list obtained from the return value corresponds to the order of the input tokens. - //An error from SendMulticast indicates a total failure -- i.e. - //the message could not be sent to any of the recipients. - //Partial failures are indicated by a `BatchResponse` return value. - response, err := f.FcmMsgCli.SendMulticast(ctx, Msg) + apns := &messaging.APNSConfig{Payload: &messaging.APNSPayload{Aps: &messaging.Aps{Sound: opts.IOSPushSound}}} + for uid, personTokens := range allTokens { + messageCount := len(messages) + if messageCount >= SinglePushCountLimit { + response, err := f.FcmMsgCli.SendAll(ctx, messages) + if err != nil { + Fail = Fail + messageCount + log.Info(operationID, "some token push err", err.Error(), messageCount) + } else { + Success = Success + response.SuccessCount + Fail = Fail + response.FailureCount + } + messages = messages[0:0] + } + if opts.IOSBadgeCount { + unreadCountSum, err := db.DB.IncrUserBadgeUnreadCountSum(uid) + if err == nil { + apns.Payload.Aps.Badge = &unreadCountSum + } else { + continue + } + } + for _, token := range personTokens { + temp := &messaging.Message{ + Token: token, + Notification: notification, + APNS: apns, + } + messages = append(messages, temp) + } + + } + messageCount := len(messages) + if messageCount > 0 { + response, err := f.FcmMsgCli.SendAll(ctx, messages) if err != nil { - Fail = Fail + len(v.Item) - log.Info(operationID, "some token push err", err.Error(), len(v.Item)) - continue + Fail = Fail + messageCount + log.Info(operationID, "some token push err", err.Error(), messageCount) + } else { + Success = Success + response.SuccessCount + Fail = Fail + response.FailureCount } - Success = Success + response.SuccessCount - Fail = Fail + response.FailureCount } return strconv.Itoa(Success) + " Success," + strconv.Itoa(Fail) + " Fail", nil } diff --git a/internal/push/getui/push.go b/internal/push/getui/push.go index 359d847f0..eb3a72280 100644 --- a/internal/push/getui/push.go +++ b/internal/push/getui/push.go @@ -112,7 +112,7 @@ func newGetuiClient() *Getui { return &Getui{} } -func (g *Getui) Push(userIDList []string, alert, detailContent, operationID string, opts push.PushOpts) (resp string, err error) { +func (g *Getui) Push(userIDList []string, title, detailContent, operationID string, opts push.PushOpts) (resp string, err error) { token, err := db.DB.GetGetuiToken() log.NewDebug(operationID, utils.GetSelfFuncName(), "token:", token) if err != nil { @@ -132,18 +132,18 @@ func (g *Getui) Push(userIDList []string, alert, detailContent, operationID stri }{Alias: []string{userIDList[0]}}, } pushReq.PushMessage.Notification = Notification{ - Title: alert, + Title: title, Body: detailContent, ClickType: "startapp", } pushReq.PushChannel.Ios.Aps.Sound = "default" pushReq.PushChannel.Ios.Aps.Alert = Alert{ - Title: alert, - Body: alert, + Title: title, + Body: title, } pushReq.PushChannel.Android.Ups.Notification = Notification{ - Title: alert, - Body: alert, + Title: title, + Body: title, ClickType: "startapp", } pushReq.PushChannel.Android.Ups.Options = Options{ diff --git a/internal/push/jpush/push.go b/internal/push/jpush/push.go index 060b11d78..f53058b7f 100644 --- a/internal/push/jpush/push.go +++ b/internal/push/jpush/push.go @@ -33,7 +33,7 @@ func (j *JPush) SetAlias(cid, alias string) (resp string, err error) { return resp, nil } -func (j *JPush) Push(accounts []string, alert, detailContent, operationID string, opts push.PushOpts) (string, error) { +func (j *JPush) Push(accounts []string, title, detailContent, operationID string, opts push.PushOpts) (string, error) { var pf requestBody.Platform pf.SetAll() @@ -47,7 +47,7 @@ func (j *JPush) Push(accounts []string, alert, detailContent, operationID string } no.IOSEnableMutableContent() no.SetExtras(extras) - no.SetAlert(alert) + no.SetAlert(title) var me requestBody.Message me.SetMsgContent(detailContent) var o requestBody.Options diff --git a/internal/push/logic/callback.go b/internal/push/logic/callback.go index 1bb51fcc1..68860757a 100644 --- a/internal/push/logic/callback.go +++ b/internal/push/logic/callback.go @@ -12,7 +12,7 @@ import ( http2 "net/http" ) -func callbackOfflinePush(operationID string, userIDList []string, msg *commonPb.MsgData, offlinePushUserIDList *[]string, offlineInfo *commonPb.OfflinePushInfo) cbApi.CommonCallbackResp { +func callbackOfflinePush(operationID string, userIDList []string, msg *commonPb.MsgData, offlinePushUserIDList *[]string) cbApi.CommonCallbackResp { callbackResp := cbApi.CommonCallbackResp{OperationID: operationID} if !config.Config.Callback.CallbackOfflinePush.Enable { return callbackResp @@ -52,7 +52,7 @@ func callbackOfflinePush(operationID string, userIDList []string, msg *commonPb. *offlinePushUserIDList = resp.UserIDList } if resp.OfflinePushInfo != nil { - *offlineInfo = *resp.OfflinePushInfo + msg.OfflinePushInfo = resp.OfflinePushInfo } } log.NewDebug(operationID, utils.GetSelfFuncName(), offlinePushUserIDList, resp.UserIDList) diff --git a/internal/push/logic/init.go b/internal/push/logic/init.go index bfe5e1187..22d03603f 100644 --- a/internal/push/logic/init.go +++ b/internal/push/logic/init.go @@ -21,7 +21,6 @@ import ( var ( rpcServer RPCServer pushCh PushConsumerHandler - pushTerminal []int32 producer *kafka.Producer offlinePusher pusher.OfflinePusher successCount uint64 @@ -30,7 +29,6 @@ var ( func Init(rpcPort int) { rpcServer.Init(rpcPort) pushCh.Init() - pushTerminal = []int32{constant.IOSPlatformID, constant.AndroidPlatformID} } func init() { diff --git a/internal/push/logic/push_to_client.go b/internal/push/logic/push_to_client.go index 13ea1bb68..2b8bbcfd8 100644 --- a/internal/push/logic/push_to_client.go +++ b/internal/push/logic/push_to_client.go @@ -17,10 +17,8 @@ import ( pbPush "Open_IM/pkg/proto/push" pbRelay "Open_IM/pkg/proto/relay" pbRtc "Open_IM/pkg/proto/rtc" - commonPb "Open_IM/pkg/proto/sdk_ws" "Open_IM/pkg/utils" "context" - "encoding/json" "strings" "github.com/golang/protobuf/proto" @@ -85,71 +83,58 @@ func MsgToUser(pushMsg *pbPush.PushMsgReq) { return } } - customContent := OpenIMContent{ - SessionType: int(pushMsg.MsgData.SessionType), - From: pushMsg.MsgData.SendID, - To: pushMsg.MsgData.RecvID, - Seq: pushMsg.MsgData.Seq, + var title, detailContent string + callbackResp := callbackOfflinePush(pushMsg.OperationID, UIDList, pushMsg.MsgData, &[]string{}) + 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") + return } - bCustomContent, _ := json.Marshal(customContent) - jsonCustomContent := string(bCustomContent) - var content string if pushMsg.MsgData.OfflinePushInfo != nil { - content = pushMsg.MsgData.OfflinePushInfo.Title - jsonCustomContent = pushMsg.MsgData.OfflinePushInfo.Desc + title = pushMsg.MsgData.OfflinePushInfo.Title + detailContent = pushMsg.MsgData.OfflinePushInfo.Desc + } + + if offlinePusher == nil { + return + } + opts, err := GetOfflinePushOpts(pushMsg) + if err != nil { + log.NewError(pushMsg.OperationID, utils.GetSelfFuncName(), "GetOfflinePushOpts failed", pushMsg, err.Error()) } - if content == "" { + log.NewInfo(pushMsg.OperationID, utils.GetSelfFuncName(), UIDList, title, detailContent, "opts:", opts) + if title == "" { switch pushMsg.MsgData.ContentType { case constant.Text: - content = constant.ContentType2PushContent[constant.Text] + fallthrough case constant.Picture: - content = constant.ContentType2PushContent[constant.Picture] + fallthrough case constant.Voice: - content = constant.ContentType2PushContent[constant.Voice] + fallthrough case constant.Video: - content = constant.ContentType2PushContent[constant.Video] + fallthrough case constant.File: - content = constant.ContentType2PushContent[constant.File] + title = constant.ContentType2PushContent[int64(pushMsg.MsgData.ContentType)] case constant.AtText: a := AtContent{} _ = utils.JsonStringToStruct(string(pushMsg.MsgData.Content), &a) if utils.IsContain(pushMsg.PushToUserID, a.AtUserList) { - content = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common] + title = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common] } else { - content = constant.ContentType2PushContent[constant.GroupMsg] + title = constant.ContentType2PushContent[constant.GroupMsg] } case constant.SignalingNotification: - content = constant.ContentType2PushContent[constant.SignalMsg] + title = constant.ContentType2PushContent[constant.SignalMsg] default: - content = constant.ContentType2PushContent[constant.Common] + title = constant.ContentType2PushContent[constant.Common] } + detailContent = title } - var offlineInfo commonPb.OfflinePushInfo - callbackResp := callbackOfflinePush(pushMsg.OperationID, UIDList, pushMsg.MsgData, &[]string{}, &offlineInfo) - 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") - return - } - if offlineInfo.Title != "" { - content = offlineInfo.Title - } - if offlineInfo.Desc != "" { - jsonCustomContent = offlineInfo.Desc - } - if offlinePusher == nil { - return - } - opts, err := GetOfflinePushOpts(pushMsg) - if err != nil { - log.NewError(pushMsg.OperationID, utils.GetSelfFuncName(), "GetOfflinePushOpts failed", pushMsg, err.Error()) - } - log.NewInfo(pushMsg.OperationID, utils.GetSelfFuncName(), UIDList, content, jsonCustomContent, "opts:", opts) - pushResult, err := offlinePusher.Push(UIDList, content, jsonCustomContent, pushMsg.OperationID, opts) + pushResult, err := offlinePusher.Push(UIDList, title, detailContent, pushMsg.OperationID, opts) if err != nil { log.NewError(pushMsg.OperationID, "offline push error", pushMsg.String(), err.Error()) } else { @@ -229,51 +214,11 @@ func MsgToSuperGroupUser(pushMsg *pbPush.PushMsgReq) { } onlineFailedUserIDList := utils.DifferenceString(onlineSuccessUserIDList, pushToUserIDList) //Use offline push messaging - 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 - jsonCustomContent = pushMsg.MsgData.OfflinePushInfo.Desc - - } 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(pushMsg.PushToUserID, a.AtUserList) { - content = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common] - } else { - content = constant.ContentType2PushContent[constant.GroupMsg] - } - case constant.SignalingNotification: - content = constant.ContentType2PushContent[constant.SignalMsg] - default: - content = constant.ContentType2PushContent[constant.Common] - - } - } + var title, detailContent string if len(onlineFailedUserIDList) > 0 { var offlinePushUserIDList []string var needOfflinePushUserIDList []string - var offlineInfo commonPb.OfflinePushInfo - callbackResp := callbackOfflinePush(pushMsg.OperationID, onlineFailedUserIDList, pushMsg.MsgData, &offlinePushUserIDList, &offlineInfo) + callbackResp := callbackOfflinePush(pushMsg.OperationID, onlineFailedUserIDList, pushMsg.MsgData, &offlinePushUserIDList) log.NewDebug(pushMsg.OperationID, utils.GetSelfFuncName(), "offline callback Resp") if callbackResp.ErrCode != 0 { log.NewError(pushMsg.OperationID, utils.GetSelfFuncName(), "callbackOfflinePush result: ", callbackResp) @@ -282,17 +227,16 @@ func MsgToSuperGroupUser(pushMsg *pbPush.PushMsgReq) { log.NewDebug(pushMsg.OperationID, utils.GetSelfFuncName(), "offlinePush stop") return } + if pushMsg.MsgData.OfflinePushInfo != nil { + title = pushMsg.MsgData.OfflinePushInfo.Title + detailContent = pushMsg.MsgData.OfflinePushInfo.Desc + } if len(offlinePushUserIDList) > 0 { needOfflinePushUserIDList = offlinePushUserIDList } else { needOfflinePushUserIDList = onlineFailedUserIDList } - if offlineInfo.Title != "" { - content = offlineInfo.Title - } - if offlineInfo.Desc != "" { - jsonCustomContent = offlineInfo.Desc - } + if offlinePusher == nil { return } @@ -300,8 +244,36 @@ func MsgToSuperGroupUser(pushMsg *pbPush.PushMsgReq) { if err != nil { log.NewError(pushMsg.OperationID, utils.GetSelfFuncName(), "GetOfflinePushOpts failed", pushMsg, err.Error()) } - log.NewInfo(pushMsg.OperationID, utils.GetSelfFuncName(), onlineFailedUserIDList, content, jsonCustomContent, "opts:", opts) - pushResult, err := offlinePusher.Push(needOfflinePushUserIDList, content, jsonCustomContent, pushMsg.OperationID, opts) + log.NewInfo(pushMsg.OperationID, utils.GetSelfFuncName(), onlineFailedUserIDList, title, detailContent, "opts:", opts) + if title == "" { + switch pushMsg.MsgData.ContentType { + case constant.Text: + fallthrough + case constant.Picture: + fallthrough + case constant.Voice: + fallthrough + case constant.Video: + fallthrough + case constant.File: + title = constant.ContentType2PushContent[int64(pushMsg.MsgData.ContentType)] + case constant.AtText: + a := AtContent{} + _ = utils.JsonStringToStruct(string(pushMsg.MsgData.Content), &a) + if utils.IsContain(pushMsg.PushToUserID, a.AtUserList) { + title = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common] + } else { + title = constant.ContentType2PushContent[constant.GroupMsg] + } + case constant.SignalingNotification: + title = constant.ContentType2PushContent[constant.SignalMsg] + default: + title = constant.ContentType2PushContent[constant.Common] + + } + detailContent = title + } + pushResult, err := offlinePusher.Push(needOfflinePushUserIDList, title, detailContent, pushMsg.OperationID, opts) if err != nil { log.NewError(pushMsg.OperationID, "offline push error", pushMsg.String(), err.Error()) } else { diff --git a/internal/push/push_interface.go b/internal/push/push_interface.go index 1e177e74e..7b60b10e1 100644 --- a/internal/push/push_interface.go +++ b/internal/push/push_interface.go @@ -1,7 +1,11 @@ package push +import "Open_IM/pkg/common/constant" + +var PushTerminal = []int{constant.IOSPlatformID, constant.AndroidPlatformID} + type OfflinePusher interface { - Push(userIDList []string, alert, detailContent, operationID string, opts PushOpts) (resp string, err error) + Push(userIDList []string, title, detailContent, operationID string, opts PushOpts) (resp string, err error) } type PushOpts struct { diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index 87e201aa1..5d543ae25 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -74,7 +74,15 @@ func (rpc *rpcConversation) ModifyConversationField(c context.Context, req *pbCo err = imdb.UpdateColumnsConversations(haveUserID, req.Conversation.ConversationID, map[string]interface{}{"attached_info": conversation.AttachedInfo}) case constant.FieldUnread: isSyncConversation = false - err = imdb.UpdateColumnsConversations(haveUserID, req.Conversation.ConversationID, map[string]interface{}{"update_unread_count_time": utils.GetCurrentTimestampByMill()}) + err = imdb.UpdateColumnsConversations(haveUserID, req.Conversation.ConversationID, map[string]interface{}{"update_unread_count_time": conversation.UpdateUnreadCountTime}) + for _, v := range req.UserIDList { + if err = db.DB.SetUserBadgeUnreadCountSum(v, int(req.BadgeUnreadCountSum)); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetUserBadgeUnreadCountSum, rpc return", err.Error()) + resp.CommonResp = &pbConversation.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()} + return resp, nil + } + } + } if err != nil { log.NewError(req.OperationID, utils.GetSelfFuncName(), "UpdateColumnsConversations error", err.Error()) @@ -83,7 +91,6 @@ func (rpc *rpcConversation) ModifyConversationField(c context.Context, req *pbCo } for _, v := range utils.DifferenceString(haveUserID, req.UserIDList) { conversation.OwnerUserID = v - conversation.UpdateUnreadCountTime = utils.GetCurrentTimestampByMill() err = rocksCache.DelUserConversationIDListFromCache(v) if err != nil { log.NewError(req.OperationID, utils.GetSelfFuncName(), v, req.Conversation.ConversationID, err.Error()) diff --git a/internal/utils/local_cache.go b/internal/utils/local_cache.go index 3be1226a1..5efec4fb3 100644 --- a/internal/utils/local_cache.go +++ b/internal/utils/local_cache.go @@ -18,7 +18,7 @@ type GroupMemberUserIDListHash struct { UserIDList []string } -var CacheGroupMemberUserIDList map[string]*GroupMemberUserIDListHash = make(map[string]*GroupMemberUserIDListHash, 0) +var CacheGroupMemberUserIDList = make(map[string]*GroupMemberUserIDListHash, 0) var CacheGroupMtx sync.RWMutex func GetGroupMemberUserIDList(groupID string, operationID string) ([]string, error) { diff --git a/pkg/base_info/conversation_api_struct.go b/pkg/base_info/conversation_api_struct.go index be913a3c0..ba369022d 100644 --- a/pkg/base_info/conversation_api_struct.go +++ b/pkg/base_info/conversation_api_struct.go @@ -61,9 +61,10 @@ type SetConversationResp struct { } type ModifyConversationFieldReq struct { Conversation - FieldType int32 `json:"fieldType" binding:"required"` - UserIDList []string `json:"userIDList" binding:"required"` - OperationID string `json:"operationID" binding:"required"` + FieldType int32 `json:"fieldType" binding:"required"` + UserIDList []string `json:"userIDList" binding:"required"` + BadgeUnreadCountSum int32 `json:"badgeUnreadCountSum"` + OperationID string `json:"operationID" binding:"required"` } type ModifyConversationFieldResp struct { CommResp diff --git a/pkg/common/db/RedisModel.go b/pkg/common/db/RedisModel.go index b211739e1..3240b8ce9 100644 --- a/pkg/common/db/RedisModel.go +++ b/pkg/common/db/RedisModel.go @@ -37,6 +37,7 @@ const ( groupMaxSeq = "GROUP_MAX_SEQ:" groupMinSeq = "GROUP_MIN_SEQ:" sendMsgFailedFlag = "SEND_MSG_FAILED_FLAG:" + userBadgeUnreadCountSum = "USER_BADGE_UNREAD_COUNT_SUM:" ) func (d *DataBases) JudgeAccountEXISTS(account string) (bool, error) { @@ -411,3 +412,12 @@ func (d *DataBases) GetFcmToken(account string, platformid int) (string, error) key := FcmToken + account + ":" + strconv.Itoa(platformid) return d.RDB.Get(context.Background(), key).Result() } +func (d *DataBases) IncrUserBadgeUnreadCountSum(uid string) (int, error) { + key := userBadgeUnreadCountSum + uid + seq, err := d.RDB.Incr(context.Background(), key).Result() + return int(seq), err +} +func (d *DataBases) SetUserBadgeUnreadCountSum(uid string, value int) error { + key := userBadgeUnreadCountSum + uid + return d.RDB.Set(context.Background(), key, value, 0).Err() +} diff --git a/pkg/proto/conversation/conversation.proto b/pkg/proto/conversation/conversation.proto index 48973fdc1..c07928e52 100644 --- a/pkg/proto/conversation/conversation.proto +++ b/pkg/proto/conversation/conversation.proto @@ -29,6 +29,7 @@ message ModifyConversationFieldReq{ int32 fieldType = 2; repeated string userIDList = 3; string operationID = 4; + int32 badgeUnreadCountSum = 5; } message ModifyConversationFieldResp{ From 714dd597f19b29593d05e40f9229099e6faf640f Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Thu, 1 Sep 2022 21:06:07 +0800 Subject: [PATCH 3/4] fcm ios push badge --- pkg/proto/conversation/conversation.pb.go | 92 +++++++++++++---------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/pkg/proto/conversation/conversation.pb.go b/pkg/proto/conversation/conversation.pb.go index de4d4a793..dc5be2b3d 100644 --- a/pkg/proto/conversation/conversation.pb.go +++ b/pkg/proto/conversation/conversation.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: conversation/conversation.proto -package conversation // import "./conversation" +package conversation // import "Open_IM/pkg/proto/conversation" import proto "github.com/golang/protobuf/proto" import fmt "fmt" @@ -35,7 +35,7 @@ func (m *CommonResp) Reset() { *m = CommonResp{} } func (m *CommonResp) String() string { return proto.CompactTextString(m) } func (*CommonResp) ProtoMessage() {} func (*CommonResp) Descriptor() ([]byte, []int) { - return fileDescriptor_conversation_ac55165355a1b6e6, []int{0} + return fileDescriptor_conversation_f01d9caff8d16987, []int{0} } func (m *CommonResp) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CommonResp.Unmarshal(m, b) @@ -94,7 +94,7 @@ func (m *Conversation) Reset() { *m = Conversation{} } func (m *Conversation) String() string { return proto.CompactTextString(m) } func (*Conversation) ProtoMessage() {} func (*Conversation) Descriptor() ([]byte, []int) { - return fileDescriptor_conversation_ac55165355a1b6e6, []int{1} + return fileDescriptor_conversation_f01d9caff8d16987, []int{1} } func (m *Conversation) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Conversation.Unmarshal(m, b) @@ -224,6 +224,7 @@ type ModifyConversationFieldReq struct { FieldType int32 `protobuf:"varint,2,opt,name=fieldType" json:"fieldType,omitempty"` UserIDList []string `protobuf:"bytes,3,rep,name=userIDList" json:"userIDList,omitempty"` OperationID string `protobuf:"bytes,4,opt,name=operationID" json:"operationID,omitempty"` + BadgeUnreadCountSum int32 `protobuf:"varint,5,opt,name=badgeUnreadCountSum" json:"badgeUnreadCountSum,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -233,7 +234,7 @@ func (m *ModifyConversationFieldReq) Reset() { *m = ModifyConversationFi func (m *ModifyConversationFieldReq) String() string { return proto.CompactTextString(m) } func (*ModifyConversationFieldReq) ProtoMessage() {} func (*ModifyConversationFieldReq) Descriptor() ([]byte, []int) { - return fileDescriptor_conversation_ac55165355a1b6e6, []int{2} + return fileDescriptor_conversation_f01d9caff8d16987, []int{2} } func (m *ModifyConversationFieldReq) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ModifyConversationFieldReq.Unmarshal(m, b) @@ -281,6 +282,13 @@ func (m *ModifyConversationFieldReq) GetOperationID() string { return "" } +func (m *ModifyConversationFieldReq) GetBadgeUnreadCountSum() int32 { + if m != nil { + return m.BadgeUnreadCountSum + } + return 0 +} + type ModifyConversationFieldResp struct { CommonResp *CommonResp `protobuf:"bytes,1,opt,name=commonResp" json:"commonResp,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -292,7 +300,7 @@ func (m *ModifyConversationFieldResp) Reset() { *m = ModifyConversationF func (m *ModifyConversationFieldResp) String() string { return proto.CompactTextString(m) } func (*ModifyConversationFieldResp) ProtoMessage() {} func (*ModifyConversationFieldResp) Descriptor() ([]byte, []int) { - return fileDescriptor_conversation_ac55165355a1b6e6, []int{3} + return fileDescriptor_conversation_f01d9caff8d16987, []int{3} } func (m *ModifyConversationFieldResp) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ModifyConversationFieldResp.Unmarshal(m, b) @@ -399,40 +407,42 @@ var _Conversation_serviceDesc = grpc.ServiceDesc{ } func init() { - proto.RegisterFile("conversation/conversation.proto", fileDescriptor_conversation_ac55165355a1b6e6) -} - -var fileDescriptor_conversation_ac55165355a1b6e6 = []byte{ - // 494 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0x5f, 0x8b, 0x13, 0x31, - 0x14, 0xc5, 0x99, 0x6e, 0xb7, 0xdb, 0xde, 0x76, 0xab, 0x04, 0xd4, 0xd0, 0xf5, 0x4f, 0x19, 0x44, - 0x46, 0x1f, 0x2a, 0xac, 0x3e, 0x08, 0xc2, 0x82, 0x4e, 0x51, 0x06, 0xac, 0x2e, 0xa1, 0x8b, 0xe0, - 0xdb, 0xd8, 0xb9, 0xed, 0x06, 0x6c, 0x32, 0x26, 0x99, 0xda, 0x7d, 0xf1, 0x33, 0xf8, 0x81, 0xfc, - 0x70, 0x92, 0x4c, 0xbb, 0x4d, 0x56, 0x0b, 0x3e, 0xde, 0x5f, 0xee, 0x9c, 0x9c, 0x33, 0x3d, 0x1d, - 0x78, 0x34, 0x93, 0x62, 0x85, 0x4a, 0xe7, 0x86, 0x4b, 0xf1, 0xdc, 0x1f, 0x46, 0xa5, 0x92, 0x46, - 0x92, 0x9e, 0xcf, 0xe2, 0x33, 0x80, 0x54, 0x2e, 0x97, 0x52, 0x30, 0xd4, 0x25, 0xa1, 0x70, 0x84, - 0x4a, 0xa5, 0xb2, 0x40, 0x1a, 0x0d, 0xa3, 0xe4, 0x90, 0x6d, 0x47, 0x72, 0x17, 0x5a, 0xa8, 0xd4, - 0x44, 0x2f, 0x68, 0x63, 0x18, 0x25, 0x1d, 0xb6, 0x99, 0xe2, 0x5f, 0x4d, 0xe8, 0xa5, 0x9e, 0x20, - 0x19, 0x42, 0x57, 0xfe, 0x10, 0xa8, 0x2e, 0x34, 0xaa, 0x6c, 0xec, 0x64, 0x3a, 0xcc, 0x47, 0xe4, - 0x09, 0xf4, 0x7d, 0x0b, 0xd9, 0x78, 0x23, 0x79, 0x83, 0x92, 0x87, 0x00, 0x0a, 0x67, 0xab, 0x89, - 0x5e, 0x7c, 0x2a, 0x0d, 0x3d, 0x70, 0x7e, 0x3c, 0x42, 0x9e, 0xc1, 0x6d, 0xff, 0x89, 0xe9, 0x55, - 0x89, 0xb4, 0xe9, 0xb6, 0xfe, 0xe2, 0xd6, 0x7e, 0x55, 0x1b, 0x3a, 0xac, 0xed, 0xd7, 0x93, 0x0d, - 0xbc, 0x50, 0xb2, 0x2a, 0xb3, 0x31, 0x6d, 0xb9, 0x83, 0xed, 0x68, 0x73, 0x54, 0x42, 0x61, 0x5e, - 0xa4, 0xb2, 0x12, 0x86, 0x1e, 0x39, 0x61, 0x1f, 0x91, 0xc7, 0x70, 0x5c, 0xa8, 0x7c, 0x6e, 0xa6, - 0xb8, 0x36, 0x53, 0xbe, 0x44, 0xda, 0x1e, 0x46, 0xc9, 0x01, 0x0b, 0x21, 0x19, 0x40, 0x9b, 0xeb, - 0x73, 0x2e, 0x04, 0x16, 0xb4, 0x33, 0x8c, 0x92, 0x36, 0xbb, 0x9e, 0x49, 0x0c, 0xbd, 0xdc, 0x98, - 0x7c, 0x76, 0x89, 0x45, 0x26, 0xe6, 0x92, 0x82, 0xb3, 0x10, 0x30, 0x7b, 0x0b, 0xd7, 0xe7, 0x8a, - 0xaf, 0x72, 0x83, 0xe9, 0x65, 0x6e, 0x68, 0xd7, 0x89, 0x84, 0xd0, 0xba, 0x75, 0xc6, 0xdf, 0x18, - 0xf7, 0x1a, 0x7a, 0xb5, 0x5b, 0x0f, 0xd9, 0xbb, 0xb8, 0xfe, 0x28, 0x4d, 0x26, 0xde, 0x5b, 0x4a, - 0x8f, 0x9d, 0x4c, 0xc0, 0x48, 0x1f, 0x1a, 0xb8, 0xa6, 0x7d, 0xe7, 0xa2, 0x81, 0x6b, 0xf2, 0x12, - 0xee, 0x54, 0x65, 0x91, 0x1b, 0xbc, 0xd8, 0xc5, 0x76, 0x49, 0x6f, 0xb9, 0xa4, 0xff, 0x3e, 0x8c, - 0x7f, 0x47, 0x30, 0x98, 0xc8, 0x82, 0xcf, 0xaf, 0xfc, 0x62, 0xbc, 0xe3, 0xf8, 0xad, 0x60, 0xf8, - 0x9d, 0x9c, 0x41, 0xd0, 0x40, 0xd7, 0x90, 0xee, 0xe9, 0x60, 0x14, 0x54, 0xd5, 0x7f, 0x92, 0x05, - 0xfb, 0xe4, 0x3e, 0x74, 0xe6, 0x56, 0xcb, 0x05, 0x6d, 0xb8, 0xa0, 0x3b, 0x60, 0x4b, 0x53, 0xff, - 0xb4, 0x1f, 0xb8, 0xb6, 0xa5, 0x39, 0x48, 0x3a, 0xcc, 0x23, 0xae, 0x9e, 0x25, 0xaa, 0x6d, 0xf3, - 0x9a, 0x9b, 0x7a, 0xee, 0x50, 0xfc, 0x19, 0x4e, 0xf6, 0xba, 0xd7, 0x25, 0x79, 0x05, 0x30, 0xbb, - 0xfe, 0xc3, 0x6c, 0xcc, 0xd3, 0x9b, 0xe6, 0xb7, 0xe7, 0xcc, 0xdb, 0x3d, 0xfd, 0x19, 0x06, 0x27, - 0x02, 0xee, 0xed, 0xb9, 0x88, 0x24, 0xa1, 0xe0, 0xfe, 0xb7, 0x39, 0x78, 0xfa, 0x9f, 0x9b, 0xba, - 0x7c, 0xfb, 0xe0, 0xcb, 0xc9, 0x28, 0xf8, 0x20, 0xbc, 0xf6, 0x87, 0xaf, 0x2d, 0xf7, 0x79, 0x78, - 0xf1, 0x27, 0x00, 0x00, 0xff, 0xff, 0x12, 0x56, 0xaa, 0x7b, 0x41, 0x04, 0x00, 0x00, + proto.RegisterFile("conversation/conversation.proto", fileDescriptor_conversation_f01d9caff8d16987) +} + +var fileDescriptor_conversation_f01d9caff8d16987 = []byte{ + // 513 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0x5d, 0x8b, 0x13, 0x3f, + 0x18, 0xc5, 0x99, 0xbe, 0x6d, 0xfb, 0xb4, 0xdb, 0xff, 0x9f, 0x88, 0x1a, 0xba, 0xbe, 0x94, 0x22, + 0x32, 0x7a, 0x51, 0x65, 0xf5, 0x42, 0x10, 0x16, 0xb4, 0x45, 0x19, 0xb0, 0xba, 0xc4, 0x2e, 0x82, + 0x77, 0xb3, 0x9d, 0xa7, 0xdd, 0x80, 0x4d, 0xc6, 0x24, 0x53, 0xbb, 0x37, 0x7e, 0x06, 0x3f, 0xa9, + 0x9f, 0x41, 0x92, 0x69, 0xb7, 0xc9, 0xba, 0x05, 0x2f, 0x9f, 0x5f, 0x32, 0x27, 0xe7, 0xa4, 0xa7, + 0x81, 0x87, 0x33, 0x29, 0x56, 0xa8, 0x74, 0x6a, 0xb8, 0x14, 0xcf, 0xfc, 0x61, 0x98, 0x2b, 0x69, + 0x24, 0xe9, 0xf8, 0x6c, 0x70, 0x02, 0x30, 0x92, 0xcb, 0xa5, 0x14, 0x0c, 0x75, 0x4e, 0x28, 0x1c, + 0xa0, 0x52, 0x23, 0x99, 0x21, 0x8d, 0xfa, 0x51, 0x5c, 0x67, 0xdb, 0x91, 0xdc, 0x81, 0x06, 0x2a, + 0x35, 0xd1, 0x0b, 0x5a, 0xe9, 0x47, 0x71, 0x8b, 0x6d, 0xa6, 0xc1, 0xaf, 0x1a, 0x74, 0x46, 0x9e, + 0x20, 0xe9, 0x43, 0x5b, 0xfe, 0x10, 0xa8, 0xce, 0x34, 0xaa, 0x64, 0xec, 0x64, 0x5a, 0xcc, 0x47, + 0xe4, 0x31, 0x74, 0x7d, 0x0b, 0xc9, 0x78, 0x23, 0x79, 0x8d, 0x92, 0x07, 0x00, 0x0a, 0x67, 0xab, + 0x89, 0x5e, 0x7c, 0xca, 0x0d, 0xad, 0x3a, 0x3f, 0x1e, 0x21, 0x4f, 0xe1, 0x7f, 0xff, 0x8b, 0xe9, + 0x65, 0x8e, 0xb4, 0xe6, 0x76, 0xfd, 0xc5, 0xad, 0xfd, 0xa2, 0x34, 0x54, 0x2f, 0xed, 0x97, 0x93, + 0x0d, 0xbc, 0x50, 0xb2, 0xc8, 0x93, 0x31, 0x6d, 0xb8, 0x85, 0xed, 0x68, 0x73, 0x14, 0x42, 0x61, + 0x9a, 0x8d, 0x64, 0x21, 0x0c, 0x3d, 0x70, 0xc2, 0x3e, 0x22, 0x8f, 0xe0, 0x30, 0x53, 0xe9, 0xdc, + 0x4c, 0x71, 0x6d, 0xa6, 0x7c, 0x89, 0xb4, 0xd9, 0x8f, 0xe2, 0x2a, 0x0b, 0x21, 0xe9, 0x41, 0x93, + 0xeb, 0x53, 0x2e, 0x04, 0x66, 0xb4, 0xd5, 0x8f, 0xe2, 0x26, 0xbb, 0x9a, 0xc9, 0x00, 0x3a, 0xa9, + 0x31, 0xe9, 0xec, 0x02, 0xb3, 0x44, 0xcc, 0x25, 0x05, 0x67, 0x21, 0x60, 0xf6, 0x14, 0xae, 0x4f, + 0x15, 0x5f, 0xa5, 0x06, 0x47, 0x17, 0xa9, 0xa1, 0x6d, 0x27, 0x12, 0x42, 0xeb, 0xd6, 0x19, 0x7f, + 0x63, 0xdc, 0x35, 0x74, 0x4a, 0xb7, 0x1e, 0xb2, 0x67, 0x71, 0xfd, 0x51, 0x9a, 0x44, 0xbc, 0xb7, + 0x94, 0x1e, 0x3a, 0x99, 0x80, 0x91, 0x2e, 0x54, 0x70, 0x4d, 0xbb, 0xce, 0x45, 0x05, 0xd7, 0xe4, + 0x25, 0xdc, 0x2e, 0xf2, 0x2c, 0x35, 0x78, 0xb6, 0x8b, 0xed, 0x92, 0xfe, 0xe7, 0x92, 0xde, 0xbc, + 0x38, 0xf8, 0x1d, 0x41, 0x6f, 0x22, 0x33, 0x3e, 0xbf, 0xf4, 0x8b, 0xf1, 0x8e, 0xe3, 0xb7, 0x8c, + 0xe1, 0x77, 0x72, 0x02, 0x41, 0x03, 0x5d, 0x43, 0xda, 0xc7, 0xbd, 0x61, 0x50, 0x55, 0xff, 0x4b, + 0x16, 0xec, 0x27, 0xf7, 0xa0, 0x35, 0xb7, 0x5a, 0x2e, 0x68, 0xc5, 0x05, 0xdd, 0x01, 0x5b, 0x9a, + 0xf2, 0xa7, 0xfd, 0xc0, 0xb5, 0x2d, 0x4d, 0x35, 0x6e, 0x31, 0x8f, 0xb8, 0x7a, 0xe6, 0xa8, 0xb6, + 0xcd, 0xab, 0x6d, 0xea, 0xb9, 0x43, 0xe4, 0x39, 0xdc, 0x3a, 0x4f, 0xb3, 0x85, 0x1f, 0xeb, 0x73, + 0xb1, 0x74, 0xbd, 0xa9, 0xb3, 0x9b, 0x96, 0x06, 0x5f, 0xe0, 0x68, 0x6f, 0x5e, 0x9d, 0x93, 0x57, + 0x00, 0xb3, 0xab, 0xbf, 0xd8, 0x26, 0x2e, 0xbd, 0x1e, 0x77, 0xbb, 0xce, 0xbc, 0xbd, 0xc7, 0x3f, + 0xc3, 0xab, 0x22, 0x02, 0xee, 0xee, 0x39, 0x88, 0xc4, 0xa1, 0xe0, 0xfe, 0xfb, 0xef, 0x3d, 0xf9, + 0xc7, 0x9d, 0x3a, 0x7f, 0x7b, 0xff, 0xeb, 0xd1, 0x30, 0x78, 0x42, 0x5e, 0xfb, 0xc3, 0x79, 0xc3, + 0x3d, 0x28, 0x2f, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x9a, 0xf4, 0x2a, 0xa6, 0x73, 0x04, 0x00, + 0x00, } From 946dbc5efc0b1115efcdfefcf1d2c78e5a97c628 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Thu, 1 Sep 2022 21:15:30 +0800 Subject: [PATCH 4/4] change log file mode --- pkg/common/log/logrus.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/log/logrus.go b/pkg/common/log/logrus.go index 2514de055..cee8316a2 100644 --- a/pkg/common/log/logrus.go +++ b/pkg/common/log/logrus.go @@ -36,7 +36,7 @@ func loggerInit(moduleName string) *Logger { logger.SetLevel(logrus.Level(config.Config.Log.RemainLogLevel)) //Close std console output //os.O_WRONLY | os.O_CREATE | os.O_APPEND - src, err := os.OpenFile(os.DevNull, os.O_APPEND|os.O_RDWR|os.O_CREATE, os.ModeAppend) + src, err := os.OpenFile(os.DevNull, os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil { panic(err.Error()) }