mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-10-26 21:22:16 +08:00 
			
		
		
		
	Merge branch 'openimsdk:main' into main
This commit is contained in:
		
						commit
						7cd396e424
					
				
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -12,7 +12,7 @@ require ( | |||||||
| 	github.com/gorilla/websocket v1.5.1 | 	github.com/gorilla/websocket v1.5.1 | ||||||
| 	github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 | 	github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 | ||||||
| 	github.com/mitchellh/mapstructure v1.5.0 | 	github.com/mitchellh/mapstructure v1.5.0 | ||||||
| 	github.com/openimsdk/protocol v0.0.72-alpha.74 | 	github.com/openimsdk/protocol v0.0.72-alpha.78 | ||||||
| 	github.com/openimsdk/tools v0.0.50-alpha.74 | 	github.com/openimsdk/tools v0.0.50-alpha.74 | ||||||
| 	github.com/pkg/errors v0.9.1 // indirect | 	github.com/pkg/errors v0.9.1 // indirect | ||||||
| 	github.com/prometheus/client_golang v1.18.0 | 	github.com/prometheus/client_golang v1.18.0 | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							| @ -347,8 +347,8 @@ github.com/onsi/gomega v1.25.0 h1:Vw7br2PCDYijJHSfBOWhov+8cAnUf8MfMaIOV323l6Y= | |||||||
| github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= | github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= | ||||||
| github.com/openimsdk/gomake v0.0.15-alpha.2 h1:5Q8yl8ezy2yx+q8/ucU/t4kJnDfCzNOrkXcDACCqtyM= | github.com/openimsdk/gomake v0.0.15-alpha.2 h1:5Q8yl8ezy2yx+q8/ucU/t4kJnDfCzNOrkXcDACCqtyM= | ||||||
| github.com/openimsdk/gomake v0.0.15-alpha.2/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI= | github.com/openimsdk/gomake v0.0.15-alpha.2/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI= | ||||||
| github.com/openimsdk/protocol v0.0.72-alpha.74 h1:cGycdzEOxjPuaeoQhIWEKKVf5zp1I+wx7ZnBemjCJJI= | github.com/openimsdk/protocol v0.0.72-alpha.78 h1:n9HVj5olMPiGLF3Z4apPvvYzn2yOpyrsn2/YiAaIsxw= | ||||||
| github.com/openimsdk/protocol v0.0.72-alpha.74/go.mod h1:WF7EuE55vQvpyUAzDXcqg+B+446xQyEba0X35lTINmw= | github.com/openimsdk/protocol v0.0.72-alpha.78/go.mod h1:WF7EuE55vQvpyUAzDXcqg+B+446xQyEba0X35lTINmw= | ||||||
| github.com/openimsdk/tools v0.0.50-alpha.74 h1:yh10SiMiivMEjicEQg+QAsH4pvaO+4noMPdlw+ew0Kc= | github.com/openimsdk/tools v0.0.50-alpha.74 h1:yh10SiMiivMEjicEQg+QAsH4pvaO+4noMPdlw+ew0Kc= | ||||||
| github.com/openimsdk/tools v0.0.50-alpha.74/go.mod h1:n2poR3asX1e1XZce4O+MOWAp+X02QJRFvhcLCXZdzRo= | github.com/openimsdk/tools v0.0.50-alpha.74/go.mod h1:n2poR3asX1e1XZce4O+MOWAp+X02QJRFvhcLCXZdzRo= | ||||||
| github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= | github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= | ||||||
|  | |||||||
| @ -21,6 +21,7 @@ import ( | |||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-playground/validator/v10" | 	"github.com/go-playground/validator/v10" | ||||||
| 	"github.com/mitchellh/mapstructure" | 	"github.com/mitchellh/mapstructure" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/apistruct" | 	"github.com/openimsdk/open-im-server/v3/pkg/apistruct" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/authverify" | 	"github.com/openimsdk/open-im-server/v3/pkg/authverify" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | ||||||
| @ -175,6 +176,8 @@ func (m *MessageApi) getSendMsgReq(c *gin.Context, req apistruct.SendMsg) (sendM | |||||||
| 		data = apistruct.AtElem{} | 		data = apistruct.AtElem{} | ||||||
| 	case constant.Custom: | 	case constant.Custom: | ||||||
| 		data = apistruct.CustomElem{} | 		data = apistruct.CustomElem{} | ||||||
|  | 	case constant.MarkdownText: | ||||||
|  | 		data = apistruct.MarkdownTextElem{} | ||||||
| 	case constant.OANotification: | 	case constant.OANotification: | ||||||
| 		data = apistruct.OANotificationElem{} | 		data = apistruct.OANotificationElem{} | ||||||
| 		req.SessionType = constant.NotificationChatType | 		req.SessionType = constant.NotificationChatType | ||||||
| @ -305,7 +308,7 @@ func (m *MessageApi) SendBusinessNotification(c *gin.Context) { | |||||||
| 				IsSendMsg:        req.SendMsg, | 				IsSendMsg:        req.SendMsg, | ||||||
| 				ReliabilityLevel: *req.ReliabilityLevel, | 				ReliabilityLevel: *req.ReliabilityLevel, | ||||||
| 				UnreadCount:      false, | 				UnreadCount:      false, | ||||||
| 			}), | 			}, nil), | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	respPb, err := m.Client.SendMsg(c, &sendMsgReq) | 	respPb, err := m.Client.SendMsg(c, &sendMsgReq) | ||||||
|  | |||||||
| @ -16,6 +16,7 @@ package conversation | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | ||||||
| 	"github.com/openimsdk/protocol/msg" | 	"github.com/openimsdk/protocol/msg" | ||||||
| 
 | 
 | ||||||
