From a8e80a44e6bfe5560ae966ff791c2d8f7c17e25d Mon Sep 17 00:00:00 2001
From: wenxu12345 <44203734@qq.com>
Date: Wed, 22 Dec 2021 15:24:49 +0800
Subject: [PATCH] notification

---
 internal/rpc/chat/send_msg.go                 |  14 +-
 internal/rpc/group/create_group.go            | 150 -----
 .../rpc/group/get_group_applicationList.go    |  21 -
 internal/rpc/group/get_groups_info.go         |  42 --
 internal/rpc/group/group.go                   | 579 +++++++++++++-----
 .../rpc/group/group_application_response.go   |  56 --
 internal/rpc/group/join_group.go              |  51 --
 internal/rpc/group/quit_group.go              |  55 --
 internal/rpc/group/set_group_info.go          |  60 --
 internal/rpc/group/transfer_group_owner.go    |  21 -
 pkg/proto/group/group.pb.go                   | 521 +++++++++-------
 pkg/proto/group/group.proto                   |  60 +-
 12 files changed, 795 insertions(+), 835 deletions(-)
 delete mode 100644 internal/rpc/group/create_group.go
 delete mode 100644 internal/rpc/group/get_group_applicationList.go
 delete mode 100644 internal/rpc/group/get_groups_info.go
 delete mode 100644 internal/rpc/group/group_application_response.go
 delete mode 100644 internal/rpc/group/join_group.go
 delete mode 100644 internal/rpc/group/quit_group.go
 delete mode 100644 internal/rpc/group/set_group_info.go
 delete mode 100644 internal/rpc/group/transfer_group_owner.go

diff --git a/internal/rpc/chat/send_msg.go b/internal/rpc/chat/send_msg.go
index 1f2737bf1..3403e84bc 100644
--- a/internal/rpc/chat/send_msg.go
+++ b/internal/rpc/chat/send_msg.go
@@ -328,7 +328,7 @@ func ApplicationProcessedNotification(operationID, RecvID string, group immysql.
 //  GroupMemberFullInfo InvitedUser = 3;
 //  uint64 OperationTime = 4;
 //}
-func MemberInvitedNotification(operationID string, group immysql.Group, opUser immysql.GroupMember, invitedUser immysql.GroupMember) {
+func MemberInvitedNotification(operationID string, group immysql.Group, opUser immysql.User, invitedUser immysql.GroupMember) {
 
 }
 
@@ -338,6 +338,10 @@ func MemberInvitedNotification(operationID string, group immysql.Group, opUser i
 //  GroupMemberFullInfo KickedUser = 3;
 //  uint64 OperationTime = 4;
 //}
+
+func MemberKickedNotificationID(operationID, GroupID, opUserID, kickedUserID, reason string) {
+
+}
 func MemberKickedNotification(operationID string, group immysql.Group, opUser immysql.GroupMember, KickedUser immysql.GroupMember) {
 
 }
@@ -347,6 +351,11 @@ func MemberKickedNotification(operationID string, group immysql.Group, opUser im
 //  GroupInfo Group = 2;
 //  GroupMemberFullInfo OpUser = 3;
 //}
+func GroupInfoChangedNotification(operationID string, changedType int32, groupID string, opUserID string) {
+
+}
+
+/*
 func GroupInfoChangedNotification(operationID string, changedType int32, group *immysql.Group, opUser *immysql.GroupMember) {
 	var n NotificationMsg
 	n.SendID = opUser.UserID
@@ -369,13 +378,14 @@ func GroupInfoChangedNotification(operationID string, changedType int32, group *
 	n.Content, _ = json.Marshal(tips)
 	Notification(&n, false)
 }
+*/
 
 //message MemberLeaveTips{
 //  GroupInfo Group = 1;
 //  GroupMemberFullInfo LeaverUser = 2;
 //  uint64 OperationTime = 3;
 //}
-func MemberLeaveNotification(operationID string, group *immysql.Group, leaverUser *immysql.GroupMember) {
+func MemberLeaveNotification(operationID, groupID, leaverUserID string) {
 
 }
 
diff --git a/internal/rpc/group/create_group.go b/internal/rpc/group/create_group.go
deleted file mode 100644
index 8edc72885..000000000
--- a/internal/rpc/group/create_group.go
+++ /dev/null
@@ -1,150 +0,0 @@
-package group
-
-import (
-	"Open_IM/internal/rpc/chat"
-	"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/common/token_verify"
-	"Open_IM/pkg/grpc-etcdv3/getcdv3"
-	pbGroup "Open_IM/pkg/proto/group"
-	"Open_IM/pkg/utils"
-	"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 {
-	log.NewPrivateLog("group")
-	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.NewInfo(req.OperationID, "CreateGroup, args=%s", req.String())
-	var (
-		groupId string
-	)
-	//Parse token, to find current user information
-	claims, err := token_verify.ParseToken(req.Token)
-	if err != nil {
-		log.NewError(req.OperationID, "ParseToken failed, ", err.Error(), req.String())
-		return &pbGroup.CreateGroupResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
-	}
-	//Time stamp + MD5 to generate group chat id
-	groupId = utils.Md5(strconv.FormatInt(time.Now().UnixNano(), 10))
-	err = im_mysql_model.InsertIntoGroup(groupId, req.GroupName, req.Introduction, req.Notification, req.FaceUrl, req.Ex)
-	if err != nil {
-		log.NewError(req.OperationID, "InsertIntoGroup failed, ", err.Error(), req.String())
-		return &pbGroup.CreateGroupResp{ErrorCode: constant.ErrCreateGroup.ErrCode, ErrorMsg: constant.ErrCreateGroup.ErrMsg}, nil
-	}
-
-	isManagerFlag := 0
-	tokenUid := claims.UID
-
-	if utils.IsContain(tokenUid, config.Config.Manager.AppManagerUid) {
-		isManagerFlag = 1
-	}
-
-	us, err := im_mysql_model.FindUserByUID(claims.UID)
-	if err != nil {
-		log.Error("", req.OperationID, "find userInfo failed", err.Error())
-		return &pbGroup.CreateGroupResp{ErrorCode: constant.ErrCreateGroup.ErrCode, ErrorMsg: constant.ErrCreateGroup.ErrMsg}, nil
-	}
-
-	if isManagerFlag == 0 {
-		//Add the group owner to the group first, otherwise the group creation will fail
-		err = im_mysql_model.InsertIntoGroupMember(groupId, claims.UID, us.Nickname, us.FaceUrl, constant.GroupOwner)
-		if err != nil {
-			log.Error("", req.OperationID, "create group chat failed,err=%s", err.Error())
-			return &pbGroup.CreateGroupResp{ErrorCode: constant.ErrCreateGroup.ErrCode, ErrorMsg: constant.ErrCreateGroup.ErrMsg}, nil
-		}
-
-		err = db.DB.AddGroupMember(groupId, claims.UID)
-		if err != nil {
-			log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), groupId, claims.UID)
-			return &pbGroup.CreateGroupResp{ErrorCode: constant.ErrCreateGroup.ErrCode, ErrorMsg: constant.ErrCreateGroup.ErrMsg}, nil
-		}
-	}
-
-	//Binding group id and member id
-	for _, user := range req.MemberList {
-		us, err := im_mysql_model.FindUserByUID(user.Uid)
-		if err != nil {
-			log.NewError(req.OperationID, "FindUserByUID failed ", err.Error(), user.Uid)
-			continue
-		}
-		err = im_mysql_model.InsertIntoGroupMember(groupId, user.Uid, us.Nickname, us.FaceUrl, user.SetRole)
-		if err != nil {
-			log.ErrorByArgs("InsertIntoGroupMember failed", user.Uid, groupId, err.Error())
-		}
-		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())
-		}
-	}
-
-	if isManagerFlag == 1 {
-
-	}
-	group, err := im_mysql_model.FindGroupInfoByGroupId(groupId)
-	if err != nil {
-		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed ", err.Error(), groupId)
-		return &pbGroup.CreateGroupResp{GroupID: groupId}, nil
-	}
-	memberList, err := im_mysql_model.FindGroupMemberListByGroupId(groupId)
-	if err != nil {
-		log.NewError(req.OperationID, "FindGroupMemberListByGroupId failed ", err.Error(), groupId)
-		return &pbGroup.CreateGroupResp{GroupID: groupId}, nil
-	}
-	chat.GroupCreatedNotification(req.OperationID, us, group, memberList)
-	log.NewInfo(req.OperationID, "GroupCreatedNotification, rpc CreateGroup success return ", groupId)
-
-	return &pbGroup.CreateGroupResp{GroupID: groupId}, nil
-}
diff --git a/internal/rpc/group/get_group_applicationList.go b/internal/rpc/group/get_group_applicationList.go
deleted file mode 100644
index a08b32f8e..000000000
--- a/internal/rpc/group/get_group_applicationList.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package group
-
-import (
-	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
-	"Open_IM/pkg/common/log"
-	"Open_IM/pkg/proto/group"
-	"context"
-)
-
-func (s *groupServer) GetGroupApplicationList(_ context.Context, pb *group.GetGroupApplicationListReq) (*group.GetGroupApplicationListResp, error) {
-	log.Info("", "", "rpc GetGroupApplicationList call start..., [pb: %s]", pb.String())
-
-	reply, err := im_mysql_model.GetGroupApplicationList(pb.UID)
-	if err != nil {
-		log.Error("", "", "rpc GetGroupApplicationList call..., im_mysql_model.GetGroupApplicationList fail [uid: %s] [err: %s]", pb.UID, err.Error())
-		return &group.GetGroupApplicationListResp{ErrCode: 701, ErrMsg: "GetGroupApplicationList failed"}, nil
-	}
-	log.Info("", "", "rpc GetGroupApplicationList call..., im_mysql_model.GetGroupApplicationList")
-
-	return reply, nil
-}
diff --git a/internal/rpc/group/get_groups_info.go b/internal/rpc/group/get_groups_info.go
deleted file mode 100644
index f0d952e94..000000000
--- a/internal/rpc/group/get_groups_info.go
+++ /dev/null
@@ -1,42 +0,0 @@
-package group
-
-import (
-	"Open_IM/pkg/common/constant"
-	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
-	"Open_IM/pkg/common/log"
-	"Open_IM/pkg/common/token_verify"
-	pbGroup "Open_IM/pkg/proto/group"
-	"context"
-)
-
-func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsInfoReq) (*pbGroup.GetGroupsInfoResp, error) {
-	log.Info(req.Token, req.OperationID, "rpc get group info is server,args=%s", req.String())
-	//Parse token, to find current user information
-	claims, err := token_verify.ParseToken(req.Token)
-	if err != nil {
-		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-		return &pbGroup.GetGroupsInfoResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
-	}
-	log.Info("", req.OperationID, "args:", req.GroupIDList, claims.UID)
-	groupsInfoList := make([]*pbGroup.GroupInfo, 0)
-	for _, groupID := range req.GroupIDList {
-		groupInfoFromMysql, err := im_mysql_model.FindGroupInfoByGroupId(groupID)
-		if err != nil {
-			log.Error(req.Token, req.OperationID, "find group info failed,err=%s", err.Error())
-			continue
-		}
-		var groupInfo pbGroup.GroupInfo
-		groupInfo.GroupId = groupID
-		groupInfo.GroupName = groupInfoFromMysql.Name
-		groupInfo.Introduction = groupInfoFromMysql.Introduction
-		groupInfo.Notification = groupInfoFromMysql.Notification
-		groupInfo.FaceUrl = groupInfoFromMysql.FaceUrl
-		groupInfo.OwnerId = im_mysql_model.GetGroupOwnerByGroupId(groupID)
-		groupInfo.MemberCount = uint32(im_mysql_model.GetGroupMemberNumByGroupId(groupID))
-		groupInfo.CreateTime = uint64(groupInfoFromMysql.CreateTime.Unix())
-
-		groupsInfoList = append(groupsInfoList, &groupInfo)
-	}
-	log.Info(req.Token, req.OperationID, "rpc get groupsInfo success return")
-	return &pbGroup.GetGroupsInfoResp{Data: groupsInfoList}, nil
-}
diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go
index e5b7cfc7d..bd8d3dd86 100644
--- a/internal/rpc/group/group.go
+++ b/internal/rpc/group/group.go
@@ -1,50 +1,183 @@
 package group
 
 import (
-	"Open_IM/internal/push/content_struct"
-	"Open_IM/internal/push/logic"
+	"Open_IM/internal/rpc/chat"
 	"Open_IM/pkg/common/config"
 	"Open_IM/pkg/common/constant"
 	"Open_IM/pkg/common/db"
-	"Open_IM/pkg/common/token_verify"
-	pbChat "Open_IM/pkg/proto/chat"
-	"encoding/json"
-
+	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
 	imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
 	"Open_IM/pkg/common/log"
+	"Open_IM/pkg/common/token_verify"
+	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 	pbGroup "Open_IM/pkg/proto/group"
 	"Open_IM/pkg/utils"
 	"context"
-
+	"encoding/json"
 	"fmt"
+	"google.golang.org/grpc"
+	"net"
+	"strconv"
+	"strings"
+	"time"
 )
 
+type groupServer struct {
+	rpcPort         int
+	rpcRegisterName string
+	etcdSchema      string
+	etcdAddr        []string
+}
+
+func NewGroupServer(port int) *groupServer {
+	log.NewPrivateLog("group")
+	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.NewInfo(req.OperationID, "CreateGroup, args=%s", req.String())
+	var (
+		groupId string
+	)
+	//Parse token, to find current user information
+	claims, err := token_verify.ParseToken(req.Token)
+	if err != nil {
+		log.NewError(req.OperationID, "ParseToken failed, ", err.Error(), req.String())
+		return &pbGroup.CreateGroupResp{ErrCode: constant.ErrParseToken.ErrCode, ErrMsg: constant.ErrParseToken.ErrMsg}, nil
+	}
+	//Time stamp + MD5 to generate group chat id
+	groupId = utils.Md5(strconv.FormatInt(time.Now().UnixNano(), 10))
+	err = im_mysql_model.InsertIntoGroup(groupId, req.GroupName, req.Introduction, req.Notification, req.FaceUrl, req.Ext)
+	if err != nil {
+		log.NewError(req.OperationID, "InsertIntoGroup failed, ", err.Error(), req.String())
+		return &pbGroup.CreateGroupResp{ErrCode: constant.ErrCreateGroup.ErrCode, ErrMsg: constant.ErrCreateGroup.ErrMsg}, nil
+	}
+
+	isManagerFlag := 0
+	tokenUid := claims.UID
+
+	if utils.IsContain(tokenUid, config.Config.Manager.AppManagerUid) {
+		isManagerFlag = 1
+	}
+
+	us, err := im_mysql_model.FindUserByUID(claims.UID)
+	if err != nil {
+		log.Error("", req.OperationID, "find userInfo failed", err.Error())
+		return &pbGroup.CreateGroupResp{ErrCode: constant.ErrCreateGroup.ErrCode, ErrMsg: constant.ErrCreateGroup.ErrMsg}, nil
+	}
+
+	if isManagerFlag == 0 {
+		//Add the group owner to the group first, otherwise the group creation will fail
+		err = im_mysql_model.InsertIntoGroupMember(groupId, claims.UID, us.Nickname, us.FaceUrl, constant.GroupOwner)
+		if err != nil {
+			log.Error("", req.OperationID, "create group chat failed,err=%s", err.Error())
+			return &pbGroup.CreateGroupResp{ErrCode: constant.ErrCreateGroup.ErrCode, ErrMsg: constant.ErrCreateGroup.ErrMsg}, nil
+		}
+
+		err = db.DB.AddGroupMember(groupId, claims.UID)
+		if err != nil {
+			log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), groupId, claims.UID)
+			return &pbGroup.CreateGroupResp{ErrCode: constant.ErrCreateGroup.ErrCode, ErrMsg: constant.ErrCreateGroup.ErrMsg}, nil
+		}
+	}
+
+	//Binding group id and member id
+	for _, user := range req.MemberList {
+		us, err := im_mysql_model.FindUserByUID(user.Uid)
+		if err != nil {
+			log.NewError(req.OperationID, "FindUserByUID failed ", err.Error(), user.Uid)
+			continue
+		}
+		err = im_mysql_model.InsertIntoGroupMember(groupId, user.Uid, us.Nickname, us.FaceUrl, user.SetRole)
+		if err != nil {
+			log.ErrorByArgs("InsertIntoGroupMember failed", user.Uid, groupId, err.Error())
+		}
+		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())
+		}
+	}
+
+	if isManagerFlag == 1 {
+
+	}
+	group, err := im_mysql_model.FindGroupInfoByGroupId(groupId)
+	if err != nil {
+		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed ", err.Error(), groupId)
+		return &pbGroup.CreateGroupResp{GroupID: groupId}, nil
+	}
+	memberList, err := im_mysql_model.FindGroupMemberListByGroupId(groupId)
+	if err != nil {
+		log.NewError(req.OperationID, "FindGroupMemberListByGroupId failed ", err.Error(), groupId)
+		return &pbGroup.CreateGroupResp{GroupID: groupId}, nil
+	}
+	chat.GroupCreatedNotification(req.OperationID, us, group, memberList)
+	log.NewInfo(req.OperationID, "GroupCreatedNotification, rpc CreateGroup success return ", groupId)
+
+	return &pbGroup.CreateGroupResp{GroupID: groupId}, nil
+}
+
 func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (*pbGroup.GetJoinedGroupListResp, error) {
 	claims, err := token_verify.ParseToken(req.Token)
 	if err != nil {
 		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-		return &pbGroup.GetJoinedGroupListResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
+		return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
 	}
 	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())
 
 	joinedGroupList, err := imdb.GetJoinedGroupIdListByMemberId(claims.UID)
 	if err != nil {
 		log.Error(claims.UID, req.OperationID, "GetJoinedGroupIdListByMemberId failed, err: ", err.Error())
-		return &pbGroup.GetJoinedGroupListResp{ErrorCode: constant.ErrParam.ErrCode, ErrorMsg: constant.ErrParam.ErrMsg}, nil
+		return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrParam.ErrCode, ErrorMsg: constant.ErrParam.ErrMsg}, nil
 	}
 
 	var resp pbGroup.GetJoinedGroupListResp
 
 	for _, v := range joinedGroupList {
 		var groupNode pbGroup.GroupInfo
-		num := imdb.GetGroupMemberNumByGroupId(v.GroupId)
-		owner := imdb.GetGroupOwnerByGroupId(v.GroupId)
-		group, err := imdb.FindGroupInfoByGroupId(v.GroupId)
+		num := imdb.GetGroupMemberNumByGroupId(v.GroupID)
+		owner := imdb.GetGroupOwnerByGroupId(v.GroupID)
+		group, err := imdb.FindGroupInfoByGroupId(v.GroupID)
 		if num > 0 && owner != "" && err == nil {
-			groupNode.GroupId = v.GroupId
+			groupNode.GroupId = v.GroupID
 			groupNode.FaceUrl = group.FaceUrl
 			groupNode.CreateTime = uint64(group.CreateTime.Unix())
-			groupNode.GroupName = group.Name
+			groupNode.GroupName = group.GroupName
 			groupNode.Introduction = group.Introduction
 			groupNode.Notification = group.Notification
 			groupNode.OwnerId = owner
@@ -53,28 +186,21 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
 		}
 		log.Info(claims.UID, req.OperationID, "member num: ", num, "owner: ", owner)
 	}
