From 02142c55b27457267effc8387711e49c66b5067d Mon Sep 17 00:00:00 2001 From: Brabem <69128477+luhaoling@users.noreply.github.com> Date: Tue, 28 Nov 2023 15:26:46 +0800 Subject: [PATCH] feat: add callback func (#1480) * feat:add callback func * fix: fix the error * fix: fix the error of repalce * fix: fix the error of repalce --- deployments/templates/openim.yaml | 153 +++++++++++++++++-------- docs/contrib/environment.md | 8 +- internal/msggateway/callback.go | 21 +++- internal/push/callback.go | 19 ++- internal/rpc/friend/callback.go | 46 ++++++-- internal/rpc/friend/friend.go | 7 ++ internal/rpc/group/callback.go | 184 +++++++++++++++++++++++------- internal/rpc/group/group.go | 57 +++++++++ internal/rpc/msg/as_read.go | 10 ++ internal/rpc/msg/callback.go | 54 +++++---- internal/rpc/user/callback.go | 64 +++++++++-- internal/rpc/user/user.go | 10 ++ pkg/callbackstruct/common.go | 11 +- pkg/callbackstruct/constant.go | 33 ++++++ pkg/callbackstruct/friend.go | 45 +++++++- pkg/callbackstruct/group.go | 132 ++++++++++++++++++++- pkg/callbackstruct/message.go | 43 +++++++ pkg/callbackstruct/user.go | 35 +++++- pkg/common/config/config.go | 13 +++ pkg/common/http/http_client.go | 16 +-- scripts/install/environment.sh | 4 + 21 files changed, 801 insertions(+), 164 deletions(-) create mode 100644 pkg/callbackstruct/constant.go diff --git a/deployments/templates/openim.yaml b/deployments/templates/openim.yaml index 44a28adff..c0e552c24 100644 --- a/deployments/templates/openim.yaml +++ b/deployments/templates/openim.yaml @@ -164,7 +164,7 @@ object: # These ports are passed into the program by the script and are not recommended to modify # For launching multiple programs, just fill in multiple ports separated by commas # For example, [10110, 10111] -rpcPort: +rpcPort: openImUserPort: [ ${OPENIM_USER_PORT} ] openImFriendPort: [ ${OPENIM_FRIEND_PORT} ] openImMessagePort: [ ${OPENIM_MESSAGE_PORT} ] @@ -314,68 +314,125 @@ iosPush: callback: url: beforeSendSingleMsg: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} afterSendSingleMsg: - enable: false - timeout: 5 + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeSendGroupMsg: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} afterSendGroupMsg: - enable: false - timeout: 5 + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} msgModify: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} userOnline: - enable: false - timeout: 5 + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} userOffline: - enable: false - timeout: 5 + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} userKickOff: - enable: false - timeout: 5 + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} offlinePush: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} onlinePush: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} superGroupOnlinePush: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeAddFriend: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeUpdateUserInfo: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeCreateGroup: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + afterCreateGroup: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeMemberJoinGroup: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} beforeSetGroupMemberInfo: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} setMessageReactionExtensions: - enable: false - timeout: 5 - failedContinue: true + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + quitGroup: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + killGroupMember: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + dismissGroup: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + joinGroup: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + groupMsgRead: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + singleMsgRead: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + updateUserInfo: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + beforeUserRegister: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + afterUserRegister: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + transferGroupOwner: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + beforeSetFriendRemark: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} + afterSetFriendRemark: + enable: ${CALLBACK_ENABLE} + timeout: ${CALLBACK_TIMEOUT} + failedContinue: ${CALLBACK_FAILED_CONTINUE} ###################### Prometheus ###################### # Prometheus configuration for various services @@ -395,4 +452,4 @@ prometheus: conversationPrometheusPort: [ ${CONVERSATION_PROM_PORT} ] rtcPrometheusPort: [ ${RTC_PROM_PORT} ] thirdPrometheusPort: [ ${THIRD_PROM_PORT} ] - messageTransferPrometheusPort: [ ${MSG_TRANSFER_PROM_PORT} ] # List of ports \ No newline at end of file + messageTransferPrometheusPort: [ ${MSG_TRANSFER_PROM_PORT} ] # List of ports diff --git a/docs/contrib/environment.md b/docs/contrib/environment.md index 221efdf03..8e0cf2572 100644 --- a/docs/contrib/environment.md +++ b/docs/contrib/environment.md @@ -466,7 +466,7 @@ This section involves configuring the log settings, including storage location, This section involves setting up additional configuration variables for Websocket, Push Notifications, and Chat. | Parameter | Example Value | Description | -| ----------------------- | ----------------- | ---------------------------------- | +|-------------------------|-------------------|------------------------------------| | WEBSOCKET_MAX_CONN_NUM | "100000" | Maximum Websocket connections | | WEBSOCKET_MAX_MSG_LEN | "4096" | Maximum Websocket message length | | WEBSOCKET_TIMEOUT | "10" | Websocket timeout | @@ -500,9 +500,9 @@ This section involves setting up additional configuration variables for Websocke | TOKEN_EXPIRE | "90" | Token Expiry Time | | FRIEND_VERIFY | "false" | Friend Verification Enable | | IOS_PUSH_SOUND | "xxx" | iOS | - - - +| CALLBACK_ENABLE | "true" | Enable callback | | | | +| CALLBACK_TIMEOUT | "5" | Maximum timeout for callback call | +| CALLBACK_FAILED_CONTINUE| "true" | fails to continue to the next step | ### 2.20. Prometheus Configuration This section involves configuring Prometheus, including enabling/disabling it and setting up ports for various services. diff --git a/internal/msggateway/callback.go b/internal/msggateway/callback.go index d7320a304..7d5381754 100644 --- a/internal/msggateway/callback.go +++ b/internal/msggateway/callback.go @@ -37,7 +37,7 @@ func CallbackUserOnline(ctx context.Context, userID string, platformID int, isAp req := cbapi.CallbackUserOnlineReq{ UserStatusCallbackReq: cbapi.UserStatusCallbackReq{ UserStatusBaseCallback: cbapi.UserStatusBaseCallback{ - CallbackCommand: constant.CallbackUserOnlineCommand, + CallbackCommand: cbapi.CallbackUserOnlineCommand, OperationID: mcontext.GetOperationID(ctx), PlatformID: platformID, Platform: constant.PlatformIDToName(platformID), @@ -49,7 +49,10 @@ func CallbackUserOnline(ctx context.Context, userID string, platformID int, isAp ConnID: connID, } resp := cbapi.CommonCallbackResp{} - return http.CallBackPostReturn(ctx, callBackURL(), &req, &resp, config.Config.Callback.CallbackUserOnline) + if err := http.CallBackPostReturn(ctx, callBackURL(), &req, &resp, config.Config.Callback.CallbackUserOnline); err != nil { + return err + } + return nil } func CallbackUserOffline(ctx context.Context, userID string, platformID int, connID string) error { @@ -59,7 +62,7 @@ func CallbackUserOffline(ctx context.Context, userID string, platformID int, con req := &cbapi.CallbackUserOfflineReq{ UserStatusCallbackReq: cbapi.UserStatusCallbackReq{ UserStatusBaseCallback: cbapi.UserStatusBaseCallback{ - CallbackCommand: constant.CallbackUserOfflineCommand, + CallbackCommand: cbapi.CallbackUserOfflineCommand, OperationID: mcontext.GetOperationID(ctx), PlatformID: platformID, Platform: constant.PlatformIDToName(platformID), @@ -70,7 +73,10 @@ func CallbackUserOffline(ctx context.Context, userID string, platformID int, con ConnID: connID, } resp := &cbapi.CallbackUserOfflineResp{} - return http.CallBackPostReturn(ctx, callBackURL(), req, resp, config.Config.Callback.CallbackUserOffline) + if err := http.CallBackPostReturn(ctx, callBackURL(), req, resp, config.Config.Callback.CallbackUserOffline); err != nil { + return err + } + return nil } func CallbackUserKickOff(ctx context.Context, userID string, platformID int) error { @@ -80,7 +86,7 @@ func CallbackUserKickOff(ctx context.Context, userID string, platformID int) err req := &cbapi.CallbackUserKickOffReq{ UserStatusCallbackReq: cbapi.UserStatusCallbackReq{ UserStatusBaseCallback: cbapi.UserStatusBaseCallback{ - CallbackCommand: constant.CallbackUserKickOffCommand, + CallbackCommand: cbapi.CallbackUserKickOffCommand, OperationID: mcontext.GetOperationID(ctx), PlatformID: platformID, Platform: constant.PlatformIDToName(platformID), @@ -90,7 +96,10 @@ func CallbackUserKickOff(ctx context.Context, userID string, platformID int) err Seq: time.Now().UnixMilli(), } resp := &cbapi.CommonCallbackResp{} - return http.CallBackPostReturn(ctx, callBackURL(), req, resp, config.Config.Callback.CallbackUserOffline) + if err := http.CallBackPostReturn(ctx, callBackURL(), req, resp, config.Config.Callback.CallbackUserOffline); err != nil { + return err + } + return nil } // func callbackUserOnline(operationID, userID string, platformID int, token string, isAppBackground bool, connID diff --git a/internal/push/callback.go b/internal/push/callback.go index c646df3e2..2085493c5 100644 --- a/internal/push/callback.go +++ b/internal/push/callback.go @@ -19,7 +19,6 @@ import ( "github.com/OpenIMSDK/protocol/constant" "github.com/OpenIMSDK/protocol/sdkws" - "github.com/OpenIMSDK/tools/errs" "github.com/OpenIMSDK/tools/mcontext" "github.com/OpenIMSDK/tools/utils" @@ -44,7 +43,7 @@ func callbackOfflinePush( req := &callbackstruct.CallbackBeforePushReq{ UserStatusBatchCallbackReq: callbackstruct.UserStatusBatchCallbackReq{ UserStatusBaseCallback: callbackstruct.UserStatusBaseCallback{ - CallbackCommand: constant.CallbackOfflinePushCommand, + CallbackCommand: callbackstruct.CallbackOfflinePushCommand, OperationID: mcontext.GetOperationID(ctx), PlatformID: int(msg.SenderPlatformID), Platform: constant.PlatformIDToName(int(msg.SenderPlatformID)), @@ -62,9 +61,6 @@ func callbackOfflinePush( } resp := &callbackstruct.CallbackBeforePushResp{} if err := http.CallBackPostReturn(ctx, url(), req, resp, config.Config.Callback.CallbackOfflinePush); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } if len(resp.UserIDs) != 0 { @@ -83,7 +79,7 @@ func callbackOnlinePush(ctx context.Context, userIDs []string, msg *sdkws.MsgDat req := callbackstruct.CallbackBeforePushReq{ UserStatusBatchCallbackReq: callbackstruct.UserStatusBatchCallbackReq{ UserStatusBaseCallback: callbackstruct.UserStatusBaseCallback{ - CallbackCommand: constant.CallbackOnlinePushCommand, + CallbackCommand: callbackstruct.CallbackOnlinePushCommand, OperationID: mcontext.GetOperationID(ctx), PlatformID: int(msg.SenderPlatformID), Platform: constant.PlatformIDToName(int(msg.SenderPlatformID)), @@ -99,7 +95,10 @@ func callbackOnlinePush(ctx context.Context, userIDs []string, msg *sdkws.MsgDat Content: GetContent(msg), } resp := &callbackstruct.CallbackBeforePushResp{} - return http.CallBackPostReturn(ctx, url(), req, resp, config.Config.Callback.CallbackOnlinePush) + if err := http.CallBackPostReturn(ctx, url(), req, resp, config.Config.Callback.CallbackOnlinePush); err != nil { + return err + } + return nil } func callbackBeforeSuperGroupOnlinePush( @@ -113,7 +112,7 @@ func callbackBeforeSuperGroupOnlinePush( } req := callbackstruct.CallbackBeforeSuperGroupOnlinePushReq{ UserStatusBaseCallback: callbackstruct.UserStatusBaseCallback{ - CallbackCommand: constant.CallbackSuperGroupOnlinePushCommand, + CallbackCommand: callbackstruct.CallbackSuperGroupOnlinePushCommand, OperationID: mcontext.GetOperationID(ctx), PlatformID: int(msg.SenderPlatformID), Platform: constant.PlatformIDToName(int(msg.SenderPlatformID)), @@ -129,11 +128,9 @@ func callbackBeforeSuperGroupOnlinePush( } resp := &callbackstruct.CallbackBeforeSuperGroupOnlinePushResp{} if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, req, resp, config.Config.Callback.CallbackBeforeSuperGroupOnlinePush); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } + return nil if len(resp.UserIDs) != 0 { *pushToUserIDs = resp.UserIDs } diff --git a/internal/rpc/friend/callback.go b/internal/rpc/friend/callback.go index bb687773e..d3b853ef9 100644 --- a/internal/rpc/friend/callback.go +++ b/internal/rpc/friend/callback.go @@ -16,12 +16,9 @@ package friend import ( "context" + "github.com/OpenIMSDK/tools/utils" - "github.com/OpenIMSDK/protocol/constant" pbfriend "github.com/OpenIMSDK/protocol/friend" - "github.com/OpenIMSDK/tools/errs" - "github.com/OpenIMSDK/tools/mcontext" - cbapi "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/http" @@ -32,17 +29,48 @@ func CallbackBeforeAddFriend(ctx context.Context, req *pbfriend.ApplyToAddFriend return nil } cbReq := &cbapi.CallbackBeforeAddFriendReq{ - CallbackCommand: constant.CallbackBeforeAddFriendCommand, + CallbackCommand: cbapi.CallbackBeforeAddFriendCommand, FromUserID: req.FromUserID, ToUserID: req.ToUserID, ReqMsg: req.ReqMsg, - OperationID: mcontext.GetOperationID(ctx), } resp := &cbapi.CallbackBeforeAddFriendResp{} if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeAddFriend); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } + return err + } + return nil +} + +func CallbackBeforeSetFriendRemark(ctx context.Context, req *pbfriend.SetFriendRemarkReq) error { + if !config.Config.Callback.CallbackBeforeSetFriendRemark.Enable { + return nil + } + cbReq := &cbapi.CallbackBeforeSetFriendRemarkReq{ + CallbackCommand: cbapi.CallbackBeforeSetFriendRemark, + OwnerUserID: req.OwnerUserID, + FriendUserID: req.FriendUserID, + Remark: req.Remark, + } + resp := &cbapi.CallbackBeforeSetFriendRemarkResp{} + if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeAddFriend); err != nil { + return err + } + utils.NotNilReplace(&req.Remark, &resp.Remark) + return nil +} + +func CallbackAfterSetFriendRemark(ctx context.Context, req *pbfriend.SetFriendRemarkReq) error { + if !config.Config.Callback.CallbackAfterSetFriendRemark.Enable { + return nil + } + cbReq := &cbapi.CallbackAfterSetFriendRemarkReq{ + CallbackCommand: cbapi.CallbackAfterSetFriendRemark, + OwnerUserID: req.OwnerUserID, + FriendUserID: req.FriendUserID, + Remark: req.Remark, + } + resp := &cbapi.CallbackAfterSetFriendRemarkResp{} + if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeAddFriend); err != nil { return err } return nil diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go index c563f77fe..24014ace1 100644 --- a/internal/rpc/friend/friend.go +++ b/internal/rpc/friend/friend.go @@ -217,6 +217,10 @@ func (s *friendServer) SetFriendRemark( req *pbfriend.SetFriendRemarkReq, ) (resp *pbfriend.SetFriendRemarkResp, err error) { defer log.ZInfo(ctx, utils.GetFuncName()+" Return") + + if err = CallbackBeforeSetFriendRemark(ctx, req); err != nil && err != errs.ErrCallbackContinue { + return nil, err + } resp = &pbfriend.SetFriendRemarkResp{} if err := s.userRpcClient.Access(ctx, req.OwnerUserID); err != nil { return nil, err @@ -228,6 +232,9 @@ func (s *friendServer) SetFriendRemark( if err := s.friendDatabase.UpdateRemark(ctx, req.OwnerUserID, req.FriendUserID, req.Remark); err != nil { return nil, err } + if err := CallbackAfterSetFriendRemark(ctx, req); err != nil && err != errs.ErrCallbackContinue { + return nil, err + } s.notificationSender.FriendRemarkSetNotification(ctx, req.OwnerUserID, req.FriendUserID) return resp, nil } diff --git a/internal/rpc/group/callback.go b/internal/rpc/group/callback.go index 38174738b..13f9737b5 100644 --- a/internal/rpc/group/callback.go +++ b/internal/rpc/group/callback.go @@ -21,10 +21,11 @@ import ( "github.com/OpenIMSDK/protocol/constant" "github.com/OpenIMSDK/protocol/group" "github.com/OpenIMSDK/protocol/wrapperspb" - "github.com/OpenIMSDK/tools/errs" "github.com/OpenIMSDK/tools/mcontext" "github.com/OpenIMSDK/tools/utils" + pbgroup "github.com/OpenIMSDK/protocol/group" + "github.com/openimsdk/open-im-server/v3/pkg/apistruct" "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct" "github.com/openimsdk/open-im-server/v3/pkg/common/config" @@ -37,7 +38,7 @@ func CallbackBeforeCreateGroup(ctx context.Context, req *group.CreateGroupReq) ( return nil } cbReq := &callbackstruct.CallbackBeforeCreateGroupReq{ - CallbackCommand: constant.CallbackBeforeCreateGroupCommand, + CallbackCommand: callbackstruct.CallbackBeforeCreateGroupCommand, OperationID: mcontext.GetOperationID(ctx), GroupInfo: req.GroupInfo, } @@ -58,17 +59,7 @@ func CallbackBeforeCreateGroup(ctx context.Context, req *group.CreateGroupReq) ( }) } resp := &callbackstruct.CallbackBeforeCreateGroupResp{} - err = http.CallBackPostReturn( - ctx, - config.Config.Callback.CallbackUrl, - cbReq, - resp, - config.Config.Callback.CallbackBeforeCreateGroup, - ) - if err != nil { - if err == errs.ErrCallbackContinue { - return nil - } + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeCreateGroup); err != nil { return err } utils.NotNilReplace(&req.GroupInfo.GroupID, resp.GroupID) @@ -86,6 +77,37 @@ func CallbackBeforeCreateGroup(ctx context.Context, req *group.CreateGroupReq) ( return nil } +func CallbackAfterCreateGroup(ctx context.Context, req *group.CreateGroupReq) (err error) { + if !config.Config.Callback.CallbackAfterCreateGroup.Enable { + return nil + } + cbReq := &callbackstruct.CallbackAfterCreateGroupReq{ + CallbackCommand: callbackstruct.CallbackAfterCreateGroupCommand, + GroupInfo: req.GroupInfo, + } + cbReq.InitMemberList = append(cbReq.InitMemberList, &apistruct.GroupAddMemberInfo{ + UserID: req.OwnerUserID, + RoleLevel: constant.GroupOwner, + }) + for _, userID := range req.AdminUserIDs { + cbReq.InitMemberList = append(cbReq.InitMemberList, &apistruct.GroupAddMemberInfo{ + UserID: userID, + RoleLevel: constant.GroupAdmin, + }) + } + for _, userID := range req.MemberUserIDs { + cbReq.InitMemberList = append(cbReq.InitMemberList, &apistruct.GroupAddMemberInfo{ + UserID: userID, + RoleLevel: constant.GroupOrdinaryUsers, + }) + } + resp := &callbackstruct.CallbackAfterCreateGroupResp{} + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackAfterCreateGroup); err != nil { + return err + } + return nil +} + func CallbackBeforeMemberJoinGroup( ctx context.Context, groupMember *relation.GroupMemberModel, @@ -95,25 +117,14 @@ func CallbackBeforeMemberJoinGroup( return nil } callbackReq := &callbackstruct.CallbackBeforeMemberJoinGroupReq{ - CallbackCommand: constant.CallbackBeforeMemberJoinGroupCommand, - OperationID: mcontext.GetOperationID(ctx), + CallbackCommand: callbackstruct.CallbackBeforeMemberJoinGroupCommand, GroupID: groupMember.GroupID, UserID: groupMember.UserID, Ex: groupMember.Ex, GroupEx: groupEx, } resp := &callbackstruct.CallbackBeforeMemberJoinGroupResp{} - err = http.CallBackPostReturn( - ctx, - config.Config.Callback.CallbackUrl, - callbackReq, - resp, - config.Config.Callback.CallbackBeforeMemberJoinGroup, - ) - if err != nil { - if err == errs.ErrCallbackContinue { - return nil - } + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, callbackReq, resp, config.Config.Callback.CallbackBeforeMemberJoinGroup); err != nil { return err } if resp.MuteEndTime != nil { @@ -131,8 +142,7 @@ func CallbackBeforeSetGroupMemberInfo(ctx context.Context, req *group.SetGroupMe return nil } callbackReq := callbackstruct.CallbackBeforeSetGroupMemberInfoReq{ - CallbackCommand: constant.CallbackBeforeSetGroupMemberInfoCommand, - OperationID: mcontext.GetOperationID(ctx), + CallbackCommand: callbackstruct.CallbackBeforeSetGroupMemberInfoCommand, GroupID: req.GroupID, UserID: req.UserID, } @@ -149,17 +159,7 @@ func CallbackBeforeSetGroupMemberInfo(ctx context.Context, req *group.SetGroupMe callbackReq.Ex = &req.Ex.Value } resp := &callbackstruct.CallbackBeforeSetGroupMemberInfoResp{} - err = http.CallBackPostReturn( - ctx, - config.Config.Callback.CallbackUrl, - callbackReq, - resp, - config.Config.Callback.CallbackBeforeSetGroupMemberInfo, - ) - if err != nil { - if err == errs.ErrCallbackContinue { - return nil - } + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, callbackReq, resp, config.Config.Callback.CallbackBeforeSetGroupMemberInfo); err != nil { return err } if resp.FaceURL != nil { @@ -176,3 +176,109 @@ func CallbackBeforeSetGroupMemberInfo(ctx context.Context, req *group.SetGroupMe } return nil } + +func CallbackAfterSetGroupMemberInfo(ctx context.Context, req *group.SetGroupMemberInfo) (err error) { + if !config.Config.Callback.CallbackBeforeSetGroupMemberInfo.Enable { + return nil + } + callbackReq := callbackstruct.CallbackAfterSetGroupMemberInfoReq{ + CallbackCommand: callbackstruct.CallbackBeforeSetGroupMemberInfoCommand, + GroupID: req.GroupID, + UserID: req.UserID, + } + if req.Nickname != nil { + callbackReq.Nickname = &req.Nickname.Value + } + if req.FaceURL != nil { + callbackReq.FaceURL = &req.FaceURL.Value + } + if req.RoleLevel != nil { + callbackReq.RoleLevel = &req.RoleLevel.Value + } + if req.Ex != nil { + callbackReq.Ex = &req.Ex.Value + } + resp := &callbackstruct.CallbackAfterSetGroupMemberInfoResp{} + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, callbackReq, resp, config.Config.Callback.CallbackBeforeSetGroupMemberInfo); err != nil { + return err + } + return nil +} + +func CallbackQuitGroup(ctx context.Context, req *group.QuitGroupReq) (err error) { + if !config.Config.Callback.CallbackQuitGroup.Enable { + return nil + } + cbReq := &callbackstruct.CallbackQuitGroupReq{ + CallbackCommand: callbackstruct.CallbackQuitGroupCommand, + GroupID: req.GroupID, + UserID: req.UserID, + } + resp := &callbackstruct.CallbackQuitGroupResp{} + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackQuitGroup); err != nil { + return err + } + return nil +} + +func CallbackKillGroupMember(ctx context.Context, req *pbgroup.KickGroupMemberReq) (err error) { + if !config.Config.Callback.CallbackKillGroupMember.Enable { + return nil + } + cbReq := &callbackstruct.CallbackKillGroupMemberReq{ + CallbackCommand: callbackstruct.CallbackKillGroupCommand, + GroupID: req.GroupID, + KickedUserIDs: req.KickedUserIDs, + } + resp := &callbackstruct.CallbackKillGroupMemberResp{} + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackQuitGroup); err != nil { + return err + } + return nil +} + +func CallbackDismissGroup(ctx context.Context, req *callbackstruct.CallbackDisMissGroupReq) (err error) { + if !config.Config.Callback.CallbackDismissGroup.Enable { + return nil + } + req.CallbackCommand = callbackstruct.CallbackDisMissGroupCommand + resp := &callbackstruct.CallbackDisMissGroupResp{} + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, req, resp, config.Config.Callback.CallbackQuitGroup); err != nil { + return err + } + return nil +} + +func CallbackApplyJoinGroupBefore(ctx context.Context, req *callbackstruct.CallbackJoinGroupReq) (err error) { + if !config.Config.Callback.CallbackBeforeJoinGroup.Enable { + return nil + } + + req.CallbackCommand = callbackstruct.CallbackBeforeJoinGroupCommand + + resp := &callbackstruct.CallbackJoinGroupResp{} + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, req, resp, config.Config.Callback.CallbackBeforeJoinGroup); err != nil { + return err + } + + return nil +} + +func CallbackTransferGroupOwnerAfter(ctx context.Context, req *pbgroup.TransferGroupOwnerReq) (err error) { + if !config.Config.Callback.CallbackTransferGroupOwnerAfter.Enable { + return nil + } + + cbReq := &callbackstruct.CallbackTransferGroupOwnerReq{ + CallbackCommand: callbackstruct.CallbackTransferGroupOwnerAfter, + GroupID: req.GroupID, + OldOwnerUserID: req.OldOwnerUserID, + NewOwnerUserID: req.NewOwnerUserID, + } + + resp := &callbackstruct.CallbackTransferGroupOwnerResp{} + if err = http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeJoinGroup); err != nil { + return err + } + return nil +} diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 85b78cfb2..227b7959d 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -26,6 +26,8 @@ import ( "strings" "time" + "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct" + "github.com/openimsdk/open-im-server/v3/pkg/authverify" "github.com/openimsdk/open-im-server/v3/pkg/msgprocessor" @@ -225,6 +227,7 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbgroup.CreateGroupR if len(userMap) != len(userIDs) { return nil, errs.ErrUserIDNotFound.Wrap("user not found") } + // Callback Before create Group if err := CallbackBeforeCreateGroup(ctx, req); err != nil { return nil, err } @@ -298,6 +301,17 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbgroup.CreateGroupR } s.Notification.GroupCreatedNotification(ctx, tips) } + reqCallBackAfter := &pbgroup.CreateGroupReq{ + MemberUserIDs: userIDs, + GroupInfo: resp.GroupInfo, + OwnerUserID: req.OwnerUserID, + AdminUserIDs: req.AdminUserIDs, + } + + if err := CallbackAfterCreateGroup(ctx, reqCallBackAfter); err != nil { + return nil, err + } + return resp, nil } @@ -606,6 +620,10 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbgroup.KickGrou if err := s.deleteMemberAndSetConversationSeq(ctx, req.GroupID, req.KickedUserIDs); err != nil { return nil, err } + + if err := CallbackKillGroupMember(ctx, req); err != nil { + return nil, err + } return resp, nil } @@ -816,6 +834,17 @@ func (s *groupServer) JoinGroup(ctx context.Context, req *pbgroup.JoinGroupReq) if group.Status == constant.GroupStatusDismissed { return nil, errs.ErrDismissedAlready.Wrap() } + + reqCall := &callbackstruct.CallbackJoinGroupReq{ + GroupID: req.GroupID, + GroupType: string(group.GroupType), + ApplyID: req.InviterUserID, + ReqMessage: req.ReqMessage, + } + + if err = CallbackApplyJoinGroupBefore(ctx, reqCall); err != nil { + return nil, err + } _, err = s.GroupDatabase.TakeGroupMember(ctx, req.GroupID, req.InviterUserID) if err == nil { return nil, errs.ErrArgs.Wrap("already in group") @@ -900,6 +929,10 @@ func (s *groupServer) QuitGroup(ctx context.Context, req *pbgroup.QuitGroupReq) return nil, err } + // callback + if err := CallbackQuitGroup(ctx, req); err != nil { + return nil, err + } return resp, nil } @@ -1031,6 +1064,10 @@ func (s *groupServer) TransferGroupOwner(ctx context.Context, req *pbgroup.Trans if err := s.GroupDatabase.TransferGroupOwner(ctx, req.GroupID, req.OldOwnerUserID, req.NewOwnerUserID, newOwner.RoleLevel); err != nil { return nil, err } + + if err := CallbackTransferGroupOwnerAfter(ctx, req); err != nil { + return nil, err + } s.Notification.GroupOwnerTransferredNotification(ctx, req) return resp, nil } @@ -1201,6 +1238,20 @@ func (s *groupServer) DismissGroup(ctx context.Context, req *pbgroup.DismissGrou s.Notification.GroupDismissedNotification(ctx, tips) } } + membersID, err := s.GroupDatabase.FindGroupMemberUserID(ctx, group.GroupID) + if err != nil { + return nil, err + } + reqCall := &callbackstruct.CallbackDisMissGroupReq{ + GroupID: req.GroupID, + OwnerID: owner.UserID, + MembersID: membersID, + GroupType: string(group.GroupType), + } + if err := CallbackDismissGroup(ctx, reqCall); err != nil { + return nil, err + } + return resp, nil } @@ -1439,6 +1490,12 @@ func (s *groupServer) SetGroupMemberInfo(ctx context.Context, req *pbgroup.SetGr } } } + for i := 0; i < len(req.Members); i++ { + if err := CallbackAfterSetGroupMemberInfo(ctx, req.Members[i]); err != nil { + return nil, err + } + } + return resp, nil } diff --git a/internal/rpc/msg/as_read.go b/internal/rpc/msg/as_read.go index 3311fa5b7..49113aa0b 100644 --- a/internal/rpc/msg/as_read.go +++ b/internal/rpc/msg/as_read.go @@ -16,6 +16,7 @@ package msg import ( "context" + cbapi "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct" utils2 "github.com/OpenIMSDK/tools/utils" @@ -164,6 +165,15 @@ func (m *msgServer) updateReadStatus(ctx context.Context, req *msg.MarkConversat return err } } + reqCall := &cbapi.CallbackGroupMsgReadReq{ + SendID: conversation.OwnerUserID, + ReceiveID: req.UserID, + UnreadMsgNum: req.HasReadSeq, + ContentType: int64(conversation.ConversationType), + } + if err := CallbackGroupMsgRead(ctx, reqCall); err != nil { + return err + } if req.HasReadSeq > hasReadSeq { if err := m.MsgDatabase.SetHasReadSeq(ctx, req.UserID, req.ConversationID, req.HasReadSeq); err != nil { diff --git a/internal/rpc/msg/callback.go b/internal/rpc/msg/callback.go index 68586ba85..85c002bf3 100644 --- a/internal/rpc/msg/callback.go +++ b/internal/rpc/msg/callback.go @@ -16,13 +16,11 @@ package msg import ( "context" - "github.com/OpenIMSDK/protocol/sdkws" "google.golang.org/protobuf/proto" "github.com/OpenIMSDK/protocol/constant" pbchat "github.com/OpenIMSDK/protocol/msg" - "github.com/OpenIMSDK/tools/errs" "github.com/OpenIMSDK/tools/log" "github.com/OpenIMSDK/tools/mcontext" "github.com/OpenIMSDK/tools/utils" @@ -74,14 +72,11 @@ func callbackBeforeSendSingleMsg(ctx context.Context, msg *pbchat.SendMsgReq) er return nil } req := &cbapi.CallbackBeforeSendSingleMsgReq{ - CommonCallbackReq: toCommonCallback(ctx, msg, constant.CallbackBeforeSendSingleMsgCommand), + CommonCallbackReq: toCommonCallback(ctx, msg, cbapi.CallbackBeforeSendSingleMsgCommand), RecvID: msg.MsgData.RecvID, } resp := &cbapi.CallbackBeforeSendSingleMsgResp{} if err := http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackBeforeSendSingleMsg); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } return nil @@ -92,14 +87,11 @@ func callbackAfterSendSingleMsg(ctx context.Context, msg *pbchat.SendMsgReq) err return nil } req := &cbapi.CallbackAfterSendSingleMsgReq{ - CommonCallbackReq: toCommonCallback(ctx, msg, constant.CallbackAfterSendSingleMsgCommand), + CommonCallbackReq: toCommonCallback(ctx, msg, cbapi.CallbackAfterSendSingleMsgCommand), RecvID: msg.MsgData.RecvID, } resp := &cbapi.CallbackAfterSendSingleMsgResp{} if err := http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackAfterSendSingleMsg); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } return nil @@ -110,14 +102,11 @@ func callbackBeforeSendGroupMsg(ctx context.Context, msg *pbchat.SendMsgReq) err return nil } req := &cbapi.CallbackAfterSendGroupMsgReq{ - CommonCallbackReq: toCommonCallback(ctx, msg, constant.CallbackBeforeSendGroupMsgCommand), + CommonCallbackReq: toCommonCallback(ctx, msg, cbapi.CallbackBeforeSendGroupMsgCommand), GroupID: msg.MsgData.GroupID, } resp := &cbapi.CallbackBeforeSendGroupMsgResp{} if err := http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackBeforeSendGroupMsg); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } return nil @@ -128,14 +117,11 @@ func callbackAfterSendGroupMsg(ctx context.Context, msg *pbchat.SendMsgReq) erro return nil } req := &cbapi.CallbackAfterSendGroupMsgReq{ - CommonCallbackReq: toCommonCallback(ctx, msg, constant.CallbackAfterSendGroupMsgCommand), + CommonCallbackReq: toCommonCallback(ctx, msg, cbapi.CallbackAfterSendGroupMsgCommand), GroupID: msg.MsgData.GroupID, } resp := &cbapi.CallbackAfterSendGroupMsgResp{} if err := http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackAfterSendGroupMsg); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } return nil @@ -146,13 +132,10 @@ func callbackMsgModify(ctx context.Context, msg *pbchat.SendMsgReq) error { return nil } req := &cbapi.CallbackMsgModifyCommandReq{ - CommonCallbackReq: toCommonCallback(ctx, msg, constant.CallbackMsgModifyCommand), + CommonCallbackReq: toCommonCallback(ctx, msg, cbapi.CallbackMsgModifyCommand), } resp := &cbapi.CallbackMsgModifyCommandResp{} if err := http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackMsgModify); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } if resp.Content != nil { @@ -177,3 +160,30 @@ func callbackMsgModify(ctx context.Context, msg *pbchat.SendMsgReq) error { log.ZDebug(ctx, "callbackMsgModify", "msg", msg.MsgData) return nil } + +func CallbackGroupMsgRead(ctx context.Context, req *cbapi.CallbackGroupMsgReadReq) error { + if !config.Config.Callback.CallbackGroupMsgRead.Enable || req.ContentType != constant.Text { + return nil + } + req.CallbackCommand = cbapi.CallbackGroupMsgReadCommand + + resp := &cbapi.CallbackGroupMsgReadResp{} + if err := http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackMsgModify); err != nil { + return err + } + return nil +} + +func CallbackSingleMsgRead(ctx context.Context, req *cbapi.CallbackSingleMsgReadReq) error { + if !config.Config.Callback.CallbackSingleMsgRead.Enable || req.ContentType != constant.Text { + return nil + } + req.CallbackCommand = cbapi.CallbackSingleMsgRead + + resp := &cbapi.CallbackGroupMsgReadResp{} + + if err := http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackMsgModify); err != nil { + return err + } + return nil +} diff --git a/internal/rpc/user/callback.go b/internal/rpc/user/callback.go index 8f6ceef23..01de2734d 100644 --- a/internal/rpc/user/callback.go +++ b/internal/rpc/user/callback.go @@ -16,11 +16,7 @@ package user import ( "context" - - "github.com/OpenIMSDK/protocol/constant" pbuser "github.com/OpenIMSDK/protocol/user" - "github.com/OpenIMSDK/tools/errs" - "github.com/OpenIMSDK/tools/mcontext" "github.com/OpenIMSDK/tools/utils" cbapi "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct" @@ -33,17 +29,13 @@ func CallbackBeforeUpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserInf return nil } cbReq := &cbapi.CallbackBeforeUpdateUserInfoReq{ - CallbackCommand: constant.CallbackBeforeUpdateUserInfoCommand, - OperationID: mcontext.GetOperationID(ctx), + CallbackCommand: cbapi.CallbackBeforeUpdateUserInfoCommand, UserID: req.UserInfo.UserID, FaceURL: &req.UserInfo.FaceURL, Nickname: &req.UserInfo.Nickname, } resp := &cbapi.CallbackBeforeUpdateUserInfoResp{} if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeUpdateUserInfo); err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } utils.NotNilReplace(&req.UserInfo.FaceURL, resp.FaceURL) @@ -51,3 +43,57 @@ func CallbackBeforeUpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserInf utils.NotNilReplace(&req.UserInfo.Nickname, resp.Nickname) return nil } + +func CallbackAfterUpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserInfoReq) error { + if !config.Config.Callback.CallbackAfterUpdateUserInfo.Enable { + return nil + } + cbReq := &cbapi.CallbackAfterUpdateUserInfoReq{ + CallbackCommand: cbapi.CallbackAfterUpdateUserInfoCommand, + UserID: req.UserInfo.UserID, + FaceURL: req.UserInfo.FaceURL, + Nickname: req.UserInfo.Nickname, + } + resp := &cbapi.CallbackAfterUpdateUserInfoResp{} + if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeUpdateUserInfo); err != nil { + return err + } + return nil +} + +func CallbackBeforeUserRegister(ctx context.Context, req *pbuser.UserRegisterReq) error { + if !config.Config.Callback.CallbackBeforeUserRegister.Enable { + return nil + } + cbReq := &cbapi.CallbackBeforeUserRegisterReq{ + CallbackCommand: cbapi.CallbackBeforeUserRegisterCommand, + Secret: req.Secret, + Users: req.Users, + } + + resp := &cbapi.CallbackBeforeUserRegisterResp{} + if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeUpdateUserInfo); err != nil { + return err + } + if len(resp.Users) != 0 { + req.Users = resp.Users + } + return nil +} + +func CallbackAfterUserRegister(ctx context.Context, req *pbuser.UserRegisterReq) error { + if !config.Config.Callback.CallbackAfterUserRegister.Enable { + return nil + } + cbReq := &cbapi.CallbackAfterUserRegisterReq{ + CallbackCommand: cbapi.CallbackAfterUserRegisterCommand, + Secret: req.Secret, + Users: req.Users, + } + + resp := &cbapi.CallbackBeforeUserRegisterResp{} + if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, cbReq, resp, config.Config.Callback.CallbackBeforeUpdateUserInfo); err != nil { + return err + } + return nil +} diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index f2ceb3beb..f4164dbf2 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -139,6 +139,9 @@ func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserI for _, friendID := range friends { s.friendNotificationSender.FriendInfoUpdatedNotification(ctx, req.UserInfo.UserID, friendID) } + if err := CallbackAfterUpdateUserInfo(ctx, req); err != nil { + return nil, err + } if err := s.groupRpcClient.NotificationUserInfoUpdate(ctx, req.UserInfo.UserID); err != nil { log.ZError(ctx, "NotificationUserInfoUpdate", err, "userID", req.UserInfo.UserID) } @@ -230,6 +233,9 @@ func (s *userServer) UserRegister(ctx context.Context, req *pbuser.UserRegisterR if exist { return nil, errs.ErrRegisteredAlready.Wrap("userID registered already") } + if err := CallbackBeforeUserRegister(ctx, req); err != nil { + return nil, err + } now := time.Now() users := make([]*tablerelation.UserModel, 0, len(req.Users)) for _, user := range req.Users { @@ -246,6 +252,10 @@ func (s *userServer) UserRegister(ctx context.Context, req *pbuser.UserRegisterR if err := s.Create(ctx, users); err != nil { return nil, err } + + if err := CallbackAfterUserRegister(ctx, req); err != nil { + return nil, err + } return resp, nil } diff --git a/pkg/callbackstruct/common.go b/pkg/callbackstruct/common.go index ef84d52b9..c58b9e415 100644 --- a/pkg/callbackstruct/common.go +++ b/pkg/callbackstruct/common.go @@ -14,8 +14,10 @@ package callbackstruct -import ( - "github.com/OpenIMSDK/tools/errs" +import "github.com/OpenIMSDK/tools/errs" + +const ( + Next = 1 ) type CommonCallbackReq struct { @@ -51,14 +53,15 @@ type CallbackResp interface { } type CommonCallbackResp struct { - ActionCode int `json:"actionCode"` + ActionCode int32 `json:"actionCode"` ErrCode int32 `json:"errCode"` ErrMsg string `json:"errMsg"` ErrDlt string `json:"errDlt"` + NextCode int32 `json:"nextCode"` } func (c CommonCallbackResp) Parse() error { - if c.ActionCode != errs.NoError || c.ErrCode != errs.NoError { + if c.ActionCode != errs.NoError || c.NextCode == Next { return errs.NewCodeError(int(c.ErrCode), c.ErrMsg).WithDetail(c.ErrDlt) } return nil diff --git a/pkg/callbackstruct/constant.go b/pkg/callbackstruct/constant.go new file mode 100644 index 000000000..f029e3713 --- /dev/null +++ b/pkg/callbackstruct/constant.go @@ -0,0 +1,33 @@ +package callbackstruct + +const ( + CallbackQuitGroupCommand = "callbackQuitGroupCommand" + CallbackKillGroupCommand = "callbackKillGroupCommand" + CallbackDisMissGroupCommand = "callbackDisMissGroupCommand" + CallbackBeforeJoinGroupCommand = "callbackBeforeJoinGroupCommand" + CallbackGroupMsgReadCommand = "callbackGroupMsgReadCommand" + CallbackMsgModifyCommand = "callbackMsgModifyCommand" + CallbackAfterUpdateUserInfoCommand = "callbackAfterUpdateUserInfoCommand" + CallbackBeforeUserRegisterCommand = "callbackBeforeUserRegisterCommand" + CallbackAfterUserRegisterCommand = "callbackAfterUserRegisterCommand" + CallbackTransferGroupOwnerAfter = "callbackTransferGroupOwnerAfter" + CallbackBeforeSetFriendRemark = "callbackBeforeSetFriendRemark" + CallbackAfterSetFriendRemark = "callbackAfterSetFriendRemark" + CallbackSingleMsgRead = "callbackSingleMsgRead" + CallbackBeforeSendSingleMsgCommand = "callbackBeforeSendSingleMsgCommand" + CallbackAfterSendSingleMsgCommand = "callbackAfterSendSingleMsgCommand" + CallbackBeforeSendGroupMsgCommand = "callbackBeforeSendGroupMsgCommand" + CallbackAfterSendGroupMsgCommand = "callbackAfterSendGroupMsgCommand" + CallbackUserOnlineCommand = "callbackUserOnlineCommand" + CallbackUserOfflineCommand = "callbackUserOfflineCommand" + CallbackUserKickOffCommand = "callbackUserKickOffCommand" + CallbackOfflinePushCommand = "callbackOfflinePushCommand" + CallbackOnlinePushCommand = "callbackOnlinePushCommand" + CallbackSuperGroupOnlinePushCommand = "callbackSuperGroupOnlinePushCommand" + CallbackBeforeAddFriendCommand = "callbackBeforeAddFriendCommand" + CallbackBeforeUpdateUserInfoCommand = "callbackBeforeUpdateUserInfoCommand" + CallbackBeforeCreateGroupCommand = "callbackBeforeCreateGroupCommand" + CallbackAfterCreateGroupCommand = "callbackAfterCreateGroupCommand" + CallbackBeforeMemberJoinGroupCommand = "callbackBeforeMemberJoinGroupCommand" + CallbackBeforeSetGroupMemberInfoCommand = "CallbackBeforeSetGroupMemberInfoCommand" +) diff --git a/pkg/callbackstruct/friend.go b/pkg/callbackstruct/friend.go index 7e89824e2..ebbd08b19 100644 --- a/pkg/callbackstruct/friend.go +++ b/pkg/callbackstruct/friend.go @@ -19,9 +19,52 @@ type CallbackBeforeAddFriendReq struct { FromUserID string `json:"fromUserID" ` ToUserID string `json:"toUserID"` ReqMsg string `json:"reqMsg"` - OperationID string `json:"operationID"` } type CallbackBeforeAddFriendResp struct { CommonCallbackResp } + +type CallBackAddFriendReplyBeforeReq struct { + CallbackCommand `json:"callbackCommand"` + FromUserID string `json:"fromUserID" ` + ToUserID string `json:"toUserID"` +} + +type CallBackAddFriendReplyBeforeResp struct { + CommonCallbackResp +} + +type CallbackAfterAddFriendReq struct { + CallbackCommand `json:"callbackCommand"` + FromUserID string `json:"fromUserID" ` + ToUserID string `json:"toUserID"` + ReqMsg string `json:"reqMsg"` +} + +type CallbackAfterAddFriendResp struct { + CommonCallbackResp +} + +type CallbackBeforeSetFriendRemarkReq struct { + CallbackCommand `json:"callbackCommand"` + OwnerUserID string `json:"ownerUserID"` + FriendUserID string `json:"friendUserID"` + Remark string `json:"remark"` +} + +type CallbackBeforeSetFriendRemarkResp struct { + CommonCallbackResp + Remark string `json:"remark"` +} + +type CallbackAfterSetFriendRemarkReq struct { + CallbackCommand `json:"callbackCommand"` + OwnerUserID string `json:"ownerUserID"` + FriendUserID string `json:"friendUserID"` + Remark string `json:"remark"` +} + +type CallbackAfterSetFriendRemarkResp struct { + CommonCallbackResp +} diff --git a/pkg/callbackstruct/group.go b/pkg/callbackstruct/group.go index 11b33bf0a..79e02ba0f 100644 --- a/pkg/callbackstruct/group.go +++ b/pkg/callbackstruct/group.go @@ -50,9 +50,18 @@ type CallbackBeforeCreateGroupResp struct { ApplyMemberFriend *int32 `json:"applyMemberFriend"` } +type CallbackAfterCreateGroupReq struct { + CallbackCommand `json:"callbackCommand"` + *common.GroupInfo + InitMemberList []*apistruct.GroupAddMemberInfo `json:"initMemberList"` +} + +type CallbackAfterCreateGroupResp struct { + CommonCallbackResp +} + type CallbackBeforeMemberJoinGroupReq struct { CallbackCommand `json:"callbackCommand"` - OperationID string `json:"operationID"` GroupID string `json:"groupID"` UserID string `json:"userID"` Ex string `json:"ex"` @@ -70,7 +79,6 @@ type CallbackBeforeMemberJoinGroupResp struct { type CallbackBeforeSetGroupMemberInfoReq struct { CallbackCommand `json:"callbackCommand"` - OperationID string `json:"operationID"` GroupID string `json:"groupID"` UserID string `json:"userID"` Nickname *string `json:"nickName"` @@ -86,3 +94,123 @@ type CallbackBeforeSetGroupMemberInfoResp struct { FaceURL *string `json:"faceURL"` RoleLevel *int32 `json:"roleLevel"` } + +type CallbackAfterSetGroupMemberInfoReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + UserID string `json:"userID"` + Nickname *string `json:"nickName"` + FaceURL *string `json:"faceURL"` + RoleLevel *int32 `json:"roleLevel"` + Ex *string `json:"ex"` +} + +type CallbackAfterSetGroupMemberInfoResp struct { + CommonCallbackResp +} + +type CallbackAfterGroupMemberExitReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + UserID string `json:"userID"` + GroupType *int32 `json:"groupType"` + ExitType string `json:"exitType"` +} + +type CallbackAfterGroupMemberExitResp struct { + CommonCallbackResp +} + +type CallbackAfterUngroupReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + GroupType *int32 `json:"groupType"` + OwnerID string `json:"ownerID"` + MemberList []string `json:"memberList"` +} + +type CallbackAfterUngroupResp struct { + CommonCallbackResp +} + +type CallbackAfterSetGroupInfoReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + GroupType *int32 `json:"groupType"` + UserID string `json:"userID"` + Name string `json:"name"` + Notification string `json:"notification"` + GroupUrl string `json:"groupUrl"` +} + +type CallbackAfterSetGroupInfoResp struct { + CommonCallbackResp +} + +type CallbackAfterRevokeMsgReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + GroupType *int32 `json:"groupType"` + UserID string `json:"userID"` + Content string `json:"content"` +} + +type CallbackAfterRevokeMsgResp struct { + CommonCallbackResp +} + +type CallbackQuitGroupReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + UserID string `json:"userID"` +} + +type CallbackQuitGroupResp struct { + CommonCallbackResp +} + +type CallbackKillGroupMemberReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + KickedUserIDs []string `json:"kickedUserIDs"` + Reason string `json:"reason"` +} + +type CallbackKillGroupMemberResp struct { + CommonCallbackResp +} + +type CallbackDisMissGroupReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + OwnerID string `json:"ownerID"` + GroupType string `json:"groupType"` + MembersID []string `json:"membersID"` +} + +type CallbackDisMissGroupResp struct { + CommonCallbackResp +} + +type CallbackJoinGroupReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + GroupType string `json:"groupType"` + ApplyID string `json:"applyID"` + ReqMessage string `json:"reqMessage"` +} + +type CallbackJoinGroupResp struct { + CommonCallbackResp +} + +type CallbackTransferGroupOwnerReq struct { + CallbackCommand `json:"callbackCommand"` + GroupID string `json:"groupID"` + OldOwnerUserID string `json:"oldOwnerUserID"` + NewOwnerUserID string `json:"newOwnerUserID"` +} + +type CallbackTransferGroupOwnerResp struct { + CommonCallbackResp +} diff --git a/pkg/callbackstruct/message.go b/pkg/callbackstruct/message.go index f404088e8..3adee618b 100644 --- a/pkg/callbackstruct/message.go +++ b/pkg/callbackstruct/message.go @@ -79,3 +79,46 @@ type CallbackMsgModifyCommandResp struct { AttachedInfo *string `json:"attachedInfo"` Ex *string `json:"ex"` } + +type CallbackSendGroupMsgErrorReq struct { + CommonCallbackReq + GroupID string `json:"groupID"` +} + +type CallbackSendGroupMsgErrorResp struct { + CommonCallbackResp +} + +type CallbackSingleMsgRevokeReq struct { + CallbackCommand `json:"callbackCommand"` + SendID string `json:"sendID"` + ReceiveID string `json:"receiveID"` + Content string `json:"content"` +} + +type CallbackSingleMsgRevokeResp struct { + CommonCallbackResp +} + +type CallbackGroupMsgReadReq struct { + CallbackCommand `json:"callbackCommand"` + SendID string `json:"sendID"` + ReceiveID string `json:"receiveID"` + UnreadMsgNum int64 `json:"unreadMsgNum"` + ContentType int64 `json:"contentType"` +} + +type CallbackGroupMsgReadResp struct { + CommonCallbackResp +} + +type CallbackSingleMsgReadReq struct { + CallbackCommand `json:"callbackCommand"` + SendID string `json:"sendID"` + ReceiveID string `json:"receiveID"` + ContentType int64 `json:"contentType"` +} + +type CallbackSingleMsgReadResp struct { + CommonCallbackResp +} diff --git a/pkg/callbackstruct/user.go b/pkg/callbackstruct/user.go index f01f4ca8a..f35cff554 100644 --- a/pkg/callbackstruct/user.go +++ b/pkg/callbackstruct/user.go @@ -14,9 +14,10 @@ package callbackstruct +import "github.com/OpenIMSDK/protocol/sdkws" + type CallbackBeforeUpdateUserInfoReq struct { CallbackCommand `json:"callbackCommand"` - OperationID string `json:"operationID"` UserID string `json:"userID"` Nickname *string `json:"nickName"` FaceURL *string `json:"faceURL"` @@ -28,3 +29,35 @@ type CallbackBeforeUpdateUserInfoResp struct { FaceURL *string `json:"faceURL"` Ex *string `json:"ex"` } + +type CallbackAfterUpdateUserInfoReq struct { + CallbackCommand `json:"callbackCommand"` + UserID string `json:"userID"` + Nickname string `json:"nickName"` + FaceURL string `json:"faceURL"` + Ex string `json:"ex"` +} +type CallbackAfterUpdateUserInfoResp struct { + CommonCallbackResp +} + +type CallbackBeforeUserRegisterReq struct { + CallbackCommand `json:"callbackCommand"` + Secret string `json:"secret"` + Users []*sdkws.UserInfo `json:"users"` +} + +type CallbackBeforeUserRegisterResp struct { + CommonCallbackResp + Users []*sdkws.UserInfo `json:"users"` +} + +type CallbackAfterUserRegisterReq struct { + CallbackCommand `json:"callbackCommand"` + Secret string `json:"secret"` + Users []*sdkws.UserInfo `json:"users"` +} + +type CallbackAfterUserRegisterResp struct { + CommonCallbackResp +} diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index 1e9df7813..6d7658468 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -254,6 +254,8 @@ type configStruct struct { CallbackBeforeSendGroupMsg CallBackConfig `yaml:"beforeSendGroupMsg"` CallbackAfterSendGroupMsg CallBackConfig `yaml:"afterSendGroupMsg"` CallbackMsgModify CallBackConfig `yaml:"msgModify"` + CallbackSingleMsgRead CallBackConfig `yaml:"singleMsgRead"` + CallbackGroupMsgRead CallBackConfig `yaml:"groupMsgRead"` CallbackUserOnline CallBackConfig `yaml:"userOnline"` CallbackUserOffline CallBackConfig `yaml:"userOffline"` CallbackUserKickOff CallBackConfig `yaml:"userKickOff"` @@ -261,10 +263,21 @@ type configStruct struct { CallbackOnlinePush CallBackConfig `yaml:"onlinePush"` CallbackBeforeSuperGroupOnlinePush CallBackConfig `yaml:"superGroupOnlinePush"` CallbackBeforeAddFriend CallBackConfig `yaml:"beforeAddFriend"` + CallbackBeforeSetFriendRemark CallBackConfig `yaml:"callbackBeforeSetFriendRemark"` + CallbackAfterSetFriendRemark CallBackConfig `yaml:"callbackAfterSetFriendRemark"` CallbackBeforeUpdateUserInfo CallBackConfig `yaml:"beforeUpdateUserInfo"` + CallbackBeforeUserRegister CallBackConfig `yaml:"beforeUserRegister"` + CallbackAfterUpdateUserInfo CallBackConfig `yaml:"updateUserInfo"` + CallbackAfterUserRegister CallBackConfig `yaml:"afterUserRegister"` CallbackBeforeCreateGroup CallBackConfig `yaml:"beforeCreateGroup"` + CallbackAfterCreateGroup CallBackConfig `yaml:"afterCreateGroup"` CallbackBeforeMemberJoinGroup CallBackConfig `yaml:"beforeMemberJoinGroup"` CallbackBeforeSetGroupMemberInfo CallBackConfig `yaml:"beforeSetGroupMemberInfo"` + CallbackQuitGroup CallBackConfig `yaml:"quitGroup"` + CallbackKillGroupMember CallBackConfig `yaml:"killGroupMember"` + CallbackDismissGroup CallBackConfig `yaml:"dismissGroup"` + CallbackBeforeJoinGroup CallBackConfig `yaml:"joinGroup"` + CallbackTransferGroupOwnerAfter CallBackConfig `yaml:"transferGroupOwner"` } `yaml:"callback"` Prometheus struct { diff --git a/pkg/common/http/http_client.go b/pkg/common/http/http_client.go index e0cedf357..f0fde3099 100644 --- a/pkg/common/http/http_client.go +++ b/pkg/common/http/http_client.go @@ -20,7 +20,6 @@ import ( "encoding/json" "io" "net/http" - urllib "net/url" "time" "github.com/OpenIMSDK/protocol/constant" @@ -107,17 +106,18 @@ func PostReturn(ctx context.Context, url string, header map[string]string, input } func callBackPostReturn(ctx context.Context, url, command string, input interface{}, output callbackstruct.CallbackResp, callbackConfig config.CallBackConfig) error { - defer log.ZDebug(ctx, "callback", "url", url, "command", command, "input", input, "callbackConfig", callbackConfig) - - v := urllib.Values{} - v.Set(constant.CallbackCommand, command) - url = url + "?" + v.Encode() + defer log.ZDebug(ctx, "callback", "url", url, "command", command, "input", input, "output", output, "callbackConfig", callbackConfig) + // + //v := urllib.Values{} + //v.Set(constant.CallbackCommand, command) + //url = url + "/" + v.Encode() + url = url + "/" + command b, err := Post(ctx, url, nil, input, callbackConfig.CallbackTimeOut) if err != nil { if callbackConfig.CallbackFailedContinue != nil && *callbackConfig.CallbackFailedContinue { log.ZWarn(ctx, "callback failed but continue", err, "url", url) - return errs.ErrCallbackContinue + return nil } return errs.ErrNetwork.Wrap(err.Error()) } @@ -125,7 +125,7 @@ func callBackPostReturn(ctx context.Context, url, command string, input interfac if err = json.Unmarshal(b, output); err != nil { if callbackConfig.CallbackFailedContinue != nil && *callbackConfig.CallbackFailedContinue { log.ZWarn(ctx, "callback failed but continue", err, "url", url) - return errs.ErrCallbackContinue + return nil } return errs.ErrData.Wrap(err.Error()) } diff --git a/scripts/install/environment.sh b/scripts/install/environment.sh index 6a87b44a6..aa4141a7d 100755 --- a/scripts/install/environment.sh +++ b/scripts/install/environment.sh @@ -376,6 +376,10 @@ def "FRIEND_VERIFY" "false" # 朋友验证 def "IOS_PUSH_SOUND" "xxx" # IOS推送声音 def "IOS_BADGE_COUNT" "true" # IOS徽章计数 def "IOS_PRODUCTION" "false" # IOS生产 +# callback 配置 +def "CALLBACK_ENABLE" "true" # 是否开启 Callback +def "CALLBACK_TIMEOUT" "5" # 最长超时时间 +def "CALLBACK_FAILED_CONTINUE" "true" # 失败后是否继续 ###################### Prometheus 配置信息 ###################### # 是否启用 Prometheus