Files
open-im-server/internal/rpc/group/group.go
T

1968 lines
89 KiB
Go
Raw Normal View History

2021-06-28 15:36:09 +08:00
package group
import (
2023-01-05 11:33:17 +08:00
"Open_IM/internal/rpc/fault_tolerant"
2021-12-23 18:29:39 +08:00
chat "Open_IM/internal/rpc/msg"
"Open_IM/pkg/common/config"
"Open_IM/pkg/common/constant"
"Open_IM/pkg/common/db"
imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
2022-08-30 01:38:23 +08:00
rocksCache "Open_IM/pkg/common/db/rocks_cache"
"Open_IM/pkg/common/log"
2022-09-15 01:22:20 +08:00
promePkg "Open_IM/pkg/common/prometheus"
2021-12-22 15:24:49 +08:00
"Open_IM/pkg/common/token_verify"
2023-01-04 11:06:28 +08:00
"Open_IM/pkg/common/trace_log"
2021-12-30 10:56:17 +08:00
cp "Open_IM/pkg/common/utils"
2023-01-04 10:12:20 +08:00
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
"github.com/OpenIMSDK/getcdv3"
2022-05-07 11:14:29 +08:00
pbCache "Open_IM/pkg/proto/cache"
2022-06-07 17:45:07 +08:00
pbConversation "Open_IM/pkg/proto/conversation"
2021-10-11 22:00:38 +08:00
pbGroup "Open_IM/pkg/proto/group"
2022-04-20 18:47:21 +08:00
pbUser "Open_IM/pkg/proto/user"
"Open_IM/pkg/utils"
2021-06-28 15:36:09 +08:00
"context"
2022-08-30 14:17:40 +08:00
"errors"
2022-11-22 11:07:20 +08:00
"fmt"
2022-06-10 13:32:40 +08:00
"math/big"
2021-12-22 15:24:49 +08:00
"net"
"strconv"
"strings"
"time"
2022-08-30 01:38:23 +08:00
2022-09-15 16:27:36 +08:00
grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
2022-08-30 01:38:23 +08:00
"google.golang.org/grpc"
2022-12-16 16:54:18 +08:00
"google.golang.org/protobuf/types/known/wrapperspb"
2022-08-30 14:17:40 +08:00
"gorm.io/gorm"
2021-06-28 15:36:09 +08:00
)
2021-12-22 15:24:49 +08:00
type groupServer struct {
rpcPort int
rpcRegisterName string
etcdSchema string
etcdAddr []string
}
func NewGroupServer(port int) *groupServer {
2022-03-31 11:15:06 +08:00
log.NewPrivateLog(constant.LogFileName)
2021-12-22 15:24:49 +08:00
return &groupServer{
rpcPort: port,
rpcRegisterName: config.Config.RpcRegisterName.OpenImGroupName,
etcdSchema: config.Config.Etcd.EtcdSchema,
etcdAddr: config.Config.Etcd.EtcdAddr,
}
}
2021-12-24 15:02:47 +08:00
2021-12-22 15:24:49 +08:00
func (s *groupServer) Run() {
2022-03-29 11:48:17 +08:00
log.NewInfo("", "group rpc start ")
2022-05-07 17:05:05 +08:00
listenIP := ""
if config.Config.ListenIP == "" {
listenIP = "0.0.0.0"
} else {
listenIP = config.Config.ListenIP
}
address := listenIP + ":" + strconv.Itoa(s.rpcPort)
2021-12-22 15:24:49 +08:00
//listener network
2022-05-07 17:05:05 +08:00
listener, err := net.Listen("tcp", address)
2021-12-22 15:24:49 +08:00
if err != nil {
2022-05-10 09:09:37 +08:00
panic("listening err:" + err.Error() + s.rpcRegisterName)
2021-12-22 15:24:49 +08:00
}
2022-05-07 17:05:05 +08:00
log.NewInfo("", "listen network success, ", address, listener)
2021-12-22 15:24:49 +08:00
defer listener.Close()
//grpc server
2022-08-01 17:44:40 +08:00
recvSize := 1024 * 1024 * constant.GroupRPCRecvSize
sendSize := 1024 * 1024 * constant.GroupRPCSendSize
2022-09-15 19:55:24 +08:00
var grpcOpts = []grpc.ServerOption{
2022-08-01 11:52:43 +08:00
grpc.MaxRecvMsgSize(recvSize),
grpc.MaxSendMsgSize(sendSize),
}
2022-09-15 01:22:20 +08:00
if config.Config.Prometheus.Enable {
2022-09-15 08:45:10 +08:00
promePkg.NewGrpcRequestCounter()
promePkg.NewGrpcRequestFailedCounter()
promePkg.NewGrpcRequestSuccessCounter()
2022-09-15 16:27:36 +08:00
grpcOpts = append(grpcOpts, []grpc.ServerOption{
2022-09-15 16:39:49 +08:00
// grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme),
2022-09-15 16:27:36 +08:00
grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor),
grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor),
}...)
2022-09-15 01:22:20 +08:00
}
2022-09-15 19:55:24 +08:00
srv := grpc.NewServer(grpcOpts...)
2021-12-22 15:24:49 +08:00
defer srv.GracefulStop()
//Service registers with etcd
pbGroup.RegisterGroupServer(srv, s)
2022-05-07 17:05:05 +08:00
2022-05-11 12:20:28 +08:00
rpcRegisterIP := config.Config.RpcRegisterIP
2022-06-23 09:24:05 +08:00
if config.Config.RpcRegisterIP == "" {
2022-05-07 17:05:05 +08:00
rpcRegisterIP, err = utils.GetLocalIP()
if err != nil {
log.Error("", "GetLocalIP failed ", err.Error())
}
}
2022-05-29 19:44:22 +08:00
log.NewInfo("", "rpcRegisterIP", rpcRegisterIP)
2023-01-04 15:51:02 +08:00
err = getcdv3.RegisterEtcd(s.etcdSchema, strings.Join(s.etcdAddr, ","), rpcRegisterIP, s.rpcPort, s.rpcRegisterName, 10, "")
2021-12-22 15:24:49 +08:00
if err != nil {
2022-03-29 11:48:17 +08:00
log.NewError("", "RegisterEtcd failed ", err.Error())
2022-08-26 17:41:58 +08:00
panic(utils.Wrap(err, "register group module rpc to etcd err"))
2021-12-22 15:24:49 +08:00
}
2022-05-11 12:13:17 +08:00
log.Info("", "RegisterEtcd ", s.etcdSchema, strings.Join(s.etcdAddr, ","), rpcRegisterIP, s.rpcPort, s.rpcRegisterName)
2021-12-22 15:24:49 +08:00
err = srv.Serve(listener)
if err != nil {
2022-03-29 11:48:17 +08:00
log.NewError("", "Serve failed ", err.Error())
2021-12-22 15:24:49 +08:00
return
}
2022-03-29 11:48:17 +08:00
log.NewInfo("", "group rpc success")
2021-12-22 15:24:49 +08:00
}
func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupReq) (*pbGroup.CreateGroupResp, error) {
2021-12-23 17:22:49 +08:00
log.NewInfo(req.OperationID, "CreateGroup, args ", req.String())
2021-12-26 18:47:11 +08:00
if !token_verify.CheckAccess(req.OpUserID, req.OwnerUserID) {
log.NewError(req.OperationID, "CheckAccess false ", req.OpUserID, req.OwnerUserID)
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
2021-12-22 15:24:49 +08:00
}
2022-10-21 15:44:55 +08:00
callbackResp := callbackBeforeCreateGroup(req)
if callbackResp.ErrCode != 0 {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg resp: ", callbackResp)
}
if callbackResp.ActionCode != constant.ActionAllow {
if callbackResp.ErrCode == 0 {
callbackResp.ErrCode = 201
}
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg result", "end rpc and return", callbackResp)
return &pbGroup.CreateGroupResp{
ErrCode: int32(callbackResp.ErrCode),
ErrMsg: callbackResp.ErrMsg,
}, nil
}
groupId := req.GroupInfo.GroupID
if groupId == "" {
2022-06-10 13:32:40 +08:00
groupId = utils.Md5(req.OperationID + strconv.FormatInt(time.Now().UnixNano(), 10))
bi := big.NewInt(0)
bi.SetString(groupId[0:8], 16)
groupId = bi.String()
}
2021-12-24 15:02:47 +08:00
//to group
2023-01-04 17:22:55 +08:00
groupInfo := imdb.Group{}
2021-12-27 21:08:42 +08:00
utils.CopyStructFields(&groupInfo, req.GroupInfo)
2021-12-28 11:57:12 +08:00
groupInfo.CreatorUserID = req.OpUserID
2022-01-18 21:42:27 +08:00
groupInfo.GroupID = groupId
2022-09-13 15:27:00 +08:00
groupInfo.CreateTime = time.Now()
2022-07-14 13:44:36 +08:00
if groupInfo.NotificationUpdateTime.Unix() < 0 {
groupInfo.NotificationUpdateTime = utils.UnixSecondToTime(0)
}
2022-05-27 16:13:44 +08:00
err := imdb.InsertIntoGroup(groupInfo)
2021-12-22 15:24:49 +08:00
if err != nil {
2021-12-28 11:57:12 +08:00
log.NewError(req.OperationID, "InsertIntoGroup failed, ", err.Error(), groupInfo)
2022-08-30 01:45:41 +08:00
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
2021-12-22 15:24:49 +08:00
}
2021-12-28 11:57:12 +08:00
var okUserIDList []string
2022-05-27 18:40:24 +08:00
resp := &pbGroup.CreateGroupResp{GroupInfo: &open_im_sdk.GroupInfo{}}
2023-01-04 17:22:55 +08:00
groupMember := imdb.GroupMember{}
us := &imdb.User{}
2022-05-27 18:40:24 +08:00
if req.OwnerUserID != "" {
2022-11-22 11:07:20 +08:00
var userIDList []string
for _, v := range req.InitMemberList {
userIDList = append(userIDList, v.UserID)
}
userIDList = append(userIDList, req.OwnerUserID)
if err := s.DelGroupAndUserCache(req.OperationID, "", userIDList); err != nil {
log.NewError(req.OperationID, "DelGroupAndUserCache failed, ", err.Error(), userIDList)
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}, nil
}
2022-05-27 16:13:44 +08:00
us, err = imdb.GetUserByUserID(req.OwnerUserID)
if err != nil {
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), req.OwnerUserID)
2022-08-30 01:45:41 +08:00
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
2021-12-23 17:22:49 +08:00
}
2022-05-27 16:13:44 +08:00
//to group member
2023-01-04 17:22:55 +08:00
groupMember = imdb.GroupMember{GroupID: groupId, RoleLevel: constant.GroupOwner, OperatorUserID: req.OpUserID, JoinSource: constant.JoinByInvitation, InviterUserID: req.OpUserID}
2021-12-27 21:08:42 +08:00
utils.CopyStructFields(&groupMember, us)
2022-11-22 11:07:20 +08:00
callbackResp := CallbackBeforeMemberJoinGroup(req.OperationID, &groupMember, groupInfo.Ex)
if callbackResp.ErrCode != 0 {
2022-12-01 19:34:54 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), "CallbackBeforeMemberJoinGroup resp: ", callbackResp)
2022-11-22 11:07:20 +08:00
}
if callbackResp.ActionCode != constant.ActionAllow {
if callbackResp.ErrCode == 0 {
callbackResp.ErrCode = 201
}
2022-12-01 19:34:54 +08:00
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CallbackBeforeMemberJoinGroup result", "end rpc and return", callbackResp)
2022-11-22 11:07:20 +08:00
return &pbGroup.CreateGroupResp{
ErrCode: int32(callbackResp.ErrCode),
ErrMsg: callbackResp.ErrMsg,
}, nil
}
2021-12-31 10:57:45 +08:00
err = imdb.InsertIntoGroupMember(groupMember)
2021-12-22 15:24:49 +08:00
if err != nil {
2021-12-27 21:08:42 +08:00
log.NewError(req.OperationID, "InsertIntoGroupMember failed ", err.Error(), groupMember)
2022-08-30 01:45:41 +08:00
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
2021-12-22 15:24:49 +08:00
}
2022-05-27 18:40:24 +08:00
}
2022-05-27 18:40:24 +08:00
if req.GroupInfo.GroupType != constant.SuperGroup {
2022-05-27 16:13:44 +08:00
//to group member
for _, user := range req.InitMemberList {
2022-08-08 11:30:10 +08:00
us, err := rocksCache.GetUserInfoFromCache(user.UserID)
2022-05-27 16:13:44 +08:00
if err != nil {
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), user.UserID)
continue
}
if user.RoleLevel == constant.GroupOwner {
log.NewError(req.OperationID, "only one owner, failed ", user)
continue
}
groupMember.RoleLevel = user.RoleLevel
2022-07-12 19:24:06 +08:00
groupMember.JoinSource = constant.JoinByInvitation
groupMember.InviterUserID = req.OpUserID
2022-05-27 16:13:44 +08:00
utils.CopyStructFields(&groupMember, us)
2022-11-22 11:07:20 +08:00
callbackResp := CallbackBeforeMemberJoinGroup(req.OperationID, &groupMember, groupInfo.Ex)
if callbackResp.ErrCode != 0 {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg resp: ", callbackResp)
}
if callbackResp.ActionCode != constant.ActionAllow {
if callbackResp.ErrCode == 0 {
callbackResp.ErrCode = 201
}
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg result", "end rpc and return", callbackResp)
continue
}
2022-05-27 16:13:44 +08:00
err = imdb.InsertIntoGroupMember(groupMember)
if err != nil {
log.NewError(req.OperationID, "InsertIntoGroupMember failed ", err.Error(), groupMember)
continue
}
okUserIDList = append(okUserIDList, user.UserID)
}
2022-08-08 11:30:10 +08:00
group, err := rocksCache.GetGroupInfoFromCache(groupId)
2022-05-27 16:13:44 +08:00
if err != nil {
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), groupId)
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = err.Error()
return resp, nil
}
utils.CopyStructFields(resp.GroupInfo, group)
2022-08-08 11:30:10 +08:00
memberCount, err := rocksCache.GetGroupMemberNumFromCache(groupId)
2022-07-14 12:08:28 +08:00
resp.GroupInfo.MemberCount = uint32(memberCount)
2022-05-27 16:13:44 +08:00
if err != nil {
log.NewError(req.OperationID, "GetGroupMemberNumByGroupID failed ", err.Error(), groupId)
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = err.Error()
return resp, nil
}
if req.OwnerUserID != "" {
resp.GroupInfo.OwnerUserID = req.OwnerUserID
okUserIDList = append(okUserIDList, req.OwnerUserID)
}
2022-07-29 14:36:07 +08:00
// superGroup stored in mongodb
2022-05-27 18:40:24 +08:00
} else {
2022-05-27 16:13:44 +08:00
for _, v := range req.InitMemberList {
okUserIDList = append(okUserIDList, v.UserID)
}
2022-05-27 18:40:24 +08:00
if err := db.DB.CreateSuperGroup(groupId, okUserIDList, len(okUserIDList)); err != nil {
log.NewError(req.OperationID, "GetGroupMemberNumByGroupID failed ", err.Error(), groupId)
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = err.Error() + ": CreateSuperGroup failed"
2022-07-29 14:36:07 +08:00
return resp, nil
}
2022-07-20 18:12:39 +08:00
}
if len(okUserIDList) != 0 {
log.NewInfo(req.OperationID, "rpc CreateGroup return ", resp.String())
2022-05-27 18:40:24 +08:00
if req.GroupInfo.GroupType != constant.SuperGroup {
chat.GroupCreatedNotification(req.OperationID, req.OpUserID, groupId, okUserIDList)
2022-05-30 15:10:26 +08:00
} else {
2022-07-29 14:36:07 +08:00
for _, userID := range okUserIDList {
if err := rocksCache.DelJoinedSuperGroupIDListFromCache(userID); err != nil {
log.NewWarn(req.OperationID, utils.GetSelfFuncName(), userID, err.Error())
}
}
2022-06-21 14:54:42 +08:00
go func() {
for _, v := range okUserIDList {
chat.SuperGroupNotification(req.OperationID, v, v)
}
}()
2022-05-27 18:40:24 +08:00
}
return resp, nil
} else {
log.NewInfo(req.OperationID, "rpc CreateGroup return ", resp.String())
return resp, nil
}
2021-12-22 15:24:49 +08:00
}
2021-06-28 15:36:09 +08:00
func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (*pbGroup.GetJoinedGroupListResp, error) {
2021-12-23 17:22:49 +08:00
log.NewInfo(req.OperationID, "GetJoinedGroupList, args ", req.String())
if !token_verify.CheckAccess(req.OpUserID, req.FromUserID) {
log.NewError(req.OperationID, "CheckAccess false ", req.OpUserID, req.FromUserID)
2021-12-26 18:47:11 +08:00
return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
2021-06-28 15:36:09 +08:00
}
2022-07-14 12:08:28 +08:00
joinedGroupList, err := rocksCache.GetJoinedGroupIDListFromCache(req.FromUserID)
2021-06-28 15:36:09 +08:00
if err != nil {
2022-07-14 12:08:28 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetJoinedGroupIDListFromCache failed", err.Error(), req.FromUserID)
2021-12-26 18:47:11 +08:00
return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
2021-06-28 15:36:09 +08:00
}
2022-07-20 12:05:57 +08:00
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "joinedGroupList: ", joinedGroupList)
2021-06-28 15:36:09 +08:00
var resp pbGroup.GetJoinedGroupListResp
for _, v := range joinedGroupList {
2021-12-23 17:22:49 +08:00
var groupNode open_im_sdk.GroupInfo
2022-08-08 11:30:10 +08:00
num, err := rocksCache.GetGroupMemberNumFromCache(v)
2022-07-20 15:49:21 +08:00
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), v)
continue
}
2021-12-27 21:08:42 +08:00
owner, err2 := imdb.GetGroupOwnerInfoByGroupID(v)
2022-07-20 15:49:21 +08:00
if err2 != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err2.Error(), v)
2021-12-23 17:22:49 +08:00
continue
2021-06-28 15:36:09 +08:00
}
2022-07-14 12:08:28 +08:00
group, err := rocksCache.GetGroupInfoFromCache(v)
2022-07-20 15:49:21 +08:00
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), v)
2021-12-23 17:22:49 +08:00
continue
2021-06-28 15:36:09 +08:00
}
2022-08-16 19:54:04 +08:00
if group.GroupType == constant.SuperGroup {
continue
}
2022-07-20 15:49:21 +08:00
if group.Status == constant.GroupStatusDismissed {
log.NewError(req.OperationID, "constant.GroupStatusDismissed ", group)
continue
}
utils.CopyStructFields(&groupNode, group)
groupNode.CreateTime = uint32(group.CreateTime.Unix())
groupNode.NotificationUpdateTime = uint32(group.NotificationUpdateTime.Unix())
if group.NotificationUpdateTime.Unix() < 0 {
groupNode.NotificationUpdateTime = 0
}
groupNode.MemberCount = uint32(num)
groupNode.OwnerUserID = owner.UserID
resp.GroupList = append(resp.GroupList, &groupNode)
2021-12-23 17:22:49 +08:00
log.NewDebug(req.OperationID, "joinedGroup ", groupNode)
2021-06-28 15:36:09 +08:00
}
2021-12-28 11:57:12 +08:00
log.NewInfo(req.OperationID, "GetJoinedGroupList rpc return ", resp.String())
2021-06-28 15:36:09 +08:00
return &resp, nil
}
func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.InviteUserToGroupReq) (*pbGroup.InviteUserToGroupResp, error) {
2021-12-23 17:22:49 +08:00
log.NewInfo(req.OperationID, "InviteUserToGroup args ", req.String())
2022-04-16 20:10:10 +08:00
if !imdb.IsExistGroupMember(req.GroupID, req.OpUserID) && !token_verify.IsManagerUserID(req.OpUserID) {
2021-12-23 17:22:49 +08:00
log.NewError(req.OperationID, "no permission InviteUserToGroup ", req.GroupID, req.OpUserID)
2021-12-22 15:24:49 +08:00
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
2021-07-15 11:16:24 +08:00
}
2022-04-18 10:53:23 +08:00
groupInfo, err := imdb.GetGroupInfoByGroupID(req.GroupID)
2021-12-28 11:57:12 +08:00
if err != nil {
2021-12-29 18:04:24 +08:00
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", req.GroupID, err)
2022-07-28 18:14:58 +08:00
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}, nil
2022-04-18 10:53:23 +08:00
}
if groupInfo.Status == constant.GroupStatusDismissed {
errMsg := " group status is dismissed "
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrStatus.ErrCode, ErrMsg: errMsg}, nil
}
2022-06-23 18:56:52 +08:00
var resp pbGroup.InviteUserToGroupResp
if groupInfo.NeedVerification == constant.AllNeedVerification &&
!imdb.IsGroupOwnerAdmin(req.GroupID, req.OpUserID) && !token_verify.IsManagerUserID(req.OpUserID) {
var resp pbGroup.InviteUserToGroupResp
joinReq := pbGroup.JoinGroupReq{}
for _, v := range req.InvitedUserIDList {
2023-01-04 17:22:55 +08:00
var groupRequest imdb.GroupRequest
2022-06-23 18:56:52 +08:00
groupRequest.UserID = v
groupRequest.GroupID = req.GroupID
2022-07-12 19:24:06 +08:00
groupRequest.JoinSource = constant.JoinByInvitation
groupRequest.InviterUserID = req.OpUserID
2022-06-23 18:56:52 +08:00
err = imdb.InsertIntoGroupRequest(groupRequest)
if err != nil {
var resultNode pbGroup.Id2Result
resultNode.Result = -1
resultNode.UserID = v
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
continue
2022-08-30 01:38:23 +08:00
// log.NewError(req.OperationID, "InsertIntoGroupRequest failed ", err.Error(), groupRequest)
2022-06-23 18:56:52 +08:00
// return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
} else {
var resultNode pbGroup.Id2Result
resultNode.Result = 0
resultNode.UserID = v
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
joinReq.GroupID = req.GroupID
joinReq.OperationID = req.OperationID
joinReq.OpUserID = v
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
chat.JoinGroupApplicationNotification(&joinReq)
}
}
log.NewInfo(req.OperationID, "InviteUserToGroup rpc return ", resp)
return &resp, nil
}
2022-11-22 11:07:20 +08:00
if err := s.DelGroupAndUserCache(req.OperationID, req.GroupID, req.InvitedUserIDList); err != nil {
log.NewError(req.OperationID, "DelGroupAndUserCache failed", err.Error())
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}, nil
}
2021-06-28 15:36:09 +08:00
//from User: invite: applicant
//to user: invite: invited
2021-12-24 15:02:47 +08:00
var okUserIDList []string
2022-05-27 18:40:24 +08:00
if groupInfo.GroupType != constant.SuperGroup {
for _, v := range req.InvitedUserIDList {
var resultNode pbGroup.Id2Result
resultNode.UserID = v
resultNode.Result = 0
toUserInfo, err := imdb.GetUserByUserID(v)
if err != nil {
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), v)
resultNode.Result = -1
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
continue
}
2021-07-15 11:16:24 +08:00
2022-05-27 18:40:24 +08:00
if imdb.IsExistGroupMember(req.GroupID, v) {
log.NewError(req.OperationID, "IsExistGroupMember ", req.GroupID, v)
resultNode.Result = -1
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
continue
}
2023-01-04 17:22:55 +08:00
var toInsertInfo imdb.GroupMember
2022-05-27 18:40:24 +08:00
utils.CopyStructFields(&toInsertInfo, toUserInfo)
toInsertInfo.GroupID = req.GroupID
toInsertInfo.RoleLevel = constant.GroupOrdinaryUsers
toInsertInfo.OperatorUserID = req.OpUserID
2022-07-12 19:24:06 +08:00
toInsertInfo.InviterUserID = req.OpUserID
toInsertInfo.JoinSource = constant.JoinByInvitation
2022-11-22 11:07:20 +08:00
callbackResp := CallbackBeforeMemberJoinGroup(req.OperationID, &toInsertInfo, groupInfo.Ex)
if callbackResp.ErrCode != 0 {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg resp: ", callbackResp)
}
if callbackResp.ActionCode != constant.ActionAllow {
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg result", "end rpc and return", callbackResp)
continue
}
2022-05-27 18:40:24 +08:00
err = imdb.InsertIntoGroupMember(toInsertInfo)
if err != nil {
log.NewError(req.OperationID, "InsertIntoGroupMember failed ", req.GroupID, toUserInfo.UserID, toUserInfo.Nickname, toUserInfo.FaceURL)
resultNode.Result = -1
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
continue
}
okUserIDList = append(okUserIDList, v)
err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UserID)
if err != nil {
log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), req.GroupID, toUserInfo.UserID)
}
2021-12-23 17:22:49 +08:00
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
2021-06-28 15:36:09 +08:00
}
2022-05-27 18:40:24 +08:00
} else {
okUserIDList = req.InvitedUserIDList
if err := db.DB.AddUserToSuperGroup(req.GroupID, req.InvitedUserIDList); err != nil {
log.NewError(req.OperationID, "AddUserToSuperGroup failed ", req.GroupID, err)
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}, nil
2022-04-21 16:46:48 +08:00
}
2022-05-27 18:40:24 +08:00
}
2022-12-02 18:39:15 +08:00
// set conversations
var haveConUserID []string
var sessionType int
if groupInfo.GroupType == constant.NormalGroup {
sessionType = constant.GroupChatType
} else {
sessionType = constant.SuperGroupChatType
}
conversations, err := imdb.GetConversationsByConversationIDMultipleOwner(okUserIDList, utils.GetConversationIDBySessionType(req.GroupID, sessionType))
if err != nil {
2022-12-05 15:49:08 +08:00
log.NewError(req.OperationID, "GetConversationsByConversationIDMultipleOwner failed ", err.Error(), req.GroupID, sessionType)
2022-12-02 18:39:15 +08:00
}
for _, v := range conversations {
haveConUserID = append(haveConUserID, v.OwnerUserID)
}
var reqPb pbUser.SetConversationReq
var c pbConversation.Conversation
for _, v := range conversations {
reqPb.OperationID = req.OperationID
c.OwnerUserID = v.OwnerUserID
2022-12-05 15:49:08 +08:00
c.ConversationID = utils.GetConversationIDBySessionType(req.GroupID, sessionType)
2022-12-02 18:39:15 +08:00
c.RecvMsgOpt = v.RecvMsgOpt
2022-12-05 15:49:08 +08:00
c.ConversationType = int32(sessionType)
2022-12-02 18:39:15 +08:00
c.GroupID = req.GroupID
c.IsPinned = v.IsPinned
c.AttachedInfo = v.AttachedInfo
c.IsPrivateChat = v.IsPrivateChat
c.GroupAtType = v.GroupAtType
c.IsNotInGroup = false
c.Ex = v.Ex
reqPb.Conversation = &c
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
if etcdConn == nil {
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
log.NewError(req.OperationID, errMsg)
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrInternal.ErrCode, ErrMsg: errMsg}, nil
}
client := pbUser.NewUserClient(etcdConn)
respPb, err := client.SetConversation(context.Background(), &reqPb)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error(), v.OwnerUserID)
} else {
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "SetConversation success", respPb.String(), v.OwnerUserID)
}
}
for _, v := range utils.DifferenceString(haveConUserID, okUserIDList) {
reqPb.OperationID = req.OperationID
c.OwnerUserID = v
2022-12-05 11:30:54 +08:00
c.ConversationID = utils.GetConversationIDBySessionType(req.GroupID, sessionType)
2022-12-05 15:49:08 +08:00
c.ConversationType = int32(sessionType)
2022-12-02 18:39:15 +08:00
c.GroupID = req.GroupID
c.IsNotInGroup = false
c.UpdateUnreadCountTime = utils.GetCurrentTimestampByMill()
reqPb.Conversation = &c
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
if etcdConn == nil {
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
log.NewError(req.OperationID, errMsg)
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrInternal.ErrCode, ErrMsg: errMsg}, nil
}
client := pbUser.NewUserClient(etcdConn)
respPb, err := client.SetConversation(context.Background(), &reqPb)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error(), v)
} else {
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "SetConversation success", respPb.String(), v)
}
}
2022-05-27 18:40:24 +08:00
if groupInfo.GroupType != constant.SuperGroup {
chat.MemberInvitedNotification(req.OperationID, req.GroupID, req.OpUserID, req.Reason, okUserIDList)
2022-05-30 15:10:26 +08:00
} else {
2022-07-29 14:36:07 +08:00
for _, v := range req.InvitedUserIDList {
if err := rocksCache.DelJoinedSuperGroupIDListFromCache(v); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error())
}
}
2022-08-26 11:39:01 +08:00
for _, v := range req.InvitedUserIDList {
chat.SuperGroupNotification(req.OperationID, v, v)
}
2022-05-27 18:40:24 +08:00
}
2022-06-23 18:56:52 +08:00
log.NewInfo(req.OperationID, "InviteUserToGroup rpc return ", resp)
return &resp, nil
2021-06-28 15:36:09 +08:00
}
func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGroupAllMemberReq) (*pbGroup.GetGroupAllMemberResp, error) {
2021-12-23 17:22:49 +08:00
log.NewInfo(req.OperationID, "GetGroupAllMember, args ", req.String())
2021-06-28 15:36:09 +08:00
var resp pbGroup.GetGroupAllMemberResp
2022-07-14 12:08:28 +08:00
groupInfo, err := rocksCache.GetGroupInfoFromCache(req.GroupID)
2021-06-28 15:36:09 +08:00
if err != nil {
2022-05-27 18:40:24 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
2021-12-26 18:47:11 +08:00
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = constant.ErrDB.ErrMsg
2021-06-28 15:36:09 +08:00
return &resp, nil
}
2022-05-27 18:40:24 +08:00
if groupInfo.GroupType != constant.SuperGroup {
2022-08-04 17:20:33 +08:00
memberList, err := rocksCache.GetGroupMembersInfoFromCache(req.Count, req.Offset, req.GroupID)
2022-05-27 18:40:24 +08:00
if err != nil {
2022-07-14 12:08:28 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
2022-05-27 18:40:24 +08:00
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = constant.ErrDB.ErrMsg
return &resp, nil
}
for _, v := range memberList {
var node open_im_sdk.GroupMemberFullInfo
2022-07-14 12:08:28 +08:00
cp.GroupMemberDBCopyOpenIM(&node, v)
2022-05-27 18:40:24 +08:00
resp.MemberList = append(resp.MemberList, &node)
}
2021-12-23 17:22:49 +08:00
}
2022-08-04 19:08:08 +08:00
log.NewInfo(req.OperationID, "GetGroupAllMember rpc return ", len(resp.MemberList))
2021-06-28 15:36:09 +08:00
return &resp, nil
}
func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGroupMemberListReq) (*pbGroup.GetGroupMemberListResp, error) {
2021-12-30 16:30:13 +08:00
log.NewInfo(req.OperationID, "GetGroupMemberList args ", req.String())
2021-06-28 15:36:09 +08:00
var resp pbGroup.GetGroupMemberListResp
2021-12-27 21:08:42 +08:00
memberList, err := imdb.GetGroupMemberByGroupID(req.GroupID, req.Filter, req.NextSeq, 30)
2021-06-28 15:36:09 +08:00
if err != nil {
2021-12-26 18:47:11 +08:00
resp.ErrCode = constant.ErrDB.ErrCode
2021-12-28 11:57:12 +08:00
resp.ErrMsg = constant.ErrDB.ErrMsg
2021-12-23 17:22:49 +08:00
log.NewError(req.OperationID, "GetGroupMemberByGroupId failed,", req.GroupID, req.Filter, req.NextSeq, 30)
2021-06-28 15:36:09 +08:00
return &resp, nil
}
for _, v := range memberList {
2021-12-23 17:22:49 +08:00
var node open_im_sdk.GroupMemberFullInfo
2021-12-30 16:30:13 +08:00
utils.CopyStructFields(&node, &v)
2021-06-28 15:36:09 +08:00
resp.MemberList = append(resp.MemberList, &node)
}
//db operate get db sorted by join time
if int32(len(memberList)) < 30 {
resp.NextSeq = 0
} else {
resp.NextSeq = req.NextSeq + int32(len(memberList))
}
2021-12-22 15:24:49 +08:00
resp.ErrCode = 0
2021-12-24 16:02:21 +08:00
log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp.String())
2021-06-28 15:36:09 +08:00
return &resp, nil
}
2022-06-06 23:19:07 +08:00
func (s *groupServer) getGroupUserLevel(groupID, userID string) (int, error) {
opFlag := 0
if !token_verify.IsManagerUserID(userID) {
opInfo, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(groupID, userID)
if err != nil {
return opFlag, utils.Wrap(err, "")
}
if opInfo.RoleLevel == constant.GroupOrdinaryUsers {
opFlag = 0
} else if opInfo.RoleLevel == constant.GroupOwner {
opFlag = 2 //owner
} else {
opFlag = 3 //admin
}
} else {
opFlag = 1 //app manager
}
return opFlag, nil
}
2021-06-28 15:36:09 +08:00
func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGroupMemberReq) (*pbGroup.KickGroupMemberResp, error) {
2022-06-06 23:19:07 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
2022-08-09 16:38:33 +08:00
groupInfo, err := rocksCache.GetGroupInfoFromCache(req.GroupID)
2021-06-28 15:36:09 +08:00
if err != nil {
2022-05-27 18:40:24 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetGroupInfoByGroupID", req.GroupID, err.Error())
2021-12-30 14:03:55 +08:00
return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
2021-06-28 15:36:09 +08:00
}
2022-05-27 18:40:24 +08:00
var okUserIDList []string
var resp pbGroup.KickGroupMemberResp
if groupInfo.GroupType != constant.SuperGroup {
2022-06-06 23:19:07 +08:00
opFlag := 0
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-08-09 16:38:33 +08:00
opInfo, err := rocksCache.GetGroupMemberInfoFromCache(req.GroupID, req.OpUserID)
2022-06-06 23:19:07 +08:00
if err != nil {
errMsg := req.OperationID + " GetGroupMemberInfoByGroupIDAndUserID failed " + err.Error() + req.GroupID + req.OpUserID
log.Error(req.OperationID, errMsg)
return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
2022-05-27 18:40:24 +08:00
}
2022-06-06 23:19:07 +08:00
if opInfo.RoleLevel == constant.GroupOrdinaryUsers {
errMsg := req.OperationID + " opInfo.RoleLevel == constant.GroupOrdinaryUsers " + opInfo.UserID + opInfo.GroupID
log.Error(req.OperationID, errMsg)
return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
} else if opInfo.RoleLevel == constant.GroupOwner {
opFlag = 2 //owner
} else {
opFlag = 3 //admin
2022-05-27 18:40:24 +08:00
}
2022-06-06 23:19:07 +08:00
} else {
opFlag = 1 //app manager
2021-09-22 20:10:38 +08:00
}
2022-06-06 23:19:07 +08:00
//op is group owner?
2022-05-27 18:40:24 +08:00
if len(req.KickedUserIDList) == 0 {
log.NewError(req.OperationID, "failed, kick list 0")
return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrArgs.ErrCode, ErrMsg: constant.ErrArgs.ErrMsg}, nil
}
2022-11-22 11:07:20 +08:00
if err := s.DelGroupAndUserCache(req.OperationID, req.GroupID, req.KickedUserIDList); err != nil {
log.NewError(req.OperationID, "DelGroupAndUserCache failed", err.Error())
return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}, nil
}
2022-05-27 18:40:24 +08:00
//remove
for _, v := range req.KickedUserIDList {
2022-08-09 16:38:33 +08:00
kickedInfo, err := rocksCache.GetGroupMemberInfoFromCache(req.GroupID, v)
2022-06-06 23:19:07 +08:00
if err != nil {
log.NewError(req.OperationID, " GetGroupMemberInfoByGroupIDAndUserID failed ", req.GroupID, v, err.Error())
resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
continue
}
if kickedInfo.RoleLevel == constant.GroupAdmin && opFlag == 3 {
log.Error(req.OperationID, "is constant.GroupAdmin, can't kicked ", v)
2022-05-27 18:40:24 +08:00
resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
continue
}
2022-06-06 23:19:07 +08:00
if kickedInfo.RoleLevel == constant.GroupOwner && opFlag != 1 {
log.NewDebug(req.OperationID, "is constant.GroupOwner, can't kicked ", v)
resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
continue
}
2022-08-12 18:37:51 +08:00
err = imdb.DeleteGroupMemberByGroupIDAndUserID(req.GroupID, v)
2022-05-27 18:40:24 +08:00
if err != nil {
log.NewError(req.OperationID, "RemoveGroupMember failed ", err.Error(), req.GroupID, v)
resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
} else {
log.NewDebug(req.OperationID, "kicked ", v)
resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: 0})
okUserIDList = append(okUserIDList, v)
}
2021-06-28 15:36:09 +08:00
}
2022-05-27 18:40:24 +08:00
var reqPb pbUser.SetConversationReq
2022-08-21 23:37:43 +08:00
var c pbConversation.Conversation
2022-05-27 18:40:24 +08:00
for _, v := range okUserIDList {
reqPb.OperationID = req.OperationID
c.OwnerUserID = v
c.ConversationID = utils.GetConversationIDBySessionType(req.GroupID, constant.GroupChatType)
c.ConversationType = constant.GroupChatType
c.GroupID = req.GroupID
c.IsNotInGroup = true
reqPb.Conversation = &c
2022-08-17 12:12:54 +08:00
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
2022-06-16 14:51:36 +08:00
if etcdConn == nil {
2022-08-17 12:12:54 +08:00
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
2022-06-16 14:51:36 +08:00
log.NewError(req.OperationID, errMsg)
resp.ErrCode = constant.ErrInternal.ErrCode
resp.ErrMsg = errMsg
return &resp, nil
}
2022-05-27 18:40:24 +08:00
client := pbUser.NewUserClient(etcdConn)
respPb, err := client.SetConversation(context.Background(), &reqPb)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error(), v)
} else {
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "SetConversation success", respPb.String(), v)
}
2021-06-28 15:36:09 +08:00
}
2022-05-27 18:40:24 +08:00
} else {
okUserIDList = req.KickedUserIDList
if err := db.DB.RemoverUserFromSuperGroup(req.GroupID, okUserIDList); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), req.GroupID, req.KickedUserIDList, err.Error())
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = constant.ErrDB.ErrMsg
return &resp, nil
2021-07-15 11:16:24 +08:00
}
2021-06-28 15:36:09 +08:00
}
2022-05-07 11:14:29 +08:00
2022-05-27 18:40:24 +08:00
if groupInfo.GroupType != constant.SuperGroup {
2022-07-29 14:36:07 +08:00
for _, userID := range okUserIDList {
2022-08-04 17:20:33 +08:00
if err := rocksCache.DelGroupMemberInfoFromCache(req.GroupID, userID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
}
2022-07-29 14:36:07 +08:00
}
2022-05-27 18:40:24 +08:00
chat.MemberKickedNotification(req, okUserIDList)
2022-05-30 15:10:26 +08:00
} else {
2022-07-29 14:36:07 +08:00
for _, userID := range okUserIDList {
err = rocksCache.DelJoinedSuperGroupIDListFromCache(userID)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), userID)
}
}
2022-06-21 14:54:42 +08:00
go func() {
for _, v := range req.KickedUserIDList {
chat.SuperGroupNotification(req.OperationID, v, v)
}
}()
2022-05-27 18:40:24 +08:00
}
2022-07-14 12:08:28 +08:00
2021-12-24 15:02:47 +08:00
log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp.String())
2021-06-28 15:36:09 +08:00
return &resp, nil
}
func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetGroupMembersInfoReq) (*pbGroup.GetGroupMembersInfoResp, error) {
2021-12-23 17:22:49 +08:00
log.NewInfo(req.OperationID, "GetGroupMembersInfo args ", req.String())
2021-06-28 15:36:09 +08:00
var resp pbGroup.GetGroupMembersInfoResp
2022-07-14 12:08:28 +08:00
resp.MemberList = []*open_im_sdk.GroupMemberFullInfo{}
2022-08-04 17:20:33 +08:00
for _, userID := range req.MemberList {
2022-08-04 18:24:17 +08:00
groupMember, err := rocksCache.GetGroupMemberInfoFromCache(req.GroupID, userID)
2022-08-04 17:20:33 +08:00
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), req.GroupID, userID, err.Error())
continue
2021-06-28 15:36:09 +08:00
}
2022-08-04 17:20:33 +08:00
var memberNode open_im_sdk.GroupMemberFullInfo
utils.CopyStructFields(&memberNode, groupMember)
memberNode.JoinTime = int32(groupMember.JoinTime.Unix())
resp.MemberList = append(resp.MemberList, &memberNode)
2021-06-28 15:36:09 +08:00
}
2021-12-24 15:02:47 +08:00
log.NewInfo(req.OperationID, "GetGroupMembersInfo rpc return ", resp.String())
2021-06-28 15:36:09 +08:00
return &resp, nil
}
2021-12-22 15:24:49 +08:00
2023-01-04 10:12:20 +08:00
func FillGroupInfoByGroupID(operationID, groupID string, groupInfo *open_im_sdk.GroupInfo) error {
group, err := imdb.TakeGroupInfoByGroupID(groupID)
if err != nil {
log.Error(operationID, "TakeGroupInfoByGroupID failed ", err.Error(), groupID)
return utils.Wrap(err, "")
}
if group.Status == constant.GroupStatusDismissed {
log.Debug(operationID, " group constant.GroupStatusDismissed ", group.GroupID)
2023-01-04 11:06:28 +08:00
return utils.Wrap(constant.ErrDismissedAlready, "")
2023-01-04 10:12:20 +08:00
}
return utils.Wrap(cp.GroupDBCopyOpenIM(groupInfo, group), "")
}
func FillPublicUserInfoByUserID(operationID, userID string, userInfo *open_im_sdk.PublicUserInfo) error {
user, err := imdb.TakeUserByUserID(userID)
2021-12-22 15:24:49 +08:00
if err != nil {
2023-01-04 10:12:20 +08:00
log.Error(operationID, "TakeUserByUserID failed ", err.Error(), userID)
return utils.Wrap(err, "")
2021-12-22 15:24:49 +08:00
}
2023-01-04 10:12:20 +08:00
cp.UserDBCopyOpenIMPublicUser(userInfo, user)
return nil
}
2021-12-27 21:08:42 +08:00
2023-01-04 11:24:11 +08:00
func SetErr(ctx context.Context, funcName string, err error, errCode *int32, errMsg *string, args ...interface{}) {
2023-01-04 11:06:28 +08:00
errInfo := constant.ToAPIErrWithErr(err)
*errCode = errInfo.ErrCode
2023-01-05 13:36:49 +08:00
*errMsg = errInfo.WrapErrMsg
2023-01-04 11:24:11 +08:00
trace_log.SetContextInfo(ctx, funcName, err, args)
2023-01-04 11:06:28 +08:00
}
2023-01-05 11:33:17 +08:00
func SetErrCodeMsg(ctx context.Context, funcName string, errCodeFrom int32, errMsgFrom string, errCode *int32, errMsg *string, args ...interface{}) {
*errCode = errCodeFrom
*errMsg = errMsgFrom
trace_log.SetContextInfo(ctx, funcName, constant.ToAPIErrWithErrCode(errCodeFrom), args)
}
func SetErrorForResp(err error, errCode *int32, errMsg *string) {
errInfo := constant.ToAPIErrWithErr(err)
*errCode = errInfo.ErrCode
*errMsg = errInfo.ErrMsg
}
2023-01-04 11:06:28 +08:00
func (s *groupServer) GetGroupApplicationList(ctx context.Context, req *pbGroup.GetGroupApplicationListReq) (*pbGroup.GetGroupApplicationListResp, error) {
nCtx := trace_log.NewRpcCtx(ctx, utils.GetSelfFuncName(), req.OperationID)
trace_log.SetRpcReqInfo(nCtx, utils.GetSelfFuncName(), req.String())
defer trace_log.ShowLog(nCtx)
2021-12-27 21:08:42 +08:00
resp := pbGroup.GetGroupApplicationListResp{}
2023-01-04 10:12:20 +08:00
reply, err := imdb.GetRecvGroupApplicationList(req.FromUserID)
if err != nil {
2023-01-04 11:54:49 +08:00
SetErr(nCtx, "", err, &resp.ErrCode, &resp.ErrMsg, "userID ", req.FromUserID)
2023-01-04 10:12:20 +08:00
return &resp, nil
}
var errResult error
2023-01-04 11:06:28 +08:00
trace_log.SetContextInfo(nCtx, "GetRecvGroupApplicationList", nil, " FromUserID: ", req.FromUserID, "GroupApplicationList: ", reply)
2023-01-04 10:12:20 +08:00
2021-12-27 21:08:42 +08:00
for _, v := range reply {
2022-01-15 15:25:12 +08:00
node := open_im_sdk.GroupRequest{UserInfo: &open_im_sdk.PublicUserInfo{}, GroupInfo: &open_im_sdk.GroupInfo{}}
2023-01-04 10:12:20 +08:00
err := FillGroupInfoByGroupID(req.OperationID, v.GroupID, node.GroupInfo)
2022-01-15 15:25:12 +08:00
if err != nil {
2023-01-04 10:12:20 +08:00
if !errors.Is(errors.Unwrap(err), constant.ErrDismissedAlready) {
errResult = err
}
2022-07-20 10:18:43 +08:00
continue
}
2023-01-04 11:06:28 +08:00
trace_log.SetContextInfo(nCtx, "FillGroupInfoByGroupID ", nil, " groupID: ", v.GroupID, " groupInfo: ", node.GroupInfo)
2023-01-04 10:12:20 +08:00
err = FillPublicUserInfoByUserID(req.OperationID, v.UserID, node.UserInfo)
2022-01-15 15:25:12 +08:00
if err != nil {
2023-01-04 10:12:20 +08:00
errResult = err
2022-01-15 15:25:12 +08:00
continue
}
2021-12-30 10:56:17 +08:00
cp.GroupRequestDBCopyOpenIM(&node, &v)
2021-12-30 11:13:19 +08:00
resp.GroupRequestList = append(resp.GroupRequestList, &node)
2021-12-27 21:08:42 +08:00
}
2023-01-04 10:12:20 +08:00
if errResult != nil && len(resp.GroupRequestList) == 0 {
2023-01-04 11:24:11 +08:00
SetErr(nCtx, "", errResult, &resp.ErrCode, &resp.ErrMsg)
2023-01-04 11:06:28 +08:00
return &resp, nil
2023-01-04 10:12:20 +08:00
}
2023-01-04 11:06:28 +08:00
trace_log.SetRpcRespInfo(nCtx, utils.GetSelfFuncName(), resp.String())
2021-12-27 21:08:42 +08:00
return &resp, nil
2021-12-22 15:24:49 +08:00
}
func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsInfoReq) (*pbGroup.GetGroupsInfoResp, error) {
2023-01-04 15:51:02 +08:00
nCtx := trace_log.NewRpcCtx(ctx, utils.GetSelfFuncName(), req.OperationID)
trace_log.SetRpcReqInfo(nCtx, utils.GetSelfFuncName(), req.String())
defer trace_log.ShowLog(nCtx)
resp := pbGroup.GetGroupsInfoResp{}
2021-12-23 17:22:49 +08:00
groupsInfoList := make([]*open_im_sdk.GroupInfo, 0)
2021-12-22 15:24:49 +08:00
for _, groupID := range req.GroupIDList {
2022-07-14 12:08:28 +08:00
groupInfoFromRedis, err := rocksCache.GetGroupInfoFromCache(groupID)
2021-12-22 15:24:49 +08:00
if err != nil {
2023-01-04 15:51:02 +08:00
SetErr(nCtx, "", err, &resp.ErrCode, &resp.ErrMsg, "groupID ", groupID)
2021-12-22 15:24:49 +08:00
continue
}
2021-12-23 17:22:49 +08:00
var groupInfo open_im_sdk.GroupInfo
2022-07-14 12:08:28 +08:00
cp.GroupDBCopyOpenIM(&groupInfo, groupInfoFromRedis)
groupInfo.NeedVerification = groupInfoFromRedis.NeedVerification
2021-12-22 15:24:49 +08:00
groupsInfoList = append(groupsInfoList, &groupInfo)
}
2023-01-04 15:51:02 +08:00
resp.GroupInfoList = groupsInfoList
2021-12-23 17:22:49 +08:00
2023-01-04 15:51:02 +08:00
trace_log.SetRpcRespInfo(nCtx, utils.GetSelfFuncName(), resp.String())
2021-12-23 17:22:49 +08:00
return &resp, nil
2021-12-22 15:24:49 +08:00
}
2023-01-05 11:33:17 +08:00
func CheckPermission(ctx context.Context, groupID string, userID string) error {
return nil
2023-01-04 17:22:55 +08:00
}
2023-01-05 11:33:17 +08:00
2023-01-04 17:22:55 +08:00
func (s *groupServer) GroupApplicationResponse(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (*pbGroup.GroupApplicationResponseResp, error) {
2023-01-05 15:04:48 +08:00
trace_log.SetRpcReqInfo(trace_log.NewRpcCtx(ctx, utils.GetSelfFuncName(), req.OperationID), utils.GetSelfFuncName(), req.String())
2023-01-05 13:36:49 +08:00
defer trace_log.ShowLog(ctx)
2023-01-05 11:33:17 +08:00
resp := pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{}}
2023-01-05 13:36:49 +08:00
if err := CheckPermission(ctx, req.GroupID, req.OpUserID); err != nil {
2023-01-05 11:33:17 +08:00
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
return &resp, nil
2021-12-30 12:05:10 +08:00
}
2023-01-04 17:22:55 +08:00
groupRequest := imdb.GroupRequest{}
utils.CopyStructFields(&groupRequest, req)
groupRequest.UserID = req.FromUserID
groupRequest.HandleUserID = req.OpUserID
groupRequest.HandledTime = time.Now()
2023-01-05 13:36:49 +08:00
if err := (&imdb.GroupRequest{}).Update(ctx, []*imdb.GroupRequest{&groupRequest}); err != nil {
2023-01-05 11:33:17 +08:00
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
return &resp, nil
2022-07-12 19:24:06 +08:00
}
2023-01-05 13:36:49 +08:00
groupInfo, err := rocksCache.GetGroupInfoFromCache(ctx, req.GroupID)
2022-11-22 11:07:20 +08:00
if err != nil {
2023-01-05 11:33:17 +08:00
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
return &resp, nil
2022-11-22 11:07:20 +08:00
}
2022-01-16 16:31:28 +08:00
if req.HandleResult == constant.GroupResponseAgree {
user, err := imdb.GetUserByUserID(req.FromUserID)
if err != nil {
2023-01-05 11:33:17 +08:00
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
return &resp, nil
}
2023-01-05 13:36:49 +08:00
request, err := (&imdb.GroupRequest{}).Take(ctx, req.GroupID, req.FromUserID)
2023-01-05 11:33:17 +08:00
if err != nil {
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
return &resp, nil
2021-12-30 12:27:26 +08:00
}
2023-01-04 17:22:55 +08:00
member := imdb.GroupMember{}
2022-01-16 16:31:28 +08:00
member.GroupID = req.GroupID
member.UserID = req.FromUserID
member.RoleLevel = constant.GroupOrdinaryUsers
member.OperatorUserID = req.OpUserID
2022-02-09 15:07:31 +08:00
member.FaceURL = user.FaceURL
2022-01-16 16:31:28 +08:00
member.Nickname = user.Nickname
2022-07-12 19:24:06 +08:00
member.JoinSource = request.JoinSource
member.InviterUserID = request.InviterUserID
2023-01-05 11:33:17 +08:00
member.MuteEndTime = time.Unix(int64(time.Now().Second()), 0)
2022-11-22 11:07:20 +08:00
callbackResp := CallbackBeforeMemberJoinGroup(req.OperationID, &member, groupInfo.Ex)
if callbackResp.ErrCode != 0 {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg resp: ", callbackResp)
}
if callbackResp.ActionCode != constant.ActionAllow {
if callbackResp.ErrCode == 0 {
callbackResp.ErrCode = 201
}
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg result", "end rpc and return", callbackResp)
return &pbGroup.GroupApplicationResponseResp{
CommonResp: &pbGroup.CommonResp{
ErrCode: int32(callbackResp.ErrCode),
ErrMsg: callbackResp.ErrMsg,
},
}, nil
}
2023-01-05 15:04:48 +08:00
err = (&imdb.GroupMember{}).Create(ctx, []*imdb.GroupMember{&member})
2022-01-16 16:31:28 +08:00
if err != nil {
2023-01-05 11:33:17 +08:00
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
return &resp, nil
2022-04-21 16:46:48 +08:00
}
2022-07-14 12:08:28 +08:00
2023-01-05 11:33:17 +08:00
etcdCacheConn, err := fault_tolerant.GetDefaultConn(config.Config.RpcRegisterName.OpenImCacheName, req.OperationID)
if err != nil {
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
return &resp, nil
2022-06-16 14:51:36 +08:00
}
2022-05-07 15:01:48 +08:00
cacheClient := pbCache.NewCacheClient(etcdCacheConn)
2022-07-14 12:08:28 +08:00
cacheResp, err := cacheClient.DelGroupMemberIDListFromCache(context.Background(), &pbCache.DelGroupMemberIDListFromCacheReq{OperationID: req.OperationID, GroupID: req.GroupID})
2022-05-07 15:01:48 +08:00
if err != nil {
2023-01-05 15:04:48 +08:00
SetErr(ctx, "DelGroupMemberIDListFromCache", err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg, "groupID", req.GroupID)
2023-01-05 11:33:17 +08:00
return &resp, nil
2022-05-07 15:01:48 +08:00
}
if cacheResp.CommonResp.ErrCode != 0 {
2023-01-05 15:04:48 +08:00
SetErrCodeMsg(ctx, "DelGroupMemberIDListFromCache", cacheResp.CommonResp.ErrCode, cacheResp.CommonResp.ErrMsg, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
2023-01-05 11:33:17 +08:00
return &resp, nil
2022-05-07 15:01:48 +08:00
}
2022-08-08 11:30:10 +08:00
if err := rocksCache.DelGroupMemberListHashFromCache(req.GroupID); err != nil {
2023-01-05 11:33:17 +08:00
trace_log.SetContextInfo(ctx, "DelGroupMemberListHashFromCache", err, "groupID ", req.GroupID)
2022-08-08 11:30:10 +08:00
}
if err := rocksCache.DelJoinedGroupIDListFromCache(req.FromUserID); err != nil {
2023-01-05 11:33:17 +08:00
trace_log.SetContextInfo(ctx, "DelJoinedGroupIDListFromCache", err, "userID ", req.FromUserID)
2022-08-08 11:30:10 +08:00
}
if err := rocksCache.DelGroupMemberNumFromCache(req.GroupID); err != nil {
2023-01-05 11:33:17 +08:00
trace_log.SetContextInfo(ctx, "DelJoinedGroupIDListFromCache", err, "groupID ", req.GroupID)
2022-08-08 11:30:10 +08:00
}
2022-01-16 16:31:28 +08:00
chat.GroupApplicationAcceptedNotification(req)
2021-12-27 16:48:05 +08:00
chat.MemberEnterNotification(req)
2022-01-16 16:31:28 +08:00
} else if req.HandleResult == constant.GroupResponseRefuse {
chat.GroupApplicationRejectedNotification(req)
} else {
2023-01-05 15:04:48 +08:00
SetErr(ctx, "", constant.ErrArgs, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
2023-01-05 11:33:17 +08:00
return &resp, nil
2021-12-22 15:24:49 +08:00
}
2023-01-05 11:33:17 +08:00
return &resp, nil
2021-12-22 15:24:49 +08:00
}
2021-12-26 18:47:11 +08:00
func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (*pbGroup.JoinGroupResp, error) {
2021-12-23 17:22:49 +08:00
log.NewInfo(req.OperationID, "JoinGroup args ", req.String())
2021-12-28 15:33:47 +08:00
_, err := imdb.GetUserByUserID(req.OpUserID)
2021-12-22 15:24:49 +08:00
if err != nil {
2021-12-30 09:38:07 +08:00
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), req.OpUserID)
2021-12-26 18:47:11 +08:00
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2021-12-22 15:24:49 +08:00
}
2022-11-22 11:07:20 +08:00
groupInfo, err := rocksCache.GetGroupInfoFromCache(req.GroupID)
2022-04-18 10:53:23 +08:00
if err != nil {
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", req.GroupID, err)
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
if groupInfo.Status == constant.GroupStatusDismissed {
errMsg := " group status is dismissed "
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrStatus.ErrCode, ErrMsg: errMsg}}, nil
}
2022-06-23 18:56:52 +08:00
if groupInfo.NeedVerification == constant.Directly {
if groupInfo.GroupType != constant.SuperGroup {
2022-07-14 12:08:28 +08:00
us, err := imdb.GetUserByUserID(req.OpUserID)
if err != nil {
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), req.OpUserID)
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
//to group member
2023-01-04 17:22:55 +08:00
groupMember := imdb.GroupMember{GroupID: req.GroupID, RoleLevel: constant.GroupOrdinaryUsers, OperatorUserID: req.OpUserID}
2022-07-14 12:08:28 +08:00
utils.CopyStructFields(&groupMember, us)
2022-11-22 11:07:20 +08:00
callbackResp := CallbackBeforeMemberJoinGroup(req.OperationID, &groupMember, groupInfo.Ex)
if callbackResp.ErrCode != 0 {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg resp: ", callbackResp)
2022-06-23 18:56:52 +08:00
}
2022-11-22 11:07:20 +08:00
if callbackResp.ActionCode != constant.ActionAllow {
if callbackResp.ErrCode == 0 {
callbackResp.ErrCode = 201
}
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg result", "end rpc and return", callbackResp)
return &pbGroup.JoinGroupResp{
CommonResp: &pbGroup.CommonResp{
ErrCode: int32(callbackResp.ErrCode),
ErrMsg: callbackResp.ErrMsg,
},
}, nil
2022-06-23 18:56:52 +08:00
}
2022-11-22 11:07:20 +08:00
if err := s.DelGroupAndUserCache(req.OperationID, req.GroupID, []string{req.OpUserID}); err != nil {
log.NewError(req.OperationID, "DelGroupAndUserCache failed, ", err.Error(), req.OpUserID)
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
2022-06-23 18:56:52 +08:00
}
2022-11-22 11:07:20 +08:00
err = imdb.InsertIntoGroupMember(groupMember)
2022-07-15 18:47:04 +08:00
if err != nil {
2022-11-22 11:07:20 +08:00
log.NewError(req.OperationID, "InsertIntoGroupMember failed ", err.Error(), groupMember)
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2022-08-08 11:30:10 +08:00
}
2022-12-05 11:30:54 +08:00
//}
2022-12-05 15:49:08 +08:00
var sessionType int
if groupInfo.GroupType == constant.NormalGroup {
sessionType = constant.GroupChatType
} else {
sessionType = constant.SuperGroupChatType
}
2022-12-05 11:30:54 +08:00
var reqPb pbUser.SetConversationReq
var c pbConversation.Conversation
reqPb.OperationID = req.OperationID
c.OwnerUserID = req.OpUserID
2022-12-05 15:49:08 +08:00
c.ConversationID = utils.GetConversationIDBySessionType(req.GroupID, sessionType)
c.ConversationType = int32(sessionType)
2022-12-05 11:30:54 +08:00
c.GroupID = req.GroupID
c.IsNotInGroup = false
c.UpdateUnreadCountTime = utils.GetCurrentTimestampByMill()
reqPb.Conversation = &c
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
if etcdConn == nil {
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
log.NewError(req.OperationID, errMsg)
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: errMsg}}, nil
}
client := pbUser.NewUserClient(etcdConn)
respPb, err := client.SetConversation(context.Background(), &reqPb)
if err != nil {
2022-12-05 14:55:38 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error())
2022-12-05 11:30:54 +08:00
} else {
2022-12-05 14:55:38 +08:00
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "SetConversation success", respPb.String())
2022-12-05 11:30:54 +08:00
}
2022-11-22 11:07:20 +08:00
2022-06-23 18:56:52 +08:00
chat.MemberEnterDirectlyNotification(req.GroupID, req.OpUserID, req.OperationID)
log.NewInfo(req.OperationID, "JoinGroup rpc return ")
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
} else {
2022-07-14 12:08:28 +08:00
log.Error(req.OperationID, "JoinGroup rpc failed, group type: ", groupInfo.GroupType, "not support directly")
2022-06-23 18:56:52 +08:00
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrArgs.ErrCode, ErrMsg: constant.ErrArgs.ErrMsg}}, nil
}
}
2023-01-04 17:22:55 +08:00
var groupRequest imdb.GroupRequest
2021-12-30 10:14:30 +08:00
groupRequest.UserID = req.OpUserID
groupRequest.ReqMsg = req.ReqMessage
groupRequest.GroupID = req.GroupID
2022-07-12 19:24:06 +08:00
groupRequest.JoinSource = req.JoinSource
2021-12-30 13:53:05 +08:00
err = imdb.InsertIntoGroupRequest(groupRequest)
2021-12-27 21:08:42 +08:00
if err != nil {
2022-06-23 18:56:52 +08:00
log.NewError(req.OperationID, "InsertIntoGroupRequest failed ", err.Error(), groupRequest)
2021-12-26 18:47:11 +08:00
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2021-12-22 15:24:49 +08:00
}
2022-06-23 18:56:52 +08:00
//_, err = imdb.GetGroupMemberListByGroupIDAndRoleLevel(req.GroupID, constant.GroupOwner)
//if err != nil {
// log.NewError(req.OperationID, "GetGroupMemberListByGroupIDAndRoleLevel failed ", err.Error(), req.GroupID, constant.GroupOwner)
// return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
2022-12-05 11:30:54 +08:00
2022-01-16 16:31:28 +08:00
chat.JoinGroupApplicationNotification(req)
2022-06-23 18:56:52 +08:00
log.NewInfo(req.OperationID, "JoinGroup rpc return ")
2021-12-26 18:47:11 +08:00
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
2021-12-22 15:24:49 +08:00
}
2021-12-26 18:47:11 +08:00
func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq) (*pbGroup.QuitGroupResp, error) {
2022-04-21 12:53:28 +08:00
log.NewInfo(req.OperationID, "QuitGroup args ", req.String())
2022-06-20 11:57:53 +08:00
groupInfo, err := imdb.GetGroupInfoByGroupID(req.GroupID)
2021-12-22 15:24:49 +08:00
if err != nil {
2022-06-20 11:57:53 +08:00
log.NewError(req.OperationID, "ReduceGroupMemberFromCache rpc call failed ", err.Error())
2021-12-26 18:47:11 +08:00
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2021-12-22 15:24:49 +08:00
}
2022-06-20 11:57:53 +08:00
if groupInfo.GroupType != constant.SuperGroup {
_, err = imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupID, req.OpUserID)
if err != nil {
log.NewError(req.OperationID, "GetGroupMemberInfoByGroupIDAndUserID failed ", err.Error(), req.GroupID, req.OpUserID)
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2021-12-22 15:24:49 +08:00
2022-11-22 11:07:20 +08:00
if err := s.DelGroupAndUserCache(req.OperationID, req.GroupID, []string{req.OpUserID}); err != nil {
log.NewError(req.OperationID, "DelGroupAndUserCache failed, ", err.Error(), req.OpUserID)
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
2022-06-20 11:57:53 +08:00
err = imdb.DeleteGroupMemberByGroupIDAndUserID(req.GroupID, req.OpUserID)
if err != nil {
log.NewError(req.OperationID, "DeleteGroupMemberByGroupIdAndUserId failed ", err.Error(), req.GroupID, req.OpUserID)
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2021-12-22 15:24:49 +08:00
2022-06-20 11:57:53 +08:00
err = db.DB.DelGroupMember(req.GroupID, req.OpUserID)
if err != nil {
log.NewError(req.OperationID, "DelGroupMember failed ", req.GroupID, req.OpUserID)
// return &pbGroup.CommonResp{ErrorCode: constant.ErrQuitGroup.ErrCode, ErrorMsg: constant.ErrQuitGroup.ErrMsg}, nil
}
//modify quitter conversation info
var reqPb pbUser.SetConversationReq
2022-08-21 23:37:43 +08:00
var c pbConversation.Conversation
2022-06-20 11:57:53 +08:00
reqPb.OperationID = req.OperationID
c.OwnerUserID = req.OpUserID
c.ConversationID = utils.GetConversationIDBySessionType(req.GroupID, constant.GroupChatType)
c.ConversationType = constant.GroupChatType
c.GroupID = req.GroupID
c.IsNotInGroup = true
reqPb.Conversation = &c
2022-08-17 12:12:54 +08:00
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
2022-06-20 11:57:53 +08:00
if etcdConn == nil {
2022-08-17 12:12:54 +08:00
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
2022-06-20 11:57:53 +08:00
log.NewError(req.OperationID, errMsg)
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrInternal.ErrCode, ErrMsg: errMsg}}, nil
}
client := pbUser.NewUserClient(etcdConn)
respPb, err := client.SetConversation(context.Background(), &reqPb)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error())
} else {
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "SetConversation success", respPb.String())
}
2022-04-20 18:47:21 +08:00
} else {
2022-06-20 11:57:53 +08:00
okUserIDList := []string{req.OpUserID}
if err := db.DB.RemoverUserFromSuperGroup(req.GroupID, okUserIDList); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), req.GroupID, okUserIDList, err.Error())
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2022-04-20 18:47:21 +08:00
}
2022-05-07 11:14:29 +08:00
2022-06-20 11:57:53 +08:00
if groupInfo.GroupType != constant.SuperGroup {
2022-08-08 11:30:10 +08:00
if err := rocksCache.DelGroupMemberInfoFromCache(req.GroupID, req.OpUserID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
}
2022-06-20 11:57:53 +08:00
chat.MemberQuitNotification(req)
} else {
2022-07-29 14:36:07 +08:00
if err := rocksCache.DelJoinedSuperGroupIDListFromCache(req.OpUserID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.OpUserID)
}
2022-11-22 14:18:57 +08:00
if err := rocksCache.DelGroupMemberListHashFromCache(req.GroupID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), req.GroupID, err.Error())
}
2022-06-21 14:54:42 +08:00
chat.SuperGroupNotification(req.OperationID, req.OpUserID, req.OpUserID)
2022-06-20 11:57:53 +08:00
}
2022-11-22 14:18:57 +08:00
log.NewInfo(req.OperationID, "rpc QuitGroup return ", pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{}})
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{}}, nil
2021-12-22 15:24:49 +08:00
}
func hasAccess(req *pbGroup.SetGroupInfoReq) bool {
if utils.IsContain(req.OpUserID, config.Config.Manager.AppManagerUid) {
return true
}
2022-06-28 20:39:27 +08:00
groupUserInfo, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupInfoForSet.GroupID, req.OpUserID)
2021-12-22 15:24:49 +08:00
if err != nil {
2022-06-28 20:39:27 +08:00
log.NewError(req.OperationID, "GetGroupMemberInfoByGroupIDAndUserID failed, ", err.Error(), req.GroupInfoForSet.GroupID, req.OpUserID)
2021-12-22 15:24:49 +08:00
return false
}
2021-12-29 22:06:27 +08:00
if groupUserInfo.RoleLevel == constant.GroupOwner || groupUserInfo.RoleLevel == constant.GroupAdmin {
2021-12-22 15:24:49 +08:00
return true
}
2021-12-28 15:33:47 +08:00
return false
2021-12-22 15:24:49 +08:00
}
2021-12-26 18:47:11 +08:00
func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInfoReq) (*pbGroup.SetGroupInfoResp, error) {
2021-12-22 15:24:49 +08:00
log.NewInfo(req.OperationID, "SetGroupInfo args ", req.String())
if !hasAccess(req) {
2021-12-29 22:06:27 +08:00
log.NewError(req.OperationID, "no access ", req)
2021-12-26 18:47:11 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
2021-12-22 15:24:49 +08:00
}
2022-06-28 20:39:27 +08:00
group, err := imdb.GetGroupInfoByGroupID(req.GroupInfoForSet.GroupID)
2021-12-22 15:24:49 +08:00
if err != nil {
2022-06-28 20:39:27 +08:00
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), req.GroupInfoForSet.GroupID)
2022-08-30 01:44:34 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
2021-12-22 15:24:49 +08:00
}
2022-04-18 10:53:23 +08:00
if group.Status == constant.GroupStatusDismissed {
errMsg := " group status is dismissed "
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrStatus.ErrCode, ErrMsg: errMsg}}, nil
}
2021-12-24 16:02:21 +08:00
////bitwise operators: 0001:groupName; 0010:Notification 0100:Introduction; 1000:FaceUrl; 10000:owner
2021-12-22 15:24:49 +08:00
var changedType int32
2022-06-06 20:39:45 +08:00
groupName := ""
notification := ""
introduction := ""
faceURL := ""
2022-06-28 20:39:27 +08:00
if group.GroupName != req.GroupInfoForSet.GroupName && req.GroupInfoForSet.GroupName != "" {
2021-12-22 15:24:49 +08:00
changedType = 1
2022-06-28 20:39:27 +08:00
groupName = req.GroupInfoForSet.GroupName
2021-12-22 15:24:49 +08:00
}
2022-06-28 20:39:27 +08:00
if group.Notification != req.GroupInfoForSet.Notification && req.GroupInfoForSet.Notification != "" {
2021-12-22 15:24:49 +08:00
changedType = changedType | (1 << 1)
2022-06-28 20:39:27 +08:00
notification = req.GroupInfoForSet.Notification
2021-12-22 15:24:49 +08:00
}
2022-06-28 20:39:27 +08:00
if group.Introduction != req.GroupInfoForSet.Introduction && req.GroupInfoForSet.Introduction != "" {
2021-12-22 15:24:49 +08:00
changedType = changedType | (1 << 2)
2022-06-28 20:39:27 +08:00
introduction = req.GroupInfoForSet.Introduction
2021-12-22 15:24:49 +08:00
}
2022-06-28 20:39:27 +08:00
if group.FaceURL != req.GroupInfoForSet.FaceURL && req.GroupInfoForSet.FaceURL != "" {
2021-12-22 15:24:49 +08:00
changedType = changedType | (1 << 3)
2022-06-28 20:39:27 +08:00
faceURL = req.GroupInfoForSet.FaceURL
2021-12-22 15:24:49 +08:00
}
2022-06-23 18:56:52 +08:00
2022-06-28 20:39:27 +08:00
if req.GroupInfoForSet.NeedVerification != nil {
2022-06-23 18:56:52 +08:00
changedType = changedType | (1 << 4)
m := make(map[string]interface{})
2022-06-28 20:39:27 +08:00
m["need_verification"] = req.GroupInfoForSet.NeedVerification.Value
if err := imdb.UpdateGroupInfoDefaultZero(req.GroupInfoForSet.GroupID, m); err != nil {
2022-06-23 18:56:52 +08:00
log.NewError(req.OperationID, "UpdateGroupInfoDefaultZero failed ", err.Error(), m)
2022-08-30 01:44:34 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2022-06-23 18:56:52 +08:00
}
}
2022-07-12 17:22:45 +08:00
if req.GroupInfoForSet.LookMemberInfo != nil {
changedType = changedType | (1 << 5)
m := make(map[string]interface{})
m["look_member_info"] = req.GroupInfoForSet.LookMemberInfo.Value
if err := imdb.UpdateGroupInfoDefaultZero(req.GroupInfoForSet.GroupID, m); err != nil {
log.NewError(req.OperationID, "UpdateGroupInfoDefaultZero failed ", err.Error(), m)
2022-08-30 01:44:34 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2022-07-12 17:22:45 +08:00
}
}
if req.GroupInfoForSet.ApplyMemberFriend != nil {
changedType = changedType | (1 << 6)
m := make(map[string]interface{})
m["apply_member_friend"] = req.GroupInfoForSet.ApplyMemberFriend.Value
if err := imdb.UpdateGroupInfoDefaultZero(req.GroupInfoForSet.GroupID, m); err != nil {
log.NewError(req.OperationID, "UpdateGroupInfoDefaultZero failed ", err.Error(), m)
2022-08-30 01:44:34 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2022-07-12 17:22:45 +08:00
}
}
2022-06-23 18:56:52 +08:00
//
//if req.RoleLevel != nil {
//
//}
2021-12-22 15:24:49 +08:00
//only administrators can set group information
2023-01-04 17:22:55 +08:00
var groupInfo imdb.Group
2022-06-28 20:39:27 +08:00
utils.CopyStructFields(&groupInfo, req.GroupInfoForSet)
2022-07-13 11:09:29 +08:00
if req.GroupInfoForSet.Notification != "" {
groupInfo.NotificationUserID = req.OpUserID
groupInfo.NotificationUpdateTime = time.Now()
}
2022-11-22 11:07:20 +08:00
if err := rocksCache.DelGroupInfoFromCache(req.GroupInfoForSet.GroupID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "DelGroupInfoFromCache failed ", err.Error(), req.GroupInfoForSet.GroupID)
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2021-12-27 21:08:42 +08:00
err = imdb.SetGroupInfo(groupInfo)
if err != nil {
2021-12-30 09:10:31 +08:00
log.NewError(req.OperationID, "SetGroupInfo failed ", err.Error(), groupInfo)
2022-08-30 01:44:34 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2021-12-22 15:24:49 +08:00
}
2022-01-16 16:31:28 +08:00
log.NewInfo(req.OperationID, "SetGroupInfo rpc return ", pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}})
2021-12-22 15:24:49 +08:00
if changedType != 0 {
2022-06-28 20:39:27 +08:00
chat.GroupInfoSetNotification(req.OperationID, req.OpUserID, req.GroupInfoForSet.GroupID, groupName, notification, introduction, faceURL, req.GroupInfoForSet.NeedVerification)
2021-12-22 15:24:49 +08:00
}
2022-06-28 20:39:27 +08:00
if req.GroupInfoForSet.Notification != "" {
2022-06-07 17:45:07 +08:00
//get group member user id
2022-06-28 20:39:27 +08:00
getGroupMemberIDListFromCacheReq := &pbCache.GetGroupMemberIDListFromCacheReq{OperationID: req.OperationID, GroupID: req.GroupInfoForSet.GroupID}
2022-08-17 12:12:54 +08:00
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImCacheName, req.OperationID)
2022-06-16 14:51:36 +08:00
if etcdConn == nil {
2022-08-17 12:12:54 +08:00
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
2022-06-16 14:51:36 +08:00
log.NewError(req.OperationID, errMsg)
2022-08-30 01:44:34 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrInternal.ErrCode, ErrMsg: errMsg}}, nil
2022-06-16 14:51:36 +08:00
}
2022-06-07 17:45:07 +08:00
client := pbCache.NewCacheClient(etcdConn)
cacheResp, err := client.GetGroupMemberIDListFromCache(context.Background(), getGroupMemberIDListFromCacheReq)
if err != nil {
log.NewError(req.OperationID, "GetGroupMemberIDListFromCache rpc call failed ", err.Error())
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}}, nil
}
if cacheResp.CommonResp.ErrCode != 0 {
log.NewError(req.OperationID, "GetGroupMemberIDListFromCache rpc logic call failed ", cacheResp.String())
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}}, nil
}
var conversationReq pbConversation.ModifyConversationFieldReq
conversation := pbConversation.Conversation{
OwnerUserID: req.OpUserID,
2022-06-28 20:39:27 +08:00
ConversationID: utils.GetConversationIDBySessionType(req.GroupInfoForSet.GroupID, constant.GroupChatType),
2022-06-07 17:45:07 +08:00
ConversationType: constant.GroupChatType,
2022-06-28 20:39:27 +08:00
GroupID: req.GroupInfoForSet.GroupID,
2022-06-07 17:45:07 +08:00
}
conversationReq.Conversation = &conversation
conversationReq.OperationID = req.OperationID
conversationReq.FieldType = constant.FieldGroupAtType
conversation.GroupAtType = constant.GroupNotification
conversationReq.UserIDList = cacheResp.UserIDList
2022-08-17 12:12:54 +08:00
nEtcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImConversationName, req.OperationID)
2022-06-16 14:51:36 +08:00
if etcdConn == nil {
2022-08-17 12:12:54 +08:00
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
2022-06-16 14:51:36 +08:00
log.NewError(req.OperationID, errMsg)
2022-08-30 01:44:34 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrInternal.ErrCode, ErrMsg: errMsg}}, nil
2022-06-16 14:51:36 +08:00
}
2022-06-07 17:45:07 +08:00
nClient := pbConversation.NewConversationClient(nEtcdConn)
conversationReply, err := nClient.ModifyConversationField(context.Background(), &conversationReq)
if err != nil {
log.NewError(conversationReq.OperationID, "ModifyConversationField rpc failed, ", conversationReq.String(), err.Error())
} else if conversationReply.CommonResp.ErrCode != 0 {
log.NewError(conversationReq.OperationID, "ModifyConversationField rpc failed, ", conversationReq.String(), conversationReply.String())
}
}
2021-12-27 21:08:42 +08:00
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}}, nil
2021-12-22 15:24:49 +08:00
}
2021-12-26 18:47:11 +08:00
func (s *groupServer) TransferGroupOwner(_ context.Context, req *pbGroup.TransferGroupOwnerReq) (*pbGroup.TransferGroupOwnerResp, error) {
2021-12-24 16:02:21 +08:00
log.NewInfo(req.OperationID, "TransferGroupOwner ", req.String())
2021-12-22 15:24:49 +08:00
2022-04-18 10:53:23 +08:00
groupInfo, err := imdb.GetGroupInfoByGroupID(req.GroupID)
if err != nil {
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", req.GroupID, err)
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
if groupInfo.Status == constant.GroupStatusDismissed {
errMsg := " group status is dismissed "
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrStatus.ErrCode, ErrMsg: errMsg}}, nil
}
2021-12-27 16:48:05 +08:00
if req.OldOwnerUserID == req.NewOwnerUserID {
2021-12-30 13:39:36 +08:00
log.NewError(req.OperationID, "same owner ", req.OldOwnerUserID, req.NewOwnerUserID)
2021-12-27 16:48:05 +08:00
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrArgs.ErrCode, ErrMsg: constant.ErrArgs.ErrMsg}}, nil
}
2022-11-22 11:07:20 +08:00
err = rocksCache.DelGroupMemberInfoFromCache(req.GroupID, req.NewOwnerUserID)
if err != nil {
log.NewError(req.OperationID, "DelGroupMemberInfoFromCache failed ", req.GroupID, req.NewOwnerUserID)
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
err = rocksCache.DelGroupMemberInfoFromCache(req.GroupID, req.OldOwnerUserID)
if err != nil {
log.NewError(req.OperationID, "DelGroupMemberInfoFromCache failed ", req.GroupID, req.OldOwnerUserID)
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
2023-01-04 17:22:55 +08:00
groupMemberInfo := imdb.GroupMember{GroupID: req.GroupID, UserID: req.OldOwnerUserID, RoleLevel: constant.GroupOrdinaryUsers}
2022-04-18 13:01:16 +08:00
err = imdb.UpdateGroupMemberInfo(groupMemberInfo)
2021-12-27 16:48:05 +08:00
if err != nil {
2021-12-30 13:39:36 +08:00
log.NewError(req.OperationID, "UpdateGroupMemberInfo failed ", groupMemberInfo)
2021-12-27 16:48:05 +08:00
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2023-01-04 17:22:55 +08:00
groupMemberInfo = imdb.GroupMember{GroupID: req.GroupID, UserID: req.NewOwnerUserID, RoleLevel: constant.GroupOwner}
2021-12-27 16:48:05 +08:00
err = imdb.UpdateGroupMemberInfo(groupMemberInfo)
2021-12-22 15:24:49 +08:00
if err != nil {
2021-12-30 13:39:36 +08:00
log.NewError(req.OperationID, "UpdateGroupMemberInfo failed ", groupMemberInfo)
2021-12-26 18:47:11 +08:00
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2021-12-22 15:24:49 +08:00
}
2022-11-22 11:07:20 +08:00
2022-01-16 16:31:28 +08:00
chat.GroupOwnerTransferredNotification(req)
2021-12-27 16:48:05 +08:00
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
2021-12-22 15:24:49 +08:00
}
2022-01-25 19:18:04 +08:00
func (s *groupServer) GetGroups(_ context.Context, req *pbGroup.GetGroupsReq) (*pbGroup.GetGroupsResp, error) {
2022-02-08 20:24:59 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "GetGroups ", req.String())
2022-01-27 01:08:02 +08:00
resp := &pbGroup.GetGroupsResp{
2022-08-30 01:57:06 +08:00
CommonResp: &pbGroup.CommonResp{},
2022-02-07 19:42:09 +08:00
CMSGroups: []*pbGroup.CMSGroup{},
2022-08-30 16:53:15 +08:00
Pagination: &open_im_sdk.ResponsePagination{CurrentPage: req.Pagination.PageNumber, ShowNumber: req.Pagination.ShowNumber},
2022-01-25 19:18:04 +08:00
}
2022-08-30 01:38:23 +08:00
if req.GroupID != "" {
groupInfoDB, err := imdb.GetGroupInfoByGroupID(req.GroupID)
2022-02-07 19:42:09 +08:00
if err != nil {
2022-08-30 16:53:15 +08:00
if errors.Is(err, gorm.ErrRecordNotFound) {
return resp, nil
}
2022-08-30 01:38:23 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = err.Error()
return resp, nil
2022-02-07 19:42:09 +08:00
}
2022-08-30 01:38:23 +08:00
resp.GroupNum = 1
groupInfo := &open_im_sdk.GroupInfo{}
utils.CopyStructFields(groupInfo, groupInfoDB)
2022-08-30 14:17:40 +08:00
groupMember, err := imdb.GetGroupOwnerInfoByGroupID(req.GroupID)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = err.Error()
return resp, nil
}
2022-09-06 16:08:28 +08:00
memberNum, err := imdb.GetGroupMembersCount(req.GroupID, "")
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = err.Error()
return resp, nil
}
groupInfo.MemberCount = uint32(memberNum)
2022-09-13 16:19:01 +08:00
groupInfo.CreateTime = uint32(groupInfoDB.CreateTime.Unix())
2022-08-30 14:17:40 +08:00
resp.CMSGroups = append(resp.CMSGroups, &pbGroup.CMSGroup{GroupInfo: groupInfo, GroupOwnerUserName: groupMember.Nickname, GroupOwnerUserID: groupMember.UserID})
2022-08-30 01:38:23 +08:00
} else {
2022-09-13 15:27:00 +08:00
groups, count, err := imdb.GetGroupsByName(req.GroupName, req.Pagination.PageNumber, req.Pagination.ShowNumber)
2022-02-21 21:02:37 +08:00
if err != nil {
2022-08-30 01:38:23 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetGroupsByName error", req.String(), req.GroupName, req.Pagination.PageNumber, req.Pagination.ShowNumber)
}
for _, v := range groups {
group := &pbGroup.CMSGroup{GroupInfo: &open_im_sdk.GroupInfo{}}
utils.CopyStructFields(group.GroupInfo, v)
groupMember, err := imdb.GetGroupOwnerInfoByGroupID(v.GroupID)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetGroupOwnerInfoByGroupID failed", err.Error(), v)
continue
}
group.GroupInfo.CreateTime = uint32(v.CreateTime.Unix())
group.GroupOwnerUserID = groupMember.UserID
group.GroupOwnerUserName = groupMember.Nickname
resp.CMSGroups = append(resp.CMSGroups, group)
}
2022-09-13 15:27:00 +08:00
resp.GroupNum = int32(count)
2022-02-21 21:02:37 +08:00
}
2022-08-30 01:38:23 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "GetGroups resp", resp.String())
2022-02-07 19:42:09 +08:00
return resp, nil
}
func (s *groupServer) GetGroupMembersCMS(_ context.Context, req *pbGroup.GetGroupMembersCMSReq) (*pbGroup.GetGroupMembersCMSResp, error) {
2022-03-10 12:01:28 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "args:", req.String())
2022-08-30 02:20:04 +08:00
resp := &pbGroup.GetGroupMembersCMSResp{CommonResp: &pbGroup.CommonResp{}}
2022-08-11 19:47:59 +08:00
groupMembers, err := imdb.GetGroupMembersByGroupIdCMS(req.GroupID, req.UserName, req.Pagination.ShowNumber, req.Pagination.PageNumber)
2022-02-07 19:42:09 +08:00
if err != nil {
2022-03-10 12:01:28 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetGroupMembersByGroupIdCMS Error", err.Error())
2022-08-30 01:38:23 +08:00
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = err.Error()
return resp, nil
2022-02-08 20:24:59 +08:00
}
2022-08-11 19:47:59 +08:00
groupMembersCount, err := imdb.GetGroupMembersCount(req.GroupID, req.UserName)
2022-02-08 20:24:59 +08:00
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetGroupMembersCMS Error", err.Error())
2022-08-30 01:38:23 +08:00
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = err.Error()
return resp, nil
2022-01-26 18:43:01 +08:00
}
2022-02-08 20:24:59 +08:00
log.NewInfo(req.OperationID, groupMembersCount)
2022-07-14 12:08:28 +08:00
resp.MemberNums = int32(groupMembersCount)
2022-02-07 19:42:09 +08:00
for _, groupMember := range groupMembers {
2022-08-11 19:47:59 +08:00
member := open_im_sdk.GroupMemberFullInfo{}
utils.CopyStructFields(&member, groupMember)
2022-08-12 11:24:21 +08:00
member.JoinTime = int32(groupMember.JoinTime.Unix())
member.MuteEndTime = uint32(groupMember.MuteEndTime.Unix())
2022-08-11 19:47:59 +08:00
resp.Members = append(resp.Members, &member)
2022-02-07 19:42:09 +08:00
}
2022-02-08 20:24:59 +08:00
resp.Pagination = &open_im_sdk.ResponsePagination{
CurrentPage: req.Pagination.PageNumber,
ShowNumber: req.Pagination.ShowNumber,
}
2022-05-10 10:44:43 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp:", resp.String())
2022-02-07 19:42:09 +08:00
return resp, nil
}
2022-02-09 19:20:46 +08:00
func (s *groupServer) GetUserReqApplicationList(_ context.Context, req *pbGroup.GetUserReqApplicationListReq) (*pbGroup.GetUserReqApplicationListResp, error) {
2022-03-10 12:01:28 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
2022-02-09 19:20:46 +08:00
resp := &pbGroup.GetUserReqApplicationListResp{}
groupRequests, err := imdb.GetUserReqGroupByUserID(req.UserID)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserReqGroupByUserID failed ", err.Error())
resp.CommonResp = &pbGroup.CommonResp{
ErrCode: constant.ErrDB.ErrCode,
ErrMsg: constant.ErrDB.ErrMsg,
}
return resp, nil
}
for _, groupReq := range groupRequests {
node := open_im_sdk.GroupRequest{UserInfo: &open_im_sdk.PublicUserInfo{}, GroupInfo: &open_im_sdk.GroupInfo{}}
group, err := imdb.GetGroupInfoByGroupID(groupReq.GroupID)
if err != nil {
log.Error(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), groupReq.GroupID)
continue
}
user, err := imdb.GetUserByUserID(groupReq.UserID)
if err != nil {
log.Error(req.OperationID, "GetUserByUserID failed ", err.Error(), groupReq.UserID)
continue
}
cp.GroupRequestDBCopyOpenIM(&node, &groupReq)
cp.UserDBCopyOpenIMPublicUser(node.UserInfo, user)
cp.GroupDBCopyOpenIM(node.GroupInfo, group)
resp.GroupRequestList = append(resp.GroupRequestList, &node)
}
resp.CommonResp = &pbGroup.CommonResp{
ErrCode: 0,
ErrMsg: "",
}
return resp, nil
2022-02-14 10:46:32 +08:00
}
2022-03-24 15:33:30 +08:00
func (s *groupServer) DismissGroup(ctx context.Context, req *pbGroup.DismissGroupReq) (*pbGroup.DismissGroupResp, error) {
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc args ", req.String())
2022-04-16 20:10:10 +08:00
if !token_verify.IsManagerUserID(req.OpUserID) && !imdb.IsGroupOwnerAdmin(req.GroupID, req.OpUserID) {
2022-03-24 15:33:30 +08:00
log.NewError(req.OperationID, "verify failed ", req.OpUserID, req.GroupID)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
}
2022-11-22 11:07:20 +08:00
if err := rocksCache.DelGroupInfoFromCache(req.GroupID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
if err := s.DelGroupAndUserCache(req.OperationID, req.GroupID, nil); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
2022-03-24 15:33:30 +08:00
err := imdb.OperateGroupStatus(req.GroupID, constant.GroupStatusDismissed)
if err != nil {
log.NewError(req.OperationID, "OperateGroupStatus failed ", req.GroupID, constant.GroupStatusDismissed)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2022-05-27 18:40:24 +08:00
groupInfo, err := imdb.GetGroupInfoByGroupID(req.GroupID)
2022-04-20 18:47:21 +08:00
if err != nil {
2022-05-27 18:40:24 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
2022-04-20 18:47:21 +08:00
}
2022-05-27 18:40:24 +08:00
if groupInfo.GroupType != constant.SuperGroup {
memberList, err := imdb.GetGroupMemberListByGroupID(req.GroupID)
2022-04-20 18:47:21 +08:00
if err != nil {
2022-05-27 18:40:24 +08:00
log.NewError(req.OperationID, "GetGroupMemberListByGroupID failed,", err.Error(), req.GroupID)
2022-04-20 18:47:21 +08:00
}
2022-05-27 18:40:24 +08:00
//modify quitter conversation info
var reqPb pbUser.SetConversationReq
2022-08-21 23:37:43 +08:00
var c pbConversation.Conversation
2022-05-27 18:40:24 +08:00
for _, v := range memberList {
reqPb.OperationID = req.OperationID
c.OwnerUserID = v.UserID
c.ConversationID = utils.GetConversationIDBySessionType(req.GroupID, constant.GroupChatType)
c.ConversationType = constant.GroupChatType
c.GroupID = req.GroupID
c.IsNotInGroup = true
reqPb.Conversation = &c
2022-08-17 12:12:54 +08:00
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
2022-06-16 14:51:36 +08:00
if etcdConn == nil {
2022-08-17 12:12:54 +08:00
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
2022-06-16 14:51:36 +08:00
log.NewError(req.OperationID, errMsg)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrInternal.ErrCode, ErrMsg: errMsg}}, nil
}
2022-05-27 18:40:24 +08:00
client := pbUser.NewUserClient(etcdConn)
respPb, err := client.SetConversation(context.Background(), &reqPb)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error(), v.UserID)
} else {
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "SetConversation success", respPb.String(), v.UserID)
}
}
err = imdb.DeleteGroupMemberByGroupID(req.GroupID)
if err != nil {
log.NewError(req.OperationID, "DeleteGroupMemberByGroupID failed ", req.GroupID)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
chat.GroupDismissedNotification(req)
} else {
err = db.DB.DeleteSuperGroup(req.GroupID)
if err != nil {
log.NewError(req.OperationID, "DeleteGroupMemberByGroupID failed ", req.GroupID)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2022-03-24 15:33:30 +08:00
}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc return ", pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""})
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
}
2022-03-29 09:34:45 +08:00
// rpc MuteGroupMember(MuteGroupMemberReq) returns(MuteGroupMemberResp);
// rpc CancelMuteGroupMember(CancelMuteGroupMemberReq) returns(CancelMuteGroupMemberResp);
// rpc MuteGroup(MuteGroupReq) returns(MuteGroupResp);
// rpc CancelMuteGroup(CancelMuteGroupReq) returns(CancelMuteGroupResp);
func (s *groupServer) MuteGroupMember(ctx context.Context, req *pbGroup.MuteGroupMemberReq) (*pbGroup.MuteGroupMemberResp, error) {
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc args ", req.String())
2022-06-06 23:19:07 +08:00
opFlag, err := s.getGroupUserLevel(req.GroupID, req.OpUserID)
if err != nil {
errMsg := req.OperationID + " getGroupUserLevel failed " + req.GroupID + req.OpUserID + err.Error()
log.Error(req.OperationID, errMsg)
return &pbGroup.MuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
2022-03-29 09:34:45 +08:00
}
2022-06-06 23:19:07 +08:00
if opFlag == 0 {
errMsg := req.OperationID + "opFlag == 0 " + req.GroupID + req.OpUserID
log.Error(req.OperationID, errMsg)
return &pbGroup.MuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
2022-11-22 11:07:20 +08:00
mutedInfo, err := rocksCache.GetGroupMemberInfoFromCache(req.GroupID, req.UserID)
2022-06-06 23:19:07 +08:00
if err != nil {
2022-06-07 16:18:23 +08:00
errMsg := req.OperationID + " GetGroupMemberInfoByGroupIDAndUserID failed " + req.GroupID + req.UserID + err.Error()
2022-06-06 23:19:07 +08:00
return &pbGroup.MuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
if mutedInfo.RoleLevel == constant.GroupOwner && opFlag != 1 {
2022-06-07 18:25:08 +08:00
errMsg := req.OperationID + " mutedInfo.RoleLevel == constant.GroupOwner " + req.GroupID + req.UserID
2022-06-06 23:19:07 +08:00
return &pbGroup.MuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
if mutedInfo.RoleLevel == constant.GroupAdmin && opFlag == 3 {
2022-06-07 18:25:08 +08:00
errMsg := req.OperationID + " mutedInfo.RoleLevel == constant.GroupAdmin " + req.GroupID + req.UserID
2022-06-06 23:19:07 +08:00
return &pbGroup.MuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
2022-11-22 11:07:20 +08:00
if err := rocksCache.DelGroupMemberInfoFromCache(req.GroupID, req.UserID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID, req.UserID)
return &pbGroup.MuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
2023-01-04 17:22:55 +08:00
groupMemberInfo := imdb.GroupMember{GroupID: req.GroupID, UserID: req.UserID}
2022-03-29 17:03:06 +08:00
groupMemberInfo.MuteEndTime = time.Unix(int64(time.Now().Second())+int64(req.MutedSeconds), time.Now().UnixNano())
2022-06-06 23:19:07 +08:00
err = imdb.UpdateGroupMemberInfo(groupMemberInfo)
2022-03-29 09:34:45 +08:00
if err != nil {
log.Error(req.OperationID, "UpdateGroupMemberInfo failed ", err.Error(), groupMemberInfo)
return &pbGroup.MuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2022-03-29 16:04:15 +08:00
chat.GroupMemberMutedNotification(req.OperationID, req.OpUserID, req.GroupID, req.UserID, req.MutedSeconds)
2022-03-29 09:34:45 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc return ", pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""})
return &pbGroup.MuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
}
func (s *groupServer) CancelMuteGroupMember(ctx context.Context, req *pbGroup.CancelMuteGroupMemberReq) (*pbGroup.CancelMuteGroupMemberResp, error) {
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc args ", req.String())
2022-06-06 23:19:07 +08:00
opFlag, err := s.getGroupUserLevel(req.GroupID, req.OpUserID)
if err != nil {
errMsg := req.OperationID + " getGroupUserLevel failed " + req.GroupID + req.OpUserID + err.Error()
log.Error(req.OperationID, errMsg)
return &pbGroup.CancelMuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
if opFlag == 0 {
errMsg := req.OperationID + "opFlag == 0 " + req.GroupID + req.OpUserID
log.Error(req.OperationID, errMsg)
return &pbGroup.CancelMuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
2022-03-29 09:34:45 +08:00
}
2022-06-06 23:19:07 +08:00
mutedInfo, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupID, req.UserID)
if err != nil {
2022-06-07 16:18:23 +08:00
errMsg := req.OperationID + " GetGroupMemberInfoByGroupIDAndUserID failed " + req.GroupID + req.UserID + err.Error()
2022-06-06 23:19:07 +08:00
return &pbGroup.CancelMuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
if mutedInfo.RoleLevel == constant.GroupOwner && opFlag != 1 {
2022-06-07 18:25:08 +08:00
errMsg := req.OperationID + " mutedInfo.RoleLevel == constant.GroupOwner " + req.GroupID + req.UserID
2022-06-06 23:19:07 +08:00
return &pbGroup.CancelMuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
if mutedInfo.RoleLevel == constant.GroupAdmin && opFlag == 3 {
2022-06-07 18:25:08 +08:00
errMsg := req.OperationID + " mutedInfo.RoleLevel == constant.GroupAdmin " + req.GroupID + req.UserID
2022-06-06 23:19:07 +08:00
return &pbGroup.CancelMuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
2022-11-22 11:07:20 +08:00
if err := rocksCache.DelGroupMemberInfoFromCache(req.GroupID, req.UserID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
return &pbGroup.CancelMuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
2022-06-06 23:19:07 +08:00
2023-01-04 17:22:55 +08:00
groupMemberInfo := imdb.GroupMember{GroupID: req.GroupID, UserID: req.UserID}
2022-03-29 09:34:45 +08:00
groupMemberInfo.MuteEndTime = time.Unix(0, 0)
2022-06-06 23:19:07 +08:00
err = imdb.UpdateGroupMemberInfo(groupMemberInfo)
2022-03-29 09:34:45 +08:00
if err != nil {
log.Error(req.OperationID, "UpdateGroupMemberInfo failed ", err.Error(), groupMemberInfo)
return &pbGroup.CancelMuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2022-11-22 11:07:20 +08:00
2022-03-29 16:04:15 +08:00
chat.GroupMemberCancelMutedNotification(req.OperationID, req.OpUserID, req.GroupID, req.UserID)
2022-03-29 09:34:45 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc return ", pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""})
return &pbGroup.CancelMuteGroupMemberResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
}
func (s *groupServer) MuteGroup(ctx context.Context, req *pbGroup.MuteGroupReq) (*pbGroup.MuteGroupResp, error) {
2022-03-29 11:48:17 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc args ", req.String())
2022-06-06 23:19:07 +08:00
opFlag, err := s.getGroupUserLevel(req.GroupID, req.OpUserID)
if err != nil {
errMsg := req.OperationID + " getGroupUserLevel failed " + req.GroupID + req.OpUserID + err.Error()
log.Error(req.OperationID, errMsg)
return &pbGroup.MuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
if opFlag == 0 {
errMsg := req.OperationID + "opFlag == 0 " + req.GroupID + req.OpUserID
log.Error(req.OperationID, errMsg)
return &pbGroup.MuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
2022-06-07 10:20:56 +08:00
//mutedInfo, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupID, req.UserID)
//if err != nil {
// errMsg := req.OperationID + " GetGroupMemberInfoByGroupIDAndUserID failed " + req.GroupID + req.OpUserID + err.Error()
// return &pbGroup.MuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
//}
//if mutedInfo.RoleLevel == constant.GroupOwner && opFlag != 1 {
// errMsg := req.OperationID + " mutedInfo.RoleLevel == constant.GroupOwner " + req.GroupID + req.OpUserID + err.Error()
// return &pbGroup.MuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
//}
//if mutedInfo.RoleLevel == constant.GroupAdmin && opFlag == 3 {
// errMsg := req.OperationID + " mutedInfo.RoleLevel == constant.GroupAdmin " + req.GroupID + req.OpUserID + err.Error()
// return &pbGroup.MuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
//}
2022-11-22 11:07:20 +08:00
if err := rocksCache.DelGroupInfoFromCache(req.GroupID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
return &pbGroup.MuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
2022-06-06 23:19:07 +08:00
err = imdb.OperateGroupStatus(req.GroupID, constant.GroupStatusMuted)
2022-03-29 11:48:17 +08:00
if err != nil {
log.Error(req.OperationID, "OperateGroupStatus failed ", err.Error(), req.GroupID, constant.GroupStatusMuted)
return &pbGroup.MuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2022-11-22 11:07:20 +08:00
2022-03-29 16:04:15 +08:00
chat.GroupMutedNotification(req.OperationID, req.OpUserID, req.GroupID)
2022-03-29 11:48:17 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc return ", pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""})
return &pbGroup.MuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
2022-03-29 09:34:45 +08:00
}
func (s *groupServer) CancelMuteGroup(ctx context.Context, req *pbGroup.CancelMuteGroupReq) (*pbGroup.CancelMuteGroupResp, error) {
2022-03-29 11:48:17 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc args ", req.String())
2022-06-06 23:19:07 +08:00
opFlag, err := s.getGroupUserLevel(req.GroupID, req.OpUserID)
if err != nil {
errMsg := req.OperationID + " getGroupUserLevel failed " + req.GroupID + req.OpUserID + err.Error()
log.Error(req.OperationID, errMsg)
return &pbGroup.CancelMuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
if opFlag == 0 {
errMsg := req.OperationID + "opFlag == 0 " + req.GroupID + req.OpUserID
log.Error(req.OperationID, errMsg)
return &pbGroup.CancelMuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
}
2022-06-07 10:13:19 +08:00
//mutedInfo, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupID, req.)
//if err != nil {
// errMsg := req.OperationID + " GetGroupMemberInfoByGroupIDAndUserID failed " + req.GroupID + req.OpUserID + err.Error()
// return &pbGroup.CancelMuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
//}
//if mutedInfo.RoleLevel == constant.GroupOwner && opFlag != 1 {
// errMsg := req.OperationID + " mutedInfo.RoleLevel == constant.GroupOwner " + req.GroupID + req.OpUserID + err.Error()
// return &pbGroup.CancelMuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
//}
//if mutedInfo.RoleLevel == constant.GroupAdmin && opFlag == 3 {
// errMsg := req.OperationID + " mutedInfo.RoleLevel == constant.GroupAdmin " + req.GroupID + req.OpUserID + err.Error()
// return &pbGroup.CancelMuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}}, nil
//}
2022-06-07 18:09:11 +08:00
log.Debug(req.OperationID, "UpdateGroupInfoDefaultZero ", req.GroupID, map[string]interface{}{"status": constant.GroupOk})
2022-11-22 11:07:20 +08:00
if err := rocksCache.DelGroupInfoFromCache(req.GroupID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
return &pbGroup.CancelMuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
2022-06-06 23:19:07 +08:00
err = imdb.UpdateGroupInfoDefaultZero(req.GroupID, map[string]interface{}{"status": constant.GroupOk})
2022-03-29 11:48:17 +08:00
if err != nil {
2022-03-29 18:36:24 +08:00
log.Error(req.OperationID, "UpdateGroupInfoDefaultZero failed ", err.Error(), req.GroupID)
2022-03-29 11:48:17 +08:00
return &pbGroup.CancelMuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
2022-11-22 11:07:20 +08:00
2022-03-29 16:04:15 +08:00
chat.GroupCancelMutedNotification(req.OperationID, req.OpUserID, req.GroupID)
2022-03-29 11:48:17 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc return ", pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""})
return &pbGroup.CancelMuteGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
2022-03-29 09:34:45 +08:00
}
2022-04-18 11:52:17 +08:00
func (s *groupServer) SetGroupMemberNickname(ctx context.Context, req *pbGroup.SetGroupMemberNicknameReq) (*pbGroup.SetGroupMemberNicknameResp, error) {
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc args ", req.String())
if req.OpUserID != req.UserID && !token_verify.IsManagerUserID(req.OpUserID) {
errMsg := req.OperationID + " verify failed " + req.OpUserID + req.GroupID
log.Error(req.OperationID, errMsg)
return &pbGroup.SetGroupMemberNicknameResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
}
2022-12-16 16:54:18 +08:00
cbReq := &pbGroup.SetGroupMemberInfoReq{
GroupID: req.GroupID,
UserID: req.UserID,
OperationID: req.OperationID,
OpUserID: req.OpUserID,
Nickname: &wrapperspb.StringValue{Value: req.Nickname},
}
callbackResp := CallbackBeforeSetGroupMemberInfo(cbReq)
if callbackResp.ErrCode != 0 {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "CallbackBeforeMemberJoinGroup resp: ", callbackResp)
}
if callbackResp.ActionCode != constant.ActionAllow {
if callbackResp.ErrCode == 0 {
callbackResp.ErrCode = 201
}
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CallbackBeforeMemberJoinGroup result", "end rpc and return", callbackResp)
return &pbGroup.SetGroupMemberNicknameResp{
CommonResp: &pbGroup.CommonResp{
ErrCode: int32(callbackResp.ErrCode),
ErrMsg: callbackResp.ErrMsg,
},
}, nil
}
2022-04-18 11:52:17 +08:00
2022-12-16 16:54:18 +08:00
nickName := cbReq.Nickname.Value
2023-01-04 17:22:55 +08:00
groupMemberInfo := imdb.GroupMember{}
2022-04-18 11:52:17 +08:00
groupMemberInfo.UserID = req.UserID
groupMemberInfo.GroupID = req.GroupID
2022-12-16 16:54:18 +08:00
if nickName == "" {
2022-04-18 11:52:17 +08:00
userNickname, err := imdb.GetUserNameByUserID(groupMemberInfo.UserID)
if err != nil {
errMsg := req.OperationID + " GetUserNameByUserID failed " + err.Error()
log.Error(req.OperationID, errMsg)
return &pbGroup.SetGroupMemberNicknameResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
groupMemberInfo.Nickname = userNickname
} else {
2022-12-16 16:54:18 +08:00
groupMemberInfo.Nickname = nickName
2022-04-18 11:52:17 +08:00
}
2022-11-22 11:07:20 +08:00
2022-11-22 14:44:52 +08:00
if err := rocksCache.DelGroupMemberInfoFromCache(req.GroupID, req.UserID); err != nil {
2022-11-22 11:07:20 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
return &pbGroup.SetGroupMemberNicknameResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}}, nil
}
2022-04-18 11:52:17 +08:00
err := imdb.UpdateGroupMemberInfo(groupMemberInfo)
if err != nil {
errMsg := req.OperationID + " UpdateGroupMemberInfo failed " + err.Error()
log.Error(req.OperationID, errMsg)
return &pbGroup.SetGroupMemberNicknameResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
chat.GroupMemberInfoSetNotification(req.OperationID, req.OpUserID, req.GroupID, req.UserID)
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc return ", pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""})
return &pbGroup.SetGroupMemberNicknameResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
}
2022-06-02 18:17:11 +08:00
func (s *groupServer) SetGroupMemberInfo(ctx context.Context, req *pbGroup.SetGroupMemberInfoReq) (resp *pbGroup.SetGroupMemberInfoResp, err error) {
2022-06-07 16:18:18 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
resp = &pbGroup.SetGroupMemberInfoResp{CommonResp: &pbGroup.CommonResp{}}
2022-11-22 14:44:52 +08:00
if err := rocksCache.DelGroupMemberInfoFromCache(req.GroupID, req.UserID); err != nil {
2022-11-22 11:07:20 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID)
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = err.Error()
return resp, nil
}
2022-12-16 16:54:18 +08:00
callbackResp := CallbackBeforeSetGroupMemberInfo(req)
if callbackResp.ErrCode != 0 {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "CallbackBeforeMemberJoinGroup resp: ", callbackResp)
}
if callbackResp.ActionCode != constant.ActionAllow {
if callbackResp.ErrCode == 0 {
callbackResp.ErrCode = 201
}
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CallbackBeforeMemberJoinGroup result", "end rpc and return", callbackResp)
return &pbGroup.SetGroupMemberInfoResp{
CommonResp: &pbGroup.CommonResp{
ErrCode: int32(callbackResp.ErrCode),
ErrMsg: callbackResp.ErrMsg,
},
}, nil
}
2023-01-04 17:22:55 +08:00
groupMember := imdb.GroupMember{
2022-06-07 16:18:18 +08:00
GroupID: req.GroupID,
UserID: req.UserID,
}
m := make(map[string]interface{})
if req.RoleLevel != nil {
m["role_level"] = req.RoleLevel.Value
}
if req.FaceURL != nil {
m["user_group_face_url"] = req.FaceURL.Value
}
if req.Nickname != nil {
m["nickname"] = req.Nickname.Value
}
if req.Ex != nil {
m["ex"] = req.Ex.Value
2022-12-09 13:18:36 +08:00
} else {
2022-12-12 14:46:49 +08:00
m["ex"] = nil
2022-06-07 16:18:18 +08:00
}
err = imdb.UpdateGroupMemberInfoByMap(groupMember, m)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetGroupMemberInfo failed", err.Error())
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg + ":" + err.Error()
2022-06-07 16:59:05 +08:00
return resp, nil
2022-06-07 16:18:18 +08:00
}
2022-06-08 15:05:57 +08:00
if req.RoleLevel != nil {
switch req.RoleLevel.Value {
case constant.GroupOrdinaryUsers:
2022-07-20 21:26:52 +08:00
//msg.GroupMemberRoleLevelChangeNotification(req.OperationID, req.OpUserID, req.GroupID, req.UserID, constant.GroupMemberSetToOrdinaryUserNotification)
2022-06-08 15:40:33 +08:00
chat.GroupMemberInfoSetNotification(req.OperationID, req.OpUserID, req.GroupID, req.UserID)
2022-06-08 15:05:57 +08:00
case constant.GroupAdmin, constant.GroupOwner:
2022-07-20 21:26:52 +08:00
//msg.GroupMemberRoleLevelChangeNotification(req.OperationID, req.OpUserID, req.GroupID, req.UserID, constant.GroupMemberSetToAdminNotification)
2022-06-08 15:40:33 +08:00
chat.GroupMemberInfoSetNotification(req.OperationID, req.OpUserID, req.GroupID, req.UserID)
2022-06-08 15:05:57 +08:00
}
} else {
chat.GroupMemberInfoSetNotification(req.OperationID, req.OpUserID, req.GroupID, req.UserID)
}
2022-06-07 16:18:18 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
2022-06-02 18:17:11 +08:00
return resp, nil
}
2022-08-08 11:30:10 +08:00
func (s *groupServer) GetGroupAbstractInfo(c context.Context, req *pbGroup.GetGroupAbstractInfoReq) (*pbGroup.GetGroupAbstractInfoResp, error) {
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
resp := &pbGroup.GetGroupAbstractInfoResp{CommonResp: &pbGroup.CommonResp{}}
hashCode, err := rocksCache.GetGroupMemberListHashFromCache(req.GroupID)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetGroupMemberListHashFromCache failed", req.GroupID, err.Error())
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = err.Error()
return resp, nil
}
resp.GroupMemberListHash = hashCode
num, err := rocksCache.GetGroupMemberNumFromCache(req.GroupID)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetGroupMemberNumByGroupID failed", req.GroupID, err.Error())
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
resp.CommonResp.ErrMsg = err.Error()
return resp, nil
}
resp.GroupMemberNumber = int32(num)
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", resp.String())
return resp, nil
}
2022-11-22 11:07:20 +08:00
func (s *groupServer) DelGroupAndUserCache(operationID, groupID string, userIDList []string) error {
if groupID != "" {
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImCacheName, operationID)
if etcdConn == nil {
errMsg := operationID + "getcdv3.GetDefaultConn == nil"
log.NewError(operationID, errMsg)
return errors.New("etcdConn is nil")
}
cacheClient := pbCache.NewCacheClient(etcdConn)
cacheResp, err := cacheClient.DelGroupMemberIDListFromCache(context.Background(), &pbCache.DelGroupMemberIDListFromCacheReq{
GroupID: groupID,
OperationID: operationID,
})
if err != nil {
log.NewError(operationID, "DelGroupMemberIDListFromCache rpc call failed ", err.Error())
return utils.Wrap(err, "")
}
if cacheResp.CommonResp.ErrCode != 0 {
log.NewError(operationID, "DelGroupMemberIDListFromCache rpc logic call failed ", cacheResp.String())
return errors.New(fmt.Sprintf("errMsg is %s, errCode is %d", cacheResp.CommonResp.ErrMsg, cacheResp.CommonResp.ErrCode))
}
err = rocksCache.DelGroupMemberListHashFromCache(groupID)
if err != nil {
log.NewError(operationID, utils.GetSelfFuncName(), groupID, err.Error())
return utils.Wrap(err, "")
}
err = rocksCache.DelGroupMemberNumFromCache(groupID)
if err != nil {
log.NewError(operationID, utils.GetSelfFuncName(), err.Error(), groupID)
return utils.Wrap(err, "")
}
}
if userIDList != nil {
for _, userID := range userIDList {
err := rocksCache.DelJoinedGroupIDListFromCache(userID)
if err != nil {
log.NewError(operationID, utils.GetSelfFuncName(), err.Error())
return utils.Wrap(err, "")
}
}
}
return nil
}