-	resp.ErrorCode = 0
+	resp.ErrCode = 0
 	return &resp, nil
 }
 
 func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.InviteUserToGroupReq) (*pbGroup.InviteUserToGroupResp, error) {
-	claims, err := token_verify.ParseToken(req.Token)
-	if err != nil {
-		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-		return &pbGroup.InviteUserToGroupResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
-	}
-	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())
-	//	if !imdb.IsExistGroupMember(req.GroupID, claims.UID) &&  claims.UID != config.Config.AppManagerUid
-
-	if !imdb.IsExistGroupMember(req.GroupID, claims.UID) && !utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
-		log.Error(req.Token, req.OperationID, "err= invite user not in group")
-		return &pbGroup.InviteUserToGroupResp{ErrorCode: constant.ErrAccess.ErrCode, ErrorMsg: constant.ErrAccess.ErrMsg}, nil
+	log.NewInfo(req.OperationID, "InviteUserToGroup args: ", req.String())
+	if !imdb.IsExistGroupMember(req.GroupID, req.OpUserID) && !utils.IsContain(req.OpUserID, config.Config.Manager.AppManagerUid) {
+		log.NewError(req.OperationID, "no permission InviteUserToGroup ", req.GroupID)
+		return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
 	}
 
 	groupInfoFromMysql, err := imdb.FindGroupInfoByGroupId(req.GroupID)
 	if err != nil || groupInfoFromMysql == nil {
-		log.NewError(req.OperationID, "get group info error", req.GroupID, req.UidList)
-		return &pbGroup.InviteUserToGroupResp{ErrorCode: constant.ErrAccess.ErrCode, ErrorMsg: constant.ErrAccess.ErrMsg}, nil
+		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed", req.GroupID)
+		return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
 	}
 
 	//
@@ -82,12 +208,10 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
 	//to user:  invite: invited
 	//to application
 	var resp pbGroup.InviteUserToGroupResp
-	/*
-		fromUserInfo, err := imdb.FindUserByUID(claims.UID)
-		if err != nil {
-			log.Error(claims.UID, req.OperationID, "FindUserByUID failed, err: ", err.Error())
-			return &pbGroup.InviteUserToGroupResp{ErrorCode: config.ErrParam.ErrCode, ErrorMsg: config.ErrParam.ErrMsg}, nil
-		}*/
+	opUser, err := imdb.FindUserByUID(req.OpUserID)
+	if err != nil {
+		log.NewError(req.OperationID, "FindUserByUID failed ", err.Error(), req.OpUserID)
+	}
 	var nicknameList string
 	for _, v := range req.UidList {
 		var resultNode pbGroup.Id2Result
@@ -95,58 +219,42 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
 		resultNode.Result = 0
 		toUserInfo, err := imdb.FindUserByUID(v)
 		if err != nil {
-			log.Error(v, req.OperationID, "FindUserByUID failed, err: ", err.Error())
+			log.NewError(req.OperationID, "FindUserByUID failed ", err.Error())
 			resultNode.Result = -1
 			resp.Id2Result = append(resp.Id2Result, &resultNode)
 			continue
 		}
 
 		if imdb.IsExistGroupMember(req.GroupID, v) {
-			log.Error(v, req.OperationID, "user has already in group")
+			log.NewError(req.OperationID, "ExistGroupMember failed ", req.GroupID, v)
 			resultNode.Result = -1
 			resp.Id2Result = append(resp.Id2Result, &resultNode)
 			continue
 		}
 
-		err = imdb.InsertGroupMember(req.GroupID, toUserInfo.UID, toUserInfo.Name, toUserInfo.Icon, 0)
+		err = imdb.InsertGroupMember(req.GroupID, toUserInfo.UserID, toUserInfo.Nickname, toUserInfo.FaceUrl, 0)
 		if err != nil {
-			log.Error(v, req.OperationID, "InsertGroupMember failed, ", err.Error(), "params: ",
-				req.GroupID, toUserInfo.UID, toUserInfo.Name, toUserInfo.Icon)
+			log.NewError(req.OperationID, "InsertGroupMember failed ", req.GroupID, toUserInfo.UserID, toUserInfo.Nickname, toUserInfo.FaceUrl)
 			resultNode.Result = -1
 			resp.Id2Result = append(resp.Id2Result, &resultNode)
 			continue
 		}
-		err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UID)
+		member, err := imdb.GetMemberInfoById(req.GroupID, v)
+		if groupInfoFromMysql != nil && opUser != nil && member != nil {
+			chat.MemberInvitedNotification(req.OperationID, *groupInfoFromMysql, *opUser, *member)
+		} else {
+			log.NewError(req.OperationID, "args failed, nil ", groupInfoFromMysql, opUser, member)
+		}
+
+		err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UserID)
 		if err != nil {
 			log.Error("", "", "add mongo group member failed, db.DB.AddGroupMember fail [err: %s]", err.Error())
 		}
-		nicknameList = nicknameList + toUserInfo.Name + " "
+		nicknameList = nicknameList + toUserInfo.Nickname + " "
 		resp.Id2Result = append(resp.Id2Result, &resultNode)
 	}
-	resp.ErrorCode = 0
-	resp.ErrorMsg = "ok"
-
-	//if claims.UID == config.Config.AppManagerUid
-	if utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
-		m, _ := imdb.FindUserByUID(claims.UID)
-		var iu inviteUserToGroupReq
-		iu.GroupID = req.GroupID
-		iu.OperationID = req.OperationID
-		iu.Reason = req.Reason
-		iu.UidList = req.UidList
-		n := content_struct.NotificationContent{1, nicknameList + "  invited into the group chat by " + m.Name, iu.ContentToString()}
-		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-			SendID:      claims.UID,
-			RecvID:      req.GroupID,
-			Content:     n.ContentToString(),
-			SendTime:    utils.GetCurrentTimestampByNano(),
-			MsgFrom:     constant.UserMsgType,
-			ContentType: constant.InviteUserToGroupTip,
-			SessionType: constant.GroupChatType,
-			OperationID: req.OperationID,
-		})
-	}
 
+	resp.ErrCode = 0
 	return &resp, nil
 }
 
@@ -164,20 +272,12 @@ func (c *inviteUserToGroupReq) ContentToString() string {
 }
 
 func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGroupAllMemberReq) (*pbGroup.GetGroupAllMemberResp, error) {
-	//claims, err := utils.ParseToken(req.Token)
-	//if err != nil {
-	//	log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-	//	if req.Token != config.Config.Secret {
-	//		return &pbGroup.GetGroupAllMemberResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
-	//	}
-	//}
-
 	var resp pbGroup.GetGroupAllMemberResp
-	resp.ErrorCode = 0
+	resp.ErrCode = 0
 	memberList, err := imdb.FindGroupMemberListByGroupId(req.GroupID)
 	if err != nil {
-		resp.ErrorCode = constant.ErrDb.ErrCode
-		resp.ErrorMsg = err.Error()
+		resp.ErrCode = constant.ErrDb.ErrCode
+		resp.ErrMsg = err.Error()
 		log.NewError(req.OperationID, "FindGroupMemberListByGroupId failed,", err.Error(), req.GroupID)
 		return &resp, nil
 	}
@@ -186,13 +286,13 @@ func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGro
 		var node pbGroup.GroupMemberFullInfo
 		node.Role = v.AdministratorLevel
 		node.NickName = v.NickName
-		node.UserId = v.Uid
-		node.FaceUrl = v.UserGroupFaceUrl
+		node.UserId = v.UserID
+		node.FaceUrl = v.FaceUrl
 		node.JoinTime = uint64(v.JoinTime.Unix())
 		resp.MemberList = append(resp.MemberList, &node)
 	}
 
-	resp.ErrorCode = 0
+	resp.ErrCode = 0
 	return &resp, nil
 }
 
@@ -200,16 +300,16 @@ func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGr
 	claims, err := token_verify.ParseToken(req.Token)
 	if err != nil {
 		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-		return &pbGroup.GetGroupMemberListResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
+		return &pbGroup.GetGroupMemberListResp{ErrCode: constant.ErrParseToken.ErrCode, ErrMsg: constant.ErrParseToken.ErrMsg}, nil
 	}
 	//	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())
 	fmt.Println("req: ", req.GroupID)
 	var resp pbGroup.GetGroupMemberListResp
-	resp.ErrorCode = 0
+	resp.ErrCode = 0
 	memberList, err := imdb.GetGroupMemberByGroupId(req.GroupID, req.Filter, req.NextSeq, 30)
 	if err != nil {
-		resp.ErrorCode = constant.ErrDb.ErrCode
-		resp.ErrorMsg = err.Error()
+		resp.ErrCode = constant.ErrDb.ErrCode
+		resp.ErrMsg = err.Error()
 		log.Error(claims.UID, req.OperationID, "GetGroupMemberByGroupId failed, ", err.Error(), "params: ", req.GroupID, req.Filter, req.NextSeq)
 		return &resp, nil
 	}
@@ -218,7 +318,7 @@ func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGr
 		var node pbGroup.GroupMemberFullInfo
 		node.Role = v.AdministratorLevel
 		node.NickName = v.NickName
-		node.UserId = v.Uid
+		node.UserId = v.UserID
 		//	node.FaceUrl =
 		node.JoinTime = uint64(v.JoinTime.Unix())
 		resp.MemberList = append(resp.MemberList, &node)
@@ -230,7 +330,7 @@ func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGr
 		resp.NextSeq = req.NextSeq + int32(len(memberList))
 	}
 
-	resp.ErrorCode = 0
+	resp.ErrCode = 0
 	return &resp, nil
 }
 
@@ -257,54 +357,51 @@ func (c *kickGroupMemberApiReq) ContentToString() string {
 }
 
 func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGroupMemberReq) (*pbGroup.KickGroupMemberResp, error) {
-	claims, err := token_verify.ParseToken(req.Token)
-	if err != nil {
-		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-		return &pbGroup.KickGroupMemberResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
-	}
-	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())
-
+	log.NewInfo(req.OperationID, "KickGroupMember failed ", req.String())
 	ownerList, err := imdb.GetOwnerManagerByGroupId(req.GroupID)
 	if err != nil {
-		log.Error(claims.UID, req.OperationID, req.GroupID, "GetOwnerManagerByGroupId, ", err.Error())
-		return &pbGroup.KickGroupMemberResp{ErrorCode: constant.ErrParam.ErrCode, ErrorMsg: constant.ErrParam.ErrMsg}, nil
+		log.NewError(req.OperationID, "GetOwnerManagerByGroupId failed ", err.Error(), req.GroupID)
+		return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrParam.ErrCode, ErrMsg: constant.ErrParam.ErrMsg}, nil
 	}
 	//op is group owner?
 	var flag = 0
 	for _, v := range ownerList {
-		if v.Uid == claims.UID {
+		if v.UserID == req.OpUserID {
 			flag = 1
+			log.NewInfo(req.OperationID, "is group owner ", req.OpUserID, req.GroupID)
 			break
 		}
 	}
+
 	if flag != 1 {
-		//	if claims.UID == config.Config.AppManagerUid {
-		if utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
+		if utils.IsContain(req.OpUserID, config.Config.Manager.AppManagerUid) {
 			flag = 1
+			log.NewInfo(req.OperationID, "is app manager ", req.OpUserID, req.GroupID)
 		}
 	}
 
 	if flag != 1 {
-		log.Error(claims.UID, req.OperationID, "no access kick")
-		return &pbGroup.KickGroupMemberResp{ErrorCode: constant.ErrAccess.ErrCode, ErrorMsg: constant.ErrAccess.ErrMsg}, nil
+		log.NewError(req.OperationID, "failed, no access kick")
+		return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
 	}
 
 	if len(req.UidListInfo) == 0 {
-		log.Error(claims.UID, req.OperationID, "kick list 0")
-		return &pbGroup.KickGroupMemberResp{ErrorCode: constant.ErrParam.ErrCode, ErrorMsg: constant.ErrParam.ErrMsg}, nil
+		log.NewError(req.OperationID, "failed, kick list 0")
+		return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrParam.ErrCode, ErrMsg: constant.ErrParam.ErrMsg}, nil
 	}
+
 	//remove
 	var resp pbGroup.KickGroupMemberResp
 	for _, v := range req.UidListInfo {
 		//owner cant kicked
-		if v.UserId == claims.UID {
-			log.Error(claims.UID, req.OperationID, v.UserId, "cant kick owner")
+		if v.UserId == req.OpUserID {
+			log.NewError(req.OperationID, v.UserId, "failed, can't kick owner ", req.OpUserID)
 			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: -1})
 			continue
 		}
 		err := imdb.RemoveGroupMember(req.GroupID, v.UserId)
 		if err != nil {
-			log.Error(claims.UID, req.OperationID, v.UserId, req.GroupID, "RemoveGroupMember failed ", err.Error())
+			log.NewError(req.OperationID, "RemoveGroupMember failed ", err.Error(), req.GroupID, v.UserId)
 			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: -1})
 		} else {
 			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: 0})
@@ -312,53 +409,15 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGrou
 
 		err = db.DB.DelGroupMember(req.GroupID, v.UserId)
 		if err != nil {
-			log.Error("", "", "delete mongo group member failed, db.DB.DelGroupMember fail [err: %s]", err.Error())
+			log.NewError(req.OperationID, "DelGroupMember failed ", err.Error(), req.GroupID, v.UserId)
 		}
-
 	}
-	var kq kickGroupMemberApiReq
 
-	kq.GroupID = req.GroupID
-	kq.OperationID = req.OperationID
-	kq.Reason = req.Reason
-
-	var gf groupMemberFullInfo
 	for _, v := range req.UidListInfo {
-		gf.UserId = v.UserId
-		gf.GroupId = req.GroupID
-		kq.UidListInfo = append(kq.UidListInfo, gf)
+		chat.MemberKickedNotificationID(req.OperationID, req.GroupID, req.OpUserID, v.UserId, req.Reason)
 	}
 
-	n := content_struct.NotificationContent{1, req.GroupID, kq.ContentToString()}
-
-	if utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
-		log.Info("", req.OperationID, claims.UID, req.GroupID)
-		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-			SendID:      claims.UID,
-			RecvID:      req.GroupID,
-			Content:     n.ContentToString(),
-			SendTime:    utils.GetCurrentTimestampByNano(),
-			MsgFrom:     constant.UserMsgType,
-			ContentType: constant.KickGroupMemberTip,
-			SessionType: constant.GroupChatType,
-			OperationID: req.OperationID,
-		})
-
-		for _, v := range req.UidListInfo {
-			log.Info("", req.OperationID, claims.UID, v.UserId)
-			logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-				SendID:      claims.UID,
-				RecvID:      v.UserId,
-				Content:     n.ContentToString(),
-				SendTime:    utils.GetCurrentTimestampBySecond(),
-				MsgFrom:     constant.UserMsgType,
-				ContentType: constant.KickGroupMemberTip,
-				SessionType: constant.SingleChatType,
-				OperationID: req.OperationID,
-			})
-		}
-	}
-	resp.ErrorCode = 0
+	resp.ErrCode = 0
 	return &resp, nil
 }
 
@@ -366,7 +425,7 @@ func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetG
 	claims, err := token_verify.ParseToken(req.Token)
 	if err != nil {
 		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-		return &pbGroup.GetGroupMembersInfoResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
+		return &pbGroup.GetGroupMembersInfoResp{ErrCode: constant.ErrParseToken.ErrCode, ErrMsg: constant.ErrParseToken.ErrMsg}, nil
 	}
 	log.InfoByKv(claims.UID, req.OperationID, "param: ", req.MemberList)
 	var resp pbGroup.GetGroupMembersInfoResp
@@ -392,6 +451,234 @@ func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetG
 		}
 		resp.MemberList = append(resp.MemberList, &memberNode)
 	}
-	resp.ErrorCode = 0
+	resp.ErrCode = 0
 	return &resp, nil
 }
