create_group.go 5.4 KB
Newer Older
落凡尘.'s avatar
落凡尘. 已提交
1 2 3
package group

import (
Bytecode字节码联盟's avatar
Bytecode字节码联盟 已提交
4 5
	"Open_IM/internal/push/content_struct"
	"Open_IM/internal/push/logic"
6 7 8 9 10 11
	"Open_IM/pkg/common/config"
	"Open_IM/pkg/common/constant"
	"Open_IM/pkg/common/db"
	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
	"Open_IM/pkg/common/log"
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
12 13
	pbChat "Open_IM/pkg/proto/chat"
	pbGroup "Open_IM/pkg/proto/group"
14
	"Open_IM/pkg/utils"
落凡尘.'s avatar
落凡尘. 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
	"context"
	"google.golang.org/grpc"
	"net"
	"strconv"
	"strings"
	"time"
)

type groupServer struct {
	rpcPort         int
	rpcRegisterName string
	etcdSchema      string
	etcdAddr        []string
}

func NewGroupServer(port int) *groupServer {
	return &groupServer{
		rpcPort:         port,
		rpcRegisterName: config.Config.RpcRegisterName.OpenImGroupName,
		etcdSchema:      config.Config.Etcd.EtcdSchema,
		etcdAddr:        config.Config.Etcd.EtcdAddr,
	}
}
func (s *groupServer) Run() {
	log.Info("", "", "rpc group init....")

	ip := utils.ServerIP
	registerAddress := ip + ":" + strconv.Itoa(s.rpcPort)
	//listener network
	listener, err := net.Listen("tcp", registerAddress)
	if err != nil {
		log.InfoByArgs("listen network failed,err=%s", err.Error())
		return
	}
	log.Info("", "", "listen network success, address = %s", registerAddress)
	defer listener.Close()
	//grpc server
	srv := grpc.NewServer()
	defer srv.GracefulStop()
	//Service registers with etcd
	pbGroup.RegisterGroupServer(srv, s)
	err = getcdv3.RegisterEtcd(s.etcdSchema, strings.Join(s.etcdAddr, ","), ip, s.rpcPort, s.rpcRegisterName, 10)
	if err != nil {
		log.ErrorByArgs("get etcd failed,err=%s", err.Error())
		return
	}
	err = srv.Serve(listener)
	if err != nil {
		log.ErrorByArgs("listen rpc_group error,err=%s", err.Error())
		return
	}
	log.Info("", "", "rpc create group init success")
}