| @ -26,11 +27,11 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type ConversationNotificationSender struct { | type ConversationNotificationSender struct { | ||||||
| 	*rpcclient.NotificationSender | 	*notification.NotificationSender | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewConversationNotificationSender(conf *config.Notification, msgClient *rpcli.MsgClient) *ConversationNotificationSender { | func NewConversationNotificationSender(conf *config.Notification, msgClient *rpcli.MsgClient) *ConversationNotificationSender { | ||||||
| 	return &ConversationNotificationSender{rpcclient.NewNotificationSender(conf, rpcclient.WithRpcClient(func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) { | 	return &ConversationNotificationSender{notification.NewNotificationSender(conf, notification.WithRpcClient(func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) { | ||||||
| 		return msgClient.SendMsg(ctx, req) | 		return msgClient.SendMsg(ctx, req) | ||||||
| 	}))} | 	}))} | ||||||
| } | } | ||||||
|  | |||||||
| @ -16,6 +16,7 @@ package group | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	pbgroup "github.com/openimsdk/protocol/group" | 	pbgroup "github.com/openimsdk/protocol/group" | ||||||
| @ -55,41 +56,52 @@ func UpdateGroupInfoMap(ctx context.Context, group *sdkws.GroupInfoForSet) map[s | |||||||
| 	return m | 	return m | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func UpdateGroupInfoExMap(ctx context.Context, group *pbgroup.SetGroupInfoExReq) (map[string]any, error) { | func UpdateGroupInfoExMap(ctx context.Context, group *pbgroup.SetGroupInfoExReq) (m map[string]any, normalFlag, groupNameFlag, notificationFlag bool, err error) { | ||||||
| 	m := make(map[string]any) | 	m = make(map[string]any) | ||||||
| 
 | 
 | ||||||
| 	if group.GroupName != nil { | 	if group.GroupName != nil { | ||||||
| 		if group.GroupName.Value != "" { | 		if strings.TrimSpace(group.GroupName.Value) != "" { | ||||||
| 			m["group_name"] = group.GroupName.Value | 			m["group_name"] = group.GroupName.Value | ||||||
|  | 			groupNameFlag = true | ||||||
| 		} else { | 		} else { | ||||||
| 			return nil, errs.ErrArgs.WrapMsg("group name is empty") | 			return nil, normalFlag, notificationFlag, groupNameFlag, errs.ErrArgs.WrapMsg("group name is empty") | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	if group.Notification != nil { | 	if group.Notification != nil { | ||||||
|  | 		notificationFlag = true | ||||||
|  | 		group.Notification.Value = strings.TrimSpace(group.Notification.Value) // if Notification only contains spaces, set it to empty string | ||||||
|  | 
 | ||||||
| 		m["notification"] = group.Notification.Value | 		m["notification"] = group.Notification.Value | ||||||
| 		m["notification_update_time"] = time.Now() |  | ||||||
| 		m["notification_user_id"] = mcontext.GetOpUserID(ctx) | 		m["notification_user_id"] = mcontext.GetOpUserID(ctx) | ||||||
|  | 		m["notification_update_time"] = time.Now() | ||||||
| 	} | 	} | ||||||
| 	if group.Introduction != nil { | 	if group.Introduction != nil { | ||||||
| 		m["introduction"] = group.Introduction.Value | 		m["introduction"] = group.Introduction.Value | ||||||
|  | 		normalFlag = true | ||||||
| 	} | 	} | ||||||
| 	if group.FaceURL != nil { | 	if group.FaceURL != nil { | ||||||
| 		m["face_url"] = group.FaceURL.Value | 		m["face_url"] = group.FaceURL.Value | ||||||
|  | 		normalFlag = true | ||||||
| 	} | 	} | ||||||
| 	if group.NeedVerification != nil { | 	if group.NeedVerification != nil { | ||||||
| 		m["need_verification"] = group.NeedVerification.Value | 		m["need_verification"] = group.NeedVerification.Value | ||||||
|  | 		normalFlag = true | ||||||
| 	} | 	} | ||||||
| 	if group.LookMemberInfo != nil { | 	if group.LookMemberInfo != nil { | ||||||
| 		m["look_member_info"] = group.LookMemberInfo.Value | 		m["look_member_info"] = group.LookMemberInfo.Value | ||||||
|  | 		normalFlag = true | ||||||
| 	} | 	} | ||||||
| 	if group.ApplyMemberFriend != nil { | 	if group.ApplyMemberFriend != nil { | ||||||
| 		m["apply_member_friend"] = group.ApplyMemberFriend.Value | 		m["apply_member_friend"] = group.ApplyMemberFriend.Value | ||||||
|  | 		normalFlag = true | ||||||
| 	} | 	} | ||||||
| 	if group.Ex != nil { | 	if group.Ex != nil { | ||||||
| 		m["ex"] = group.Ex.Value | 		m["ex"] = group.Ex.Value | ||||||
|  | 		normalFlag = true | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return m, nil | 	return m, normalFlag, groupNameFlag, notificationFlag, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func UpdateGroupStatusMap(status int) map[string]any { | func UpdateGroupStatusMap(status int) map[string]any { | ||||||
|  | |||||||
| @ -26,6 +26,8 @@ import ( | |||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/dbbuild" | 	"github.com/openimsdk/open-im-server/v3/pkg/dbbuild" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | ||||||
| 
 | 
 | ||||||
|  | 	"google.golang.org/grpc" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/authverify" | 	"github.com/openimsdk/open-im-server/v3/pkg/authverify" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/callbackstruct" | 	"github.com/openimsdk/open-im-server/v3/pkg/callbackstruct" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | ||||||
| @ -51,7 +53,6 @@ import ( | |||||||
| 	"github.com/openimsdk/tools/mw/specialerror" | 	"github.com/openimsdk/tools/mw/specialerror" | ||||||
| 	"github.com/openimsdk/tools/utils/datautil" | 	"github.com/openimsdk/tools/utils/datautil" | ||||||
| 	"github.com/openimsdk/tools/utils/encrypt" | 	"github.com/openimsdk/tools/utils/encrypt" | ||||||
| 	"google.golang.org/grpc" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type groupServer struct { | type groupServer struct { | ||||||
| @ -284,13 +285,14 @@ func (g *groupServer) CreateGroup(ctx context.Context, req *pbgroup.CreateGroupR | |||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	g.notification.GroupCreatedNotification(ctx, tips) | 	g.notification.GroupCreatedNotification(ctx, tips, req.SendMessage) | ||||||
| 
 | 
 | ||||||
| 	if req.GroupInfo.Notification != "" { | 	if req.GroupInfo.Notification != "" { | ||||||
|  | 		notificationFlag := true | ||||||
| 		g.notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{ | 		g.notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{ | ||||||
| 			Group:  tips.Group, | 			Group:  tips.Group, | ||||||
| 			OpUser: tips.OpUser, | 			OpUser: tips.OpUser, | ||||||
| 		}) | 		}, ¬ificationFlag) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	reqCallBackAfter := &pbgroup.CreateGroupReq{ | 	reqCallBackAfter := &pbgroup.CreateGroupReq{ | ||||||
| @ -447,7 +449,7 @@ func (g *groupServer) InviteUserToGroup(ctx context.Context, req *pbgroup.Invite | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err = g.notification.GroupApplicationAgreeMemberEnterNotification(ctx, req.GroupID, opUserID, req.InvitedUserIDs...); err != nil { | 	if err = g.notification.GroupApplicationAgreeMemberEnterNotification(ctx, req.GroupID, req.SendMessage, opUserID, req.InvitedUserIDs...); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return &pbgroup.InviteUserToGroupResp{}, nil | 	return &pbgroup.InviteUserToGroupResp{}, nil | ||||||
| @ -613,7 +615,7 @@ func (g *groupServer) KickGroupMember(ctx context.Context, req *pbgroup.KickGrou | |||||||
| 	for _, userID := range req.KickedUserIDs { | 	for _, userID := range req.KickedUserIDs { | ||||||
| 		tips.KickedUserList = append(tips.KickedUserList, convert.Db2PbGroupMember(memberMap[userID])) | 		tips.KickedUserList = append(tips.KickedUserList, convert.Db2PbGroupMember(memberMap[userID])) | ||||||
| 	} | 	} | ||||||
| 	g.notification.MemberKickedNotification(ctx, tips) | 	g.notification.MemberKickedNotification(ctx, tips, req.SendMessage) | ||||||
| 	if err := g.deleteMemberAndSetConversationSeq(ctx, req.GroupID, req.KickedUserIDs); err != nil { | 	if err := g.deleteMemberAndSetConversationSeq(ctx, req.GroupID, req.KickedUserIDs); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @ -822,7 +824,7 @@ func (g *groupServer) GroupApplicationResponse(ctx context.Context, req *pbgroup | |||||||
| 		if member == nil { | 		if member == nil { | ||||||
| 			log.ZDebug(ctx, "GroupApplicationResponse", "member is nil") | 			log.ZDebug(ctx, "GroupApplicationResponse", "member is nil") | ||||||
| 		} else { | 		} else { | ||||||
| 			if err = g.notification.GroupApplicationAgreeMemberEnterNotification(ctx, req.GroupID, groupRequest.InviterUserID, req.FromUserID); err != nil { | 			if err = g.notification.GroupApplicationAgreeMemberEnterNotification(ctx, req.GroupID, nil, groupRequest.InviterUserID, req.FromUserID); err != nil { | ||||||
| 				return nil, err | 				return nil, err | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @ -1025,7 +1027,8 @@ func (g *groupServer) SetGroupInfo(ctx context.Context, req *pbgroup.SetGroupInf | |||||||
| 				log.ZWarn(ctx, "SetConversations", err, "UserIDs", resp.UserIDs, "conversation", conversation) | 				log.ZWarn(ctx, "SetConversations", err, "UserIDs", resp.UserIDs, "conversation", conversation) | ||||||
| 			} | 			} | ||||||
| 		}() | 		}() | ||||||
| 		g.notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser}) | 		notficationFlag := true | ||||||
|  | 		g.notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser}, ¬ficationFlag) | ||||||
| 	} | 	} | ||||||
| 	if req.GroupInfoForSet.GroupName != "" { | 	if req.GroupInfoForSet.GroupName != "" { | ||||||
| 		num-- | 		num-- | ||||||
| @ -1086,7 +1089,7 @@ func (g *groupServer) SetGroupInfoEx(ctx context.Context, req *pbgroup.SetGroupI | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	updatedData, err := UpdateGroupInfoExMap(ctx, req) | 	updatedData, normalFlag, groupNameFlag, notificationFlag, err := UpdateGroupInfoExMap(ctx, req) | ||||||
| 	if len(updatedData) == 0 { | 	if len(updatedData) == 0 { | ||||||
| 		return &pbgroup.SetGroupInfoExResp{}, nil | 		return &pbgroup.SetGroupInfoExResp{}, nil | ||||||
| 	} | 	} | ||||||
| @ -1114,41 +1117,38 @@ func (g *groupServer) SetGroupInfoEx(ctx context.Context, req *pbgroup.SetGroupI | |||||||
| 		tips.OpUser = g.groupMemberDB2PB(opMember, 0) | 		tips.OpUser = g.groupMemberDB2PB(opMember, 0) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	num := len(updatedData) | 	if notificationFlag { | ||||||
| 
 |  | ||||||
| 	if req.Notification != nil { |  | ||||||
| 		num -= 3 |  | ||||||
| 
 |  | ||||||
| 		if req.Notification.Value != "" { | 		if req.Notification.Value != "" { | ||||||
| 			func() { | 			conversation := &pbconv.ConversationReq{ | ||||||
| 				conversation := &pbconv.ConversationReq{ | 				ConversationID:   msgprocessor.GetConversationIDBySessionType(constant.ReadGroupChatType, req.GroupID), | ||||||
| 					ConversationID:   msgprocessor.GetConversationIDBySessionType(constant.ReadGroupChatType, req.GroupID), | 				ConversationType: constant.ReadGroupChatType, | ||||||
| 					ConversationType: constant.ReadGroupChatType, | 				GroupID:          req.GroupID, | ||||||
| 					GroupID:          req.GroupID, | 			} | ||||||
| 				} |  | ||||||
| 
 | 
 | ||||||
| 				resp, err := g.GetGroupMemberUserIDs(ctx, &pbgroup.GetGroupMemberUserIDsReq{GroupID: req.GroupID}) | 			resp, err := g.GetGroupMemberUserIDs(ctx, &pbgroup.GetGroupMemberUserIDsReq{GroupID: req.GroupID}) | ||||||
| 				if err != nil { | 			if err != nil { | ||||||
| 					log.ZWarn(ctx, "GetGroupMemberIDs is failed.", err) | 				log.ZWarn(ctx, "GetGroupMemberIDs is failed.", err) | ||||||
| 					return | 				return nil, err | ||||||
| 				} | 			} | ||||||
| 
 | 
 | ||||||
| 				conversation.GroupAtType = &wrapperspb.Int32Value{Value: constant.GroupNotification} | 			conversation.GroupAtType = &wrapperspb.Int32Value{Value: constant.GroupNotification} | ||||||
| 				if err := g.conversationClient.SetConversations(ctx, resp.UserIDs, conversation); err != nil { | 			if err := g.conversationClient.SetConversations(ctx, resp.UserIDs, conversation); err != nil { | ||||||
| 					log.ZWarn(ctx, "SetConversations", err, "UserIDs", resp.UserIDs, "conversation", conversation) | 				log.ZWarn(ctx, "SetConversations", err, "UserIDs", resp.UserIDs, "conversation", conversation) | ||||||
| 				} | 			} | ||||||
| 			}() |  | ||||||
| 
 | 
 | ||||||
| 			g.notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser}) | 			g.notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser}, ¬ificationFlag) | ||||||
|  | 		} else { | ||||||
|  | 			notificationFlag = false | ||||||
|  | 			g.notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser}, ¬ificationFlag) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if req.GroupName != nil { | 	if groupNameFlag { | ||||||
| 		num-- |  | ||||||
| 		g.notification.GroupInfoSetNameNotification(ctx, &sdkws.GroupInfoSetNameTips{Group: tips.Group, OpUser: tips.OpUser}) | 		g.notification.GroupInfoSetNameNotification(ctx, &sdkws.GroupInfoSetNameTips{Group: tips.Group, OpUser: tips.OpUser}) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if num > 0 { | 	// if updatedData > 0, send the normal notification | ||||||
|  | 	if normalFlag { | ||||||
| 		g.notification.GroupInfoSetNotification(ctx, tips) | 		g.notification.GroupInfoSetNotification(ctx, tips) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -1368,7 +1368,7 @@ func (g *groupServer) DismissGroup(ctx context.Context, req *pbgroup.DismissGrou | |||||||
| 		if mcontext.GetOpUserID(ctx) == owner.UserID { | 		if mcontext.GetOpUserID(ctx) == owner.UserID { | ||||||
| 			tips.OpUser = g.groupMemberDB2PB(owner, 0) | 			tips.OpUser = g.groupMemberDB2PB(owner, 0) | ||||||
| 		} | 		} | ||||||
| 		g.notification.GroupDismissedNotification(ctx, tips) | 		g.notification.GroupDismissedNotification(ctx, tips, req.SendMessage) | ||||||
| 	} | 	} | ||||||
| 	membersID, err := g.db.FindGroupMemberUserID(ctx, group.GroupID) | 	membersID, err := g.db.FindGroupMemberUserID(ctx, group.GroupID) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
| @ -22,6 +22,8 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | ||||||
| 
 | 
 | ||||||
|  | 	"go.mongodb.org/mongo-driver/mongo" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/authverify" | 	"github.com/openimsdk/open-im-server/v3/pkg/authverify" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/convert" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/convert" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/servererrs" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/servererrs" | ||||||
| @ -41,7 +43,6 @@ import ( | |||||||
| 	"github.com/openimsdk/tools/mcontext" | 	"github.com/openimsdk/tools/mcontext" | ||||||
| 	"github.com/openimsdk/tools/utils/datautil" | 	"github.com/openimsdk/tools/utils/datautil" | ||||||
| 	"github.com/openimsdk/tools/utils/stringutil" | 	"github.com/openimsdk/tools/utils/stringutil" | ||||||
| 	"go.mongodb.org/mongo-driver/mongo" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // GroupApplicationReceiver | // GroupApplicationReceiver | ||||||
| @ -52,11 +53,11 @@ const ( | |||||||
| 
 | 
 | ||||||
| func NewNotificationSender(db controller.GroupDatabase, config *Config, userClient *rpcli.UserClient, msgClient *rpcli.MsgClient, conversationClient *rpcli.ConversationClient) *NotificationSender { | func NewNotificationSender(db controller.GroupDatabase, config *Config, userClient *rpcli.UserClient, msgClient *rpcli.MsgClient, conversationClient *rpcli.ConversationClient) *NotificationSender { | ||||||
| 	return &NotificationSender{ | 	return &NotificationSender{ | ||||||
| 		NotificationSender: rpcclient.NewNotificationSender(&config.NotificationConfig, | 		NotificationSender: notification.NewNotificationSender(&config.NotificationConfig, | ||||||
| 			rpcclient.WithRpcClient(func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) { | 			notification.WithRpcClient(func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) { | ||||||
| 				return msgClient.SendMsg(ctx, req) | 				return msgClient.SendMsg(ctx, req) | ||||||
| 			}), | 			}), | ||||||
| 			rpcclient.WithUserRpcClient(userClient.GetUserInfo), | 			notification.WithUserRpcClient(userClient.GetUserInfo), | ||||||
| 		), | 		), | ||||||
| 		getUsersInfo: func(ctx context.Context, userIDs []string) ([]common_user.CommonUser, error) { | 		getUsersInfo: func(ctx context.Context, userIDs []string) ([]common_user.CommonUser, error) { | ||||||
| 			users, err := userClient.GetUsersInfo(ctx, userIDs) | 			users, err := userClient.GetUsersInfo(ctx, userIDs) | ||||||
| @ -73,7 +74,7 @@ func NewNotificationSender(db controller.GroupDatabase, config *Config, userClie | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type NotificationSender struct { | type NotificationSender struct { | ||||||
| 	*rpcclient.NotificationSender | 	*notification.NotificationSender | ||||||
| 	getUsersInfo       func(ctx context.Context, userIDs []string) ([]common_user.CommonUser, error) | 	getUsersInfo       func(ctx context.Context, userIDs []string) ([]common_user.CommonUser, error) | ||||||
| 	db                 controller.GroupDatabase | 	db                 controller.GroupDatabase | ||||||
| 	config             *Config | 	config             *Config | ||||||
| @ -307,7 +308,7 @@ func (g *NotificationSender) setSortVersion(ctx context.Context, version *uint64 | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) GroupCreatedNotification(ctx context.Context, tips *sdkws.GroupCreatedTips) { | func (g *NotificationSender) GroupCreatedNotification(ctx context.Context, tips *sdkws.GroupCreatedTips, SendMessage *bool) { | ||||||
| 	var err error | 	var err error | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -318,7 +319,7 @@ func (g *NotificationSender) GroupCreatedNotification(ctx context.Context, tips | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | ||||||
| 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupCreatedNotification, tips) | 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupCreatedNotification, tips, notification.WithSendMessage(SendMessage)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) GroupInfoSetNotification(ctx context.Context, tips *sdkws.GroupInfoSetTips) { | func (g *NotificationSender) GroupInfoSetNotification(ctx context.Context, tips *sdkws.GroupInfoSetTips) { | ||||||
| @ -332,7 +333,7 @@ func (g *NotificationSender) GroupInfoSetNotification(ctx context.Context, tips | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | ||||||
| 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNotification, tips, rpcclient.WithRpcGetUserName()) | 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNotification, tips, notification.WithRpcGetUserName()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) GroupInfoSetNameNotification(ctx context.Context, tips *sdkws.GroupInfoSetNameTips) { | func (g *NotificationSender) GroupInfoSetNameNotification(ctx context.Context, tips *sdkws.GroupInfoSetNameTips) { | ||||||
| @ -349,7 +350,7 @@ func (g *NotificationSender) GroupInfoSetNameNotification(ctx context.Context, t | |||||||
| 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNameNotification, tips) | 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNameNotification, tips) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) GroupInfoSetAnnouncementNotification(ctx context.Context, tips *sdkws.GroupInfoSetAnnouncementTips) { | func (g *NotificationSender) GroupInfoSetAnnouncementNotification(ctx context.Context, tips *sdkws.GroupInfoSetAnnouncementTips, sendMessage *bool) { | ||||||
| 	var err error | 	var err error | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -360,7 +361,7 @@ func (g *NotificationSender) GroupInfoSetAnnouncementNotification(ctx context.Co | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | ||||||
| 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetAnnouncementNotification, tips, rpcclient.WithRpcGetUserName()) | 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetAnnouncementNotification, tips, notification.WithRpcGetUserName(), notification.WithSendMessage(sendMessage)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) JoinGroupApplicationNotification(ctx context.Context, req *pbgroup.JoinGroupReq) { | func (g *NotificationSender) JoinGroupApplicationNotification(ctx context.Context, req *pbgroup.JoinGroupReq) { | ||||||
| @ -505,7 +506,7 @@ func (g *NotificationSender) GroupOwnerTransferredNotification(ctx context.Conte | |||||||
| 	g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupOwnerTransferredNotification, tips) | 	g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupOwnerTransferredNotification, tips) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) MemberKickedNotification(ctx context.Context, tips *sdkws.MemberKickedTips) { | func (g *NotificationSender) MemberKickedNotification(ctx context.Context, tips *sdkws.MemberKickedTips, SendMessage *bool) { | ||||||
| 	var err error | 	var err error | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -516,10 +517,10 @@ func (g *NotificationSender) MemberKickedNotification(ctx context.Context, tips | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | ||||||
| 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.MemberKickedNotification, tips) | 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.MemberKickedNotification, tips, notification.WithSendMessage(SendMessage)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) GroupApplicationAgreeMemberEnterNotification(ctx context.Context, groupID string, invitedOpUserID string, entrantUserID ...string) error { | func (g *NotificationSender) GroupApplicationAgreeMemberEnterNotification(ctx context.Context, groupID string, SendMessage *bool, invitedOpUserID string, entrantUserID ...string) error { | ||||||
| 	var err error | 	var err error | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -569,7 +570,7 @@ func (g *NotificationSender) GroupApplicationAgreeMemberEnterNotification(ctx co | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | 	g.setVersion(ctx, &tips.GroupMemberVersion, &tips.GroupMemberVersionID, database.GroupMemberVersionName, tips.Group.GroupID) | ||||||
| 	g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.MemberInvitedNotification, tips) | 	g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.MemberInvitedNotification, tips, notification.WithSendMessage(SendMessage)) | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -614,7 +615,7 @@ func (g *NotificationSender) MemberEnterNotification(ctx context.Context, groupI | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) GroupDismissedNotification(ctx context.Context, tips *sdkws.GroupDismissedTips) { | func (g *NotificationSender) GroupDismissedNotification(ctx context.Context, tips *sdkws.GroupDismissedTips, SendMessage *bool) { | ||||||
| 	var err error | 	var err error | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -624,7 +625,7 @@ func (g *NotificationSender) GroupDismissedNotification(ctx context.Context, tip | |||||||
| 	if err = g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { | 	if err = g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupDismissedNotification, tips) | 	g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupDismissedNotification, tips, notification.WithSendMessage(SendMessage)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *NotificationSender) GroupMemberMutedNotification(ctx context.Context, groupID, groupMemberUserID string, mutedSeconds uint32) { | func (g *NotificationSender) GroupMemberMutedNotification(ctx context.Context, groupID, groupMemberUserID string, mutedSeconds uint32) { | ||||||
|  | |||||||
| @ -23,11 +23,11 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type MsgNotificationSender struct { | type MsgNotificationSender struct { | ||||||
| 	*rpcclient.NotificationSender | 	*notification.NotificationSender | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewMsgNotificationSender(config *Config, opts ...rpcclient.NotificationSenderOptions) *MsgNotificationSender { | func NewMsgNotificationSender(config *Config, opts ...notification.NotificationSenderOptions) *MsgNotificationSender { | ||||||
| 	return &MsgNotificationSender{rpcclient.NewNotificationSender(&config.NotificationConfig, opts...)} | 	return &MsgNotificationSender{notification.NewNotificationSender(&config.NotificationConfig, opts...)} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *MsgNotificationSender) UserDeleteMsgsNotification(ctx context.Context, userID, conversationID string, seqs []int64) { | func (m *MsgNotificationSender) UserDeleteMsgsNotification(ctx context.Context, userID, conversationID string, seqs []int64) { | ||||||
|  | |||||||
| @ -23,6 +23,8 @@ import ( | |||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/mqbuild" | 	"github.com/openimsdk/open-im-server/v3/pkg/mqbuild" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | ||||||
| 
 | 
 | ||||||
|  | 	"google.golang.org/grpc" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/cache/redis" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/cache/redis" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/controller" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/controller" | ||||||
| @ -35,7 +37,6 @@ import ( | |||||||
| 	"github.com/openimsdk/protocol/msg" | 	"github.com/openimsdk/protocol/msg" | ||||||
| 	"github.com/openimsdk/protocol/sdkws" | 	"github.com/openimsdk/protocol/sdkws" | ||||||
| 	"github.com/openimsdk/tools/discovery" | 	"github.com/openimsdk/tools/discovery" | ||||||
| 	"google.golang.org/grpc" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type MessageInterceptorFunc func(ctx context.Context, globalConfig *Config, req *msg.SendMsgReq) (*sdkws.MsgData, error) | type MessageInterceptorFunc func(ctx context.Context, globalConfig *Config, req *msg.SendMsgReq) (*sdkws.MsgData, error) | ||||||
| @ -66,7 +67,7 @@ type msgServer struct { | |||||||
| 	GroupLocalCache        *rpccache.GroupLocalCache        // Local cache for group data. | 	GroupLocalCache        *rpccache.GroupLocalCache        // Local cache for group data. | ||||||
| 	ConversationLocalCache *rpccache.ConversationLocalCache // Local cache for conversation data. | 	ConversationLocalCache *rpccache.ConversationLocalCache // Local cache for conversation data. | ||||||
| 	Handlers               MessageInterceptorChain          // Chain of handlers for processing messages. | 	Handlers               MessageInterceptorChain          // Chain of handlers for processing messages. | ||||||
| 	notificationSender     *rpcclient.NotificationSender    // RPC client for sending notifications. | 	notificationSender     *notification.NotificationSender // RPC client for sending notifications. | ||||||
| 	msgNotificationSender  *MsgNotificationSender           // RPC client for sending msg notifications. | 	msgNotificationSender  *MsgNotificationSender           // RPC client for sending msg notifications. | ||||||
| 	config                 *Config                          // Global configuration settings. | 	config                 *Config                          // Global configuration settings. | ||||||
| 	webhookClient          *webhook.Client | 	webhookClient          *webhook.Client | ||||||
| @ -152,8 +153,8 @@ func Start(ctx context.Context, config *Config, client discovery.Conn, server gr | |||||||
| 		conversationClient:     conversationClient, | 		conversationClient:     conversationClient, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	s.notificationSender = rpcclient.NewNotificationSender(&config.NotificationConfig, rpcclient.WithLocalSendMsg(s.SendMsg)) | 	s.notificationSender = notification.NewNotificationSender(&config.NotificationConfig, notification.WithLocalSendMsg(s.SendMsg)) | ||||||
| 	s.msgNotificationSender = NewMsgNotificationSender(config, rpcclient.WithLocalSendMsg(s.SendMsg)) | 	s.msgNotificationSender = NewMsgNotificationSender(config, notification.WithLocalSendMsg(s.SendMsg)) | ||||||
| 
 | 
 | ||||||
| 	msg.RegisterMsgServer(server, s) | 	msg.RegisterMsgServer(server, s) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -16,13 +16,14 @@ package msg | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"math/rand" | ||||||
|  | 	"strconv" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/servererrs" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/servererrs" | ||||||
| 	"github.com/openimsdk/tools/utils/datautil" | 	"github.com/openimsdk/tools/utils/datautil" | ||||||
| 	"github.com/openimsdk/tools/utils/encrypt" | 	"github.com/openimsdk/tools/utils/encrypt" | ||||||
| 	"github.com/openimsdk/tools/utils/timeutil" | 	"github.com/openimsdk/tools/utils/timeutil" | ||||||
| 	"math/rand" |  | ||||||
| 	"strconv" |  | ||||||
| 	"time" |  | ||||||
| 
 | 
 | ||||||
| 	"github.com/openimsdk/protocol/constant" | 	"github.com/openimsdk/protocol/constant" | ||||||
| 	"github.com/openimsdk/protocol/msg" | 	"github.com/openimsdk/protocol/msg" | ||||||
| @ -137,27 +138,9 @@ func (m *msgServer) encapsulateMsgData(msg *sdkws.MsgData) { | |||||||
| 		msg.SendTime = timeutil.GetCurrentTimestampByMill() | 		msg.SendTime = timeutil.GetCurrentTimestampByMill() | ||||||
| 	} | 	} | ||||||
| 	switch msg.ContentType { | 	switch msg.ContentType { | ||||||
| 	case constant.Text: | 	case constant.Text, constant.Picture, constant.Voice, constant.Video, | ||||||
| 		fallthrough | 		constant.File, constant.AtText, constant.Merger, constant.Card, | ||||||
| 	case constant.Picture: | 		constant.Location, constant.Custom, constant.Quote, constant.AdvancedText, constant.MarkdownText: | ||||||
| 		fallthrough |  | ||||||
| 	case constant.Voice: |  | ||||||
| 		fallthrough |  | ||||||
| 	case constant.Video: |  | ||||||
| 		fallthrough |  | ||||||
| 	case constant.File: |  | ||||||
| 		fallthrough |  | ||||||
| 	case constant.AtText: |  | ||||||
| 		fallthrough |  | ||||||
| 	case constant.Merger: |  | ||||||
| 		fallthrough |  | ||||||
| 	case constant.Card: |  | ||||||
| 		fallthrough |  | ||||||
| 	case constant.Location: |  | ||||||
| 		fallthrough |  | ||||||
| 	case constant.Custom: |  | ||||||
| 		fallthrough |  | ||||||
| 	case constant.Quote: |  | ||||||
| 	case constant.Revoke: | 	case constant.Revoke: | ||||||
| 		datautil.SetSwitchFromOptions(msg.Options, constant.IsUnreadCount, false) | 		datautil.SetSwitchFromOptions(msg.Options, constant.IsUnreadCount, false) | ||||||
| 		datautil.SetSwitchFromOptions(msg.Options, constant.IsOfflinePush, false) | 		datautil.SetSwitchFromOptions(msg.Options, constant.IsOfflinePush, false) | ||||||
|  | |||||||
| @ -16,6 +16,7 @@ package relation | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | ||||||
| 	"github.com/openimsdk/protocol/msg" | 	"github.com/openimsdk/protocol/msg" | ||||||
| 
 | 
 | ||||||
| @ -36,7 +37,7 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type FriendNotificationSender struct { | type FriendNotificationSender struct { | ||||||
| 	*rpcclient.NotificationSender | 	*notification.NotificationSender | ||||||
| 	// Target not found err | 	// Target not found err | ||||||
| 	getUsersInfo func(ctx context.Context, userIDs []string) ([]common_user.CommonUser, error) | 	getUsersInfo func(ctx context.Context, userIDs []string) ([]common_user.CommonUser, error) | ||||||
| 	// db controller | 	// db controller | ||||||
| @ -89,7 +90,7 @@ func WithRpcFunc( | |||||||
| 
 | 
 | ||||||
| func NewFriendNotificationSender(conf *config.Notification, msgClient *rpcli.MsgClient, opts ...friendNotificationSenderOptions) *FriendNotificationSender { | func NewFriendNotificationSender(conf *config.Notification, msgClient *rpcli.MsgClient, opts ...friendNotificationSenderOptions) *FriendNotificationSender { | ||||||
| 	f := &FriendNotificationSender{ | 	f := &FriendNotificationSender{ | ||||||
| 		NotificationSender: rpcclient.NewNotificationSender(conf, rpcclient.WithRpcClient(func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) { | 		NotificationSender: notification.NewNotificationSender(conf, notification.WithRpcClient(func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) { | ||||||
| 			return msgClient.SendMsg(ctx, req) | 			return msgClient.SendMsg(ctx, req) | ||||||
| 		})), | 		})), | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -16,6 +16,7 @@ package user | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | 	"github.com/openimsdk/open-im-server/v3/pkg/rpcli" | ||||||
| 	"github.com/openimsdk/protocol/msg" | 	"github.com/openimsdk/protocol/msg" | ||||||
| 
 | 
 | ||||||
| @ -29,7 +30,7 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type UserNotificationSender struct { | type UserNotificationSender struct { | ||||||
| 	*rpcclient.NotificationSender | 	*notification.NotificationSender | ||||||
| 	getUsersInfo func(ctx context.Context, userIDs []string) ([]common_user.CommonUser, error) | 	getUsersInfo func(ctx context.Context, userIDs []string) ([]common_user.CommonUser, error) | ||||||
| 	// db controller | 	// db controller | ||||||
| 	db controller.UserDatabase | 	db controller.UserDatabase | ||||||
| @ -63,7 +64,7 @@ func WithUserFunc( | |||||||
| 
 | 
 | ||||||
| func NewUserNotificationSender(config *Config, msgClient *rpcli.MsgClient, opts ...userNotificationSenderOptions) *UserNotificationSender { | func NewUserNotificationSender(config *Config, msgClient *rpcli.MsgClient, opts ...userNotificationSenderOptions) *UserNotificationSender { | ||||||
| 	f := &UserNotificationSender{ | 	f := &UserNotificationSender{ | ||||||
| 		NotificationSender: rpcclient.NewNotificationSender(&config.NotificationConfig, rpcclient.WithRpcClient(func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) { | 		NotificationSender: notification.NewNotificationSender(&config.NotificationConfig, notification.WithRpcClient(func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) { | ||||||
| 			return msgClient.SendMsg(ctx, req) | 			return msgClient.SendMsg(ctx, req) | ||||||
| 		})), | 		})), | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -83,6 +83,10 @@ type TextElem struct { | |||||||
| 	Content string `json:"content" validate:"required"` | 	Content string `json:"content" validate:"required"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type MarkdownTextElem struct { | ||||||
|  | 	Content string `mapstructure:"content" validate:"required"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type StreamMsgElem struct { | type StreamMsgElem struct { | ||||||
| 	Type    string `mapstructure:"type" validate:"required"` | 	Type    string `mapstructure:"type" validate:"required"` | ||||||
| 	Content string `mapstructure:"content" validate:"required"` | 	Content string `mapstructure:"content" validate:"required"` | ||||||
|  | |||||||
| @ -18,11 +18,12 @@ import ( | |||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 
 | 
 | ||||||
|  | 	"gopkg.in/yaml.v3" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor" | 	"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor" | ||||||
| 	"github.com/openimsdk/protocol/constant" | 	"github.com/openimsdk/protocol/constant" | ||||||
| 	"github.com/openimsdk/tools/errs" | 	"github.com/openimsdk/tools/errs" | ||||||
| 	"github.com/openimsdk/tools/field" | 	"github.com/openimsdk/tools/field" | ||||||
| 	"gopkg.in/yaml.v3" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -56,9 +57,12 @@ func GetProjectRoot() (string, error) { | |||||||
| 	return projectRoot, nil | 	return projectRoot, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func GetOptionsByNotification(cfg NotificationConfig) msgprocessor.Options { | func GetOptionsByNotification(cfg NotificationConfig, sendMessage *bool) msgprocessor.Options { | ||||||
| 	opts := msgprocessor.NewOptions() | 	opts := msgprocessor.NewOptions() | ||||||
| 
 | 
 | ||||||
|  | 	if sendMessage != nil { | ||||||
|  | 		cfg.IsSendMsg = *sendMessage | ||||||
|  | 	} | ||||||
| 	if cfg.IsSendMsg { | 	if cfg.IsSendMsg { | ||||||
| 		opts = msgprocessor.WithOptions(opts, msgprocessor.WithUnreadCount(true)) | 		opts = msgprocessor.WithOptions(opts, msgprocessor.WithUnreadCount(true)) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ | |||||||
| // See the License for the specific language governing permissions and | // See the License for the specific language governing permissions and | ||||||
| // limitations under the License. | // limitations under the License. | ||||||
| 
 | 
 | ||||||
| package rpcclient | package notification | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| @ -179,19 +179,24 @@ func NewNotificationSender(conf *config.Notification, opts ...NotificationSender | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type notificationOpt struct { | type notificationOpt struct { | ||||||
| 	WithRpcGetUsername bool | 	RpcGetUsername bool | ||||||
|  | 	SendMessage    *bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type NotificationOptions func(*notificationOpt) | type NotificationOptions func(*notificationOpt) | ||||||
| 
 | 
 | ||||||
| func WithRpcGetUserName() NotificationOptions { | func WithRpcGetUserName() NotificationOptions { | ||||||
| 	return func(opt *notificationOpt) { | 	return func(opt *notificationOpt) { | ||||||
| 		opt.WithRpcGetUsername = true | 		opt.RpcGetUsername = true | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | func WithSendMessage(sendMessage *bool) NotificationOptions { | ||||||
|  | 	return func(opt *notificationOpt) { | ||||||
|  | 		opt.SendMessage = sendMessage | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *NotificationSender) send(ctx context.Context, sendID, recvID string, contentType, sessionType int32, m proto.Message, opts ...NotificationOptions) { | func (s *NotificationSender) send(ctx context.Context, sendID, recvID string, contentType, sessionType int32, m proto.Message, opts ...NotificationOptions) { | ||||||
| 	//ctx = mcontext.WithMustInfoCtx([]string{mcontext.GetOperationID(ctx), mcontext.GetOpUserID(ctx), mcontext.GetOpUserPlatform(ctx), mcontext.GetConnID(ctx)}) |  | ||||||
| 	ctx = context.WithoutCancel(ctx) | 	ctx = context.WithoutCancel(ctx) | ||||||
| 	ctx, cancel := context.WithTimeout(ctx, time.Second*time.Duration(5)) | 	ctx, cancel := context.WithTimeout(ctx, time.Second*time.Duration(5)) | ||||||
| 	defer cancel() | 	defer cancel() | ||||||
| @ -208,7 +213,7 @@ func (s *NotificationSender) send(ctx context.Context, sendID, recvID string, co | |||||||
| 	var req msg.SendMsgReq | 	var req msg.SendMsgReq | ||||||
| 	var msg sdkws.MsgData | 	var msg sdkws.MsgData | ||||||
| 	var userInfo *sdkws.UserInfo | 	var userInfo *sdkws.UserInfo | ||||||
| 	if notificationOpt.WithRpcGetUsername && s.getUserInfo != nil { | 	if notificationOpt.RpcGetUsername && s.getUserInfo != nil { | ||||||
| 		userInfo, err = s.getUserInfo(ctx, sendID) | 		userInfo, err = s.getUserInfo(ctx, sendID) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			log.ZWarn(ctx, "getUserInfo failed", err, "sendID", sendID) | 			log.ZWarn(ctx, "getUserInfo failed", err, "sendID", sendID) | ||||||
| @ -233,7 +238,7 @@ func (s *NotificationSender) send(ctx context.Context, sendID, recvID string, co | |||||||
| 	if sendID == recvID && contentType == constant.HasReadReceipt { | 	if sendID == recvID && contentType == constant.HasReadReceipt { | ||||||
| 		optionsConfig.ReliabilityLevel = constant.UnreliableNotification | 		optionsConfig.ReliabilityLevel = constant.UnreliableNotification | ||||||
| 	} | 	} | ||||||
| 	options := config.GetOptionsByNotification(optionsConfig) | 	options := config.GetOptionsByNotification(optionsConfig, notificationOpt.SendMessage) | ||||||
| 	s.SetOptionsByContentType(ctx, options, contentType) | 	s.SetOptionsByContentType(ctx, options, contentType) | ||||||
| 	msg.Options = options | 	msg.Options = options | ||||||
| 	// fill Notification OfflinePush by config | 	// fill Notification OfflinePush by config | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user