+
+func (s *groupServer) GetGroupApplicationList(_ context.Context, pb *pbGroup.GetGroupApplicationListReq) (*pbGroup.GetGroupApplicationListResp, error) {
+	log.Info("", "", "rpc GetGroupApplicationList call start..., [pb: %s]", pb.String())
+
+	reply, err := im_mysql_model.GetGroupApplicationList(pb.OpUserID)
+	if err != nil {
+		return &pbGroup.GetGroupApplicationListResp{ErrCode: 701, ErrMsg: "GetGroupApplicationList failed"}, nil
+	}
+	log.Info("", "", "rpc GetGroupApplicationList call..., im_mysql_model.GetGroupApplicationList")
+
+	return reply, nil
+}
+
+func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsInfoReq) (*pbGroup.GetGroupsInfoResp, error) {
+	log.Info(req.Token, req.OperationID, "rpc get group info is server,args=%s", req.String())
+	//Parse token, to find current user information
+	claims, err := token_verify.ParseToken(req.Token)
+	if err != nil {
+		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
+		return &pbGroup.GetGroupsInfoResp{ErrCode: constant.ErrParseToken.ErrCode, ErrMsg: constant.ErrParseToken.ErrMsg}, nil
+	}
+	log.Info("", req.OperationID, "args:", req.GroupIDList, claims.UID)
+	groupsInfoList := make([]*pbGroup.GroupInfo, 0)
+	for _, groupID := range req.GroupIDList {
+		groupInfoFromMysql, err := im_mysql_model.FindGroupInfoByGroupId(groupID)
+		if err != nil {
+			log.Error(req.Token, req.OperationID, "find group info failed,err=%s", err.Error())
+			continue
+		}
+		var groupInfo pbGroup.GroupInfo
+		groupInfo.GroupId = groupID
+		groupInfo.GroupName = groupInfoFromMysql.GroupName
+		groupInfo.Introduction = groupInfoFromMysql.Introduction
+		groupInfo.Notification = groupInfoFromMysql.Notification
+		groupInfo.FaceUrl = groupInfoFromMysql.FaceUrl
+		groupInfo.OwnerId = im_mysql_model.GetGroupOwnerByGroupId(groupID)
+		groupInfo.MemberCount = uint32(im_mysql_model.GetGroupMemberNumByGroupId(groupID))
+		groupInfo.CreateTime = uint64(groupInfoFromMysql.CreateTime.Unix())
+
+		groupsInfoList = append(groupsInfoList, &groupInfo)
+	}
+	log.Info(req.Token, req.OperationID, "rpc get groupsInfo success return")
+	return &pbGroup.GetGroupsInfoResp{Data: groupsInfoList}, nil
+}
+
+func (s *groupServer) GroupApplicationResponse(_ context.Context, pb *pbGroup.GroupApplicationResponseReq) (*pbGroup.GroupApplicationResponseResp, error) {
+	log.NewInfo(pb.OperationID, "GroupApplicationResponse args: ", pb.String())
+	reply, err := imdb.GroupApplicationResponse(pb)
+	if err != nil {
+		log.NewError(pb.OperationID, "GroupApplicationResponse failed ", err.Error(), pb.String())
+		return &pbGroup.GroupApplicationResponseResp{ErrCode: 702, ErrMsg: err.Error()}, nil
+	}
+
+	if pb.HandleResult == 1 {
+		if pb.ToUserID == "0" {
+			err = db.DB.AddGroupMember(pb.GroupID, pb.FromUserID)
+			if err != nil {
+				log.Error("", "", "rpc GroupApplicationResponse call..., db.DB.AddGroupMember fail [pb: %s] [err: %s]", pb.String(), err.Error())
+				return nil, err
+			}
+		} else {
+			err = db.DB.AddGroupMember(pb.GroupID, pb.ToUserID)
+			if err != nil {
+				log.Error("", "", "rpc GroupApplicationResponse call..., db.DB.AddGroupMember fail [pb: %s] [err: %s]", pb.String(), err.Error())
+				return nil, err
+			}
+		}
+	}
+	if pb.ToUserID == "0" {
+		group, err := imdb.FindGroupInfoByGroupId(pb.GroupID)
+		if err != nil {
+			log.NewError(pb.OperationID, "FindGroupInfoByGroupId failed ", pb.GroupID)
+			return reply, nil
+		}
+		member, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(pb.GroupID, pb.OpUserID)
+		if err != nil {
+			log.NewError(pb.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", pb.GroupID, pb.OpUserID)
+			return reply, nil
+		}
+		chat.ApplicationProcessedNotification(pb.OperationID, pb.FromUserID, *group, *member, pb.HandleResult, pb.HandledMsg)
+		if pb.HandleResult == 1 {
+			entrantUser, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(pb.GroupID, pb.FromUserID)
+			if err != nil {
+				log.NewError(pb.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", err.Error(), pb.GroupID, pb.FromUserID)
+				return reply, nil
+			}
+			chat.MemberEnterNotification(pb.OperationID, group, entrantUser)
+		}
+	} else {
+		log.NewError(pb.OperationID, "args failed ", pb.String())
+	}
+
+	log.NewInfo(pb.OperationID, "rpc GroupApplicationResponse ok ", reply)
+	return reply, nil
+}
+
+func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (*pbGroup.CommonResp, error) {
+	log.NewInfo(req.Token, req.OperationID, "JoinGroup args ", req.String())
+	//Parse token, to find current user information
+	claims, err := token_verify.ParseToken(req.Token)
+	if err != nil {
+		log.NewError(req.OperationID, "ParseToken failed", err.Error(), req.String())
+		return &pbGroup.CommonResp{ErrCode: constant.ErrParseToken.ErrCode, ErrMsg: constant.ErrParseToken.ErrMsg}, nil
+	}
+	applicationUserInfo, err := im_mysql_model.FindUserByUID(claims.UID)
+	if err != nil {
+		log.NewError(req.OperationID, "FindUserByUID failed", err.Error(), claims.UID)
+		return &pbGroup.CommonResp{ErrCode: constant.ErrSearchUserInfo.ErrCode, ErrMsg: constant.ErrSearchUserInfo.ErrMsg}, nil
+	}
+
+	_, err = im_mysql_model.FindGroupRequestUserInfoByGroupIDAndUid(req.GroupID, claims.UID)
+	if err == nil {
+		err = im_mysql_model.DelGroupRequest(req.GroupID, claims.UID, "0")
+	}
+
+	if err = im_mysql_model.InsertIntoGroupRequest(req.GroupID, claims.UID, "0", req.Message, applicationUserInfo.Nickname, applicationUserInfo.FaceUrl); err != nil {
+		log.Error(req.Token, req.OperationID, "Insert into group request failed,er=%s", err.Error())
+		return &pbGroup.CommonResp{ErrCode: constant.ErrJoinGroupApplication.ErrCode, ErrMsg: constant.ErrJoinGroupApplication.ErrMsg}, nil
+	}
+
+	memberList, err := im_mysql_model.FindGroupMemberListByGroupIdAndFilterInfo(req.GroupID, constant.GroupOwner)
+	if len(memberList) == 0 {
+		log.NewError(req.OperationID, "FindGroupMemberListByGroupIdAndFilterInfo failed ", req.GroupID, constant.GroupOwner, err)
+		return &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}, nil
+	}
+	group, err := im_mysql_model.FindGroupInfoByGroupId(req.GroupID)
+	if err != nil {
+		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed ", req.GroupID)
+		return &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}, nil
+	}
+	chat.ReceiveJoinApplicationNotification(req.OperationID, memberList[0].UserID, applicationUserInfo, group)
+
+	log.NewInfo(req.OperationID, "ReceiveJoinApplicationNotification rpc JoinGroup success return")
+	return &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}, nil
+}
+
+func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq) (*pbGroup.CommonResp, error) {
+	log.NewError("QuitGroup args ", req.String())
+
+	_, err := im_mysql_model.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, req.OpUserID)
+	if err != nil {
+		log.NewError(req.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed", err.Error(), req.GroupID, req.OpUserID)
+		return &pbGroup.CommonResp{ErrCode: constant.ErrQuitGroup.ErrCode, ErrMsg: constant.ErrQuitGroup.ErrMsg}, nil
+	}
+
+	err = im_mysql_model.DeleteGroupMemberByGroupIdAndUserId(req.GroupID, req.OpUserID)
+	if err != nil {
+		log.NewError(req.OperationID, "DeleteGroupMemberByGroupIdAndUserId failed ", err.Error(), req.GroupID, req.OpUserID)
+		return &pbGroup.CommonResp{ErrCode: constant.ErrQuitGroup.ErrCode, ErrMsg: constant.ErrQuitGroup.ErrMsg}, nil
+	}
+
+	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
+	}
+
+	chat.MemberLeaveNotification(req.OperationID, req.GroupID, req.OpUserID)
+	log.NewInfo(req.OperationID, "rpc quit group is success return")
+	return &pbGroup.CommonResp{}, nil
+}
+
+func hasAccess(req *pbGroup.SetGroupInfoReq) bool {
+	if utils.IsContain(req.OpUserID, config.Config.Manager.AppManagerUid) {
+		return true
+	}
+	groupUserInfo, err := im_mysql_model.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, req.OpUserID)
+	if err != nil {
+		log.NewError(req.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed, ", err.Error(), req.GroupID, req.OpUserID)
+		return false
+
+	}
+	if groupUserInfo.AdministratorLevel == constant.OrdinaryMember {
+		return true
+	}
+}
+
+func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInfoReq) (*pbGroup.CommonResp, error) {
+	log.NewInfo(req.OperationID, "SetGroupInfo args ", req.String())
+	if !hasAccess(req) {
+		log.NewError(req.OperationID, "no access ")
+		return &pbGroup.CommonResp{ErrCode: constant.ErrSetGroupInfo.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
+	}
+
+	group, err := im_mysql_model.FindGroupInfoByGroupId(req.GroupID)
+	if err != nil {
+		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed, ", err.Error(), req.GroupID)
+		return &pbGroup.CommonResp{ErrCode: constant.ErrSetGroupInfo.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
+	}
+
+	////bitwise operators: 1:groupName; 10:Notification  100:Introduction; 1000:FaceUrl
+	var changedType int32
+	if group.GroupName != req.GroupName && req.GroupName != "" {
+		changedType = 1
+	}
+	if group.Notification != req.Notification && req.Notification != "" {
+		changedType = changedType | (1 << 1)
+	}
+	if group.Introduction != req.Introduction && req.Introduction != "" {
+		changedType = changedType | (1 << 2)
+	}
+	if group.FaceUrl != req.FaceUrl && req.FaceUrl != "" {
+		changedType = changedType | (1 << 3)
+	}
+	//only administrators can set group information
+	if err = im_mysql_model.SetGroupInfo(req.GroupID, req.GroupName, req.Introduction, req.Notification, req.FaceUrl, ""); err != nil {
+		return &pbGroup.CommonResp{ErrCode: constant.ErrSetGroupInfo.ErrCode, ErrMsg: constant.ErrSetGroupInfo.ErrMsg}, nil
+	}
+
+	if changedType != 0 {
+		chat.GroupInfoChangedNotification(req.OperationID, changedType, req.GroupID, req.OpUserID)
+	}
+
+	return &pbGroup.CommonResp{}, nil
+}
+
+func (s *groupServer) TransferGroupOwner(_ context.Context, pb *pbGroup.TransferGroupOwnerReq) (*pbGroup.TransferGroupOwnerResp, error) {
+	log.Info("", "", "rpc TransferGroupOwner call start..., [pb: %s]", pb.String())
+
+	reply, err := im_mysql_model.TransferGroupOwner(pb)
+	if err != nil {
+		log.Error("", "", "rpc TransferGroupOwner call..., im_mysql_model.TransferGroupOwner fail [pb: %s] [err: %s]", pb.String(), err.Error())
+		return nil, err
+	}
+	log.Info("", "", "rpc TransferGroupOwner call..., im_mysql_model.TransferGroupOwner")
+
+	return reply, nil
+}
diff --git a/internal/rpc/group/group_application_response.go b/internal/rpc/group/group_application_response.go
deleted file mode 100644
index e51339575..000000000
--- a/internal/rpc/group/group_application_response.go
+++ /dev/null
@@ -1,56 +0,0 @@
-package group
-
-import (
-	"Open_IM/internal/rpc/chat"
-	"Open_IM/pkg/common/db"
-	immsql "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
-	"Open_IM/pkg/common/log"
-	"Open_IM/pkg/proto/group"
-	"context"
-)
-
-func (s *groupServer) GroupApplicationResponse(_ context.Context, pb *group.GroupApplicationResponseReq) (*group.GroupApplicationResponseResp, error) {
-	log.NewInfo(pb.OperationID, "GroupApplicationResponse args: ", pb.String())
-	reply, err := immsql.GroupApplicationResponse(pb)
-	if err != nil {
-		log.NewError(pb.OperationID, "GroupApplicationResponse failed ", err.Error(), pb)
-		return &group.GroupApplicationResponseResp{ErrCode: 702, ErrMsg: err.Error()}, nil
-	}
-
-	if pb.HandleResult == 1 {
-		if pb.ToUserID == "0" {
-			err = db.DB.AddGroupMember(pb.GroupID, pb.FromUserID)
-			if err != nil {
-				log.Error("", "", "rpc GroupApplicationResponse call..., db.DB.AddGroupMember fail [pb: %s] [err: %s]", pb.String(), err.Error())
-				return nil, err
-			}
-		} else {
-			err = db.DB.AddGroupMember(pb.GroupID, pb.ToUserID)
-			if err != nil {
-				log.Error("", "", "rpc GroupApplicationResponse call..., db.DB.AddGroupMember fail [pb: %s] [err: %s]", pb.String(), err.Error())
-				return nil, err
-			}
-		}
-	}
-	if pb.ToUserID == "0" {
-		group, err := immsql.FindGroupInfoByGroupId(pb.GroupID)
-		if err != nil {
-
-		}
-		member, err := immsql.FindGroupMemberInfoByGroupIdAndUserId(pb.GroupID, pb.OwnerID)
-		if err != nil {
-
-		}
-		chat.ApplicationProcessedNotification(pb.OperationID, pb.FromUserID, *group, *member, pb.HandleResult, pb.HandledMsg)
-	} else {
-
-	}
-
-	if pb.HandleResult == 1 {
-
-	}
-
-	log.NewInfo(pb.OperationID, "rpc GroupApplicationResponse ok ", reply)
-
-	return reply, nil
-}
diff --git a/internal/rpc/group/join_group.go b/internal/rpc/group/join_group.go
deleted file mode 100644
index 5a26181dd..000000000
--- a/internal/rpc/group/join_group.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package group
-
-import (
-	"Open_IM/internal/rpc/chat"
-	"Open_IM/pkg/common/constant"
-	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
-	"Open_IM/pkg/common/log"
-	"Open_IM/pkg/common/token_verify"
-	pbGroup "Open_IM/pkg/proto/group"
-	"context"
-)
-
-func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (*pbGroup.CommonResp, error) {
-	log.NewInfo(req.Token, req.OperationID, "JoinGroup args ", req.String())
-	//Parse token, to find current user information
-	claims, err := token_verify.ParseToken(req.Token)
-	if err != nil {
-		log.NewError(req.OperationID, "ParseToken failed", err.Error(), req.String())
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
-	}
-	applicationUserInfo, err := im_mysql_model.FindUserByUID(claims.UID)
-	if err != nil {
-		log.NewError(req.OperationID, "FindUserByUID failed", err.Error(), claims.UID)
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrSearchUserInfo.ErrCode, ErrorMsg: constant.ErrSearchUserInfo.ErrMsg}, nil
-	}
-
-	_, err = im_mysql_model.FindGroupRequestUserInfoByGroupIDAndUid(req.GroupID, claims.UID)
-	if err == nil {
-		err = im_mysql_model.DelGroupRequest(req.GroupID, claims.UID, "0")
-	}
-
-	if err = im_mysql_model.InsertIntoGroupRequest(req.GroupID, claims.UID, "0", req.Message, applicationUserInfo.Nickname, applicationUserInfo.FaceUrl); err != nil {
-		log.Error(req.Token, req.OperationID, "Insert into group request failed,er=%s", err.Error())
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrJoinGroupApplication.ErrCode, ErrorMsg: constant.ErrJoinGroupApplication.ErrMsg}, nil
-	}
-
-	memberList, err := im_mysql_model.FindGroupMemberListByGroupIdAndFilterInfo(req.GroupID, constant.GroupOwner)
-	if len(memberList) == 0 {
-		log.NewError(req.OperationID, "FindGroupMemberListByGroupIdAndFilterInfo failed ", req.GroupID, constant.GroupOwner, err)
-		return &pbGroup.CommonResp{ErrorCode: 0, ErrorMsg: ""}, nil
-	}
-	group, err := im_mysql_model.FindGroupInfoByGroupId(req.GroupID)
-	if err != nil {
-		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed ", req.GroupID)
-		return &pbGroup.CommonResp{ErrorCode: 0, ErrorMsg: ""}, nil
-	}
-	chat.ReceiveJoinApplicationNotification(req.OperationID, memberList[0].UserID, applicationUserInfo, group)
-
-	log.NewInfo(req.OperationID, "ReceiveJoinApplicationNotification rpc JoinGroup success return")
-	return &pbGroup.CommonResp{ErrorCode: 0, ErrorMsg: ""}, nil
-}
diff --git a/internal/rpc/group/quit_group.go b/internal/rpc/group/quit_group.go
deleted file mode 100644
index e77a34009..000000000
--- a/internal/rpc/group/quit_group.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package group
-
-import (
-	"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/common/token_verify"
-	pbGroup "Open_IM/pkg/proto/group"
-	"context"
-)
-
-func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq) (*pbGroup.CommonResp, error) {
-	log.InfoByArgs("rpc quit group is server,args:", req.String())
-	//Parse token, to find current user information
-	claims, err := token_verify.ParseToken(req.Token)
-	if err != nil {
-		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
-	}
-	log.InfoByKv("args:", req.OperationID, req.GetGroupID(), claims.UID)
-	//Check to see  whether there is a user in the group.
-	_, err = im_mysql_model.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, claims.UID)
-	if err != nil {
-		log.Error(req.Token, req.OperationID, "no such group or you are not in the group,err=%s", err.Error(), req.OperationID, req.GroupID, claims.UID)
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrQuitGroup.ErrCode, ErrorMsg: constant.ErrQuitGroup.ErrMsg}, nil
-	}
-	//After the user's verification is successful, user will quit the group chat.
-	err = im_mysql_model.DeleteGroupMemberByGroupIdAndUserId(req.GroupID, claims.UID)
-	if err != nil {
-		log.ErrorByArgs("this user exit the group failed,err=%s", err.Error(), req.OperationID, req.GroupID, claims.UID)
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrQuitGroup.ErrCode, ErrorMsg: constant.ErrQuitGroup.ErrMsg}, nil
-	}
-
-	err = db.DB.DelGroupMember(req.GroupID, claims.UID)
-	if err != nil {
-		log.Error("", "", "delete mongo group member failed, db.DB.DelGroupMember fail [err: %s]", err.Error())
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrQuitGroup.ErrCode, ErrorMsg: constant.ErrQuitGroup.ErrMsg}, nil
-	}
-	////Push message when quit group chat
-	//jsonInfo, _ := json.Marshal(req)
-	//logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-	//	SendID:      claims.UID,
-	//	RecvID:      req.GroupID,
-	//	Content:     string(jsonInfo),
-	//	SendTime:    utils.GetCurrentTimestampBySecond(),
-	//	MsgFrom:     constant.SysMsgType,
-	//	ContentType: constant.QuitGroupTip,
-	//	SessionType: constant.GroupChatType,
-	//	OperationID: req.OperationID,
-	//})
-	log.Info(req.Token, req.OperationID, "rpc quit group is success return")
-
-	return &pbGroup.CommonResp{}, nil
-}
diff --git a/internal/rpc/group/set_group_info.go b/internal/rpc/group/set_group_info.go
deleted file mode 100644
index 55532a04e..000000000
--- a/internal/rpc/group/set_group_info.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package group
-
-import (
-	"Open_IM/internal/rpc/chat"
-	"Open_IM/pkg/common/constant"
-	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
-	"Open_IM/pkg/common/log"
-	"Open_IM/pkg/common/token_verify"
-	pbGroup "Open_IM/pkg/proto/group"
-	"context"
-)
-
-func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInfoReq) (*pbGroup.CommonResp, error) {
-	log.Info(req.Token, req.OperationID, "rpc set group info is server,args=%s", req.String())
-
-	//Parse token, to find current user information
-	claims, err := token_verify.ParseToken(req.Token)
-	if err != nil {
-		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrParseToken.ErrCode, ErrorMsg: constant.ErrParseToken.ErrMsg}, nil
-	}
-
-	groupUserInfo, err := im_mysql_model.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, claims.UID)
-	if err != nil {
-		log.Error("", req.OperationID, "your are not in the group,can not change this group info,err=%s", err.Error())
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrSetGroupInfo.ErrCode, ErrorMsg: constant.ErrSetGroupInfo.ErrMsg}, nil
-	}
-	if groupUserInfo.AdministratorLevel == constant.OrdinaryMember {
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrSetGroupInfo.ErrCode, ErrorMsg: constant.ErrAccess.ErrMsg}, nil
-	}
-	group, err := im_mysql_model.FindGroupInfoByGroupId(req.GroupID)
-	if err != nil {
-		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed, ", err.Error(), req.GroupID)
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrSetGroupInfo.ErrCode, ErrorMsg: constant.ErrAccess.ErrMsg}, nil
-	}
-	////bitwise operators: 1:groupName; 10:Notification  100:Introduction; 1000:FaceUrl
-	var changedType int32
-	if group.GroupName != req.GroupName && req.GroupName != "" {
-		changedType = 1
-	}
-	if group.Notification != req.Notification && req.Notification != "" {
-		changedType = changedType | (1 << 1)
-	}
-	if group.Introduction != req.Introduction && req.Introduction != "" {
-		changedType = changedType | (1 << 2)
-	}
-	if group.FaceUrl != req.FaceUrl && req.FaceUrl != "" {
-		changedType = changedType | (1 << 3)
-	}
-	//only administrators can set group information
-	if err = im_mysql_model.SetGroupInfo(req.GroupID, req.GroupName, req.Introduction, req.Notification, req.FaceUrl, ""); err != nil {
-		return &pbGroup.CommonResp{ErrorCode: constant.ErrSetGroupInfo.ErrCode, ErrorMsg: constant.ErrSetGroupInfo.ErrMsg}, nil
-	}
-
-	if changedType != 0 {
-		chat.GroupInfoChangedNotification(req.OperationID, claims.UID, changedType, group, groupUserInfo)
-	}
-
-	return &pbGroup.CommonResp{}, nil
-}
diff --git a/internal/rpc/group/transfer_group_owner.go b/internal/rpc/group/transfer_group_owner.go
deleted file mode 100644
index 4595fa1f1..000000000
--- a/internal/rpc/group/transfer_group_owner.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package group
-
-import (
-	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
-	"Open_IM/pkg/common/log"
-	"Open_IM/pkg/proto/group"
-	"context"
-)
-
-func (s *groupServer) TransferGroupOwner(_ context.Context, pb *group.TransferGroupOwnerReq) (*group.TransferGroupOwnerResp, error) {
-	log.Info("", "", "rpc TransferGroupOwner call start..., [pb: %s]", pb.String())
-
-	reply, err := im_mysql_model.TransferGroupOwner(pb)
-	if err != nil {
-		log.Error("", "", "rpc TransferGroupOwner call..., im_mysql_model.TransferGroupOwner fail [pb: %s] [err: %s]", pb.String(), err.Error())
-		return nil, err
-	}
-	log.Info("", "", "rpc TransferGroupOwner call..., im_mysql_model.TransferGroupOwner")
-
-	return reply, nil
-}
diff --git a/pkg/proto/group/group.pb.go b/pkg/proto/group/group.pb.go
index fae312019..bc8371177 100644
--- a/pkg/proto/group/group.pb.go
+++ b/pkg/proto/group/group.pb.go
@@ -24,8 +24,8 @@ var _ = math.Inf
 const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
 
 type CommonResp struct {
-	ErrorCode            int32    `protobuf:"varint,1,opt,name=ErrorCode" json:"ErrorCode,omitempty"`
-	ErrorMsg             string   `protobuf:"bytes,2,opt,name=ErrorMsg" json:"ErrorMsg,omitempty"`
+	ErrCode              int32    `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrMsg               string   `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -35,7 +35,7 @@ func (m *CommonResp) Reset()         { *m = CommonResp{} }
 func (m *CommonResp) String() string { return proto.CompactTextString(m) }
 func (*CommonResp) ProtoMessage()    {}
 func (*CommonResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{0}
+	return fileDescriptor_group_ac6850665f72c22b, []int{0}
 }
 func (m *CommonResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CommonResp.Unmarshal(m, b)
@@ -55,16 +55,16 @@ func (m *CommonResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_CommonResp proto.InternalMessageInfo
 
-func (m *CommonResp) GetErrorCode() int32 {
+func (m *CommonResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
 
-func (m *CommonResp) GetErrorMsg() string {
+func (m *CommonResp) GetErrMsg() string {
 	if m != nil {
-		return m.ErrorMsg
+		return m.ErrMsg
 	}
 	return ""
 }
@@ -77,7 +77,8 @@ type CreateGroupReq struct {
 	FaceUrl              string                `protobuf:"bytes,5,opt,name=faceUrl" json:"faceUrl,omitempty"`
 	Token                string                `protobuf:"bytes,6,opt,name=token" json:"token,omitempty"`
 	OperationID          string                `protobuf:"bytes,7,opt,name=operationID" json:"operationID,omitempty"`
-	Ex                   string                `protobuf:"bytes,8,opt,name=ex" json:"ex,omitempty"`
+	OpUserID             string                `protobuf:"bytes,8,opt,name=OpUserID" json:"OpUserID,omitempty"`
+	Ext                  string                `protobuf:"bytes,9,opt,name=Ext" json:"Ext,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
 	XXX_unrecognized     []byte                `json:"-"`
 	XXX_sizecache        int32                 `json:"-"`
@@ -87,7 +88,7 @@ func (m *CreateGroupReq) Reset()         { *m = CreateGroupReq{} }
 func (m *CreateGroupReq) String() string { return proto.CompactTextString(m) }
 func (*CreateGroupReq) ProtoMessage()    {}
 func (*CreateGroupReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{1}
+	return fileDescriptor_group_ac6850665f72c22b, []int{1}
 }
 func (m *CreateGroupReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateGroupReq.Unmarshal(m, b)
@@ -156,9 +157,16 @@ func (m *CreateGroupReq) GetOperationID() string {
 	return ""
 }
 
-func (m *CreateGroupReq) GetEx() string {
+func (m *CreateGroupReq) GetOpUserID() string {
 	if m != nil {
-		return m.Ex
+		return m.OpUserID
+	}
+	return ""
+}
+
+func (m *CreateGroupReq) GetExt() string {
+	if m != nil {
+		return m.Ext
 	}
 	return ""
 }
@@ -175,7 +183,7 @@ func (m *GroupAddMemberInfo) Reset()         { *m = GroupAddMemberInfo{} }
 func (m *GroupAddMemberInfo) String() string { return proto.CompactTextString(m) }
 func (*GroupAddMemberInfo) ProtoMessage()    {}
 func (*GroupAddMemberInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{2}
+	return fileDescriptor_group_ac6850665f72c22b, []int{2}
 }
 func (m *GroupAddMemberInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupAddMemberInfo.Unmarshal(m, b)
@@ -210,8 +218,8 @@ func (m *GroupAddMemberInfo) GetSetRole() int32 {
 }
 
 type CreateGroupResp struct {
-	ErrorCode            int32    `protobuf:"varint,1,opt,name=ErrorCode" json:"ErrorCode,omitempty"`
-	ErrorMsg             string   `protobuf:"bytes,2,opt,name=ErrorMsg" json:"ErrorMsg,omitempty"`
+	ErrCode              int32    `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrMsg               string   `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
 	GroupID              string   `protobuf:"bytes,3,opt,name=groupID" json:"groupID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -222,7 +230,7 @@ func (m *CreateGroupResp) Reset()         { *m = CreateGroupResp{} }
 func (m *CreateGroupResp) String() string { return proto.CompactTextString(m) }
 func (*CreateGroupResp) ProtoMessage()    {}
 func (*CreateGroupResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{3}
+	return fileDescriptor_group_ac6850665f72c22b, []int{3}
 }
 func (m *CreateGroupResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateGroupResp.Unmarshal(m, b)
@@ -242,16 +250,16 @@ func (m *CreateGroupResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_CreateGroupResp proto.InternalMessageInfo
 
-func (m *CreateGroupResp) GetErrorCode() int32 {
+func (m *CreateGroupResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
 
-func (m *CreateGroupResp) GetErrorMsg() string {
+func (m *CreateGroupResp) GetErrMsg() string {
 	if m != nil {
-		return m.ErrorMsg
+		return m.ErrMsg
 	}
 	return ""
 }
@@ -267,6 +275,7 @@ type GetGroupsInfoReq struct {
 	GroupIDList          []string `protobuf:"bytes,1,rep,name=groupIDList" json:"groupIDList,omitempty"`
 	Token                string   `protobuf:"bytes,2,opt,name=token" json:"token,omitempty"`
 	OperationID          string   `protobuf:"bytes,3,opt,name=operationID" json:"operationID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,4,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -276,7 +285,7 @@ func (m *GetGroupsInfoReq) Reset()         { *m = GetGroupsInfoReq{} }
 func (m *GetGroupsInfoReq) String() string { return proto.CompactTextString(m) }
 func (*GetGroupsInfoReq) ProtoMessage()    {}
 func (*GetGroupsInfoReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{4}
+	return fileDescriptor_group_ac6850665f72c22b, []int{4}
 }
 func (m *GetGroupsInfoReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupsInfoReq.Unmarshal(m, b)
@@ -317,9 +326,16 @@ func (m *GetGroupsInfoReq) GetOperationID() string {
 	return ""
 }
 
+func (m *GetGroupsInfoReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type GetGroupsInfoResp struct {
-	ErrorCode            int32        `protobuf:"varint,1,opt,name=ErrorCode" json:"ErrorCode,omitempty"`
-	ErrorMsg             string       `protobuf:"bytes,2,opt,name=ErrorMsg" json:"ErrorMsg,omitempty"`
+	ErrCode              int32        `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrMsg               string       `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
 	Data                 []*GroupInfo `protobuf:"bytes,3,rep,name=data" json:"data,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
 	XXX_unrecognized     []byte       `json:"-"`
@@ -330,7 +346,7 @@ func (m *GetGroupsInfoResp) Reset()         { *m = GetGroupsInfoResp{} }
 func (m *GetGroupsInfoResp) String() string { return proto.CompactTextString(m) }
 func (*GetGroupsInfoResp) ProtoMessage()    {}
 func (*GetGroupsInfoResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{5}
+	return fileDescriptor_group_ac6850665f72c22b, []int{5}
 }
 func (m *GetGroupsInfoResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupsInfoResp.Unmarshal(m, b)
@@ -350,16 +366,16 @@ func (m *GetGroupsInfoResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_GetGroupsInfoResp proto.InternalMessageInfo
 
-func (m *GetGroupsInfoResp) GetErrorCode() int32 {
+func (m *GetGroupsInfoResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
 
-func (m *GetGroupsInfoResp) GetErrorMsg() string {
+func (m *GetGroupsInfoResp) GetErrMsg() string {
 	if m != nil {
-		return m.ErrorMsg
+		return m.ErrMsg
 	}
 	return ""
 }
@@ -379,6 +395,7 @@ type SetGroupInfoReq struct {
 	FaceUrl              string   `protobuf:"bytes,5,opt,name=faceUrl" json:"faceUrl,omitempty"`
 	Token                string   `protobuf:"bytes,6,opt,name=token" json:"token,omitempty"`
 	OperationID          string   `protobuf:"bytes,7,opt,name=operationID" json:"operationID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,8,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -388,7 +405,7 @@ func (m *SetGroupInfoReq) Reset()         { *m = SetGroupInfoReq{} }
 func (m *SetGroupInfoReq) String() string { return proto.CompactTextString(m) }
 func (*SetGroupInfoReq) ProtoMessage()    {}
 func (*SetGroupInfoReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{6}
+	return fileDescriptor_group_ac6850665f72c22b, []int{6}
 }
 func (m *SetGroupInfoReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetGroupInfoReq.Unmarshal(m, b)
@@ -457,8 +474,15 @@ func (m *SetGroupInfoReq) GetOperationID() string {
 	return ""
 }
 
+func (m *SetGroupInfoReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type GetGroupApplicationListReq struct {
-	UID                  string   `protobuf:"bytes,1,opt,name=UID" json:"UID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,1,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	OperationID          string   `protobuf:"bytes,2,opt,name=OperationID" json:"OperationID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -469,7 +493,7 @@ func (m *GetGroupApplicationListReq) Reset()         { *m = GetGroupApplicationL
 func (m *GetGroupApplicationListReq) String() string { return proto.CompactTextString(m) }
 func (*GetGroupApplicationListReq) ProtoMessage()    {}
 func (*GetGroupApplicationListReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{7}
+	return fileDescriptor_group_ac6850665f72c22b, []int{7}
 }
 func (m *GetGroupApplicationListReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupApplicationListReq.Unmarshal(m, b)
@@ -489,9 +513,9 @@ func (m *GetGroupApplicationListReq) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_GetGroupApplicationListReq proto.InternalMessageInfo
 
-func (m *GetGroupApplicationListReq) GetUID() string {
+func (m *GetGroupApplicationListReq) GetOpUserID() string {
 	if m != nil {
-		return m.UID
+		return m.OpUserID
 	}
 	return ""
 }
@@ -529,7 +553,7 @@ func (m *GetGroupApplicationList_Data_User) Reset()         { *m = GetGroupAppli
 func (m *GetGroupApplicationList_Data_User) String() string { return proto.CompactTextString(m) }
 func (*GetGroupApplicationList_Data_User) ProtoMessage()    {}
 func (*GetGroupApplicationList_Data_User) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{8}
+	return fileDescriptor_group_ac6850665f72c22b, []int{8}
 }
 func (m *GetGroupApplicationList_Data_User) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupApplicationList_Data_User.Unmarshal(m, b)
@@ -673,7 +697,7 @@ func (m *GetGroupApplicationListData) Reset()         { *m = GetGroupApplication
 func (m *GetGroupApplicationListData) String() string { return proto.CompactTextString(m) }
 func (*GetGroupApplicationListData) ProtoMessage()    {}
 func (*GetGroupApplicationListData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{9}
+	return fileDescriptor_group_ac6850665f72c22b, []int{9}
 }
 func (m *GetGroupApplicationListData) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupApplicationListData.Unmarshal(m, b)
@@ -720,7 +744,7 @@ func (m *GetGroupApplicationListResp) Reset()         { *m = GetGroupApplication
 func (m *GetGroupApplicationListResp) String() string { return proto.CompactTextString(m) }
 func (*GetGroupApplicationListResp) ProtoMessage()    {}
 func (*GetGroupApplicationListResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{10}
+	return fileDescriptor_group_ac6850665f72c22b, []int{10}
 }
 func (m *GetGroupApplicationListResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupApplicationListResp.Unmarshal(m, b)
@@ -766,6 +790,7 @@ type TransferGroupOwnerReq struct {
 	OldOwner             string   `protobuf:"bytes,2,opt,name=OldOwner" json:"OldOwner,omitempty"`
 	NewOwner             string   `protobuf:"bytes,3,opt,name=NewOwner" json:"NewOwner,omitempty"`
 	OperationID          string   `protobuf:"bytes,4,opt,name=OperationID" json:"OperationID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,5,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -775,7 +800,7 @@ func (m *TransferGroupOwnerReq) Reset()         { *m = TransferGroupOwnerReq{} }
 func (m *TransferGroupOwnerReq) String() string { return proto.CompactTextString(m) }
 func (*TransferGroupOwnerReq) ProtoMessage()    {}
 func (*TransferGroupOwnerReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{11}
+	return fileDescriptor_group_ac6850665f72c22b, []int{11}
 }
 func (m *TransferGroupOwnerReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TransferGroupOwnerReq.Unmarshal(m, b)
@@ -823,6 +848,13 @@ func (m *TransferGroupOwnerReq) GetOperationID() string {
 	return ""
 }
 
+func (m *TransferGroupOwnerReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type TransferGroupOwnerResp struct {
 	ErrCode              int32    `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
 	ErrMsg               string   `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
@@ -835,7 +867,7 @@ func (m *TransferGroupOwnerResp) Reset()         { *m = TransferGroupOwnerResp{}
 func (m *TransferGroupOwnerResp) String() string { return proto.CompactTextString(m) }
 func (*TransferGroupOwnerResp) ProtoMessage()    {}
 func (*TransferGroupOwnerResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{12}
+	return fileDescriptor_group_ac6850665f72c22b, []int{12}
 }
 func (m *TransferGroupOwnerResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TransferGroupOwnerResp.Unmarshal(m, b)
@@ -874,6 +906,7 @@ type JoinGroupReq struct {
 	Message              string   `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
 	Token                string   `protobuf:"bytes,3,opt,name=token" json:"token,omitempty"`
 	OperationID          string   `protobuf:"bytes,4,opt,name=OperationID" json:"OperationID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,5,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -883,7 +916,7 @@ func (m *JoinGroupReq) Reset()         { *m = JoinGroupReq{} }
 func (m *JoinGroupReq) String() string { return proto.CompactTextString(m) }
 func (*JoinGroupReq) ProtoMessage()    {}
 func (*JoinGroupReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{13}
+	return fileDescriptor_group_ac6850665f72c22b, []int{13}
 }
 func (m *JoinGroupReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_JoinGroupReq.Unmarshal(m, b)
@@ -931,9 +964,16 @@ func (m *JoinGroupReq) GetOperationID() string {
 	return ""
 }
 
+func (m *JoinGroupReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type GroupApplicationResponseReq struct {
 	OperationID          string   `protobuf:"bytes,1,opt,name=OperationID" json:"OperationID,omitempty"`
-	OwnerID              string   `protobuf:"bytes,2,opt,name=OwnerID" json:"OwnerID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,2,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	GroupID              string   `protobuf:"bytes,3,opt,name=GroupID" json:"GroupID,omitempty"`
 	FromUserID           string   `protobuf:"bytes,4,opt,name=FromUserID" json:"FromUserID,omitempty"`
 	FromUserNickName     string   `protobuf:"bytes,5,opt,name=FromUserNickName" json:"FromUserNickName,omitempty"`
@@ -956,7 +996,7 @@ func (m *GroupApplicationResponseReq) Reset()         { *m = GroupApplicationRes
 func (m *GroupApplicationResponseReq) String() string { return proto.CompactTextString(m) }
 func (*GroupApplicationResponseReq) ProtoMessage()    {}
 func (*GroupApplicationResponseReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{14}
+	return fileDescriptor_group_ac6850665f72c22b, []int{14}
 }
 func (m *GroupApplicationResponseReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupApplicationResponseReq.Unmarshal(m, b)
@@ -983,9 +1023,9 @@ func (m *GroupApplicationResponseReq) GetOperationID() string {
 	return ""
 }
 
-func (m *GroupApplicationResponseReq) GetOwnerID() string {
+func (m *GroupApplicationResponseReq) GetOpUserID() string {
 	if m != nil {
-		return m.OwnerID
+		return m.OpUserID
 	}
 	return ""
 }
@@ -1093,7 +1133,7 @@ func (m *GroupApplicationResponseResp) Reset()         { *m = GroupApplicationRe
 func (m *GroupApplicationResponseResp) String() string { return proto.CompactTextString(m) }
 func (*GroupApplicationResponseResp) ProtoMessage()    {}
 func (*GroupApplicationResponseResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{15}
+	return fileDescriptor_group_ac6850665f72c22b, []int{15}
 }
 func (m *GroupApplicationResponseResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupApplicationResponseResp.Unmarshal(m, b)
@@ -1132,6 +1172,7 @@ type SetOwnerGroupNickNameReq struct {
 	NickName             string   `protobuf:"bytes,2,opt,name=nickName" json:"nickName,omitempty"`
 	OperationID          string   `protobuf:"bytes,3,opt,name=OperationID" json:"OperationID,omitempty"`
 	Token                string   `protobuf:"bytes,4,opt,name=token" json:"token,omitempty"`
+	OpUserID             string   `protobuf:"bytes,5,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1141,7 +1182,7 @@ func (m *SetOwnerGroupNickNameReq) Reset()         { *m = SetOwnerGroupNickNameR
 func (m *SetOwnerGroupNickNameReq) String() string { return proto.CompactTextString(m) }
 func (*SetOwnerGroupNickNameReq) ProtoMessage()    {}
 func (*SetOwnerGroupNickNameReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{16}
+	return fileDescriptor_group_ac6850665f72c22b, []int{16}
 }
 func (m *SetOwnerGroupNickNameReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetOwnerGroupNickNameReq.Unmarshal(m, b)
@@ -1189,10 +1230,18 @@ func (m *SetOwnerGroupNickNameReq) GetToken() string {
 	return ""
 }
 
+func (m *SetOwnerGroupNickNameReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type QuitGroupReq struct {
 	GroupID              string   `protobuf:"bytes,1,opt,name=groupID" json:"groupID,omitempty"`
 	OperationID          string   `protobuf:"bytes,2,opt,name=operationID" json:"operationID,omitempty"`
 	Token                string   `protobuf:"bytes,3,opt,name=token" json:"token,omitempty"`
+	OpUserID             string   `protobuf:"bytes,4,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1202,7 +1251,7 @@ func (m *QuitGroupReq) Reset()         { *m = QuitGroupReq{} }
 func (m *QuitGroupReq) String() string { return proto.CompactTextString(m) }
 func (*QuitGroupReq) ProtoMessage()    {}
 func (*QuitGroupReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{17}
+	return fileDescriptor_group_ac6850665f72c22b, []int{17}
 }
 func (m *QuitGroupReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_QuitGroupReq.Unmarshal(m, b)
@@ -1243,6 +1292,13 @@ func (m *QuitGroupReq) GetToken() string {
 	return ""
 }
 
+func (m *QuitGroupReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type GroupApplicationUserInfo struct {
 	GroupID              string   `protobuf:"bytes,1,opt,name=groupID" json:"groupID,omitempty"`
 	Uid                  string   `protobuf:"bytes,2,opt,name=uid" json:"uid,omitempty"`
@@ -1262,7 +1318,7 @@ func (m *GroupApplicationUserInfo) Reset()         { *m = GroupApplicationUserIn
 func (m *GroupApplicationUserInfo) String() string { return proto.CompactTextString(m) }
 func (*GroupApplicationUserInfo) ProtoMessage()    {}
 func (*GroupApplicationUserInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{18}
+	return fileDescriptor_group_ac6850665f72c22b, []int{18}
 }
 func (m *GroupApplicationUserInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupApplicationUserInfo.Unmarshal(m, b)
@@ -1360,7 +1416,7 @@ func (m *GroupMemberFullInfo) Reset()         { *m = GroupMemberFullInfo{} }
 func (m *GroupMemberFullInfo) String() string { return proto.CompactTextString(m) }
 func (*GroupMemberFullInfo) ProtoMessage()    {}
 func (*GroupMemberFullInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{19}
+	return fileDescriptor_group_ac6850665f72c22b, []int{19}
 }
 func (m *GroupMemberFullInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupMemberFullInfo.Unmarshal(m, b)
@@ -1421,6 +1477,7 @@ type GetGroupMemberListReq struct {
 	OperationID          string   `protobuf:"bytes,3,opt,name=operationID" json:"operationID,omitempty"`
 	Filter               int32    `protobuf:"varint,4,opt,name=filter" json:"filter,omitempty"`
 	NextSeq              int32    `protobuf:"varint,5,opt,name=nextSeq" json:"nextSeq,omitempty"`
+	OpUserID             string   `protobuf:"bytes,6,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1430,7 +1487,7 @@ func (m *GetGroupMemberListReq) Reset()         { *m = GetGroupMemberListReq{} }
 func (m *GetGroupMemberListReq) String() string { return proto.CompactTextString(m) }
 func (*GetGroupMemberListReq) ProtoMessage()    {}
 func (*GetGroupMemberListReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{20}
+	return fileDescriptor_group_ac6850665f72c22b, []int{20}
 }
 func (m *GetGroupMemberListReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupMemberListReq.Unmarshal(m, b)
@@ -1485,9 +1542,16 @@ func (m *GetGroupMemberListReq) GetNextSeq() int32 {
 	return 0
 }
 
+func (m *GetGroupMemberListReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type GetGroupMemberListResp struct {
-	ErrorCode            int32                  `protobuf:"varint,1,opt,name=errorCode" json:"errorCode,omitempty"`
-	ErrorMsg             string                 `protobuf:"bytes,2,opt,name=errorMsg" json:"errorMsg,omitempty"`
+	ErrCode              int32                  `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrMsg               string                 `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
 	MemberList           []*GroupMemberFullInfo `protobuf:"bytes,3,rep,name=memberList" json:"memberList,omitempty"`
 	NextSeq              int32                  `protobuf:"varint,4,opt,name=nextSeq" json:"nextSeq,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
@@ -1499,7 +1563,7 @@ func (m *GetGroupMemberListResp) Reset()         { *m = GetGroupMemberListResp{}
 func (m *GetGroupMemberListResp) String() string { return proto.CompactTextString(m) }
 func (*GetGroupMemberListResp) ProtoMessage()    {}
 func (*GetGroupMemberListResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{21}
+	return fileDescriptor_group_ac6850665f72c22b, []int{21}
 }
 func (m *GetGroupMemberListResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupMemberListResp.Unmarshal(m, b)
@@ -1519,16 +1583,16 @@ func (m *GetGroupMemberListResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_GetGroupMemberListResp proto.InternalMessageInfo
 
-func (m *GetGroupMemberListResp) GetErrorCode() int32 {
+func (m *GetGroupMemberListResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
 
-func (m *GetGroupMemberListResp) GetErrorMsg() string {
+func (m *GetGroupMemberListResp) GetErrMsg() string {
 	if m != nil {
-		return m.ErrorMsg
+		return m.ErrMsg
 	}
 	return ""
 }
@@ -1552,6 +1616,7 @@ type GetGroupMembersInfoReq struct {
 	MemberList           []string `protobuf:"bytes,2,rep,name=memberList" json:"memberList,omitempty"`
 	Token                string   `protobuf:"bytes,3,opt,name=token" json:"token,omitempty"`
 	OperationID          string   `protobuf:"bytes,4,opt,name=operationID" json:"operationID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,5,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1561,7 +1626,7 @@ func (m *GetGroupMembersInfoReq) Reset()         { *m = GetGroupMembersInfoReq{}
 func (m *GetGroupMembersInfoReq) String() string { return proto.CompactTextString(m) }
 func (*GetGroupMembersInfoReq) ProtoMessage()    {}
 func (*GetGroupMembersInfoReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{22}
+	return fileDescriptor_group_ac6850665f72c22b, []int{22}
 }
 func (m *GetGroupMembersInfoReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupMembersInfoReq.Unmarshal(m, b)
@@ -1609,9 +1674,16 @@ func (m *GetGroupMembersInfoReq) GetOperationID() string {
 	return ""
 }
 
+func (m *GetGroupMembersInfoReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type GetGroupMembersInfoResp struct {
-	ErrorCode            int32                  `protobuf:"varint,1,opt,name=errorCode" json:"errorCode,omitempty"`
-	ErrorMsg             string                 `protobuf:"bytes,2,opt,name=errorMsg" json:"errorMsg,omitempty"`
+	ErrCode              int32                  `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrMsg               string                 `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
 	MemberList           []*GroupMemberFullInfo `protobuf:"bytes,3,rep,name=memberList" json:"memberList,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
 	XXX_unrecognized     []byte                 `json:"-"`
@@ -1622,7 +1694,7 @@ func (m *GetGroupMembersInfoResp) Reset()         { *m = GetGroupMembersInfoResp
 func (m *GetGroupMembersInfoResp) String() string { return proto.CompactTextString(m) }
 func (*GetGroupMembersInfoResp) ProtoMessage()    {}
 func (*GetGroupMembersInfoResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{23}
+	return fileDescriptor_group_ac6850665f72c22b, []int{23}
 }
 func (m *GetGroupMembersInfoResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupMembersInfoResp.Unmarshal(m, b)
@@ -1642,16 +1714,16 @@ func (m *GetGroupMembersInfoResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_GetGroupMembersInfoResp proto.InternalMessageInfo
 
-func (m *GetGroupMembersInfoResp) GetErrorCode() int32 {
+func (m *GetGroupMembersInfoResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
 
-func (m *GetGroupMembersInfoResp) GetErrorMsg() string {
+func (m *GetGroupMembersInfoResp) GetErrMsg() string {
 	if m != nil {
-		return m.ErrorMsg
+		return m.ErrMsg
 	}
 	return ""
 }
@@ -1669,6 +1741,7 @@ type KickGroupMemberReq struct {
 	Reason               string                 `protobuf:"bytes,3,opt,name=reason" json:"reason,omitempty"`
 	Token                string                 `protobuf:"bytes,4,opt,name=token" json:"token,omitempty"`
 	OperationID          string                 `protobuf:"bytes,5,opt,name=operationID" json:"operationID,omitempty"`
+	OpUserID             string                 `protobuf:"bytes,6,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
 	XXX_unrecognized     []byte                 `json:"-"`
 	XXX_sizecache        int32                  `json:"-"`
@@ -1678,7 +1751,7 @@ func (m *KickGroupMemberReq) Reset()         { *m = KickGroupMemberReq{} }
 func (m *KickGroupMemberReq) String() string { return proto.CompactTextString(m) }
 func (*KickGroupMemberReq) ProtoMessage()    {}
 func (*KickGroupMemberReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{24}
+	return fileDescriptor_group_ac6850665f72c22b, []int{24}
 }
 func (m *KickGroupMemberReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_KickGroupMemberReq.Unmarshal(m, b)
@@ -1733,6 +1806,13 @@ func (m *KickGroupMemberReq) GetOperationID() string {
 	return ""
 }
 
+func (m *KickGroupMemberReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type Id2Result struct {
 	UId                  string   `protobuf:"bytes,1,opt,name=uId" json:"uId,omitempty"`
 	Result               int32    `protobuf:"varint,2,opt,name=result" json:"result,omitempty"`
@@ -1745,7 +1825,7 @@ func (m *Id2Result) Reset()         { *m = Id2Result{} }
 func (m *Id2Result) String() string { return proto.CompactTextString(m) }
 func (*Id2Result) ProtoMessage()    {}
 func (*Id2Result) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{25}
+	return fileDescriptor_group_ac6850665f72c22b, []int{25}
 }
 func (m *Id2Result) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Id2Result.Unmarshal(m, b)
@@ -1780,8 +1860,8 @@ func (m *Id2Result) GetResult() int32 {
 }
 
 type KickGroupMemberResp struct {
-	ErrorCode            int32        `protobuf:"varint,1,opt,name=errorCode" json:"errorCode,omitempty"`
-	ErrorMsg             string       `protobuf:"bytes,2,opt,name=errorMsg" json:"errorMsg,omitempty"`
+	ErrCode              int32        `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrMsg               string       `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
 	Id2Result            []*Id2Result `protobuf:"bytes,3,rep,name=id2result" json:"id2result,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
 	XXX_unrecognized     []byte       `json:"-"`
@@ -1792,7 +1872,7 @@ func (m *KickGroupMemberResp) Reset()         { *m = KickGroupMemberResp{} }
 func (m *KickGroupMemberResp) String() string { return proto.CompactTextString(m) }
 func (*KickGroupMemberResp) ProtoMessage()    {}
 func (*KickGroupMemberResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{26}
+	return fileDescriptor_group_ac6850665f72c22b, []int{26}
 }
 func (m *KickGroupMemberResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_KickGroupMemberResp.Unmarshal(m, b)
@@ -1812,16 +1892,16 @@ func (m *KickGroupMemberResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_KickGroupMemberResp proto.InternalMessageInfo
 
-func (m *KickGroupMemberResp) GetErrorCode() int32 {
+func (m *KickGroupMemberResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
 
-func (m *KickGroupMemberResp) GetErrorMsg() string {
+func (m *KickGroupMemberResp) GetErrMsg() string {
 	if m != nil {
-		return m.ErrorMsg
+		return m.ErrMsg
 	}
 	return ""
 }
@@ -1836,6 +1916,7 @@ func (m *KickGroupMemberResp) GetId2Result() []*Id2Result {
 type GetJoinedGroupListReq struct {
 	Token                string   `protobuf:"bytes,1,opt,name=token" json:"token,omitempty"`
 	OperationID          string   `protobuf:"bytes,2,opt,name=operationID" json:"operationID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,3,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1845,7 +1926,7 @@ func (m *GetJoinedGroupListReq) Reset()         { *m = GetJoinedGroupListReq{} }
 func (m *GetJoinedGroupListReq) String() string { return proto.CompactTextString(m) }
 func (*GetJoinedGroupListReq) ProtoMessage()    {}
 func (*GetJoinedGroupListReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{27}
+	return fileDescriptor_group_ac6850665f72c22b, []int{27}
 }
 func (m *GetJoinedGroupListReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetJoinedGroupListReq.Unmarshal(m, b)
@@ -1879,6 +1960,13 @@ func (m *GetJoinedGroupListReq) GetOperationID() string {
 	return ""
 }
 
+func (m *GetJoinedGroupListReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type GroupInfo struct {
 	GroupId              string   `protobuf:"bytes,1,opt,name=groupId" json:"groupId,omitempty"`
 	GroupName            string   `protobuf:"bytes,2,opt,name=groupName" json:"groupName,omitempty"`
@@ -1897,7 +1985,7 @@ func (m *GroupInfo) Reset()         { *m = GroupInfo{} }
 func (m *GroupInfo) String() string { return proto.CompactTextString(m) }
 func (*GroupInfo) ProtoMessage()    {}
 func (*GroupInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{28}
+	return fileDescriptor_group_ac6850665f72c22b, []int{28}
 }
 func (m *GroupInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupInfo.Unmarshal(m, b)
@@ -1974,9 +2062,9 @@ func (m *GroupInfo) GetMemberCount() uint32 {
 }
 
 type GetJoinedGroupListResp struct {
-	ErrorCode            int32        `protobuf:"varint,1,opt,name=errorCode" json:"errorCode,omitempty"`
-	ErrorMsg             string       `protobuf:"bytes,2,opt,name=errorMsg" json:"errorMsg,omitempty"`
-	GroupList            []*GroupInfo `protobuf:"bytes,3,rep,name=groupList" json:"groupList,omitempty"`
+	ErrCode              int32        `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrorMsg             string       `protobuf:"bytes,2,opt,name=ErrorMsg" json:"ErrorMsg,omitempty"`
+	GroupList            []*GroupInfo `protobuf:"bytes,3,rep,name=GroupList" json:"GroupList,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
 	XXX_unrecognized     []byte       `json:"-"`
 	XXX_sizecache        int32        `json:"-"`
@@ -1986,7 +2074,7 @@ func (m *GetJoinedGroupListResp) Reset()         { *m = GetJoinedGroupListResp{}
 func (m *GetJoinedGroupListResp) String() string { return proto.CompactTextString(m) }
 func (*GetJoinedGroupListResp) ProtoMessage()    {}
 func (*GetJoinedGroupListResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{29}
+	return fileDescriptor_group_ac6850665f72c22b, []int{29}
 }
 func (m *GetJoinedGroupListResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetJoinedGroupListResp.Unmarshal(m, b)
@@ -2006,9 +2094,9 @@ func (m *GetJoinedGroupListResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_GetJoinedGroupListResp proto.InternalMessageInfo
 
-func (m *GetJoinedGroupListResp) GetErrorCode() int32 {
+func (m *GetJoinedGroupListResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
@@ -2033,6 +2121,7 @@ type InviteUserToGroupReq struct {
 	GroupID              string   `protobuf:"bytes,3,opt,name=groupID" json:"groupID,omitempty"`
 	Reason               string   `protobuf:"bytes,4,opt,name=reason" json:"reason,omitempty"`
 	UidList              []string `protobuf:"bytes,5,rep,name=uidList" json:"uidList,omitempty"`
+	OpUserID             string   `protobuf:"bytes,6,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -2042,7 +2131,7 @@ func (m *InviteUserToGroupReq) Reset()         { *m = InviteUserToGroupReq{} }
 func (m *InviteUserToGroupReq) String() string { return proto.CompactTextString(m) }
 func (*InviteUserToGroupReq) ProtoMessage()    {}
 func (*InviteUserToGroupReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{30}
+	return fileDescriptor_group_ac6850665f72c22b, []int{30}
 }
 func (m *InviteUserToGroupReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_InviteUserToGroupReq.Unmarshal(m, b)
@@ -2097,10 +2186,17 @@ func (m *InviteUserToGroupReq) GetUidList() []string {
 	return nil
 }
 
+func (m *InviteUserToGroupReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type InviteUserToGroupResp struct {
-	ErrorCode            int32        `protobuf:"varint,1,opt,name=errorCode" json:"errorCode,omitempty"`
-	ErrorMsg             string       `protobuf:"bytes,2,opt,name=errorMsg" json:"errorMsg,omitempty"`
-	Id2Result            []*Id2Result `protobuf:"bytes,3,rep,name=id2result" json:"id2result,omitempty"`
+	ErrCode              int32        `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrMsg               string       `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
+	Id2Result            []*Id2Result `protobuf:"bytes,3,rep,name=Id2Result" json:"Id2Result,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
 	XXX_unrecognized     []byte       `json:"-"`
 	XXX_sizecache        int32        `json:"-"`
@@ -2110,7 +2206,7 @@ func (m *InviteUserToGroupResp) Reset()         { *m = InviteUserToGroupResp{} }
 func (m *InviteUserToGroupResp) String() string { return proto.CompactTextString(m) }
 func (*InviteUserToGroupResp) ProtoMessage()    {}
 func (*InviteUserToGroupResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{31}
+	return fileDescriptor_group_ac6850665f72c22b, []int{31}
 }
 func (m *InviteUserToGroupResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_InviteUserToGroupResp.Unmarshal(m, b)
@@ -2130,16 +2226,16 @@ func (m *InviteUserToGroupResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_InviteUserToGroupResp proto.InternalMessageInfo
 
-func (m *InviteUserToGroupResp) GetErrorCode() int32 {
+func (m *InviteUserToGroupResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
 
-func (m *InviteUserToGroupResp) GetErrorMsg() string {
+func (m *InviteUserToGroupResp) GetErrMsg() string {
 	if m != nil {
-		return m.ErrorMsg
+		return m.ErrMsg
 	}
 	return ""
 }
@@ -2155,6 +2251,7 @@ type GetGroupAllMemberReq struct {
 	GroupID              string   `protobuf:"bytes,1,opt,name=groupID" json:"groupID,omitempty"`
 	Token                string   `protobuf:"bytes,2,opt,name=token" json:"token,omitempty"`
 	OperationID          string   `protobuf:"bytes,3,opt,name=operationID" json:"operationID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,4,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -2164,7 +2261,7 @@ func (m *GetGroupAllMemberReq) Reset()         { *m = GetGroupAllMemberReq{} }
 func (m *GetGroupAllMemberReq) String() string { return proto.CompactTextString(m) }
 func (*GetGroupAllMemberReq) ProtoMessage()    {}
 func (*GetGroupAllMemberReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{32}
+	return fileDescriptor_group_ac6850665f72c22b, []int{32}
 }
 func (m *GetGroupAllMemberReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupAllMemberReq.Unmarshal(m, b)
@@ -2205,9 +2302,16 @@ func (m *GetGroupAllMemberReq) GetOperationID() string {
 	return ""
 }
 
+func (m *GetGroupAllMemberReq) GetOpUserID() string {
+	if m != nil {
+		return m.OpUserID
+	}
+	return ""
+}
+
 type GetGroupAllMemberResp struct {
-	ErrorCode            int32                  `protobuf:"varint,1,opt,name=errorCode" json:"errorCode,omitempty"`
-	ErrorMsg             string                 `protobuf:"bytes,2,opt,name=errorMsg" json:"errorMsg,omitempty"`
+	ErrCode              int32                  `protobuf:"varint,1,opt,name=ErrCode" json:"ErrCode,omitempty"`
+	ErrMsg               string                 `protobuf:"bytes,2,opt,name=ErrMsg" json:"ErrMsg,omitempty"`
 	MemberList           []*GroupMemberFullInfo `protobuf:"bytes,3,rep,name=memberList" json:"memberList,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
 	XXX_unrecognized     []byte                 `json:"-"`
@@ -2218,7 +2322,7 @@ func (m *GetGroupAllMemberResp) Reset()         { *m = GetGroupAllMemberResp{} }
 func (m *GetGroupAllMemberResp) String() string { return proto.CompactTextString(m) }
 func (*GetGroupAllMemberResp) ProtoMessage()    {}
 func (*GetGroupAllMemberResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_group_ed07d0078ff66bfe, []int{33}
+	return fileDescriptor_group_ac6850665f72c22b, []int{33}
 }
 func (m *GetGroupAllMemberResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupAllMemberResp.Unmarshal(m, b)
@@ -2238,16 +2342,16 @@ func (m *GetGroupAllMemberResp) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_GetGroupAllMemberResp proto.InternalMessageInfo
 
-func (m *GetGroupAllMemberResp) GetErrorCode() int32 {
+func (m *GetGroupAllMemberResp) GetErrCode() int32 {
 	if m != nil {
-		return m.ErrorCode
+		return m.ErrCode
 	}
 	return 0
 }
 
-func (m *GetGroupAllMemberResp) GetErrorMsg() string {
+func (m *GetGroupAllMemberResp) GetErrMsg() string {
 	if m != nil {
-		return m.ErrorMsg
+		return m.ErrMsg
 	}
 	return ""
 }
@@ -2799,116 +2903,117 @@ var _Group_serviceDesc = grpc.ServiceDesc{
 	Metadata: "group/group.proto",
 }
 
-func init() { proto.RegisterFile("group/group.proto", fileDescriptor_group_ed07d0078ff66bfe) }
+func init() { proto.RegisterFile("group/group.proto", fileDescriptor_group_ac6850665f72c22b) }
 
-var fileDescriptor_group_ed07d0078ff66bfe = []byte{
-	// 1718 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xcd, 0x6e, 0xdc, 0xb6,
-	0x13, 0x87, 0x76, 0xb5, 0xb6, 0x77, 0xfc, 0x4d, 0xc7, 0x8e, 0xfe, 0x8a, 0xff, 0x86, 0xc3, 0x06,
-	0x85, 0xd1, 0x83, 0x0b, 0x38, 0x68, 0x81, 0xb4, 0x39, 0x34, 0xb1, 0x63, 0xc7, 0x69, 0x63, 0x27,
-	0xb2, 0x73, 0xe9, 0x25, 0x51, 0x56, 0xf4, 0x46, 0xf1, 0xae, 0xb4, 0x96, 0xb4, 0x4d, 0xda, 0x4b,
-	0x91, 0xa2, 0x40, 0xbf, 0x50, 0xf4, 0x90, 0x53, 0xdb, 0x17, 0xe8, 0xa9, 0x4f, 0xd0, 0xb7, 0xe9,
-	0x8b, 0x14, 0x1c, 0x92, 0x12, 0xf5, 0xb5, 0x1b, 0xd8, 0x45, 0x73, 0x59, 0x68, 0x86, 0x43, 0x72,
-	0x66, 0x38, 0xf3, 0xe3, 0x0c, 0x17, 0x16, 0xbb, 0x51, 0x38, 0x1c, 0xbc, 0x8f, 0xbf, 0x9b, 0x83,
-	0x28, 0x4c, 0x42, 0xd2, 0x42, 0x82, 0xee, 0x02, 0x6c, 0x87, 0xfd, 0x7e, 0x18, 0x38, 0x2c, 0x1e,
-	0x90, 0x55, 0x68, 0xdf, 0x89, 0xa2, 0x30, 0xda, 0x0e, 0x3d, 0x66, 0x19, 0xeb, 0xc6, 0x46, 0xcb,
-	0xc9, 0x18, 0xc4, 0x86, 0x29, 0x24, 0xee, 0xc7, 0x5d, 0xab, 0xb1, 0x6e, 0x6c, 0xb4, 0x9d, 0x94,
-	0xa6, 0xaf, 0x1b, 0x30, 0xb7, 0x1d, 0x31, 0x37, 0x61, 0x7b, 0x7c, 0x5d, 0x87, 0x9d, 0x91, 0x1b,
-	0x00, 0x7d, 0xd6, 0x7f, 0xca, 0xa2, 0xcf, 0xfc, 0x38, 0xb1, 0x8c, 0xf5, 0xe6, 0xc6, 0xf4, 0xd6,
-	0xff, 0x36, 0x85, 0x0e, 0x28, 0x74, 0xcb, 0xf3, 0xee, 0xa3, 0xc0, 0x7e, 0x70, 0x12, 0x3a, 0x9a,
-	0x30, 0xd7, 0x03, 0xe5, 0x0e, 0xdc, 0x3e, 0x93, 0x5b, 0x65, 0x0c, 0x42, 0x61, 0xc6, 0x0f, 0x92,
-	0x28, 0xf4, 0x86, 0x9d, 0xc4, 0x0f, 0x03, 0xab, 0x89, 0x02, 0x39, 0x1e, 0x97, 0x09, 0xc2, 0xc4,
-	0x3f, 0xf1, 0x3b, 0x2e, 0xca, 0x98, 0x42, 0x46, 0xe7, 0x11, 0x0b, 0x26, 0x4f, 0xdc, 0x0e, 0x7b,
-	0x14, 0xf5, 0xac, 0x16, 0x0e, 0x2b, 0x92, 0x5c, 0x82, 0x56, 0x12, 0x9e, 0xb2, 0xc0, 0x9a, 0x40,
-	0xbe, 0x20, 0xc8, 0x3a, 0x4c, 0x87, 0x03, 0x16, 0xe1, 0xe4, 0xfd, 0x1d, 0x6b, 0x12, 0xc7, 0x74,
-	0x16, 0x99, 0x83, 0x06, 0x7b, 0x69, 0x4d, 0xe1, 0x40, 0x83, 0xbd, 0xa4, 0x9f, 0x00, 0x29, 0x5b,
-	0x4a, 0x16, 0xa0, 0x39, 0xf4, 0x3d, 0xf4, 0x6f, 0xdb, 0xe1, 0x9f, 0x5c, 0x93, 0x98, 0x25, 0x4e,
-	0xd8, 0x13, 0xd6, 0xb6, 0x1c, 0x45, 0x52, 0x06, 0xf3, 0x39, 0xb7, 0x5e, 0xe4, 0x90, 0xf8, 0x36,
-	0xe8, 0xc5, 0xfd, 0x1d, 0xe9, 0x33, 0x45, 0xd2, 0x1e, 0x2c, 0xec, 0xb1, 0x04, 0xf7, 0x88, 0xf1,
-	0x34, 0xd8, 0x19, 0x37, 0x57, 0x0e, 0xa7, 0x07, 0xd8, 0x76, 0x74, 0x56, 0xe6, 0xa6, 0xc6, 0x08,
-	0x37, 0x35, 0x4b, 0x6e, 0xa2, 0x31, 0x2c, 0x16, 0x76, 0xbb, 0x90, 0x59, 0xd7, 0xc0, 0xf4, 0xdc,
-	0xc4, 0xb5, 0x9a, 0x18, 0x62, 0x0b, 0x7a, 0x88, 0xe1, 0xea, 0x38, 0x4a, 0xff, 0x36, 0x60, 0xfe,
-	0x48, 0xee, 0xaa, 0x4c, 0xd4, 0x1c, 0x62, 0xe4, 0x1c, 0x32, 0x3e, 0x02, 0x73, 0xd1, 0xd5, 0xac,
-	0x88, 0xae, 0x62, 0x94, 0x9a, 0x15, 0x51, 0xfa, 0xaf, 0x47, 0x20, 0x7d, 0x00, 0xb6, 0x72, 0xed,
-	0xad, 0xc1, 0xa0, 0x27, 0x95, 0xe1, 0xa7, 0xc5, 0xed, 0x5d, 0x80, 0xe6, 0xa3, 0xd4, 0x56, 0xfe,
-	0xc9, 0x57, 0x3c, 0xd4, 0x56, 0x14, 0x96, 0xea, 0x2c, 0xfa, 0xab, 0x09, 0x57, 0x6b, 0x96, 0x7c,
-	0xbc, 0xe3, 0x26, 0xee, 0xe3, 0x47, 0x31, 0x8b, 0x78, 0xe4, 0xa7, 0x0b, 0x37, 0xf6, 0x77, 0xb8,
-	0x65, 0x7b, 0xd2, 0xb3, 0x62, 0x4d, 0x45, 0x92, 0x35, 0x80, 0xdd, 0x28, 0xec, 0xf3, 0x59, 0x69,
-	0x74, 0x68, 0x1c, 0x7e, 0xd2, 0xc7, 0xa1, 0x1c, 0x15, 0x3e, 0x4b, 0x69, 0x42, 0xc0, 0xdc, 0xed,
-	0xb9, 0x5d, 0x74, 0x56, 0xcb, 0xc1, 0x6f, 0xbe, 0x9e, 0xc3, 0xce, 0x86, 0x2c, 0x4e, 0x78, 0x6c,
-	0x08, 0x77, 0x69, 0x1c, 0x3e, 0x7e, 0xd7, 0x0d, 0xbc, 0x1e, 0xf3, 0xf8, 0xb8, 0x70, 0x99, 0xc6,
-	0xe1, 0x9a, 0xde, 0xf2, 0xbc, 0x63, 0xbf, 0xcf, 0x30, 0x71, 0x9b, 0x8e, 0x22, 0xc9, 0x7b, 0xb0,
-	0xa0, 0xf4, 0x3a, 0xf0, 0x3b, 0xa7, 0x01, 0x0f, 0x85, 0x36, 0xce, 0x2f, 0xf1, 0xc9, 0xbb, 0x30,
-	0x27, 0xb4, 0x4c, 0x25, 0x01, 0x25, 0x0b, 0x5c, 0xb2, 0x01, 0xf3, 0x6a, 0xee, 0xae, 0x3c, 0xf9,
-	0x69, 0x14, 0x2c, 0xb2, 0xc9, 0x35, 0x98, 0x15, 0x73, 0x95, 0xdc, 0x0c, 0xca, 0xe5, 0x99, 0xfc,
-	0xfc, 0xa4, 0x2d, 0x9c, 0x6b, 0xcd, 0x8a, 0xf3, 0xd3, 0x58, 0xdc, 0x67, 0xc7, 0x5f, 0x0e, 0x98,
-	0x35, 0x27, 0x7c, 0xc6, 0xbf, 0x79, 0x6c, 0x0a, 0x91, 0xa3, 0xc4, 0x4d, 0x86, 0xb1, 0x35, 0x8f,
-	0x63, 0x39, 0x5e, 0x26, 0xe3, 0xb0, 0x78, 0xd8, 0x4b, 0xac, 0x05, 0x5d, 0x46, 0xf0, 0xe8, 0x19,
-	0x5c, 0xa9, 0x09, 0x0d, 0x1e, 0x19, 0x3c, 0x88, 0xb7, 0xc3, 0x61, 0x90, 0xc8, 0x74, 0x16, 0x04,
-	0xb9, 0x09, 0x26, 0xea, 0xda, 0xc0, 0x74, 0xdd, 0x50, 0xe9, 0x3a, 0x2e, 0xc4, 0x1c, 0x9c, 0x45,
-	0xbf, 0x33, 0x6a, 0xf7, 0x44, 0x18, 0xb1, 0x60, 0xf2, 0x4e, 0xa4, 0x83, 0x88, 0x22, 0xc9, 0x0a,
-	0x4c, 0xdc, 0x89, 0x34, 0x00, 0x91, 0x14, 0xf9, 0x10, 0xcc, 0x1d, 0x01, 0x1f, 0xc6, 0xc6, 0xf4,
-	0x16, 0x1d, 0xad, 0x0f, 0x97, 0x74, 0x50, 0x9e, 0xfe, 0x64, 0xc0, 0xf2, 0x71, 0xe4, 0x06, 0xf1,
-	0x09, 0x8b, 0x50, 0xf4, 0xf0, 0x45, 0xc0, 0x22, 0x09, 0x2b, 0x7b, 0x79, 0x58, 0x51, 0xc1, 0x6f,
-	0xc3, 0xd4, 0x61, 0xcf, 0x43, 0x41, 0x05, 0x63, 0x8a, 0xe6, 0x63, 0x07, 0xec, 0x85, 0x18, 0x13,
-	0x69, 0x91, 0xd2, 0xc5, 0x34, 0x35, 0xcb, 0x69, 0x7a, 0x0f, 0x56, 0xaa, 0x94, 0x39, 0x8f, 0x47,
-	0xe8, 0x57, 0x30, 0x73, 0x2f, 0xf4, 0x83, 0xf4, 0x26, 0xaf, 0x87, 0x49, 0x0b, 0x26, 0xfb, 0x2c,
-	0x8e, 0xdd, 0xae, 0x02, 0x49, 0x45, 0x66, 0x00, 0xd6, 0x2c, 0x00, 0xd8, 0x18, 0x3b, 0x7e, 0x30,
-	0xe1, 0x4a, 0xd1, 0xf1, 0xdc, 0x8c, 0x30, 0x88, 0x99, 0xbc, 0x95, 0xf4, 0x15, 0x8c, 0xd2, 0x0a,
-	0x5c, 0x27, 0x34, 0x3e, 0x83, 0x1e, 0x49, 0xea, 0xe7, 0xd2, 0x1c, 0x05, 0x4a, 0x66, 0x09, 0x94,
-	0x0a, 0x50, 0x80, 0xb7, 0x42, 0xab, 0x0c, 0x05, 0x07, 0x35, 0x29, 0x3e, 0x51, 0x9d, 0xe2, 0x3a,
-	0xd4, 0x4d, 0x16, 0xa0, 0x2e, 0x07, 0x28, 0xb8, 0xdf, 0x54, 0x11, 0x50, 0x70, 0xb7, 0x12, 0x4c,
-	0xb4, 0xab, 0x60, 0x42, 0x03, 0x39, 0xc8, 0x83, 0x5c, 0x1e, 0x3e, 0xa7, 0xc7, 0xc0, 0xe7, 0x4c,
-	0x09, 0x3e, 0x15, 0xbc, 0xcc, 0x8e, 0x80, 0x97, 0xb9, 0x37, 0x80, 0x97, 0xf9, 0x0a, 0x78, 0x79,
-	0x00, 0xab, 0xf5, 0xa1, 0x70, 0xae, 0xc8, 0xfe, 0xde, 0x00, 0xeb, 0x88, 0x25, 0x18, 0x10, 0xb8,
-	0xb4, 0xf2, 0xe3, 0xe8, 0x30, 0xb7, 0x61, 0x2a, 0x50, 0xc7, 0x20, 0xd3, 0x56, 0xd1, 0xc5, 0x80,
-	0x6c, 0x96, 0x03, 0x32, 0x4d, 0x05, 0x53, 0x4b, 0x05, 0xfa, 0x04, 0x66, 0x1e, 0x0e, 0xfd, 0xe4,
-	0x0d, 0x92, 0xac, 0x70, 0xeb, 0x37, 0xca, 0x75, 0x67, 0x65, 0xb2, 0xd1, 0x6f, 0x1b, 0x60, 0x15,
-	0xfd, 0x87, 0xd1, 0xc5, 0x8b, 0xd0, 0xfa, 0xed, 0x64, 0x79, 0xda, 0xc8, 0xca, 0x53, 0x02, 0x26,
-	0x5e, 0x69, 0x62, 0x75, 0xfc, 0xe6, 0x3c, 0xbf, 0x93, 0x96, 0x35, 0xf8, 0xcd, 0xbd, 0x1e, 0xb1,
-	0x33, 0xee, 0x75, 0x91, 0x1b, 0x92, 0xe2, 0x19, 0xe1, 0x66, 0x2a, 0x60, 0x14, 0x4e, 0x60, 0x14,
-	0x16, 0xd9, 0x7c, 0xd5, 0x13, 0x7e, 0xc1, 0x4f, 0x8a, 0x68, 0x3a, 0x91, 0x17, 0xbc, 0xb0, 0x35,
-	0xe4, 0x79, 0x22, 0xb2, 0x40, 0xe3, 0xf0, 0xf1, 0x67, 0x59, 0x84, 0x8a, 0xf0, 0xd7, 0x38, 0xf4,
-	0xb5, 0x01, 0x4b, 0xe8, 0x06, 0x51, 0x82, 0xef, 0x0e, 0x7b, 0x3d, 0xf4, 0xc0, 0x0a, 0x4c, 0x0c,
-	0xb9, 0x37, 0x54, 0x25, 0x2e, 0x29, 0xae, 0x43, 0x94, 0x55, 0xe2, 0xf8, 0xcd, 0x03, 0xe0, 0x79,
-	0xe8, 0x0b, 0xd5, 0xb9, 0x17, 0x4c, 0x27, 0xa5, 0x73, 0xc1, 0x61, 0x16, 0x82, 0xa3, 0xb6, 0xc0,
-	0xa3, 0xbf, 0x1b, 0xb0, 0xac, 0xee, 0x98, 0xfb, 0x69, 0xe7, 0x33, 0x3a, 0x10, 0xce, 0x59, 0x6f,
-	0x73, 0x4b, 0x4f, 0xfc, 0x5e, 0xc2, 0x22, 0xd4, 0xaf, 0xe5, 0x48, 0x8a, 0xef, 0x14, 0xb0, 0x97,
-	0xc9, 0x11, 0x3b, 0x93, 0x15, 0x95, 0x22, 0xe9, 0x1f, 0x06, 0xac, 0x54, 0x69, 0x27, 0xea, 0x74,
-	0x56, 0xac, 0xd3, 0x99, 0x5e, 0xa7, 0xb3, 0x42, 0x9d, 0xae, 0x68, 0xf2, 0x51, 0xae, 0x21, 0x14,
-	0xd5, 0xba, 0xad, 0x57, 0xeb, 0xf9, 0x03, 0xca, 0x75, 0x84, 0x9a, 0xaa, 0x66, 0x5e, 0xd5, 0x1f,
-	0x4b, 0xaa, 0xc6, 0xe3, 0xcb, 0xfb, 0xb5, 0x9c, 0x2a, 0x0d, 0x6c, 0x6d, 0xf4, 0xed, 0x6a, 0x6f,
-	0xaf, 0xb0, 0x7c, 0x7b, 0xe9, 0xe5, 0xf7, 0x2f, 0x06, 0x5c, 0xae, 0x54, 0xe6, 0x6d, 0x39, 0x8e,
-	0xfe, 0x65, 0x00, 0xf9, 0xd4, 0xef, 0x9c, 0x6a, 0x72, 0xa3, 0x5d, 0x73, 0x13, 0xa6, 0x87, 0xbe,
-	0xc7, 0xe7, 0xf2, 0xb5, 0x64, 0x95, 0x36, 0x6a, 0x37, 0x5d, 0x5c, 0x40, 0x80, 0x1b, 0xa7, 0x3d,
-	0x91, 0xa4, 0xaa, 0x31, 0xb0, 0xe8, 0xd0, 0x56, 0xd9, 0xa1, 0x1f, 0x40, 0x7b, 0xdf, 0xdb, 0x12,
-	0xf7, 0x01, 0x22, 0xd3, 0x7e, 0xd6, 0x38, 0xef, 0x7b, 0x62, 0x3b, 0xbc, 0x3f, 0x44, 0xb6, 0x4a,
-	0x8a, 0x7e, 0x0d, 0x4b, 0x25, 0xa3, 0x2f, 0x74, 0x04, 0x9b, 0xd0, 0xf6, 0xbd, 0x2d, 0xb9, 0x57,
-	0xbe, 0xd1, 0x4c, 0xf5, 0x73, 0x32, 0x11, 0x7a, 0x08, 0xcb, 0x5d, 0x96, 0xf0, 0x2a, 0x8a, 0x79,
-	0xa8, 0x85, 0xca, 0xee, 0xd4, 0x11, 0xc6, 0x08, 0x47, 0x94, 0x21, 0x9e, 0xbe, 0x6a, 0x40, 0x3b,
-	0xed, 0x5d, 0xb3, 0xe3, 0xf3, 0xf2, 0xc7, 0xe7, 0xbd, 0xf5, 0xc6, 0x75, 0x0d, 0xa0, 0x83, 0x0f,
-	0x16, 0x29, 0xcc, 0x9b, 0x8e, 0xc6, 0xe1, 0x33, 0x43, 0x2c, 0xc7, 0x3c, 0x59, 0xf2, 0x28, 0x92,
-	0xfb, 0x40, 0xc4, 0xad, 0xe8, 0x19, 0x38, 0xd0, 0xcf, 0x3a, 0x3a, 0x8b, 0x7e, 0x63, 0xc0, 0x4a,
-	0x95, 0x57, 0x2f, 0x7a, 0xb2, 0x5d, 0xb5, 0x54, 0xed, 0x13, 0x42, 0x26, 0x42, 0x7f, 0x33, 0xe0,
-	0x92, 0x1f, 0x7c, 0xe1, 0x27, 0x8c, 0xdf, 0xa5, 0xc7, 0x61, 0x7a, 0x81, 0x9f, 0xf3, 0x64, 0xeb,
-	0x5f, 0x65, 0xb4, 0x64, 0x32, 0x73, 0xc9, 0x64, 0xc1, 0xa4, 0xcc, 0x39, 0xab, 0x85, 0xd0, 0xa5,
-	0x48, 0xfa, 0xca, 0x80, 0xe5, 0x0a, 0xe5, 0xfe, 0xd3, 0xd0, 0x7f, 0x06, 0x97, 0xd2, 0xe6, 0xa9,
-	0xd7, 0x7b, 0x13, 0xc8, 0x39, 0xef, 0x3b, 0xd2, 0xcf, 0xda, 0x1d, 0xaa, 0x6d, 0xf5, 0xb6, 0xb0,
-	0x76, 0xeb, 0xcf, 0x29, 0x10, 0xcf, 0xaa, 0x1c, 0x44, 0x3b, 0xd9, 0xb3, 0x1d, 0x59, 0x96, 0x0b,
-	0xe4, 0x5f, 0x48, 0xed, 0x95, 0x2a, 0x76, 0x3c, 0x20, 0xd7, 0xa1, 0xfd, 0x5c, 0xf5, 0x5f, 0x64,
-	0x49, 0x0a, 0xe9, 0x1d, 0x99, 0xbd, 0xa8, 0x66, 0x66, 0x6f, 0xb7, 0xd7, 0xa1, 0x7d, 0xa6, 0xea,
-	0xc9, 0x74, 0x92, 0x5e, 0x61, 0x56, 0x4d, 0xba, 0x0d, 0xb3, 0x5d, 0xfd, 0x25, 0x8e, 0x5c, 0x2e,
-	0xb4, 0xbf, 0xea, 0x2e, 0xb5, 0xad, 0xea, 0x81, 0x78, 0x40, 0x6e, 0xc0, 0x4c, 0xac, 0xbd, 0xab,
-	0x11, 0x65, 0x55, 0xe1, 0xb1, 0xad, 0x6a, 0xfb, 0x27, 0x70, 0xb9, 0x5b, 0xdd, 0x67, 0x93, 0xab,
-	0xa3, 0xfb, 0x70, 0xbe, 0x20, 0x1d, 0x27, 0x12, 0x0f, 0xc8, 0x43, 0x20, 0x49, 0xa9, 0x2d, 0x26,
-	0xab, 0x72, 0x66, 0x65, 0xfb, 0x6e, 0xff, 0x7f, 0xc4, 0x68, 0x3c, 0x20, 0x1d, 0xb0, 0xba, 0x35,
-	0x5d, 0x09, 0xa1, 0xb9, 0xf7, 0xed, 0xca, 0x0e, 0xd6, 0x7e, 0x67, 0xac, 0x8c, 0xd0, 0xbb, 0x5b,
-	0xaa, 0xbf, 0x52, 0xbd, 0x2b, 0x0b, 0xc7, 0x54, 0xef, 0x9a, 0xc2, 0xed, 0x18, 0x96, 0xba, 0xe5,
-	0xd2, 0x84, 0x54, 0xcf, 0x4a, 0xcf, 0x7d, 0x6d, 0xd4, 0x70, 0x3c, 0x20, 0x77, 0x61, 0xfe, 0x34,
-	0x7f, 0xd3, 0x12, 0xf5, 0xc8, 0x5f, 0x2e, 0x3b, 0x6c, 0xbb, 0x6e, 0x28, 0x35, 0xb9, 0x00, 0xee,
-	0xa9, 0xc9, 0x95, 0xb7, 0x69, 0x6a, 0x72, 0xcd, 0xad, 0x70, 0x00, 0x8b, 0x25, 0x34, 0x24, 0x57,
-	0xe4, 0x9c, 0x2a, 0x10, 0xb7, 0x57, 0xeb, 0x07, 0xc5, 0x7a, 0xdd, 0x22, 0xde, 0xa4, 0xeb, 0x55,
-	0x81, 0x9e, 0xbd, 0x5a, 0x3f, 0x18, 0x0f, 0x6e, 0xcf, 0x7f, 0x3e, 0xbb, 0x29, 0xfe, 0x95, 0xf9,
-	0x18, 0x7f, 0x9f, 0x4e, 0xe0, 0x9f, 0x33, 0xd7, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xc0, 0xd8,
-	0xe8, 0x44, 0xb1, 0x19, 0x00, 0x00,
+var fileDescriptor_group_ac6850665f72c22b = []byte{
+	// 1744 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xdb, 0x6f, 0xdc, 0x44,
+	0x17, 0x97, 0x77, 0xbd, 0x9b, 0xec, 0xc9, 0x7d, 0xd2, 0xa4, 0xfe, 0xdc, 0x7c, 0x51, 0xea, 0xaf,
+	0xfa, 0x14, 0xf1, 0x10, 0xa4, 0x54, 0x20, 0x15, 0x2a, 0x44, 0x9b, 0x5b, 0xb7, 0xd0, 0x94, 0x3a,
+	0xe9, 0x4b, 0x25, 0x54, 0xdc, 0xf5, 0xec, 0xe2, 0x66, 0xd7, 0xf6, 0xda, 0x5e, 0xda, 0x4a, 0x08,
+	0x09, 0xa9, 0xa8, 0x48, 0x3c, 0x22, 0x21, 0xf1, 0xc6, 0x03, 0x82, 0x37, 0x24, 0x5e, 0xe0, 0x5f,
+	0xe1, 0xbf, 0x01, 0xcd, 0xd5, 0xe3, 0x6b, 0xa2, 0x45, 0x94, 0x97, 0x95, 0xcf, 0x99, 0x33, 0x33,
+	0x67, 0x7e, 0x73, 0xce, 0x6f, 0xce, 0xcc, 0xc2, 0xca, 0x20, 0x0a, 0x26, 0xe1, 0x9b, 0xf4, 0x77,
+	0x27, 0x8c, 0x82, 0x24, 0x40, 0x2d, 0x2a, 0x58, 0xef, 0x01, 0xec, 0x05, 0xa3, 0x51, 0xe0, 0xdb,
+	0x38, 0x0e, 0x91, 0x01, 0x33, 0x07, 0x51, 0xb4, 0x17, 0xb8, 0xd8, 0xd0, 0xb6, 0xb4, 0xed, 0x96,
+	0x2d, 0x44, 0xb4, 0x0e, 0xed, 0x83, 0x28, 0xba, 0x17, 0x0f, 0x8c, 0xc6, 0x96, 0xb6, 0xdd, 0xb1,
+	0xb9, 0x64, 0xfd, 0xda, 0x80, 0xc5, 0xbd, 0x08, 0x3b, 0x09, 0x3e, 0x22, 0xe3, 0xd9, 0x78, 0x8c,
+	0x6e, 0x00, 0x8c, 0xf0, 0xe8, 0x09, 0x8e, 0x3e, 0xf4, 0xe2, 0xc4, 0xd0, 0xb6, 0x9a, 0xdb, 0x73,
+	0xbb, 0xff, 0xd9, 0x61, 0x73, 0x53, 0xa3, 0x5b, 0xae, 0x7b, 0x8f, 0x1a, 0x74, 0xfd, 0x7e, 0x60,
+	0x2b, 0xc6, 0x68, 0x03, 0x3a, 0xd4, 0xee, 0xd8, 0x19, 0x61, 0x3e, 0x51, 0xaa, 0x40, 0x16, 0xcc,
+	0x7b, 0x7e, 0x12, 0x05, 0xee, 0xa4, 0x97, 0x78, 0x81, 0x6f, 0x34, 0xa9, 0x41, 0x46, 0x47, 0x6c,
+	0xfc, 0x20, 0xf1, 0xfa, 0x5e, 0xcf, 0xa1, 0x36, 0x3a, 0xb3, 0x51, 0x75, 0x64, 0x95, 0x7d, 0xa7,
+	0x87, 0x1f, 0x46, 0x43, 0xa3, 0x45, 0x9b, 0x85, 0x88, 0x2e, 0x41, 0x2b, 0x09, 0xce, 0xb0, 0x6f,
+	0xb4, 0xa9, 0x9e, 0x09, 0x68, 0x0b, 0xe6, 0x82, 0x10, 0x47, 0xb4, 0x73, 0x77, 0xdf, 0x98, 0xa1,
+	0x6d, 0xaa, 0x0a, 0x99, 0x30, 0x7b, 0x3f, 0x7c, 0x18, 0xe3, 0xa8, 0xbb, 0x6f, 0xcc, 0xd2, 0x66,
+	0x29, 0xa3, 0x65, 0x68, 0x1e, 0x3c, 0x4f, 0x8c, 0x0e, 0x55, 0x93, 0x4f, 0xeb, 0x7d, 0x40, 0x45,
+	0x1c, 0x88, 0xdd, 0xc4, 0x73, 0x29, 0xee, 0x1d, 0x9b, 0x7c, 0x12, 0x3f, 0x63, 0x9c, 0xd8, 0xc1,
+	0x90, 0x61, 0xd1, 0xb2, 0x85, 0x68, 0x7d, 0x0c, 0x4b, 0x19, 0xd0, 0xa7, 0xd9, 0x3a, 0xd2, 0x83,
+	0x62, 0xdb, 0xdd, 0xe7, 0x48, 0x0a, 0xd1, 0xfa, 0x5a, 0x83, 0xe5, 0x23, 0x9c, 0xd0, 0xc1, 0x63,
+	0xba, 0x49, 0x78, 0x4c, 0x50, 0xe0, 0xed, 0x72, 0x5f, 0x3b, 0xb6, 0xaa, 0x4a, 0xd1, 0x6b, 0xd4,
+	0xa0, 0xd7, 0xac, 0x47, 0x4f, 0xcf, 0xa2, 0x67, 0x9d, 0xc1, 0x4a, 0xce, 0x93, 0xa9, 0xd6, 0x7a,
+	0x0d, 0x74, 0xd7, 0x49, 0x1c, 0xa3, 0x49, 0xa3, 0x71, 0x59, 0x8d, 0x46, 0x3a, 0x2a, 0x6d, 0xb5,
+	0xfe, 0xd4, 0x60, 0xe9, 0x84, 0xcf, 0x26, 0x96, 0xad, 0xa0, 0xa4, 0x65, 0x50, 0x3a, 0x3f, 0x58,
+	0x33, 0x81, 0xd8, 0x2c, 0x09, 0xc4, 0x7c, 0x40, 0xeb, 0x25, 0x01, 0xfd, 0x5a, 0x83, 0xd5, 0x7a,
+	0x04, 0xa6, 0x80, 0xfb, 0x56, 0x18, 0x0e, 0xb9, 0xa3, 0x64, 0x77, 0x09, 0x16, 0x6a, 0x4f, 0x2d,
+	0x17, 0xe6, 0x5b, 0x30, 0x77, 0x5f, 0x99, 0x97, 0xe1, 0xa1, 0xaa, 0xac, 0xef, 0x75, 0xb8, 0x5a,
+	0x31, 0xf8, 0xe3, 0x7d, 0x27, 0x71, 0x1e, 0x93, 0x91, 0xd0, 0x22, 0x34, 0xe4, 0xe8, 0x8d, 0xee,
+	0x3e, 0x59, 0xff, 0x11, 0xc7, 0x9f, 0x8d, 0x29, 0x44, 0xb4, 0x09, 0x70, 0x18, 0x05, 0x23, 0xee,
+	0x0f, 0xc3, 0x57, 0xd1, 0x10, 0x6f, 0x4f, 0x83, 0x6c, 0x58, 0x09, 0x19, 0x21, 0xd0, 0x0f, 0x87,
+	0xce, 0x80, 0x42, 0xda, 0xb2, 0xe9, 0x37, 0x19, 0xcf, 0xc6, 0xe3, 0x09, 0x8e, 0x13, 0x12, 0x3f,
+	0x0c, 0x54, 0x45, 0x43, 0xda, 0xef, 0x38, 0xbe, 0x3b, 0xc4, 0x2e, 0x69, 0x67, 0xc0, 0x2a, 0x1a,
+	0xe2, 0xe9, 0x2d, 0xd7, 0x3d, 0xf5, 0x46, 0x98, 0xc2, 0xda, 0xb4, 0x85, 0x88, 0xde, 0x80, 0x65,
+	0xe1, 0xd7, 0xb1, 0xd7, 0x3b, 0xf3, 0x49, 0xc0, 0x30, 0x3e, 0x28, 0xe8, 0xd1, 0xff, 0x61, 0x91,
+	0x79, 0x29, 0x2d, 0x81, 0x5a, 0xe6, 0xb4, 0x68, 0x1b, 0x96, 0x44, 0xdf, 0x43, 0x1e, 0x1f, 0x73,
+	0xd4, 0x30, 0xaf, 0x46, 0xd7, 0x60, 0x81, 0xf5, 0x15, 0x76, 0xf3, 0xd4, 0x2e, 0xab, 0x24, 0xfb,
+	0xc7, 0xd7, 0x42, 0xb4, 0xc6, 0x02, 0xdb, 0x3f, 0x45, 0x45, 0x30, 0x3b, 0x7d, 0x11, 0x62, 0x63,
+	0x91, 0x61, 0x46, 0xbe, 0x49, 0x04, 0x33, 0x93, 0x93, 0xc4, 0x49, 0x26, 0xb1, 0xb1, 0x44, 0xdb,
+	0x32, 0xba, 0xd4, 0xc6, 0xc6, 0xf1, 0x64, 0x98, 0x18, 0xcb, 0xaa, 0x0d, 0xd3, 0x59, 0x63, 0xb8,
+	0x52, 0x11, 0x1a, 0x24, 0x32, 0x48, 0xa8, 0xef, 0x05, 0x13, 0x3f, 0xe1, 0xe9, 0xce, 0x04, 0x74,
+	0x13, 0x74, 0xea, 0x6b, 0x83, 0x26, 0xf5, 0xb6, 0x48, 0xea, 0xf3, 0x42, 0xcc, 0xa6, 0xbd, 0xac,
+	0x57, 0x5a, 0xe5, 0x9c, 0x53, 0x92, 0xcc, 0xdb, 0xa0, 0xef, 0x33, 0x92, 0xd1, 0xb6, 0xe7, 0x76,
+	0xad, 0x7a, 0x7f, 0x88, 0xa5, 0x4d, 0xed, 0xad, 0x9f, 0x35, 0x58, 0x3b, 0x8d, 0x1c, 0x3f, 0xee,
+	0xe3, 0x88, 0x9a, 0xde, 0x7f, 0xe6, 0xe3, 0x88, 0x93, 0xcf, 0x51, 0x96, 0x7c, 0x44, 0xf0, 0x93,
+	0x54, 0x1c, 0xba, 0xd4, 0x90, 0x7b, 0x21, 0x65, 0xd2, 0x76, 0x8c, 0x9f, 0xb1, 0x36, 0x96, 0x16,
+	0x52, 0xce, 0xa7, 0xa9, 0x5e, 0x48, 0xd3, 0x4c, 0x92, 0xb7, 0x72, 0xf4, 0x70, 0x17, 0xd6, 0xcb,
+	0x1c, 0x9d, 0xaa, 0x72, 0xf8, 0x4e, 0x83, 0xf9, 0xbb, 0x81, 0xe7, 0xcb, 0xba, 0xa1, 0x9a, 0x69,
+	0x0d, 0x98, 0x19, 0xe1, 0x38, 0x76, 0x06, 0x82, 0x67, 0x85, 0x98, 0x72, 0x60, 0x33, 0xc7, 0x81,
+	0x7f, 0x63, 0x91, 0xdf, 0xe8, 0x70, 0x25, 0xbf, 0x63, 0x64, 0x8d, 0x81, 0x1f, 0x63, 0x7e, 0x10,
+	0xaa, 0xa3, 0x6b, 0xf5, 0xa3, 0x37, 0x72, 0x3c, 0xa9, 0x6c, 0x69, 0xb3, 0x8e, 0xcf, 0xf4, 0x02,
+	0x9f, 0xe5, 0x58, 0x84, 0x1e, 0x3b, 0xad, 0x22, 0x8b, 0x1c, 0x57, 0xb0, 0x43, 0xbb, 0x9c, 0x1d,
+	0x54, 0x96, 0x9c, 0xc9, 0xb1, 0x64, 0x86, 0x8b, 0xe8, 0x7c, 0xb3, 0x79, 0x2e, 0xa2, 0xb3, 0x15,
+	0x18, 0xa6, 0x53, 0xc6, 0x30, 0x0a, 0x3f, 0x42, 0x96, 0x1f, 0xb3, 0xcc, 0x3b, 0x77, 0x0e, 0xf3,
+	0xce, 0x17, 0x98, 0x57, 0x30, 0xd3, 0x42, 0x0d, 0x33, 0x2d, 0x5e, 0x80, 0x99, 0x96, 0x4a, 0x98,
+	0xe9, 0x23, 0xd8, 0xa8, 0x0e, 0x86, 0xa9, 0x02, 0xff, 0x47, 0x0d, 0x8c, 0x13, 0x9c, 0xd0, 0xdc,
+	0xa1, 0x43, 0x0b, 0x1c, 0xeb, 0x93, 0xc0, 0x84, 0x59, 0x5f, 0x6c, 0x03, 0x0f, 0x2a, 0x21, 0xe7,
+	0x43, 0xb2, 0x59, 0x0c, 0x49, 0x99, 0x28, 0xba, 0x9a, 0x28, 0x75, 0x69, 0xf0, 0x39, 0xcc, 0x3f,
+	0x98, 0x78, 0xc9, 0x05, 0xd2, 0x33, 0x57, 0x72, 0x34, 0x8a, 0x25, 0x47, 0x79, 0x9a, 0xd6, 0xd5,
+	0x7d, 0x2f, 0x1b, 0x60, 0xe4, 0x71, 0xa7, 0x4d, 0xa4, 0x54, 0xae, 0x76, 0x85, 0x17, 0xd1, 0x8d,
+	0xb4, 0x88, 0x46, 0xa0, 0xd3, 0x53, 0x94, 0xcd, 0x4c, 0xbf, 0x89, 0xce, 0xeb, 0xc9, 0x7a, 0x8b,
+	0x7e, 0x93, 0xdd, 0x8a, 0xf0, 0x98, 0xec, 0x16, 0x03, 0x82, 0x4b, 0x24, 0x93, 0x9c, 0xd4, 0x05,
+	0x1a, 0xbd, 0x6d, 0x1a, 0xbd, 0x79, 0x35, 0x19, 0xb5, 0x4f, 0x6a, 0x8a, 0x19, 0x16, 0x85, 0x7d,
+	0x5e, 0x53, 0x30, 0x1c, 0x82, 0xb4, 0xda, 0x52, 0x34, 0xa4, 0xfd, 0xd3, 0x34, 0xb2, 0x59, 0xda,
+	0x28, 0x1a, 0xeb, 0x5b, 0x0d, 0x56, 0x29, 0x0c, 0xec, 0xa2, 0x70, 0x38, 0x19, 0x0e, 0x29, 0x02,
+	0xeb, 0xd0, 0x9e, 0x10, 0x34, 0xc4, 0x7d, 0x81, 0x4b, 0xc4, 0x87, 0x28, 0xbd, 0x2f, 0xd0, 0x6f,
+	0x02, 0xf3, 0xd3, 0xc0, 0x63, 0xae, 0x13, 0x14, 0x74, 0x5b, 0xca, 0x99, 0xa0, 0xd2, 0x73, 0x41,
+	0x55, 0x59, 0x79, 0x5a, 0xbf, 0x6b, 0xb0, 0x26, 0x8e, 0xb5, 0x7b, 0xf2, 0xf6, 0x56, 0x1f, 0x24,
+	0xd3, 0x5e, 0x0e, 0xd6, 0xa1, 0xdd, 0xf7, 0x86, 0x09, 0x8e, 0xa8, 0x7f, 0x2d, 0x9b, 0x4b, 0x64,
+	0x26, 0x1f, 0x3f, 0x4f, 0x4e, 0xf0, 0x98, 0x17, 0x71, 0x42, 0xcc, 0x84, 0x55, 0x3b, 0x17, 0x56,
+	0x3f, 0x68, 0xb0, 0x5e, 0xe6, 0xf9, 0x54, 0xe7, 0xfd, 0x3b, 0x99, 0x8b, 0x2e, 0xbb, 0x5a, 0x98,
+	0xea, 0xd5, 0x22, 0xbb, 0x69, 0x99, 0x9b, 0xae, 0xe2, 0xbe, 0x9e, 0x71, 0xdf, 0xfa, 0xa9, 0xe0,
+	0x62, 0x7c, 0xfe, 0x5d, 0x64, 0x33, 0xe3, 0x4a, 0x83, 0xde, 0xcd, 0xd4, 0xe9, 0x2a, 0xcf, 0xc9,
+	0xa0, 0x78, 0x4e, 0x06, 0x17, 0x3c, 0x27, 0x5f, 0x69, 0x70, 0xb9, 0xd4, 0xd1, 0xd7, 0x0d, 0xa6,
+	0xf5, 0x87, 0x06, 0xe8, 0x03, 0xaf, 0x77, 0xa6, 0xd8, 0xd5, 0xc3, 0x75, 0x13, 0xe6, 0x26, 0x9e,
+	0x4b, 0xfa, 0x92, 0xb1, 0x78, 0x01, 0x59, 0x37, 0x9b, 0x6a, 0xce, 0xa8, 0xc2, 0x89, 0xe5, 0xa5,
+	0x8e, 0x4b, 0x15, 0x1c, 0x9b, 0x03, 0xb9, 0x55, 0x0f, 0x72, 0x3e, 0x60, 0xdf, 0x82, 0x4e, 0xd7,
+	0xdd, 0x65, 0x67, 0x11, 0x65, 0xb7, 0x6e, 0xfa, 0x44, 0xd0, 0x75, 0x99, 0x2b, 0xf4, 0xec, 0x62,
+	0x19, 0xcf, 0x25, 0xeb, 0x19, 0xac, 0x16, 0x00, 0x99, 0x6a, 0x5b, 0x76, 0xa0, 0xe3, 0xb9, 0xbb,
+	0x7c, 0x8e, 0xec, 0xed, 0x59, 0xfa, 0x65, 0xa7, 0x26, 0xd6, 0x19, 0xac, 0x0d, 0x70, 0x42, 0xea,
+	0x3a, 0xec, 0xd2, 0xd9, 0x05, 0x33, 0x48, 0x70, 0xb4, 0x1a, 0x70, 0x1a, 0xf5, 0xe0, 0x34, 0x73,
+	0xe0, 0x7c, 0xd9, 0x80, 0x8e, 0xbc, 0xac, 0xa7, 0xdb, 0xed, 0x66, 0xb7, 0xdb, 0xfd, 0xd7, 0x6f,
+	0xea, 0x9b, 0x00, 0x3d, 0xfa, 0x5c, 0x23, 0x8f, 0x0f, 0xdd, 0x56, 0x34, 0xa4, 0x67, 0x40, 0xaa,
+	0x81, 0xae, 0xcb, 0x4b, 0x30, 0x21, 0x12, 0x7c, 0x58, 0x9c, 0xb3, 0xeb, 0x0f, 0x39, 0x40, 0x16,
+	0x6c, 0x55, 0x65, 0x7d, 0x01, 0xeb, 0x65, 0x80, 0xd7, 0x6e, 0xb6, 0x09, 0xb3, 0x07, 0x51, 0x14,
+	0x28, 0xdb, 0x2d, 0x65, 0xb2, 0xe1, 0x72, 0x98, 0xca, 0xe7, 0x92, 0xd4, 0xc4, 0xfa, 0x4d, 0x83,
+	0x4b, 0x9e, 0xff, 0x99, 0x97, 0x60, 0xb2, 0x29, 0xa7, 0x81, 0xac, 0x17, 0xa6, 0xdd, 0xf0, 0xca,
+	0x67, 0x29, 0x25, 0xef, 0xf4, 0x4c, 0xde, 0x19, 0x30, 0xc3, 0xd3, 0xd3, 0x68, 0x51, 0xe6, 0x13,
+	0x62, 0x6d, 0x66, 0xbd, 0x80, 0xb5, 0x12, 0xbf, 0xa7, 0x4d, 0x12, 0x99, 0x0c, 0xd5, 0x49, 0x22,
+	0x3f, 0xad, 0x97, 0x1a, 0x5c, 0x92, 0xd7, 0xc2, 0xe1, 0xf0, 0x22, 0x8c, 0xf5, 0x4f, 0xbc, 0xad,
+	0x7d, 0xa5, 0x1c, 0xe3, 0x8a, 0x1b, 0xaf, 0x9b, 0xbe, 0x77, 0x7f, 0x99, 0x05, 0xf6, 0x1a, 0x4d,
+	0x78, 0xb9, 0x97, 0xbe, 0x6b, 0xa2, 0x35, 0x3e, 0x40, 0xf6, 0x81, 0xd9, 0x5c, 0x2f, 0x53, 0xc7,
+	0x21, 0xba, 0x0e, 0x9d, 0xa7, 0xe2, 0x42, 0x89, 0x56, 0xb9, 0x91, 0x7a, 0xc5, 0x34, 0x57, 0x44,
+	0xcf, 0xf4, 0xc9, 0xfb, 0x3a, 0x74, 0xc6, 0xa2, 0xcc, 0x95, 0x9d, 0xd4, 0xc2, 0xb7, 0xac, 0xd3,
+	0x6d, 0x58, 0x18, 0xa8, 0xaf, 0x92, 0xe8, 0x72, 0xee, 0xb2, 0x2f, 0x8e, 0x6c, 0xd3, 0x28, 0x6f,
+	0x88, 0x43, 0x74, 0x03, 0xe6, 0x63, 0xe5, 0xad, 0x11, 0x89, 0x55, 0xe5, 0x1e, 0x20, 0xcb, 0xa6,
+	0xff, 0x04, 0x2e, 0x0f, 0xca, 0x5f, 0x15, 0xd0, 0xd5, 0xfa, 0x57, 0x07, 0x32, 0xa0, 0x75, 0x9e,
+	0x49, 0x1c, 0xa2, 0x07, 0x80, 0x92, 0xc2, 0x45, 0x1f, 0x6d, 0xf0, 0x9e, 0xa5, 0x8f, 0x15, 0xe6,
+	0x7f, 0x6b, 0x5a, 0xe3, 0x10, 0xf5, 0xc0, 0x18, 0x54, 0x5c, 0xa4, 0x90, 0x95, 0xf9, 0x7b, 0xa0,
+	0xf4, 0xda, 0x6d, 0xfe, 0xef, 0x5c, 0x1b, 0xe6, 0xf7, 0xa0, 0x50, 0xde, 0x49, 0xbf, 0x4b, 0x6b,
+	0x56, 0xe9, 0x77, 0x45, 0x5d, 0x78, 0x0a, 0xab, 0x83, 0x62, 0x95, 0x83, 0xca, 0x7b, 0xc9, 0x7d,
+	0xdf, 0xac, 0x6b, 0x8e, 0x43, 0x74, 0x07, 0x96, 0xce, 0xb2, 0x07, 0x34, 0x12, 0xff, 0x91, 0x14,
+	0x2b, 0x19, 0xd3, 0xac, 0x6a, 0x92, 0x4b, 0xce, 0x1d, 0x00, 0x72, 0xc9, 0xa5, 0x87, 0xb1, 0x5c,
+	0x72, 0xc5, 0xc9, 0x71, 0x0c, 0x2b, 0x05, 0x6a, 0x44, 0x57, 0x78, 0x9f, 0x32, 0xb2, 0x37, 0x37,
+	0xaa, 0x1b, 0xd9, 0x78, 0x83, 0x3c, 0xcf, 0xc8, 0xf1, 0xca, 0x88, 0xd0, 0xdc, 0xa8, 0x6e, 0x8c,
+	0xc3, 0xdb, 0x4b, 0x8f, 0x16, 0x76, 0xd8, 0x9f, 0x59, 0xef, 0xd2, 0xdf, 0x27, 0x6d, 0xfa, 0x9f,
+	0xd6, 0xf5, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xdb, 0x12, 0xfa, 0x38, 0xe8, 0x1a, 0x00, 0x00,
 }
diff --git a/pkg/proto/group/group.proto b/pkg/proto/group/group.proto
index 4859fc359..5b3deb002 100644
--- a/pkg/proto/group/group.proto
+++ b/pkg/proto/group/group.proto
@@ -3,8 +3,8 @@ option go_package = "./group;group";
 package group;
 
 message CommonResp{
-  int32   ErrorCode = 1;
-  string  ErrorMsg = 2;
+  int32   ErrCode = 1;
+  string  ErrMsg = 2;
 }
 
 message CreateGroupReq{
@@ -15,7 +15,8 @@ message CreateGroupReq{
   string faceUrl = 5;
   string token = 6;
   string operationID = 7;
-  string CreatorUserID = 8;
+  string OpUserID = 8;
+  string Ext = 9;
 }
 
 
@@ -23,9 +24,10 @@ message GroupAddMemberInfo{
   string uid = 1;
   int32 setRole = 2;
 }
+
 message CreateGroupResp{
-  int32   ErrorCode = 1;
-  string  ErrorMsg = 2;
+  int32   ErrCode = 1;
+  string  ErrMsg = 2;
   string  groupID = 3;
 }
 
@@ -33,11 +35,12 @@ message GetGroupsInfoReq{
   repeated string groupIDList = 1;
   string token = 2;
   string operationID = 3;
-  string UserID = 4;
+  string OpUserID = 4;
 }
+
 message GetGroupsInfoResp{
-  int32   ErrorCode = 1;
-  string  ErrorMsg = 2;
+  int32   ErrCode = 1;
+  string  ErrMsg = 2;
   repeated GroupInfo data = 3;
 }
 
@@ -49,11 +52,12 @@ message SetGroupInfoReq{
   string faceUrl = 5;
   string token = 6;
   string operationID = 7;
+  string OpUserID = 8;
 }
 
 
 message GetGroupApplicationListReq {
-  string UID = 1;
+  string OpUserID = 1;
   string OperationID = 2;
 }
 
@@ -92,6 +96,7 @@ message TransferGroupOwnerReq {
   string OldOwner = 2;
   string NewOwner = 3;
   string OperationID = 4;
+  string OpUserID = 5;
 }
 
 message TransferGroupOwnerResp{
@@ -104,6 +109,7 @@ message JoinGroupReq{
   string message = 2;
   string token = 3;
   string OperationID = 4;
+  string OpUserID = 5;
 }
 
 message GroupApplicationResponseReq{
@@ -135,6 +141,7 @@ message SetOwnerGroupNickNameReq{
   string nickName = 2;
   string OperationID = 3;
   string token = 4;
+  string OpUserID = 5;
 }
 
 
@@ -142,6 +149,7 @@ message QuitGroupReq{
   string groupID = 1;
   string operationID = 2;
   string token = 3;
+  string OpUserID = 4;
 }
 
 
@@ -171,11 +179,12 @@ message GetGroupMemberListReq {
   string operationID = 3;
   int32 filter = 4;
   int32 nextSeq = 5;
+  string OpUserID = 6;
 }
 
 message GetGroupMemberListResp {
-  int32   errorCode = 1;
-  string  errorMsg = 2;
+  int32   ErrCode = 1;
+  string  ErrMsg = 2;
   repeated GroupMemberFullInfo memberList = 3;
   int32 nextSeq = 4;
 }
@@ -187,11 +196,12 @@ message GetGroupMembersInfoReq {
   repeated string memberList = 2;
   string token = 3;
   string operationID = 4;
+  string OpUserID = 5;
 }
 
 message GetGroupMembersInfoResp {
-  int32   errorCode = 1;
-  string  errorMsg = 2;
+  int32   ErrCode = 1;
+  string  ErrMsg = 2;
   repeated GroupMemberFullInfo memberList = 3;
 
 }
@@ -202,6 +212,7 @@ message KickGroupMemberReq {
   string reason = 3;
   string token = 4;
   string operationID = 5;
+  string OpUserID = 6;
 }
 
 message Id2Result {
@@ -210,8 +221,8 @@ message Id2Result {
 }
 
 message KickGroupMemberResp {
-  int32   errorCode = 1;
-  string  errorMsg = 2;
+  int32   ErrCode = 1;
+  string  ErrMsg = 2;
   repeated Id2Result id2result = 3;
 }
 
@@ -219,6 +230,7 @@ message KickGroupMemberResp {
 message getJoinedGroupListReq {
   string token = 1;
   string operationID = 2;
+  string OpUserID = 3;
 }
 
 message GroupInfo {
@@ -233,9 +245,9 @@ message GroupInfo {
 }
 
 message getJoinedGroupListResp{
-  int32   errorCode = 1;
-  string  errorMsg = 2;
-  repeated  GroupInfo groupList = 3;
+  int32   ErrCode = 1;
+  string  ErrorMsg = 2;
+  repeated  GroupInfo GroupList = 3;
 }
 
 
@@ -245,23 +257,25 @@ message inviteUserToGroupReq {
   string groupID = 3;
   string reason = 4;
   repeated string uidList = 5;
+  string OpUserID = 6;
 }
 
 message inviteUserToGroupResp {
-  int32   errorCode = 1;
-  string  errorMsg = 2;
-  repeated  Id2Result id2result = 3; // 0 ok, -1 error
+  int32   ErrCode = 1;
+  string  ErrMsg = 2;
+  repeated  Id2Result Id2Result = 3; // 0 ok, -1 error
 }
 
 message GetGroupAllMemberReq {
   string groupID = 1;
   string token = 2;
   string operationID = 3;
+  string OpUserID = 4;
 }
 
 message GetGroupAllMemberResp {
-  int32   errorCode = 1;
-  string  errorMsg = 2;
+  int32   ErrCode = 1;
+  string  ErrMsg = 2;
   repeated GroupMemberFullInfo memberList = 3;
 }