func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupReq) (*pbGroup.CreateGroupResp, error) {
	log.InfoByArgs("rpc create group is server,args=%s", req.String())
	var (
		groupId string
	)
	//Parse token, to find current user information
	claims, err := utils.ParseToken(req.Token)
	if err != nil {
		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
		return &pbGroup.CreateGroupResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
	}
	//Time stamp + MD5 to generate group chat id
落凡尘.'s avatar
落凡尘. 已提交
81
	groupId = utils.Md5(strconv.FormatInt(time.Now().UnixNano(), 10))
落凡尘.'s avatar
落凡尘. 已提交
82
	err = im_mysql_model.InsertIntoGroup(groupId, req.GroupName, req.Introduction, req.Notification, req.FaceUrl, req.Ex)
落凡尘.'s avatar
落凡尘. 已提交
83 84 85 86 87
	if err != nil {
		log.ErrorByKv("create group chat failed", req.OperationID, "err=%s", err.Error())
		return &pbGroup.CreateGroupResp{ErrorCode: config.ErrCreateGroup.ErrCode, ErrorMsg: config.ErrCreateGroup.ErrMsg}, nil
	}

programor_guo's avatar
programor_guo 已提交
88 89
	isMagagerFlag := 0
	tokenUid := claims.UID
programor_guo's avatar
programor_guo 已提交
90 91

	if utils.IsContain(tokenUid, config.Config.Manager.AppManagerUid) {
programor_guo's avatar
programor_guo 已提交
92
		isMagagerFlag = 1
落凡尘.'s avatar
落凡尘. 已提交
93
	}
落凡尘.'s avatar
落凡尘. 已提交
94

programor_guo's avatar
programor_guo 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
	if isMagagerFlag == 0 {
		//Add the group owner to the group first, otherwise the group creation will fail
		us, err := im_mysql_model.FindUserByUID(claims.UID)
		if err != nil {
			log.Error("", req.OperationID, "find userInfo failed", err.Error())
			return &pbGroup.CreateGroupResp{ErrorCode: config.ErrCreateGroup.ErrCode, ErrorMsg: config.ErrCreateGroup.ErrMsg}, nil
		}
		err = im_mysql_model.InsertIntoGroupMember(groupId, claims.UID, us.Name, us.Icon, constant.GroupOwner)
		if err != nil {
			log.Error("", req.OperationID, "create group chat failed,err=%s", err.Error())
			return &pbGroup.CreateGroupResp{ErrorCode: config.ErrCreateGroup.ErrCode, ErrorMsg: config.ErrCreateGroup.ErrMsg}, nil
		}

		err = db.DB.AddGroupMember(groupId, claims.UID)
		if err != nil {
			log.Error("", "", "create mongo group member failed, db.DB.AddGroupMember fail [err: %s]", err.Error())
			return &pbGroup.CreateGroupResp{ErrorCode: config.ErrCreateGroup.ErrCode, ErrorMsg: config.ErrCreateGroup.ErrMsg}, nil
		}
落凡尘.'s avatar
落凡尘. 已提交
113 114
	}

落凡尘.'s avatar
落凡尘. 已提交
115 116
	//Binding group id and member id
	for _, user := range req.MemberList {
落凡尘.'s avatar
落凡尘. 已提交
117 118 119 120 121 122
		us, err := im_mysql_model.FindUserByUID(user.Uid)
		if err != nil {
			log.Error("", req.OperationID, "find userInfo failed,uid=%s", user.Uid, err.Error())
			continue
		}
		err = im_mysql_model.InsertIntoGroupMember(groupId, user.Uid, us.Name, us.Icon, user.SetRole)
落凡尘.'s avatar
落凡尘. 已提交
123 124 125
		if err != nil {
			log.ErrorByArgs("pull %s to group %s failed,err=%s", user.Uid, groupId, err.Error())
		}
落凡尘.'s avatar
落凡尘. 已提交
126 127 128 129
		err = db.DB.AddGroupMember(groupId, user.Uid)
		if err != nil {
			log.Error("", "", "add mongo group member failed, db.DB.AddGroupMember fail [err: %s]", err.Error())
		}
落凡尘.'s avatar
落凡尘. 已提交
130
	}
programor_guo's avatar
programor_guo 已提交
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

	if isMagagerFlag == 1 {

		//type NotificationContent struct {
		//	IsDisplay   int32  `json:"isDisplay"`
		//	DefaultTips string `json:"defaultTips"`
		//	Detail      string `json:"detail"`
		//}	n := NotificationContent{
		//		IsDisplay:   1,
		//		DefaultTips: "You have joined the group chat:" + createGroupResp.Data.GroupName,
		//		Detail:      createGroupResp.Data.GroupId,
		//	}

		////Push message when create group chat
		n := content_struct.NotificationContent{1, req.GroupName, groupId}
		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
			SendID:      claims.UID,
			RecvID:      groupId,
			Content:     n.ContentToString(),
			SendTime:    utils.GetCurrentTimestampByNano(),
			MsgFrom:     constant.SysMsgType,     //Notification message identification
			ContentType: constant.CreateGroupTip, //Add friend flag
			SessionType: constant.GroupChatType,
			OperationID: req.OperationID,
		})
	}

落凡尘.'s avatar
落凡尘. 已提交
158 159 160
	log.Info(req.Token, req.OperationID, "rpc create group success return")
	return &pbGroup.CreateGroupResp{GroupID: groupId}, nil
}