From e64bc40ca9932834aa33cf1eb199fa86e0fb8df5 Mon Sep 17 00:00:00 2001
From: wenxu12345 <44203734@qq.com>
Date: Fri, 24 Dec 2021 15:02:47 +0800
Subject: [PATCH] notification

---
 internal/rpc/friend/firend.go                 |  23 +-
 internal/rpc/group/group.go                   | 106 ++-
 internal/rpc/msg/send_msg.go                  | 487 +++++++++++--
 internal/rpc/user/get_user_info.go            |   9 +-
 internal/rpc/user/update_user_info.go         |   5 +-
 pkg/common/constant/constant.go               |  48 +-
 pkg/common/db/mysql.go                        |  12 -
 .../mysql_model/im_mysql_model/group_model.go |   2 +-
 pkg/proto/group/group.pb.go                   | 304 ++++----
 pkg/proto/sdk_ws/ws.pb.go                     | 686 ++++++++----------
 pkg/proto/sdk_ws/ws.proto                     |  62 +-
 11 files changed, 970 insertions(+), 774 deletions(-)

diff --git a/internal/rpc/friend/firend.go b/internal/rpc/friend/firend.go
index 52f422083..7acd4f37a 100644
--- a/internal/rpc/friend/firend.go
+++ b/internal/rpc/friend/firend.go
@@ -1,7 +1,7 @@
 package friend
 
 import (
-	"Open_IM/internal/rpc/chat"
+	chat "Open_IM/internal/rpc/msg"
 	"Open_IM/pkg/common/config"
 	"Open_IM/pkg/common/constant"
 	imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
@@ -124,7 +124,7 @@ func (s *friendServer) AddBlacklist(ctx context.Context, req *pbFriend.AddBlackl
 		return &pbFriend.CommonResp{ErrCode: constant.ErrMysql.ErrCode, ErrMsg: constant.ErrMysql.ErrMsg}, nil
 	}
 	log.NewInfo(req.CommID.OperationID, "InsertInToUserBlackList ok ", req.CommID.FromUserID, req.CommID.ToUserID)
-	chat.BlackAddedNotification(req.CommID.OperationID, req.CommID.OpUserID, req.CommID.FromUserID, req.CommID.ToUserID)
+	chat.BlackAddedNotification(req)
 	return &pbFriend.CommonResp{}, nil
 
 }
@@ -148,7 +148,7 @@ func (s *friendServer) AddFriend(ctx context.Context, req *pbFriend.AddFriendReq
 		return &pbFriend.CommonResp{ErrCode: constant.ErrAddFriend.ErrCode, ErrMsg: constant.ErrAddFriend.ErrMsg}, nil
 	}
 
-	chat.FriendApplicationAddedNotification(req.CommID.OperationID, req.CommID.OpUserID, req.CommID.FromUserID, req.CommID.ToUserID, req.ReqMessage)
+	chat.FriendApplicationAddedNotification(req)
 	return &pbFriend.CommonResp{}, nil
 }
 
@@ -195,7 +195,10 @@ func (s *friendServer) ImportFriend(ctx context.Context, req *pbFriend.ImportFri
 					c.ErrCode = 408
 					continue
 				}
-				chat.FriendAddedNotification(req.OperationID, req.OpUserID, req.FromUserID, v)
+				for _, v := range req.FriendUserIDList {
+					chat.FriendAddedNotification(req.OperationID, req.OpUserID, req.FromUserID, v)
+				}
+
 			}
 		}
 	}
@@ -204,10 +207,11 @@ func (s *friendServer) ImportFriend(ctx context.Context, req *pbFriend.ImportFri
 	return &resp, nil
 }
 
+//process Friend application
 func (s *friendServer) AddFriendResponse(ctx context.Context, req *pbFriend.AddFriendResponseReq) (*pbFriend.CommonResp, error) {
 	log.NewInfo(req.CommID.OperationID, "AddFriendResponse args ", req.String())
 
-	if !token_verify.CheckAccess(rreq.CommID.FromUserID, req.CommID.ToUserID) {
+	if !token_verify.CheckAccess(req.CommID.FromUserID, req.CommID.ToUserID) {
 		log.NewError(req.CommID.OperationID, "CheckAccess failed ", req.CommID.FromUserID, req.CommID.ToUserID)
 		return &pbFriend.CommonResp{ErrCode: constant.ErrAgreeToAddFriend.ErrCode, ErrMsg: constant.ErrAgreeToAddFriend.ErrMsg}, nil
 	}
@@ -253,7 +257,8 @@ func (s *friendServer) AddFriendResponse(ctx context.Context, req *pbFriend.AddF
 		}
 	}
 
-	chat.FriendApplicationProcessedNotification(req.CommID.OperationID, req.CommID.OpUserID, req.CommID.FromUserID, req.CommID.ToUserID, req.Flag)
+	chat.FriendApplicationProcessedNotification(req)
+	chat.FriendAddedNotification(req.CommID.OperationID, req.CommID.OpUserID, req.CommID.FromUserID, req.CommID.ToUserID)
 	return &pbFriend.CommonResp{}, nil
 }
 
@@ -271,7 +276,7 @@ func (s *friendServer) DeleteFriend(ctx context.Context, req *pbFriend.DeleteFri
 		return &pbFriend.CommonResp{ErrCode: constant.ErrMysql.ErrCode, ErrMsg: constant.ErrMysql.ErrMsg}, nil
 	}
 	log.NewInfo(req.CommID.OperationID, "DeleteFriend rpc ok")
-	chat.FriendDeletedNotification(req.CommID.OperationID, req.CommID.OpUserID, req.CommID.FromUserID, req.CommID.ToUserID)
+	chat.FriendDeletedNotification(req)
 	return &pbFriend.CommonResp{}, nil
 }
 
@@ -322,7 +327,7 @@ func (s *friendServer) SetFriendComment(ctx context.Context, req *pbFriend.SetFr
 		return &pbFriend.CommonResp{ErrCode: constant.ErrSetFriendComment.ErrCode, ErrMsg: constant.ErrSetFriendComment.ErrMsg}, nil
 	}
 	log.NewInfo(req.CommID.OperationID, "rpc SetFriendComment ok")
-	chat.FriendInfoChangedNotification(req.CommID.OperationID, req.CommID.OpUserID, req.CommID.FromUserID, req.CommID.ToUserID)
+	chat.FriendInfoChangedNotification(req)
 	return &pbFriend.CommonResp{}, nil
 }
 
@@ -339,7 +344,7 @@ func (s *friendServer) RemoveBlacklist(ctx context.Context, req *pbFriend.Remove
 		return &pbFriend.CommonResp{ErrCode: constant.ErrMysql.ErrCode, ErrMsg: constant.ErrMysql.ErrMsg}, nil
 	}
 	log.NewInfo(req.CommID.OperationID, "rpc RemoveBlacklist ok")
-	chat.BlackDeletedNotification(req.CommID.OperationID, req.CommID.OpUserID, req.CommID.FromUserID, req.CommID.ToUserID)
+	chat.BlackDeletedNotification(req)
 	return &pbFriend.CommonResp{}, nil
 }
 
diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go
index 6ac49ac72..1b3956c37 100644
--- a/internal/rpc/group/group.go
+++ b/internal/rpc/group/group.go
@@ -11,11 +11,9 @@ import (
 	"Open_IM/pkg/common/token_verify"
 	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 	pbGroup "Open_IM/pkg/proto/group"
-	"Open_IM/pkg/proto/sdk_ws"
+	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 	"Open_IM/pkg/utils"
 	"context"
-	"encoding/json"
-	"fmt"
 	"google.golang.org/grpc"
 	"net"
 	"strconv"
@@ -39,6 +37,7 @@ func NewGroupServer(port int) *groupServer {
 		etcdAddr:        config.Config.Etcd.EtcdAddr,
 	}
 }
+
 func (s *groupServer) Run() {
 	log.Info("", "", "rpc group init....")
 
@@ -78,6 +77,7 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
 	}
 	//Time stamp + MD5 to generate group chat id
 	groupId := utils.Md5(strconv.FormatInt(time.Now().UnixNano(), 10))
+	//to group
 	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(), groupId, req.GroupName, req.Introduction, req.Notification, req.FaceUrl, req.Ext)
@@ -90,7 +90,7 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
 		return &pbGroup.CreateGroupResp{ErrCode: constant.ErrCreateGroup.ErrCode, ErrMsg: constant.ErrCreateGroup.ErrMsg}, nil
 	}
 
-	//Add the group owner to the group first, otherwise the group creation will fail
+	//to group member
 	err = im_mysql_model.InsertIntoGroupMember(groupId, us.UserID, us.Nickname, us.FaceUrl, constant.GroupOwner)
 	if err != nil {
 		log.NewError(req.OperationID, "InsertIntoGroupMember failed ", err.Error())
@@ -103,7 +103,7 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
 		//	return &pbGroup.CreateGroupResp{ErrCode: constant.ErrCreateGroup.ErrCode, ErrMsg: constant.ErrCreateGroup.ErrMsg}, nil
 	}
 
-	//Binding group id and member id
+	//to group member
 	for _, user := range req.InitMemberList {
 		us, err := im_mysql_model.FindUserByUID(user.UserID)
 		if err != nil {
@@ -123,8 +123,8 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
 			log.NewError(req.OperationID, "add mongo group member failed, db.DB.AddGroupMember failed ", err.Error())
 		}
 	}
-	resp := &pbGroup.CreateGroupResp{}
 
+	resp := &pbGroup.CreateGroupResp{}
 	group, err := im_mysql_model.FindGroupInfoByGroupId(groupId)
 	if err != nil {
 		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed ", err.Error(), groupId)
@@ -145,6 +145,7 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
 		return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrParseToken.ErrCode, ErrMsg: constant.ErrParseToken.ErrMsg}, nil
 	}
 
+	//group list
 	joinedGroupList, err := imdb.GetJoinedGroupIdListByMemberId(req.FromUserID)
 	if err != nil {
 		log.NewError(req.OperationID, "GetJoinedGroupIdListByMemberId failed ", err.Error(), req.FromUserID)
@@ -152,7 +153,6 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
 	}
 
 	var resp pbGroup.GetJoinedGroupListResp
-
 	for _, v := range joinedGroupList {
 		var groupNode open_im_sdk.GroupInfo
 		num := imdb.GetGroupMemberNumByGroupId(v.GroupID)
@@ -160,6 +160,7 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
 		group, err := imdb.FindGroupInfoByGroupId(v.GroupID)
 		if num > 0 && owner != nil && err2 == nil && group != nil && err == nil {
 			utils.CopyStructFields(&groupNode, group)
+			groupNode.CreateTime = group.CreateTime
 			utils.CopyStructFields(groupNode.Owner, owner)
 			groupNode.MemberCount = uint32(num)
 			resp.GroupList = append(resp.GroupList, &groupNode)
@@ -177,7 +178,7 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
 func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.InviteUserToGroupReq) (*pbGroup.InviteUserToGroupResp, error) {
 	log.NewInfo(req.OperationID, "InviteUserToGroup args ", req.String())
 
-	if !imdb.IsExistGroupMember(req.GroupID, req.OpUserID) && !utils.IsContain(req.OpUserID, config.Config.Manager.AppManagerUid) {
+	if !imdb.IsExistGroupMember(req.GroupID, req.OpUserID) && !token_verify.IsMangerUserID(req.OpUserID) {
 		log.NewError(req.OperationID, "no permission InviteUserToGroup ", req.GroupID, req.OpUserID)
 		return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
 	}
@@ -191,6 +192,7 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
 	//from User:  invite: applicant
 	//to user:  invite: invited
 	var resp pbGroup.InviteUserToGroupResp
+	var okUserIDList []string
 	for _, v := range req.InvitedUserIDList {
 		var resultNode pbGroup.Id2Result
 		resultNode.UserID = v
@@ -217,7 +219,7 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
 			resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
 			continue
 		}
-		chat.MemberInvitedNotification(req.OperationID, req.GroupID, req.OpUserID, v)
+		okUserIDList = append(okUserIDList, v)
 		err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UserID)
 		if err != nil {
 			log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), req.GroupID, toUserInfo.UserID)
@@ -225,8 +227,9 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
 		resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
 	}
 
+	chat.MemberInvitedNotification(req.OperationID, req.GroupID, req.OpUserID, req.Reason, okUserIDList)
 	resp.ErrCode = 0
-	log.NewInfo(req.OperationID, "InviteUserToGroup rpc return ", resp)
+	log.NewInfo(req.OperationID, "InviteUserToGroup rpc return ", resp.String())
 	return &resp, nil
 }
 
@@ -308,6 +311,7 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGrou
 		}
 	}
 
+	//op is app manager
 	if flag != 1 {
 		if token_verify.IsMangerUserID(req.OpUserID) {
 			flag = 1
@@ -332,6 +336,7 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGrou
 		}
 	}
 
+	var okUserIDList []string
 	//remove
 	var resp pbGroup.KickGroupMemberResp
 	for _, v := range req.KickedUserIDList {
@@ -347,19 +352,17 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGrou
 			resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
 		} else {
 			resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: 0})
+			okUserIDList = append(okUserIDList, v)
 		}
+
 		err = db.DB.DelGroupMember(req.GroupID, v)
 		if err != nil {
-			log.NewError(req.OperationID, "DelGroupMember failed ", err.Error(), req.GroupID, v.UserId)
+			log.NewError(req.OperationID, "DelGroupMember failed ", err.Error(), req.GroupID, v)
 		}
 	}
-
-	for _, v := range req.KickedUserIDList {
-		chat.MemberKickedNotification(req.OperationID, req.GroupID, req.OpUserID, v, req.Reason)
-	}
-
+	chat.MemberKickedNotification(req, okUserIDList)
 	resp.ErrCode = 0
-	log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp)
+	log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp.String())
 	return &resp, nil
 }
 
@@ -377,11 +380,12 @@ func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetG
 			continue
 		} else {
 			utils.CopyStructFields(&memberNode, memberInfo)
+			memberNode.JoinTime = memberInfo.JoinTime
 			resp.MemberList = append(resp.MemberList, &memberNode)
 		}
 	}
 	resp.ErrCode = 0
-	log.NewInfo(req.OperationID, "GetGroupMembersInfo rpc return ", resp)
+	log.NewInfo(req.OperationID, "GetGroupMembersInfo rpc return ", resp.String())
 	return &resp, nil
 }
 
@@ -407,6 +411,7 @@ func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsI
 		}
 		var groupInfo open_im_sdk.GroupInfo
 		utils.CopyStructFields(&groupInfo, groupInfoFromMysql)
+		groupInfo.CreateTime = groupInfoFromMysql.CreateTime
 		groupsInfoList = append(groupsInfoList, &groupInfo)
 	}
 
@@ -437,24 +442,24 @@ func (s *groupServer) GroupApplicationResponse(_ context.Context, req *pbGroup.G
 		}
 	}
 	if req.ToUserID == "0" {
-		group, err := imdb.FindGroupInfoByGroupId(req.GroupID)
-		if err != nil {
-			log.NewError(req.OperationID, "FindGroupInfoByGroupId failed ", req.GroupID)
-			return reply, nil
-		}
-		member, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, req.OpUserID)
-		if err != nil {
-			log.NewError(req.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", req.GroupID, req.OpUserID)
-			return reply, nil
-		}
-		chat.ApplicationProcessedNotification(req.OperationID, req.FromUserID, *group, *member, req.HandleResult, req.HandledMsg)
+		//group, err := imdb.FindGroupInfoByGroupId(req.GroupID)
+		//if err != nil {
+		//	log.NewError(req.OperationID, "FindGroupInfoByGroupId failed ", req.GroupID)
+		//	return reply, nil
+		//}
+		//member, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, req.OpUserID)
+		//if err != nil {
+		//	log.NewError(req.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", req.GroupID, req.OpUserID)
+		//	return reply, nil
+		//}
+		chat.ApplicationProcessedNotification(req)
 		if req.HandleResult == 1 {
-			entrantUser, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, req.FromUserID)
-			if err != nil {
-				log.NewError(req.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", err.Error(), req.GroupID, req.FromUserID)
-				return reply, nil
-			}
-			chat.MemberEnterNotification(req.OperationID, req.GroupID, entrantUser)
+			//	entrantUser, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, req.FromUserID)
+			//	if err != nil {
+			//		log.NewError(req.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", err.Error(), req.GroupID, req.FromUserID)
+			//	return reply, nil
+			//	}
+			chat.MemberEnterNotification(req)
 		}
 	} else {
 		log.NewError(req.OperationID, "args failed ", req.String())
@@ -466,25 +471,20 @@ func (s *groupServer) GroupApplicationResponse(_ context.Context, req *pbGroup.G
 
 func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (*pbGroup.CommonResp, error) {
 	log.NewInfo(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(req.FromUserID)
+
+	applicationUserInfo, err := im_mysql_model.FindUserByUID(req.OpUserID)
 	if err != nil {
-		log.NewError(req.OperationID, "FindUserByUID failed ", err.Error(), req.FromUserID)
+		log.NewError(req.OperationID, "FindUserByUID failed ", err.Error(), req.OpUserID)
 		return &pbGroup.CommonResp{ErrCode: constant.ErrSearchUserInfo.ErrCode, ErrMsg: constant.ErrSearchUserInfo.ErrMsg}, nil
 	}
 
-	_, err = im_mysql_model.FindGroupRequestUserInfoByGroupIDAndUid(req.GroupID, req.FromUserID)
+	_, err = im_mysql_model.FindGroupRequestUserInfoByGroupIDAndUid(req.GroupID, req.OpUserID)
 	if err == nil {
-		err = im_mysql_model.DelGroupRequest(req.GroupID, req.FromUserID, "0")
+		err = im_mysql_model.DelGroupRequest(req.GroupID, req.OpUserID, "0")
 	}
 
-	if err = im_mysql_model.InsertIntoGroupRequest(req.GroupID, req.FromUserID, "0", req.ReqMessage, applicationUserInfo.Nickname, applicationUserInfo.FaceUrl); err != nil {
-		log.NewError(req.OperationID, "InsertIntoGroupRequest ", err.Error(), req.GroupID, req.FromUserID, "0", req.ReqMessage, applicationUserInfo.Nickname, applicationUserInfo.FaceUrl)
+	if err = im_mysql_model.InsertIntoGroupRequest(req.GroupID, req.OpUserID, "0", req.ReqMessage, applicationUserInfo.Nickname, applicationUserInfo.FaceUrl); err != nil {
+		log.NewError(req.OperationID, "InsertIntoGroupRequest ", err.Error(), req.GroupID, req.OpUserID, "0", req.ReqMessage, applicationUserInfo.Nickname, applicationUserInfo.FaceUrl)
 		return &pbGroup.CommonResp{ErrCode: constant.ErrJoinGroupApplication.ErrCode, ErrMsg: constant.ErrJoinGroupApplication.ErrMsg}, nil
 	}
 
@@ -493,12 +493,8 @@ func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq)
 		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)
+
+	chat.ReceiveJoinApplicationNotification(req)
 
 	log.NewInfo(req.OperationID, "ReceiveJoinApplicationNotification rpc JoinGroup success return")
 	return &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}, nil
@@ -525,7 +521,7 @@ func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq)
 		//	return &pbGroup.CommonResp{ErrorCode: constant.ErrQuitGroup.ErrCode, ErrorMsg: constant.ErrQuitGroup.ErrMsg}, nil
 	}
 
-	chat.MemberLeaveNotification(req.OperationID, req.GroupID, req.OpUserID)
+	chat.MemberLeaveNotification(req)
 	log.NewInfo(req.OperationID, "rpc quit group is success return")
 	return &pbGroup.CommonResp{}, nil
 }
@@ -578,7 +574,7 @@ func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInf
 	}
 
 	if changedType != 0 {
-		chat.GroupInfoChangedNotification(req.OperationID, changedType, req.GroupInfo.GroupID, req.OpUserID)
+		chat.GroupInfoChangedNotification(req)
 	}
 
 	return &pbGroup.CommonResp{}, nil
diff --git a/internal/rpc/msg/send_msg.go b/internal/rpc/msg/send_msg.go
index 26e49bfa8..f6162f278 100644
--- a/internal/rpc/msg/send_msg.go
+++ b/internal/rpc/msg/send_msg.go
@@ -10,6 +10,7 @@ import (
 	"Open_IM/pkg/common/token_verify"
 	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 	pbChat "Open_IM/pkg/proto/chat"
+	pbFriend "Open_IM/pkg/proto/friend"
 	pbGroup "Open_IM/pkg/proto/group"
 	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 	sdk_ws "Open_IM/pkg/proto/sdk_ws"
@@ -308,51 +309,82 @@ func Notification(n *NotificationMsg, onlineUserOnly bool) {
 //  repeated GroupMemberFullInfo MemberList = 3;
 //  uint64 OperationTime = 4;
 //} creator->group
-func GroupCreatedNotification(req *pbGroup.CreateGroupReq, groupID string) {
-	var n NotificationMsg
-	n.SendID = req.OpUserID
-	n.RecvID = groupID
-	n.ContentType = constant.CreateGroupTip
-	n.SessionType = constant.GroupChatType
-	n.MsgFrom = constant.SysMsgType
-	n.OperationID = req.OperationID
 
-	var groupCreated open_im_sdk.GroupCreatedTips
-	groupCreated.Group = &open_im_sdk.GroupInfo{}
-
-	if token_verify.IsMangerUserID(req.OpUserID) {
-		u, err := imdb.FindUserByUID(req.OpUserID)
-		if err != nil || u == nil {
+func setOpUserInfo(operationID, opUserID, groupID string, groupMemberInfo *open_im_sdk.GroupMemberFullInfo) {
+	if token_verify.IsMangerUserID(opUserID) {
+		u, err := imdb.FindUserByUID(opUserID)
+		if err != nil {
+			log.NewError(operationID, "FindUserByUID failed ", err.Error(), opUserID)
 			return
 		}
-		utils.CopyStructFields(groupCreated.Creator, u)
-		groupCreated.Creator.AppMangerLevel = 1
+		utils.CopyStructFields(groupMemberInfo, u)
+		groupMemberInfo.AppMangerLevel = 1
 	} else {
-		u, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(groupID, req.OpUserID)
-		if err != nil || u == nil {
+		u, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(groupID, opUserID)
+		if err != nil {
+			log.NewError(operationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", err.Error(), groupID, opUserID)
 			return
 		}
-		utils.CopyStructFields(groupCreated.Creator, u)
+		utils.CopyStructFields(groupMemberInfo, u)
 	}
+}
 
+func setGroupInfo(operationID, groupID string, groupInfo *open_im_sdk.GroupInfo, ownerUserID string) {
 	group, err := imdb.FindGroupInfoByGroupId(groupID)
-	if err != nil || group == nil {
+	if err != nil {
+		log.NewError(operationID, "FindGroupInfoByGroupId failed ", err.Error(), groupID)
+		return
+	}
+	utils.CopyStructFields(groupInfo, group)
+
+	if ownerUserID != "" {
+		groupInfo.Owner = &open_im_sdk.PublicUserInfo{}
+		setGroupPublicUserInfo(operationID, groupID, ownerUserID, groupInfo.Owner)
+	}
+}
+
+func setGroupMemberInfo(operationID, groupID, userID string, groupMemberInfo *open_im_sdk.GroupMemberFullInfo) {
+	group, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(groupID, userID)
+	if err != nil {
+		log.NewError(operationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", err.Error(), groupID, userID)
 		return
 	}
-	utils.CopyStructFields(groupCreated.Group, group)
-	groupCreated.Creator = &open_im_sdk.GroupMemberFullInfo{}
+	utils.CopyStructFields(groupMemberInfo, group)
+}
+
+func setGroupPublicUserInfo(operationID, groupID, userID string, publicUserInfo *open_im_sdk.PublicUserInfo) {
+	group, err := imdb.FindGroupMemberInfoByGroupIdAndUserId(groupID, userID)
+	if err != nil {
+		log.NewError(operationID, "FindGroupMemberInfoByGroupIdAndUserId failed ", err.Error(), groupID, userID)
+		return
+	}
+	utils.CopyStructFields(publicUserInfo, group)
+}
 
-	for _, v := range req.InitMemberList {
+//创建群后调用
+func GroupCreatedNotification(operationID, opUserID, OwnerUserID, groupID string, initMemberList []string) {
+	var n NotificationMsg
+	n.SendID = opUserID
+	n.RecvID = groupID
+	n.ContentType = constant.GroupCreatedNotification
+	n.SessionType = constant.GroupChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = operationID
+
+	GroupCreatedTips := open_im_sdk.GroupCreatedTips{Group: &open_im_sdk.GroupInfo{},
+		Creator: &open_im_sdk.GroupMemberFullInfo{}}
+	setOpUserInfo(operationID, GroupCreatedTips.Creator.UserID, groupID, GroupCreatedTips.Creator)
+
+	setGroupInfo(operationID, groupID, GroupCreatedTips.Group, OwnerUserID)
+
+	for _, v := range initMemberList {
 		var groupMemberInfo open_im_sdk.GroupMemberFullInfo
-		member, err := imdb.GetMemberInfoById(groupID, v.UserID)
-		if err != nil {
-			utils.CopyStructFields(&groupMemberInfo, member)
-		}
-		groupCreated.MemberList = append(groupCreated.MemberList, &groupMemberInfo)
+		setGroupMemberInfo(operationID, groupID, v, &groupMemberInfo)
+		GroupCreatedTips.MemberList = append(GroupCreatedTips.MemberList, &groupMemberInfo)
 	}
 
 	var tips open_im_sdk.TipsComm
-	tips.Detail, _ = json.Marshal(groupCreated)
+	tips.Detail, _ = json.Marshal(GroupCreatedTips)
 	tips.DefaultTips = config.Config.Notification.GroupCreated.DefaultTips.Tips
 	n.Content, _ = json.Marshal(tips)
 	Notification(&n, false)
@@ -362,27 +394,44 @@ func GroupCreatedNotification(req *pbGroup.CreateGroupReq, groupID string) {
 //  GroupInfo Group = 1;
 //  PublicUserInfo Applicant  = 2;
 //  string 	Reason = 3;
-//}
-func ReceiveJoinApplicationNotification(operationID, RecvID string, applicant *immysql.User, group *immysql.Group) {
+//}  apply->all managers GroupID              string   `protobuf:"bytes,1,opt,name=GroupID" json:"GroupID,omitempty"`
+//	ReqMessage           string   `protobuf:"bytes,2,opt,name=ReqMessage" json:"ReqMessage,omitempty"`
+//	OpUserID             string   `protobuf:"bytes,3,opt,name=OpUserID" json:"OpUserID,omitempty"`
+//	OperationID          string   `protobuf:"bytes,4,opt,name=OperationID" json:"OperationID,omitempty"`
+//申请进群后调用
+func JoinApplicationNotification(req *pbGroup.JoinGroupReq) {
+	managerList, err := imdb.GetOwnerManagerByGroupId(req.GroupID)
+	if err != nil {
+		log.NewError(req.OperationID, "GetOwnerManagerByGroupId failed ", err.Error(), req.GroupID)
+		return
+	}
+
 	var n NotificationMsg
-	n.SendID = applicant.UserID
-	n.RecvID = RecvID
-	n.ContentType = constant.ApplyJoinGroupTip
+	n.SendID = req.OpUserID
+	n.ContentType = constant.JoinApplicationNotification
 	n.SessionType = constant.SingleChatType
 	n.MsgFrom = constant.SysMsgType
-	n.OperationID = operationID
+	n.OperationID = req.OperationID
 
-	var joniGroup open_im_sdk.ReceiveJoinApplicationTips
-	joniGroup.Group = &open_im_sdk.GroupInfo{}
-	utils.CopyStructFields(joniGroup.Group, group)
-	joniGroup.Applicant = &open_im_sdk.PublicUserInfo{}
-	utils.CopyStructFields(joniGroup.Applicant, applicant)
+	JoinGroupApplicationTips := open_im_sdk.JoinGroupApplicationTips{Group: &open_im_sdk.GroupInfo{}, Applicant: &open_im_sdk.PublicUserInfo{}}
+	setGroupInfo(req.OperationID, req.GroupID, JoinGroupApplicationTips.Group, "")
+
+	apply, err := imdb.FindUserByUID(req.OpUserID)
+	if err != nil {
+		log.NewError(req.OperationID, "FindUserByUID failed ", err.Error(), req.OpUserID)
+		return
+	}
+	utils.CopyStructFields(JoinGroupApplicationTips.Applicant, apply)
+	JoinGroupApplicationTips.Reason = req.ReqMessage
 
 	var tips open_im_sdk.TipsComm
-	tips.Detail, _ = json.Marshal(joniGroup)
-	tips.DefaultTips = config.Config.Notification.ApplyJoinGroup.DefaultTips.Tips
+	tips.Detail, _ = json.Marshal(JoinGroupApplicationTips)
+	tips.DefaultTips = "JoinGroupApplicationTips"
 	n.Content, _ = json.Marshal(tips)
-	Notification(&n, false)
+	for _, v := range managerList {
+		n.RecvID = v.UserID
+		Notification(&n, true)
+	}
 }
 
 //message ApplicationProcessedTips{
@@ -391,8 +440,28 @@ func ReceiveJoinApplicationNotification(operationID, RecvID string, applicant *i
 //  int32 Result = 3;
 //  string 	Reason = 4;
 //}
-func ApplicationProcessedNotification(operationID, RecvID string, group immysql.Group, opUser immysql.GroupMember, result int32, Reason string) {
+//处理进群请求后调用
+func ApplicationProcessedNotification(req *pbGroup.GroupApplicationResponseReq) {
+	var n NotificationMsg
+	n.SendID = req.OpUserID
+	n.ContentType = constant.ApplicationProcessedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.OperationID
+	n.RecvID = req.ToUserID
 
+	ApplicationProcessedTips := open_im_sdk.ApplicationProcessedTips{Group: &open_im_sdk.GroupInfo{}, OpUser: &open_im_sdk.GroupMemberFullInfo{}}
+	setGroupInfo(req.OperationID, req.GroupID, ApplicationProcessedTips.Group, "")
+	setOpUserInfo(req.OperationID, req.OpUserID, req.GroupID, ApplicationProcessedTips.OpUser)
+	ApplicationProcessedTips.Reason = req.HandledMsg
+	ApplicationProcessedTips.Result = req.HandleResult
+
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(ApplicationProcessedTips)
+	tips.DefaultTips = "ApplicationProcessedNotification"
+	n.Content, _ = json.Marshal(tips)
+
+	Notification(&n, true)
 }
 
 //message MemberInvitedTips{
@@ -401,8 +470,29 @@ func ApplicationProcessedNotification(operationID, RecvID string, group immysql.
 //  GroupMemberFullInfo InvitedUser = 3;
 //  uint64 OperationTime = 4;
 //}
-func MemberInvitedNotification(operationID string, group immysql.Group, opUser immysql.User, invitedUser immysql.GroupMember) {
+//被邀请进群后调用
+func MemberInvitedNotification(operationID, groupID, opUserID, reason string, invitedUserIDList []string) {
+	var n NotificationMsg
+	n.SendID = opUserID
+	n.ContentType = constant.MemberInvitedNotification
+	n.SessionType = constant.GroupChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = operationID
 
+	ApplicationProcessedTips := open_im_sdk.MemberInvitedTips{Group: &open_im_sdk.GroupInfo{}, OpUser: &open_im_sdk.GroupMemberFullInfo{}}
+	setGroupInfo(operationID, groupID, ApplicationProcessedTips.Group, "")
+	setOpUserInfo(operationID, opUserID, groupID, ApplicationProcessedTips.OpUser)
+	for _, v := range invitedUserIDList {
+		var groupMemberInfo open_im_sdk.GroupMemberFullInfo
+		setGroupMemberInfo(operationID, groupID, v, &groupMemberInfo)
+		ApplicationProcessedTips.InvitedUserList = append(ApplicationProcessedTips.InvitedUserList, &groupMemberInfo)
+	}
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(ApplicationProcessedTips)
+	tips.DefaultTips = "MemberInvitedNotification"
+	n.Content, _ = json.Marshal(tips)
+	n.RecvID = groupID
+	Notification(&n, true)
 }
 
 //message MemberKickedTips{
@@ -411,12 +501,35 @@ func MemberInvitedNotification(operationID string, group immysql.Group, opUser i
 //  GroupMemberFullInfo KickedUser = 3;
 //  uint64 OperationTime = 4;
 //}
+//被踢后调用
+func MemberKickedNotification(req *pbGroup.KickGroupMemberReq, kickedUserIDList []string) {
+	var n NotificationMsg
+	n.SendID = req.OpUserID
+	n.ContentType = constant.MemberKickedNotification
+	n.SessionType = constant.GroupChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.OperationID
 
-func MemberKickedNotificationID(operationID, GroupID, opUserID, kickedUserID, reason string) {
-
-}
-func MemberKickedNotification(operationID string, group immysql.Group, opUser immysql.GroupMember, KickedUser immysql.GroupMember) {
+	MemberKickedTips := open_im_sdk.MemberKickedTips{Group: &open_im_sdk.GroupInfo{}, OpUser: &open_im_sdk.GroupMemberFullInfo{}}
+	setGroupInfo(req.OperationID, req.GroupID, MemberKickedTips.Group, "")
+	setOpUserInfo(req.OperationID, req.OpUserID, req.GroupID, MemberKickedTips.OpUser)
+	for _, v := range kickedUserIDList {
+		var groupMemberInfo open_im_sdk.GroupMemberFullInfo
+		setGroupMemberInfo(req.OperationID, req.GroupID, v, &groupMemberInfo)
+		MemberKickedTips.KickedUserList = append(MemberKickedTips.KickedUserList, &groupMemberInfo)
+	}
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(MemberKickedTips)
+	tips.DefaultTips = "MemberKickedNotification"
+	n.Content, _ = json.Marshal(tips)
+	n.RecvID = req.GroupID
+	Notification(&n, true)
 
+	for _, v := range kickedUserIDList {
+		n.SessionType = constant.SingleChatType
+		n.RecvID = v
+		Notification(&n, true)
+	}
 }
 
 //message GroupInfoChangedTips{
@@ -424,8 +537,26 @@ 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(req *pbGroup.SetGroupInfoReq) {
+	var n NotificationMsg
+	n.SendID = req.OpUserID
+	n.ContentType = constant.GroupInfoChangedNotification
+	n.SessionType = constant.GroupChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.OperationID
+
+	GroupInfoChangedTips := open_im_sdk.GroupInfoChangedTips{Group: &open_im_sdk.GroupInfo{}, OpUser: &open_im_sdk.GroupMemberFullInfo{}}
+	setGroupInfo(req.OperationID, req.GroupInfo.GroupID, GroupInfoChangedTips.Group, "")
+	setOpUserInfo(req.OperationID, req.OpUserID, req.GroupInfo.GroupID, GroupInfoChangedTips.OpUser)
+
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(GroupInfoChangedTips)
+	tips.DefaultTips = "GroupInfoChangedNotification"
+	n.Content, _ = json.Marshal(tips)
+	n.RecvID = req.GroupInfo.GroupID
+	Notification(&n, true)
 }
 
 /*
@@ -458,8 +589,30 @@ func GroupInfoChangedNotification(operationID string, changedType int32, group *
 //  GroupMemberFullInfo LeaverUser = 2;
 //  uint64 OperationTime = 3;
 //}
-func MemberLeaveNotification(operationID, groupID, leaverUserID string) {
 
+//群成员退群后调用
+func MemberLeaveNotification(req *pbGroup.QuitGroupReq) {
+	var n NotificationMsg
+	n.SendID = req.OpUserID
+	n.ContentType = constant.MemberLeaveNotification
+	n.SessionType = constant.GroupChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.OperationID
+
+	MemberLeaveTips := open_im_sdk.MemberLeaveTips{Group: &open_im_sdk.GroupInfo{}, LeaverUser: &open_im_sdk.GroupMemberFullInfo{}}
+	setGroupInfo(req.OperationID, req.GroupID, MemberLeaveTips.Group, "")
+	setOpUserInfo(req.OperationID, req.OpUserID, req.GroupID, MemberLeaveTips.LeaverUser)
+
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(MemberLeaveTips)
+	tips.DefaultTips = "MemberLeaveNotification"
+	n.Content, _ = json.Marshal(tips)
+	n.RecvID = req.GroupID
+	Notification(&n, true)
+
+	n.SessionType = constant.SingleChatType
+	n.RecvID = req.OpUserID
+	Notification(&n, true)
 }
 
 //message MemberEnterTips{
@@ -467,7 +620,25 @@ func MemberLeaveNotification(operationID, groupID, leaverUserID string) {
 //  GroupMemberFullInfo EntrantUser = 2;
 //  uint64 OperationTime = 3;
 //}
-func MemberEnterNotification(operationID string, group *immysql.Group, entrantUser *immysql.GroupMember) {
+//群成员主动申请进群,管理员同意后调用,
+func MemberEnterNotification(req *pbGroup.GroupApplicationResponseReq) {
+	var n NotificationMsg
+	n.SendID = req.OpUserID
+	n.ContentType = constant.MemberEnterNotification
+	n.SessionType = constant.GroupChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.OperationID
+
+	MemberLeaveTips := open_im_sdk.MemberEnterTips{Group: &open_im_sdk.GroupInfo{}, EntrantUser: &open_im_sdk.GroupMemberFullInfo{}}
+	setGroupInfo(req.OperationID, req.GroupID, MemberLeaveTips.Group, "")
+	setOpUserInfo(req.OperationID, req.OpUserID, req.GroupID, MemberLeaveTips.EntrantUser)
+
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(MemberLeaveTips)
+	tips.DefaultTips = "MemberEnterNotification"
+	n.Content, _ = json.Marshal(tips)
+	n.RecvID = req.GroupID
+	Notification(&n, true)
 
 }
 
@@ -478,47 +649,143 @@ func MemberEnterNotification(operationID string, group *immysql.Group, entrantUs
 //  uint64 MuteTime = 4;
 //  GroupInfo Group = 5;
 //}
-func MemberInfoChangedNotification(operationID string, group *immysql.Group, opUser *immysql.GroupMember, userFinalInfo *immysql.GroupMember) {
+//func MemberInfoChangedNotification(operationID string, group *immysql.Group, opUser *immysql.GroupMember, userFinalInfo *immysql.GroupMember) {
 
-}
+//}
 
 //message FriendApplicationAddedTips{
 //  PublicUserInfo OpUser = 1; //user1
 //  FriendApplication Application = 2;
 //  PublicUserInfo  OpedUser = 3; //user2
 //}
-func FriendApplicationAddedNotification(operationID string, opUser *immysql.User, opedUser *immysql.User, application *immysql.FriendRequest) {
 
+func getFromToUserNickname(operationID, fromUserID, toUserID string) (string, string) {
+	from, err1 := imdb.FindUserByUID(fromUserID)
+	to, err2 := imdb.FindUserByUID(toUserID)
+	if err1 != nil || err2 != nil {
+		log.NewError("FindUserByUID failed ", err1, err2, fromUserID, toUserID)
+	}
+	fromNickname, toNickname := "", ""
+	if from != nil {
+		fromNickname = from.Nickname
+	}
+	if to != nil {
+		toNickname = to.Nickname
+	}
+	return fromNickname, toNickname
 }
 
-//message FriendApplicationProcessedTips{
-//  PublicUserInfo     OpUser = 1;  //user2
-//  PublicUserInfo     OpedUser = 2; //user1
-//  int32 result = 3; //1: accept; -1: reject
-//}
-func FriendApplicationProcessedNotification(operationID string, opUser *immysql.User, OpedUser *immysql.User, result int32) {
+func FriendApplicationAddedNotification(req *pbFriend.AddFriendReq) {
+	var n NotificationMsg
+	n.SendID = req.CommID.FromUserID
+	n.RecvID = req.CommID.ToUserID
+	n.ContentType = constant.FriendApplicationAddedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.CommID.OperationID
 
+	var FriendApplicationAddedTips open_im_sdk.FriendApplicationAddedTips
+	FriendApplicationAddedTips.FromToUserID.FromUserID = req.CommID.FromUserID
+	FriendApplicationAddedTips.FromToUserID.ToUserID = req.CommID.ToUserID
+	fromUserNickname, toUserNickname := getFromToUserNickname(req.CommID.OperationID, req.CommID.FromUserID, req.CommID.ToUserID)
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(FriendApplicationAddedTips)
+	tips.DefaultTips = fromUserNickname + " FriendApplicationAddedNotification " + toUserNickname
+	n.Content, _ = json.Marshal(tips)
+	Notification(&n, true)
 }
 
-//message FriendAddedTips{
-//  FriendInfo Friend = 1;
-//}
-//message FriendInfo{
-//  UserInfo OwnerUser = 1;
-//  string Remark = 2;
-//  uint64 CreateTime = 3;
-//  UserInfo FriendUser = 4;
-//}
+func FriendApplicationProcessedNotification(req *pbFriend.AddFriendResponseReq) {
+	var n NotificationMsg
+	n.SendID = req.CommID.FromUserID
+	n.RecvID = req.CommID.ToUserID
+	n.ContentType = constant.FriendApplicationProcessedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.CommID.OperationID
 
-func FriendAddedNotification(operationID string, opUser *immysql.User, friendUser *immysql.Friend) {
+	var FriendApplicationProcessedTips open_im_sdk.FriendApplicationProcessedTips
+	FriendApplicationProcessedTips.FromToUserID.FromUserID = req.CommID.FromUserID
+	FriendApplicationProcessedTips.FromToUserID.ToUserID = req.CommID.ToUserID
+	fromUserNickname, toUserNickname := getFromToUserNickname(req.CommID.OperationID, req.CommID.FromUserID, req.CommID.ToUserID)
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(FriendApplicationProcessedTips)
+	tips.DefaultTips = fromUserNickname + " FriendApplicationProcessedNotification " + toUserNickname
+	n.Content, _ = json.Marshal(tips)
+	Notification(&n, true)
+}
+
+func FriendAddedNotification(operationID, opUserID, fromUserID, toUserID string) {
+	var n NotificationMsg
+	n.SendID = fromUserID
+	n.RecvID = toUserID
+	n.ContentType = constant.FriendAddedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = operationID
+
+	var FriendAddedTips open_im_sdk.FriendAddedTips
+
+	user, err := imdb.FindUserByUID(opUserID)
+	if err != nil {
+		log.NewError(operationID, "FindUserByUID failed ", err.Error(), opUserID)
+
+	} else {
+		utils.CopyStructFields(FriendAddedTips.OpUser, user)
+	}
 
+	friend, err := imdb.FindFriendRelationshipFromFriend(fromUserID, toUserID)
+	if err != nil {
+		log.NewError(operationID, "FindUserByUID failed ", err.Error(), fromUserID, toUserID)
+	} else {
+		FriendAddedTips.Friend.Remark = friend.Remark
+	}
+
+	from, err := imdb.FindUserByUID(fromUserID)
+	if err != nil {
+		log.NewError(operationID, "FindUserByUID failed ", err.Error(), fromUserID)
+
+	} else {
+		utils.CopyStructFields(FriendAddedTips.Friend.OwnerUser, from)
+	}
+
+	to, err := imdb.FindUserByUID(toUserID)
+	if err != nil {
+		log.NewError(operationID, "FindUserByUID failed ", err.Error(), toUserID)
+
+	} else {
+		utils.CopyStructFields(FriendAddedTips.Friend.FriendUser, to)
+	}
+
+	fromUserNickname, toUserNickname := FriendAddedTips.Friend.OwnerUser.Nickname, FriendAddedTips.Friend.FriendUser.Nickname
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(FriendAddedTips)
+	tips.DefaultTips = fromUserNickname + " FriendAddedNotification " + toUserNickname
+	n.Content, _ = json.Marshal(tips)
+	Notification(&n, true)
 }
 
 //message FriendDeletedTips{
 //  FriendInfo Friend = 1;
 //}
-func FriendDeletedNotification(operationID string, opUser *immysql.User, friendUser *immysql.Friend) {
+func FriendDeletedNotification(req *pbFriend.DeleteFriendReq) {
+	var n NotificationMsg
+	n.SendID = req.CommID.FromUserID
+	n.RecvID = req.CommID.ToUserID
+	n.ContentType = constant.FriendDeletedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.CommID.OperationID
 
+	var FriendDeletedTips open_im_sdk.FriendDeletedTips
+	FriendDeletedTips.FromToUserID.FromUserID = req.CommID.FromUserID
+	FriendDeletedTips.FromToUserID.ToUserID = req.CommID.ToUserID
+	fromUserNickname, toUserNickname := getFromToUserNickname(req.CommID.OperationID, req.CommID.FromUserID, req.CommID.ToUserID)
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(FriendDeletedTips)
+	tips.DefaultTips = fromUserNickname + " FriendDeletedNotification " + toUserNickname
+	n.Content, _ = json.Marshal(tips)
+	Notification(&n, true)
 }
 
 //message FriendInfoChangedTips{
@@ -526,8 +793,24 @@ func FriendDeletedNotification(operationID string, opUser *immysql.User, friendU
 //  PublicUserInfo OpUser = 2;
 //  uint64 OperationTime = 3;
 //}
-func FriendInfoChangedNotification(operationID string, opUser *immysql.User, friendUser *immysql.Friend) {
+func FriendInfoChangedNotification(req *pbFriend.SetFriendCommentReq) {
+	var n NotificationMsg
+	n.SendID = req.CommID.FromUserID
+	n.RecvID = req.CommID.ToUserID
+	n.ContentType = constant.FriendInfoChangedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.CommID.OperationID
 
+	var FriendInfoChangedTips open_im_sdk.FriendInfoChangedTips
+	FriendInfoChangedTips.FromToUserID.FromUserID = req.CommID.FromUserID
+	FriendInfoChangedTips.FromToUserID.ToUserID = req.CommID.ToUserID
+	fromUserNickname, toUserNickname := getFromToUserNickname(req.CommID.OperationID, req.CommID.FromUserID, req.CommID.ToUserID)
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(FriendInfoChangedTips)
+	tips.DefaultTips = fromUserNickname + " FriendDeletedNotification " + toUserNickname
+	n.Content, _ = json.Marshal(tips)
+	Notification(&n, true)
 }
 
 //message BlackAddedTips{
@@ -539,15 +822,47 @@ func FriendInfoChangedNotification(operationID string, opUser *immysql.User, fri
 //  uint64 CreateTime = 3;
 //  PublicUserInfo BlackUser = 4;
 //}
-func BlackAddedNotification(operationID string, opUser *immysql.User, blackUser *immysql.User) {
+func BlackAddedNotification(req *pbFriend.AddBlacklistReq) {
+	var n NotificationMsg
+	n.SendID = req.CommID.FromUserID
+	n.RecvID = req.CommID.ToUserID
+	n.ContentType = constant.BlackAddedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.CommID.OperationID
 
+	var BlackAddedTips open_im_sdk.BlackAddedTips
+	BlackAddedTips.FromToUserID.FromUserID = req.CommID.FromUserID
+	BlackAddedTips.FromToUserID.ToUserID = req.CommID.ToUserID
+	fromUserNickname, toUserNickname := getFromToUserNickname(req.CommID.OperationID, req.CommID.FromUserID, req.CommID.ToUserID)
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(BlackAddedTips)
+	tips.DefaultTips = fromUserNickname + " BlackAddedNotification " + toUserNickname
+	n.Content, _ = json.Marshal(tips)
+	Notification(&n, true)
 }
 
 //message BlackDeletedTips{
 //  BlackInfo Black = 1;
 //}
-func BlackDeletedNotification(operationID string, opUser *immysql.User, blackUser *immysql.User) {
+func BlackDeletedNotification(req *pbFriend.RemoveBlacklistReq) {
+	var n NotificationMsg
+	n.SendID = req.CommID.FromUserID
+	n.RecvID = req.CommID.ToUserID
+	n.ContentType = constant.BlackDeletedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = req.CommID.OperationID
 
+	var BlackDeletedTips open_im_sdk.BlackDeletedTips
+	BlackDeletedTips.FromToUserID.FromUserID = req.CommID.FromUserID
+	BlackDeletedTips.FromToUserID.ToUserID = req.CommID.ToUserID
+	fromUserNickname, toUserNickname := getFromToUserNickname(req.CommID.OperationID, req.CommID.FromUserID, req.CommID.ToUserID)
+	var tips open_im_sdk.TipsComm
+	tips.Detail, _ = json.Marshal(BlackDeletedTips)
+	tips.DefaultTips = fromUserNickname + " BlackDeletedNotification " + toUserNickname
+	n.Content, _ = json.Marshal(tips)
+	Notification(&n, true)
 }
 
 //message SelfInfoUpdatedTips{
@@ -555,6 +870,26 @@ func BlackDeletedNotification(operationID string, opUser *immysql.User, blackUse
 //  PublicUserInfo OpUser = 2;
 //  uint64 OperationTime = 3;
 //}
-func SelfInfoUpdatedNotification(operationID string, opUser *immysql.User, selfUser *immysql.User) {
+func SelfInfoUpdatedNotification(operationID, userID string) {
+	var n NotificationMsg
+	n.SendID = userID
+	n.RecvID = userID
+	n.ContentType = constant.SelfInfoUpdatedNotification
+	n.SessionType = constant.SingleChatType
+	n.MsgFrom = constant.SysMsgType
+	n.OperationID = operationID
+
+	var SelfInfoUpdatedTips open_im_sdk.SelfInfoUpdatedTips
+	SelfInfoUpdatedTips.UserID = userID
 
+	var tips open_im_sdk.TipsComm
+	u, err := imdb.FindUserByUID(userID)
+	if err != nil {
+		log.NewError(operationID, "FindUserByUID failed ", err.Error(), userID)
+	}
+
+	tips.Detail, _ = json.Marshal(SelfInfoUpdatedTips)
+	tips.DefaultTips = u.Nickname + " SelfInfoUpdatedNotification "
+	n.Content, _ = json.Marshal(tips)
+	Notification(&n, true)
 }
diff --git a/internal/rpc/user/get_user_info.go b/internal/rpc/user/get_user_info.go
index 3f9cec00f..eca8afbd5 100644
--- a/internal/rpc/user/get_user_info.go
+++ b/internal/rpc/user/get_user_info.go
@@ -75,14 +75,7 @@ func (s *userServer) GetUserInfo(ctx context.Context, req *pbUser.GetUserInfoReq
 				log.ErrorByKv("search userinfo failed", req.OperationID, "userID", userID, "err=%s", err.Error())
 				continue
 			}
-			userInfo.Uid = user.UID
-			userInfo.Icon = user.Icon
-			userInfo.Name = user.Name
-			userInfo.Gender = user.Gender
-			userInfo.Mobile = user.Mobile
-			userInfo.Birth = user.Birth
-			userInfo.Email = user.Email
-			userInfo.Ex = user.Ex
+			utils.CopyStructFields(&userInfo, user)
 			userInfoList = append(userInfoList, &userInfo)
 		}
 	} else {
diff --git a/internal/rpc/user/update_user_info.go b/internal/rpc/user/update_user_info.go
index 079cb1b44..f022542e4 100644
--- a/internal/rpc/user/update_user_info.go
+++ b/internal/rpc/user/update_user_info.go
@@ -2,6 +2,7 @@ package user
 
 import (
 	"Open_IM/internal/push/logic"
+	chat "Open_IM/internal/rpc/msg"
 	"Open_IM/pkg/common/config"
 	"Open_IM/pkg/common/constant"
 	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
@@ -49,7 +50,7 @@ func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbUser.UpdateUserI
 		log.ErrorByKv("get friend list rpc server failed", req.OperationID, "err", err.Error(), "req", req.String())
 		return &pbUser.CommonResp{}, nil
 	}
-	if RpcResp.ErrorCode != 0 {
+	if RpcResp.ErrCode != 0 {
 		log.ErrorByKv("get friend list rpc server failed", req.OperationID, "err", err.Error(), "req", req.String())
 		return &pbUser.CommonResp{}, nil
 	}
@@ -62,6 +63,8 @@ func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbUser.UpdateUserI
 	if self != nil {
 		name, faceUrl = self.Name, self.Icon
 	}
+
+	chat.SelfInfoUpdatedNotification(req.OperationID, req.Uid)
 	for _, v := range RpcResp.Data {
 		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
 			SendID:         ownerUid,
diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go
index 0d2b5dae6..44216d1c8 100644
--- a/pkg/common/constant/constant.go
+++ b/pkg/common/constant/constant.go
@@ -45,22 +45,38 @@ const (
 	GroupMsg       = 201
 
 	//SysRelated
-	AcceptFriendApplicationTip = 201
-	AddFriendTip               = 202
-	RefuseFriendApplicationTip = 203
-	SetSelfInfoTip             = 204
-
-	TransferGroupOwnerTip       = 501
-	CreateGroupTip              = 502
-	GroupApplicationResponseTip = 503
-	ApplyJoinGroupTip           = 504
-	QuitGroupTip                = 505
-	SetGroupInfoTip             = 506
-	AcceptGroupApplicationTip   = 507
-	RefuseGroupApplicationTip   = 508
-	KickGroupMemberTip          = 509
-	InviteUserToGroupTip        = 510
-	ChangeGroupInfoTip          = 511
+	FriendApplicationAddedNotification     = 201
+	FriendApplicationProcessedNotification = 202
+	FriendAddedNotification                = 203
+	FriendDeletedNotification              = 204
+	FriendInfoChangedNotification          = 205
+	BlackAddedNotification                 = 206
+	BlackDeletedNotification               = 207
+	//AcceptFriendApplicationTip = 201
+	//AddFriendTip               = 202
+	//RefuseFriendApplicationTip = 203
+
+	SelfInfoUpdatedNotification = 301
+
+	GroupCreatedNotification         = 501
+	JoinApplicationNotification      = 502
+	ApplicationProcessedNotification = 503
+	MemberInvitedNotification        = 504
+	MemberKickedNotification         = 505
+	GroupInfoChangedNotification     = 506
+	MemberLeaveNotification          = 507
+	MemberEnterNotification          = 508
+	//TransferGroupOwnerTip       = 501
+	//CreateGroupTip              = 502
+	//GroupApplicationResponseTip = 503
+	//ApplyJoinGroupTip           = 504
+	//QuitGroupTip                = 505
+	//SetGroupInfoTip             = 506
+	//AcceptGroupApplicationTip   = 507
+	//RefuseGroupApplicationTip   = 508
+	//KickGroupMemberTip          = 509
+	//InviteUserToGroupTip        = 510
+	//ChangeGroupInfoTip          = 511
 
 	//MsgFrom
 	UserMsgType = 100
diff --git a/pkg/common/db/mysql.go b/pkg/common/db/mysql.go
index 859620e36..152273f97 100644
--- a/pkg/common/db/mysql.go
+++ b/pkg/common/db/mysql.go
@@ -91,18 +91,6 @@ func initMysqlDB() {
 		panic(err.Error())
 	}
 
-	sqlTable = "CREATE TABLE IF NOT EXISTS `black_list` (" +
-		" `uid` varchar(32) NOT NULL COMMENT 'uid'," +
-		" `begin_disable_time` datetime DEFAULT NULL," +
-		" `end_disable_time` datetime DEFAULT NULL," +
-		" `ex` varchar(1024) DEFAULT NULL," +
-		" PRIMARY KEY (`uid`) USING BTREE" +
-		" ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;"
-	err = db.Exec(sqlTable).Error
-	if err != nil {
-		panic(err.Error())
-	}
-
 	sqlTable = "CREATE TABLE IF NOT EXISTS `user_black_list` (" +
 		" `owner_id` varchar(64) NOT NULL," +
 		" `block_id` varchar(64) NOT NULL," +
diff --git a/pkg/common/db/mysql_model/im_mysql_model/group_model.go b/pkg/common/db/mysql_model/im_mysql_model/group_model.go
index d9c69fdc0..db4e7f3c0 100644
--- a/pkg/common/db/mysql_model/im_mysql_model/group_model.go
+++ b/pkg/common/db/mysql_model/im_mysql_model/group_model.go
@@ -15,7 +15,7 @@ func InsertIntoGroup(groupId, name, introduction, notification, faceUrl, ex stri
 	}
 	//Default group name
 	if name == "" {
-		name = "groupChat"
+		name = "Group Chat"
 	}
 	toInsertInfo := Group{GroupID: groupId, GroupName: name, Introduction: introduction, Notification: notification, FaceUrl: faceUrl, CreateTime: time.Now(), Ex: ex}
 	err = dbConn.Table("group").Create(toInsertInfo).Error
diff --git a/pkg/proto/group/group.pb.go b/pkg/proto/group/group.pb.go
index caa26e0e5..cbd93fb5e 100644
--- a/pkg/proto/group/group.pb.go
+++ b/pkg/proto/group/group.pb.go
@@ -36,7 +36,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_2ff972788727c811, []int{0}
+	return fileDescriptor_group_95297d6a59bab850, []int{0}
 }
 func (m *CommonResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CommonResp.Unmarshal(m, b)
@@ -82,7 +82,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_2ff972788727c811, []int{1}
+	return fileDescriptor_group_95297d6a59bab850, []int{1}
 }
 func (m *GroupAddMemberInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupAddMemberInfo.Unmarshal(m, b)
@@ -135,7 +135,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_2ff972788727c811, []int{2}
+	return fileDescriptor_group_95297d6a59bab850, []int{2}
 }
 func (m *CreateGroupReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateGroupReq.Unmarshal(m, b)
@@ -231,7 +231,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_2ff972788727c811, []int{3}
+	return fileDescriptor_group_95297d6a59bab850, []int{3}
 }
 func (m *CreateGroupResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateGroupResp.Unmarshal(m, b)
@@ -285,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_2ff972788727c811, []int{4}
+	return fileDescriptor_group_95297d6a59bab850, []int{4}
 }
 func (m *GetGroupsInfoReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupsInfoReq.Unmarshal(m, b)
@@ -339,7 +339,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_2ff972788727c811, []int{5}
+	return fileDescriptor_group_95297d6a59bab850, []int{5}
 }
 func (m *GetGroupsInfoResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupsInfoResp.Unmarshal(m, b)
@@ -383,8 +383,7 @@ func (m *GetGroupsInfoResp) GetGroupInfoList() []*sdk_ws.GroupInfo {
 type SetGroupInfoReq struct {
 	GroupInfo            *sdk_ws.GroupInfo `protobuf:"bytes,1,opt,name=GroupInfo" json:"GroupInfo,omitempty"`
 	OpUserID             string            `protobuf:"bytes,2,opt,name=OpUserID" json:"OpUserID,omitempty"`
-	FromUserID           string            `protobuf:"bytes,3,opt,name=FromUserID" json:"FromUserID,omitempty"`
-	OperationID          string            `protobuf:"bytes,4,opt,name=OperationID" json:"OperationID,omitempty"`
+	OperationID          string            `protobuf:"bytes,3,opt,name=OperationID" json:"OperationID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
 	XXX_unrecognized     []byte            `json:"-"`
 	XXX_sizecache        int32             `json:"-"`
@@ -394,7 +393,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_2ff972788727c811, []int{6}
+	return fileDescriptor_group_95297d6a59bab850, []int{6}
 }
 func (m *SetGroupInfoReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetGroupInfoReq.Unmarshal(m, b)
@@ -428,13 +427,6 @@ func (m *SetGroupInfoReq) GetOpUserID() string {
 	return ""
 }
 
-func (m *SetGroupInfoReq) GetFromUserID() string {
-	if m != nil {
-		return m.FromUserID
-	}
-	return ""
-}
-
 func (m *SetGroupInfoReq) GetOperationID() string {
 	if m != nil {
 		return m.OperationID
@@ -442,7 +434,6 @@ func (m *SetGroupInfoReq) GetOperationID() string {
 	return ""
 }
 
-// owner or manager
 type GetGroupApplicationListReq struct {
 	OpUserID             string   `protobuf:"bytes,1,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	OperationID          string   `protobuf:"bytes,2,opt,name=OperationID" json:"OperationID,omitempty"`
@@ -456,7 +447,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_2ff972788727c811, []int{7}
+	return fileDescriptor_group_95297d6a59bab850, []int{7}
 }
 func (m *GetGroupApplicationListReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupApplicationListReq.Unmarshal(m, b)
@@ -523,7 +514,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_2ff972788727c811, []int{8}
+	return fileDescriptor_group_95297d6a59bab850, []int{8}
 }
 func (m *GetGroupApplicationList_Data_User) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupApplicationList_Data_User.Unmarshal(m, b)
@@ -667,7 +658,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_2ff972788727c811, []int{9}
+	return fileDescriptor_group_95297d6a59bab850, []int{9}
 }
 func (m *GetGroupApplicationListData) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupApplicationListData.Unmarshal(m, b)
@@ -714,7 +705,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_2ff972788727c811, []int{10}
+	return fileDescriptor_group_95297d6a59bab850, []int{10}
 }
 func (m *GetGroupApplicationListResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupApplicationListResp.Unmarshal(m, b)
@@ -770,7 +761,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_2ff972788727c811, []int{11}
+	return fileDescriptor_group_95297d6a59bab850, []int{11}
 }
 func (m *TransferGroupOwnerReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TransferGroupOwnerReq.Unmarshal(m, b)
@@ -828,9 +819,8 @@ func (m *TransferGroupOwnerReq) GetOpUserID() string {
 type JoinGroupReq struct {
 	GroupID              string   `protobuf:"bytes,1,opt,name=GroupID" json:"GroupID,omitempty"`
 	ReqMessage           string   `protobuf:"bytes,2,opt,name=ReqMessage" json:"ReqMessage,omitempty"`
-	FromUserID           string   `protobuf:"bytes,3,opt,name=FromUserID" json:"FromUserID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,3,opt,name=OpUserID" json:"OpUserID,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:"-"`
@@ -840,7 +830,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_2ff972788727c811, []int{12}
+	return fileDescriptor_group_95297d6a59bab850, []int{12}
 }
 func (m *JoinGroupReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_JoinGroupReq.Unmarshal(m, b)
@@ -874,9 +864,9 @@ func (m *JoinGroupReq) GetReqMessage() string {
 	return ""
 }
 
-func (m *JoinGroupReq) GetFromUserID() string {
+func (m *JoinGroupReq) GetOpUserID() string {
 	if m != nil {
-		return m.FromUserID
+		return m.OpUserID
 	}
 	return ""
 }
@@ -888,24 +878,15 @@ 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"`
-	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"`
-	ToUserID    string `protobuf:"bytes,7,opt,name=ToUserID" json:"ToUserID,omitempty"`
-	AddTime     int64  `protobuf:"varint,10,opt,name=AddTime" json:"AddTime,omitempty"`
-	HandledMsg  string `protobuf:"bytes,12,opt,name=HandledMsg" json:"HandledMsg,omitempty"`
-	// int32 Type = 13;
-	//  int32 HandleStatus = 14;
-	HandleResult         int32    `protobuf:"varint,15,opt,name=HandleResult" json:"HandleResult,omitempty"`
+	OperationID          string   `protobuf:"bytes,1,opt,name=OperationID" json:"OperationID,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"`
+	ToUserID             string   `protobuf:"bytes,5,opt,name=ToUserID" json:"ToUserID,omitempty"`
+	AddTime              int64    `protobuf:"varint,6,opt,name=AddTime" json:"AddTime,omitempty"`
+	HandledMsg           string   `protobuf:"bytes,7,opt,name=HandledMsg" json:"HandledMsg,omitempty"`
+	HandleResult         int32    `protobuf:"varint,8,opt,name=HandleResult" json:"HandleResult,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -915,7 +896,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_2ff972788727c811, []int{13}
+	return fileDescriptor_group_95297d6a59bab850, []int{13}
 }
 func (m *GroupApplicationResponseReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupApplicationResponseReq.Unmarshal(m, b)
@@ -1006,7 +987,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_2ff972788727c811, []int{14}
+	return fileDescriptor_group_95297d6a59bab850, []int{14}
 }
 func (m *SetOwnerGroupNickNameReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetOwnerGroupNickNameReq.Unmarshal(m, b)
@@ -1064,8 +1045,7 @@ func (m *SetOwnerGroupNickNameReq) GetOpUserID() string {
 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"`
-	FromUserID           string   `protobuf:"bytes,3,opt,name=FromUserID" json:"FromUserID,omitempty"`
-	OpUserID             string   `protobuf:"bytes,4,opt,name=OpUserID" json:"OpUserID,omitempty"`
+	OpUserID             string   `protobuf:"bytes,3,opt,name=OpUserID" json:"OpUserID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1075,7 +1055,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_2ff972788727c811, []int{15}
+	return fileDescriptor_group_95297d6a59bab850, []int{15}
 }
 func (m *QuitGroupReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_QuitGroupReq.Unmarshal(m, b)
@@ -1109,13 +1089,6 @@ func (m *QuitGroupReq) GetOperationID() string {
 	return ""
 }
 
-func (m *QuitGroupReq) GetFromUserID() string {
-	if m != nil {
-		return m.FromUserID
-	}
-	return ""
-}
-
 func (m *QuitGroupReq) GetOpUserID() string {
 	if m != nil {
 		return m.OpUserID
@@ -1138,7 +1111,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_2ff972788727c811, []int{16}
+	return fileDescriptor_group_95297d6a59bab850, []int{16}
 }
 func (m *GetGroupMemberListReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupMemberListReq.Unmarshal(m, b)
@@ -1207,7 +1180,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_2ff972788727c811, []int{17}
+	return fileDescriptor_group_95297d6a59bab850, []int{17}
 }
 func (m *GetGroupMemberListResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupMemberListResp.Unmarshal(m, b)
@@ -1269,7 +1242,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_2ff972788727c811, []int{18}
+	return fileDescriptor_group_95297d6a59bab850, []int{18}
 }
 func (m *GetGroupMembersInfoReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupMembersInfoReq.Unmarshal(m, b)
@@ -1330,7 +1303,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_2ff972788727c811, []int{19}
+	return fileDescriptor_group_95297d6a59bab850, []int{19}
 }
 func (m *GetGroupMembersInfoResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupMembersInfoResp.Unmarshal(m, b)
@@ -1386,7 +1359,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_2ff972788727c811, []int{20}
+	return fileDescriptor_group_95297d6a59bab850, []int{20}
 }
 func (m *KickGroupMemberReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_KickGroupMemberReq.Unmarshal(m, b)
@@ -1453,7 +1426,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_2ff972788727c811, []int{21}
+	return fileDescriptor_group_95297d6a59bab850, []int{21}
 }
 func (m *Id2Result) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Id2Result.Unmarshal(m, b)
@@ -1500,7 +1473,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_2ff972788727c811, []int{22}
+	return fileDescriptor_group_95297d6a59bab850, []int{22}
 }
 func (m *KickGroupMemberResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_KickGroupMemberResp.Unmarshal(m, b)
@@ -1554,7 +1527,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_2ff972788727c811, []int{23}
+	return fileDescriptor_group_95297d6a59bab850, []int{23}
 }
 func (m *GetJoinedGroupListReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetJoinedGroupListReq.Unmarshal(m, b)
@@ -1608,7 +1581,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_2ff972788727c811, []int{24}
+	return fileDescriptor_group_95297d6a59bab850, []int{24}
 }
 func (m *GetJoinedGroupListResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetJoinedGroupListResp.Unmarshal(m, b)
@@ -1664,7 +1637,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_2ff972788727c811, []int{25}
+	return fileDescriptor_group_95297d6a59bab850, []int{25}
 }
 func (m *InviteUserToGroupReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_InviteUserToGroupReq.Unmarshal(m, b)
@@ -1732,7 +1705,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_2ff972788727c811, []int{26}
+	return fileDescriptor_group_95297d6a59bab850, []int{26}
 }
 func (m *InviteUserToGroupResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_InviteUserToGroupResp.Unmarshal(m, b)
@@ -1786,7 +1759,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_2ff972788727c811, []int{27}
+	return fileDescriptor_group_95297d6a59bab850, []int{27}
 }
 func (m *GetGroupAllMemberReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupAllMemberReq.Unmarshal(m, b)
@@ -1840,7 +1813,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_2ff972788727c811, []int{28}
+	return fileDescriptor_group_95297d6a59bab850, []int{28}
 }
 func (m *GetGroupAllMemberResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupAllMemberResp.Unmarshal(m, b)
@@ -2416,101 +2389,100 @@ var _Group_serviceDesc = grpc.ServiceDesc{
 	Metadata: "group/group.proto",
 }
 
-func init() { proto.RegisterFile("group/group.proto", fileDescriptor_group_2ff972788727c811) }
-
-var fileDescriptor_group_2ff972788727c811 = []byte{
-	// 1480 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xcd, 0x6f, 0xdc, 0x44,
-	0x14, 0x97, 0xf7, 0x23, 0xcd, 0xbe, 0x7c, 0x6c, 0x32, 0x6d, 0x52, 0xe3, 0x86, 0x2a, 0xb5, 0x50,
-	0x15, 0x55, 0x28, 0x91, 0x52, 0x84, 0x84, 0x5a, 0xa1, 0xa6, 0xf9, 0x68, 0x17, 0x48, 0xa2, 0x3a,
-	0xdb, 0x0b, 0x97, 0xe0, 0xae, 0xa7, 0x2b, 0xb3, 0x5e, 0xdb, 0xeb, 0xf1, 0x92, 0x96, 0x0b, 0x20,
-	0x24, 0x38, 0x20, 0x44, 0xaf, 0x1c, 0x39, 0xc0, 0x11, 0x71, 0xe0, 0xce, 0x81, 0x7f, 0x0c, 0xcd,
-	0x87, 0xbd, 0xe3, 0xf1, 0xc7, 0xae, 0x12, 0x89, 0x5e, 0x56, 0x3b, 0xef, 0xbd, 0x99, 0xf7, 0x31,
-	0xef, 0xfd, 0xde, 0x1b, 0xc3, 0x6a, 0x3f, 0x0a, 0xc6, 0xe1, 0x0e, 0xfb, 0xdd, 0x0e, 0xa3, 0x20,
-	0x0e, 0x50, 0x93, 0x2d, 0x8c, 0x3b, 0xa7, 0x21, 0xf6, 0xcf, 0x3b, 0xc7, 0x3b, 0xe1, 0xa0, 0xbf,
-	0xc3, 0x38, 0x3b, 0xc4, 0x19, 0x9c, 0x5f, 0x90, 0x9d, 0x0b, 0xc2, 0x25, 0xcd, 0x8f, 0x01, 0xf6,
-	0x83, 0xe1, 0x30, 0xf0, 0x2d, 0x4c, 0x42, 0xa4, 0xc3, 0xb5, 0xc3, 0x28, 0xda, 0x0f, 0x1c, 0xac,
-	0x6b, 0x9b, 0xda, 0x56, 0xd3, 0x4a, 0x96, 0x68, 0x1d, 0xe6, 0x0e, 0xa3, 0xe8, 0x98, 0xf4, 0xf5,
-	0xda, 0xa6, 0xb6, 0xd5, 0xb2, 0xc4, 0xca, 0x7c, 0x04, 0xe8, 0x09, 0xd5, 0xb5, 0xe7, 0x38, 0xc7,
-	0x78, 0xf8, 0x02, 0x47, 0x1d, 0xff, 0x65, 0x40, 0xa5, 0x9f, 0x13, 0x1c, 0x75, 0x0e, 0xd8, 0x31,
-	0x2d, 0x4b, 0xac, 0x10, 0x82, 0x86, 0x15, 0x78, 0x98, 0x9d, 0xd1, 0xb4, 0xd8, 0x7f, 0xf3, 0xdf,
-	0x1a, 0x2c, 0xef, 0x47, 0xd8, 0x8e, 0x31, 0x3b, 0xc8, 0xc2, 0x23, 0xb4, 0x07, 0xcb, 0x1d, 0xdf,
-	0x8d, 0xf9, 0x81, 0x9f, 0xb9, 0x24, 0xd6, 0xb5, 0xcd, 0xfa, 0xd6, 0xc2, 0xee, 0x3b, 0xdb, 0xdc,
-	0xc9, 0xbc, 0x46, 0x4b, 0xd9, 0x80, 0x36, 0xa0, 0xc5, 0xa4, 0x4e, 0xec, 0x21, 0x16, 0x26, 0x4f,
-	0x08, 0xc8, 0x84, 0xc5, 0x8e, 0x1f, 0x47, 0x81, 0x33, 0xee, 0xc5, 0x6e, 0xe0, 0xeb, 0x75, 0x26,
-	0x90, 0xa1, 0x51, 0x99, 0x93, 0x20, 0x76, 0x5f, 0xba, 0x3d, 0x9b, 0xc9, 0x34, 0xb8, 0x8c, 0x4c,
-	0xa3, 0xf1, 0x3a, 0xb2, 0x7b, 0xf8, 0x79, 0xe4, 0xe9, 0x4d, 0xc6, 0x4e, 0x96, 0x68, 0x05, 0xea,
-	0x87, 0xaf, 0x62, 0x7d, 0x8e, 0x51, 0xe9, 0x5f, 0xb4, 0x09, 0x0b, 0xa7, 0x21, 0x8e, 0xd8, 0xc6,
-	0xce, 0x81, 0x7e, 0x8d, 0x71, 0x64, 0x12, 0x32, 0x60, 0xfe, 0x34, 0x14, 0x71, 0x9b, 0x67, 0xec,
-	0x74, 0x8d, 0x6e, 0x03, 0x1c, 0x45, 0xc1, 0x50, 0x70, 0x5b, 0x8c, 0x2b, 0x51, 0xcc, 0xd7, 0xd0,
-	0xce, 0x04, 0xf1, 0x32, 0x97, 0x89, 0x3e, 0x10, 0x41, 0xa3, 0x11, 0x65, 0x31, 0x59, 0xd8, 0x5d,
-	0xdf, 0x0e, 0x68, 0x0e, 0xb9, 0xc3, 0x73, 0xe2, 0x0c, 0xb6, 0x53, 0xae, 0x35, 0x11, 0x34, 0x23,
-	0x58, 0x79, 0x82, 0x63, 0xb6, 0x26, 0x8c, 0x87, 0x47, 0xd4, 0x59, 0x2e, 0x70, 0x90, 0x5e, 0x5f,
-	0xcb, 0x92, 0x49, 0x6a, 0x38, 0x6a, 0xd5, 0xe1, 0xa8, 0x67, 0xc3, 0x61, 0x7e, 0xaf, 0xc1, 0xaa,
-	0xa2, 0xf4, 0x52, 0x1e, 0x3f, 0x84, 0xa5, 0xd4, 0x11, 0x66, 0x69, 0x9d, 0x25, 0x5a, 0x99, 0xd7,
-	0x59, 0x61, 0xf3, 0x77, 0x0d, 0xda, 0x67, 0xc2, 0x8a, 0xc4, 0xf3, 0x4c, 0x0c, 0xb5, 0x19, 0x63,
-	0x98, 0xf1, 0xb5, 0x56, 0x79, 0xf5, 0x75, 0xf5, 0xea, 0xd5, 0x48, 0x36, 0x72, 0x91, 0x34, 0xbf,
-	0x06, 0x23, 0x09, 0xd6, 0x5e, 0x18, 0x7a, 0x22, 0x7b, 0xa9, 0x0b, 0xd4, 0x62, 0x59, 0xb7, 0xa6,
-	0xe8, 0x9e, 0x7e, 0x4b, 0x53, 0xac, 0x33, 0x7f, 0x6d, 0xc0, 0x9d, 0x12, 0xe5, 0xe7, 0x07, 0x76,
-	0x6c, 0x9f, 0x53, 0x39, 0xb4, 0x0c, 0xb5, 0x54, 0x7b, 0xad, 0x73, 0x40, 0x6f, 0x52, 0x24, 0x8b,
-	0xd0, 0x99, 0x2c, 0xa7, 0x46, 0xc3, 0x80, 0xf9, 0x6e, 0x20, 0xb8, 0x3c, 0x14, 0xe9, 0x9a, 0xc2,
-	0xcf, 0x91, 0x67, 0xf7, 0x59, 0xad, 0x36, 0x2d, 0xf6, 0x9f, 0x9e, 0x67, 0xe1, 0xd1, 0x18, 0x93,
-	0x98, 0x66, 0x07, 0xaf, 0x57, 0x89, 0x42, 0xf9, 0x4f, 0x6d, 0xdf, 0xf1, 0xb0, 0x43, 0xf9, 0xbc,
-	0x6a, 0x25, 0x0a, 0xb5, 0x74, 0xcf, 0x71, 0xba, 0xee, 0x10, 0xb3, 0x9a, 0xad, 0x5b, 0xc9, 0x12,
-	0xdd, 0x83, 0x95, 0xc4, 0xae, 0x13, 0xb7, 0x37, 0xf0, 0x29, 0x12, 0xf1, 0xc2, 0xcd, 0xd1, 0xd1,
-	0x5d, 0x58, 0xe6, 0x56, 0xa6, 0x92, 0xc0, 0x24, 0x15, 0x2a, 0xda, 0x82, 0x76, 0xb2, 0x37, 0x01,
-	0x9e, 0x05, 0x26, 0xa8, 0x92, 0xd1, 0x7b, 0xb0, 0xc4, 0xf7, 0x26, 0x72, 0x8b, 0x4c, 0x2e, 0x4b,
-	0xa4, 0xf7, 0x2b, 0x7c, 0xa1, 0x54, 0x7d, 0x89, 0xdf, 0xaf, 0x44, 0xa2, 0x31, 0xeb, 0xbe, 0x0e,
-	0xb1, 0xbe, 0xcc, 0x63, 0x46, 0xff, 0x53, 0x68, 0xe4, 0x22, 0x67, 0xb1, 0x1d, 0x8f, 0x89, 0xde,
-	0x66, 0xbc, 0x0c, 0x6d, 0x22, 0x63, 0x61, 0x32, 0xf6, 0x62, 0x7d, 0x45, 0x96, 0xe1, 0x34, 0x73,
-	0x04, 0xb7, 0x4a, 0x52, 0x83, 0x66, 0x06, 0xba, 0x01, 0xcd, 0xfd, 0x60, 0xec, 0xc7, 0xa2, 0x98,
-	0xf9, 0x02, 0x3d, 0x84, 0x06, 0xb3, 0xb5, 0xc6, 0x2a, 0x75, 0x2b, 0x69, 0x09, 0xd3, 0x52, 0xcc,
-	0x62, 0xbb, 0xcc, 0x1f, 0xb5, 0x52, 0x9d, 0x97, 0x84, 0x90, 0x0f, 0xa1, 0x41, 0x95, 0x08, 0xbc,
-	0x34, 0xab, 0xed, 0xa1, 0x92, 0x16, 0x93, 0x37, 0xff, 0xd1, 0x60, 0xad, 0x1b, 0xd9, 0x3e, 0x79,
-	0x89, 0x23, 0x26, 0x7a, 0x7a, 0xe1, 0xe3, 0x88, 0x16, 0xa4, 0x94, 0xfc, 0x5a, 0x36, 0xf9, 0xef,
-	0xc2, 0xf2, 0xa9, 0xe7, 0x30, 0xc1, 0x0c, 0x58, 0x28, 0x54, 0x2a, 0x77, 0x82, 0x2f, 0x64, 0x39,
-	0x5e, 0x28, 0x0a, 0x75, 0x3a, 0x74, 0x64, 0xc0, 0xa1, 0xa9, 0x80, 0xf0, 0x1f, 0x1a, 0x2c, 0x7e,
-	0x12, 0xb8, 0x7e, 0xda, 0xb7, 0xcb, 0x0d, 0xe7, 0x55, 0x76, 0x8c, 0x09, 0xb1, 0xfb, 0x49, 0x3f,
-	0x96, 0x28, 0x57, 0xc7, 0xb8, 0x4a, 0x43, 0x7f, 0xa9, 0xc1, 0x2d, 0xf5, 0x36, 0xe8, 0x6d, 0x07,
-	0x3e, 0xc1, 0xa2, 0x5b, 0xc9, 0xa7, 0x6b, 0xd5, 0xa7, 0xab, 0xf8, 0x2c, 0x79, 0x5d, 0xaf, 0xc2,
-	0xaa, 0x46, 0x25, 0x56, 0x5d, 0x53, 0xb0, 0x4a, 0xc2, 0x15, 0xc8, 0xe2, 0x4a, 0x16, 0x91, 0x16,
-	0x73, 0x88, 0xa4, 0x56, 0x5e, 0xbb, 0xa0, 0xf2, 0xfe, 0xd4, 0x40, 0x3f, 0xc3, 0x31, 0xcb, 0x05,
-	0x3e, 0x16, 0xb9, 0xbd, 0x01, 0x1d, 0x8d, 0xaa, 0xaf, 0xd1, 0x80, 0xf9, 0x14, 0xa0, 0x44, 0x18,
-	0x52, 0x68, 0x52, 0x82, 0x58, 0x9f, 0xd6, 0x2a, 0x0a, 0xc3, 0x51, 0x7a, 0x85, 0x3f, 0x68, 0xb0,
-	0xf8, 0x6c, 0xec, 0xc6, 0x33, 0xe4, 0xda, 0x95, 0x7b, 0x56, 0xc6, 0x90, 0x86, 0x62, 0xc8, 0x6f,
-	0x1a, 0xac, 0x25, 0xc5, 0x3d, 0x99, 0x37, 0xa7, 0x86, 0xad, 0x34, 0x7b, 0xa6, 0x87, 0x6d, 0x1d,
-	0xe6, 0x8e, 0x5c, 0x2f, 0xc6, 0x11, 0xb3, 0xa5, 0x69, 0x89, 0x15, 0xd5, 0x77, 0x82, 0x5f, 0xc5,
-	0x67, 0x78, 0x24, 0x1a, 0x5a, 0xb2, 0xa4, 0x85, 0xb9, 0x5e, 0x64, 0xe3, 0xa5, 0xf0, 0xed, 0x11,
-	0xc0, 0x70, 0x32, 0x88, 0xf3, 0xf9, 0x68, 0x33, 0x3f, 0xd1, 0x70, 0x3d, 0x47, 0x63, 0xcf, 0x63,
-	0xb3, 0x8d, 0xb4, 0x87, 0xea, 0xf4, 0x85, 0xa1, 0xdc, 0x83, 0x64, 0x69, 0xbe, 0xc9, 0x19, 0x9a,
-	0x4e, 0x90, 0x95, 0x58, 0x22, 0x19, 0x54, 0x63, 0xa3, 0xa5, 0xac, 0xae, 0x62, 0x6e, 0x9c, 0x61,
-	0x56, 0xfa, 0x59, 0x83, 0x9b, 0x85, 0x26, 0xbd, 0x9d, 0xe0, 0x99, 0x7f, 0x69, 0x80, 0x3e, 0x75,
-	0x7b, 0x03, 0x49, 0xae, 0x3a, 0x3c, 0xf7, 0x60, 0x85, 0xca, 0xf3, 0xf6, 0x2d, 0xe6, 0x6f, 0x1e,
-	0xa4, 0x1c, 0x9d, 0x9a, 0x6d, 0x61, 0x9b, 0xa4, 0x2f, 0x20, 0xb1, 0x52, 0xc3, 0xd4, 0xac, 0x06,
-	0xc4, 0x39, 0xa5, 0x44, 0x1e, 0x40, 0xab, 0xe3, 0xec, 0x72, 0xa4, 0x29, 0x7d, 0x0a, 0x32, 0xd5,
-	0x0c, 0x9f, 0xf8, 0x63, 0x50, 0xac, 0xcc, 0x6f, 0xe0, 0x7a, 0xce, 0xdd, 0x4b, 0xf6, 0xe5, 0xa5,
-	0xd4, 0x0a, 0x29, 0xfa, 0x2b, 0xa2, 0x41, 0xa7, 0x3c, 0x2b, 0x2b, 0x66, 0x8e, 0x59, 0x7d, 0xd3,
-	0xbe, 0x86, 0x1d, 0x66, 0x45, 0x52, 0xdf, 0x59, 0xd4, 0xd0, 0x8a, 0x7a, 0x54, 0x90, 0xc7, 0x9d,
-	0x60, 0xc6, 0x17, 0xcd, 0xb7, 0xbc, 0x14, 0x72, 0x7a, 0xaf, 0xf4, 0x90, 0x9b, 0xe1, 0x49, 0x33,
-	0x11, 0x34, 0xff, 0xd6, 0xe0, 0x46, 0xc7, 0xff, 0xca, 0x8d, 0x31, 0xb5, 0xa9, 0x1b, 0xa4, 0x58,
-	0x3b, 0x1d, 0x51, 0xcb, 0x7b, 0xe0, 0x24, 0xc5, 0x1a, 0x99, 0x14, 0x7b, 0x1f, 0x56, 0xb9, 0x2e,
-	0x39, 0x4f, 0x9b, 0x2c, 0x4f, 0xf3, 0x8c, 0xca, 0x74, 0xfb, 0x4e, 0x83, 0xb5, 0x02, 0xb3, 0xff,
-	0xd7, 0xa4, 0xf1, 0xe1, 0x46, 0x3a, 0xf1, 0x79, 0xde, 0x2c, 0x65, 0x7a, 0xa5, 0x9e, 0x60, 0xfe,
-	0x24, 0x75, 0x21, 0x49, 0xe1, 0xdb, 0xc1, 0xa8, 0xdd, 0x37, 0xf3, 0xc0, 0xbf, 0x38, 0xa1, 0x87,
-	0xb0, 0xd0, 0x9b, 0x7c, 0x86, 0x40, 0x6b, 0x22, 0x6e, 0xd9, 0xef, 0x3b, 0xc6, 0x7a, 0x11, 0x99,
-	0x84, 0xe8, 0x3e, 0xb4, 0xbe, 0x4c, 0xe6, 0x49, 0x74, 0x5d, 0x08, 0xc9, 0x13, 0xa6, 0xb1, 0x9a,
-	0xec, 0x9c, 0x7c, 0xb3, 0xba, 0x0f, 0xad, 0x51, 0x32, 0x18, 0xa4, 0x9b, 0xe4, 0x51, 0xa1, 0x68,
-	0xd3, 0x63, 0x58, 0xea, 0xcb, 0x9f, 0x0f, 0xd0, 0x4d, 0x65, 0x6e, 0x4f, 0xfa, 0x90, 0xa1, 0x17,
-	0x33, 0x48, 0x88, 0x3e, 0x82, 0x45, 0x22, 0x3d, 0xfe, 0x51, 0xe2, 0x95, 0xf2, 0x45, 0xa0, 0x48,
-	0xfd, 0x17, 0x70, 0xb3, 0x5f, 0xfc, 0x40, 0x40, 0x77, 0xaa, 0x1f, 0x10, 0xf4, 0x40, 0x73, 0x9a,
-	0x08, 0x09, 0xd1, 0x21, 0xa0, 0x38, 0xf7, 0xb8, 0x40, 0x1b, 0x62, 0x67, 0xe1, 0xbb, 0xa3, 0xc8,
-	0xd0, 0x67, 0xa0, 0xf7, 0x4b, 0x06, 0x67, 0x64, 0x66, 0xbe, 0xc6, 0x15, 0x4e, 0xd6, 0xc5, 0x47,
-	0xa2, 0x7e, 0x6e, 0x36, 0x49, 0x2d, 0x2b, 0x1c, 0xad, 0x8c, 0x77, 0x2b, 0xb8, 0x24, 0x44, 0x5d,
-	0xb8, 0xde, 0xcf, 0xb7, 0x6c, 0x54, 0xbc, 0x2b, 0xbd, 0xd9, 0xdb, 0x55, 0x6c, 0x12, 0xa2, 0xa7,
-	0xd0, 0x1e, 0x64, 0x3b, 0x11, 0x4a, 0x3e, 0x40, 0xe6, 0x1b, 0xb2, 0x61, 0x94, 0xb1, 0x52, 0x97,
-	0x15, 0x68, 0x97, 0x5d, 0xce, 0x77, 0x1b, 0xd9, 0xe5, 0xa2, 0x9e, 0x70, 0x02, 0xab, 0xae, 0x8a,
-	0x79, 0xe8, 0x56, 0x02, 0x53, 0x05, 0x20, 0x6e, 0x6c, 0x94, 0x33, 0xf9, 0x79, 0x7d, 0x15, 0x4f,
-	0xd2, 0xf3, 0x8a, 0xa0, 0xcd, 0xd8, 0x28, 0x67, 0x92, 0xf0, 0x71, 0xfb, 0xf3, 0xa5, 0x6d, 0xfe,
-	0x49, 0xfa, 0x01, 0xfb, 0x7d, 0x31, 0xc7, 0xbe, 0x37, 0xdf, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff,
-	0x77, 0xc5, 0xd1, 0xfe, 0xae, 0x16, 0x00, 0x00,
+func init() { proto.RegisterFile("group/group.proto", fileDescriptor_group_95297d6a59bab850) }
+
+var fileDescriptor_group_95297d6a59bab850 = []byte{
+	// 1464 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xcd, 0x6f, 0x1b, 0x45,
+	0x14, 0xd7, 0xfa, 0x23, 0x8d, 0x5f, 0xbe, 0x9c, 0x69, 0x93, 0x2e, 0xdb, 0x50, 0xb9, 0x2b, 0x54,
+	0x45, 0x15, 0x4a, 0xa4, 0x14, 0x21, 0xa1, 0x46, 0xa8, 0x69, 0x3e, 0x5a, 0x03, 0x71, 0xd4, 0x8d,
+	0x7b, 0xe1, 0x12, 0xb6, 0xde, 0x89, 0xb5, 0x78, 0xbd, 0xbb, 0xde, 0x59, 0x93, 0x96, 0x0b, 0x20,
+	0x04, 0x1c, 0x10, 0xa2, 0x57, 0x8e, 0x5c, 0x38, 0x22, 0x0e, 0xdc, 0x39, 0xf0, 0x8f, 0xa1, 0xf9,
+	0xd8, 0xf5, 0xec, 0xa7, 0x2d, 0x47, 0xa2, 0x17, 0xcb, 0xf3, 0xde, 0x9b, 0x79, 0x1f, 0xf3, 0xde,
+	0xef, 0xbd, 0x59, 0x58, 0xef, 0x07, 0xde, 0xd8, 0xdf, 0x65, 0xbf, 0x3b, 0x7e, 0xe0, 0x85, 0x1e,
+	0xaa, 0xb3, 0x85, 0x76, 0xef, 0xcc, 0xc7, 0xee, 0x45, 0xfb, 0x74, 0xd7, 0x1f, 0xf4, 0x77, 0x19,
+	0x67, 0x97, 0x58, 0x83, 0x8b, 0x2b, 0xb2, 0x7b, 0x45, 0xb8, 0xa4, 0xfe, 0x31, 0xc0, 0xa1, 0x37,
+	0x1c, 0x7a, 0xae, 0x81, 0x89, 0x8f, 0x54, 0xb8, 0x71, 0x1c, 0x04, 0x87, 0x9e, 0x85, 0x55, 0xa5,
+	0xa5, 0x6c, 0xd7, 0x8d, 0x68, 0x89, 0x36, 0x61, 0xe1, 0x38, 0x08, 0x4e, 0x49, 0x5f, 0xad, 0xb4,
+	0x94, 0xed, 0x86, 0x21, 0x56, 0xfa, 0x63, 0x40, 0x4f, 0xa9, 0xae, 0x03, 0xcb, 0x3a, 0xc5, 0xc3,
+	0x97, 0x38, 0x68, 0xbb, 0x97, 0x1e, 0x95, 0x7e, 0x41, 0x70, 0xd0, 0x3e, 0x62, 0xc7, 0x34, 0x0c,
+	0xb1, 0x42, 0x08, 0x6a, 0x86, 0xe7, 0x60, 0x76, 0x46, 0xdd, 0x60, 0xff, 0xf5, 0x7f, 0x2b, 0xb0,
+	0x7a, 0x18, 0x60, 0x33, 0xc4, 0xec, 0x20, 0x03, 0x8f, 0xd0, 0x01, 0xac, 0xb6, 0x5d, 0x3b, 0xe4,
+	0x07, 0x7e, 0x66, 0x93, 0x50, 0x55, 0x5a, 0xd5, 0xed, 0xa5, 0xbd, 0x77, 0x76, 0xb8, 0x93, 0x59,
+	0x8d, 0x46, 0x6a, 0x03, 0xda, 0x82, 0x06, 0x93, 0xea, 0x98, 0x43, 0x2c, 0x4c, 0x9e, 0x10, 0x90,
+	0x0e, 0xcb, 0x6d, 0x37, 0x0c, 0x3c, 0x6b, 0xdc, 0x0b, 0x6d, 0xcf, 0x55, 0xab, 0x4c, 0x20, 0x41,
+	0xa3, 0x32, 0x1d, 0x2f, 0xb4, 0x2f, 0xed, 0x9e, 0xc9, 0x64, 0x6a, 0x5c, 0x46, 0xa6, 0xd1, 0x78,
+	0x9d, 0x98, 0x3d, 0xfc, 0x22, 0x70, 0xd4, 0x3a, 0x63, 0x47, 0x4b, 0xd4, 0x84, 0xea, 0xf1, 0xab,
+	0x50, 0x5d, 0x60, 0x54, 0xfa, 0x17, 0xb5, 0x60, 0xe9, 0xcc, 0xc7, 0x01, 0xdb, 0xd8, 0x3e, 0x52,
+	0x6f, 0x30, 0x8e, 0x4c, 0x42, 0x1a, 0x2c, 0x9e, 0xf9, 0x22, 0x6e, 0x8b, 0x8c, 0x1d, 0xaf, 0xd1,
+	0x5d, 0x80, 0x93, 0xc0, 0x1b, 0x0a, 0x6e, 0x83, 0x71, 0x25, 0x8a, 0xfe, 0x1a, 0xd6, 0x12, 0x41,
+	0x9c, 0xe7, 0x32, 0xd1, 0x07, 0x22, 0x68, 0x34, 0xa2, 0x2c, 0x26, 0x4b, 0x7b, 0x9b, 0x3b, 0x1e,
+	0xcd, 0x21, 0x7b, 0x78, 0x41, 0xac, 0xc1, 0x4e, 0xcc, 0x35, 0x26, 0x82, 0x7a, 0x00, 0xcd, 0xa7,
+	0x38, 0x64, 0x6b, 0xc2, 0x78, 0x78, 0x44, 0x9d, 0xe5, 0x02, 0x47, 0xf1, 0xf5, 0x35, 0x0c, 0x99,
+	0x94, 0x0e, 0x47, 0xa5, 0x3c, 0x1c, 0xd5, 0x64, 0x38, 0xf4, 0xef, 0x15, 0x58, 0x4f, 0x29, 0x9d,
+	0xcb, 0xe3, 0x7d, 0x58, 0x89, 0x1d, 0x61, 0x96, 0x56, 0x59, 0xa2, 0x15, 0x79, 0x9d, 0x14, 0xd6,
+	0x7f, 0x50, 0x60, 0xed, 0x5c, 0x58, 0x11, 0x79, 0x9e, 0x88, 0xa1, 0x32, 0x63, 0x0c, 0x13, 0xbe,
+	0x56, 0x52, 0x57, 0x9f, 0x8a, 0x54, 0x35, 0x13, 0x29, 0xfd, 0x6b, 0xd0, 0xa2, 0x60, 0x1c, 0xf8,
+	0xbe, 0x23, 0xb2, 0x93, 0x9a, 0x48, 0x2d, 0x92, 0xcf, 0x56, 0xca, 0xcf, 0xce, 0xb9, 0x85, 0x64,
+	0xe2, 0x55, 0x33, 0x89, 0xf7, 0x5b, 0x0d, 0xee, 0x15, 0x28, 0xbf, 0x38, 0x32, 0x43, 0xf3, 0x82,
+	0xca, 0xa1, 0x55, 0xa8, 0xc4, 0xda, 0x2b, 0xed, 0x23, 0x7a, 0x53, 0x22, 0x19, 0x84, 0xce, 0x68,
+	0x39, 0x4d, 0x1f, 0xf5, 0xa6, 0xeb, 0x09, 0x2e, 0x2f, 0xc9, 0x78, 0x4d, 0xe1, 0xe5, 0xc4, 0x31,
+	0xfb, 0xac, 0x16, 0xeb, 0x06, 0xfb, 0x4f, 0xcf, 0x33, 0xf0, 0x68, 0x8c, 0x49, 0x48, 0x6f, 0x9f,
+	0xd7, 0xa3, 0x44, 0xa1, 0xfc, 0x67, 0xa6, 0x6b, 0x39, 0xd8, 0xa2, 0x7c, 0x5e, 0x95, 0x12, 0x85,
+	0x5a, 0x7a, 0x60, 0x59, 0x5d, 0x7b, 0x88, 0x59, 0x4d, 0x56, 0x8d, 0x68, 0x89, 0x1e, 0x40, 0x33,
+	0xb2, 0xab, 0x63, 0xf7, 0x06, 0x2e, 0x45, 0x1a, 0x5e, 0x98, 0x19, 0x3a, 0xba, 0x0f, 0xab, 0xdc,
+	0xca, 0x58, 0x12, 0x98, 0x64, 0x8a, 0x8a, 0xb6, 0x61, 0x2d, 0xda, 0x1b, 0x01, 0xcb, 0x12, 0x13,
+	0x4c, 0x93, 0xd1, 0x7b, 0xb0, 0xc2, 0xf7, 0x46, 0x72, 0xcb, 0x4c, 0x2e, 0x49, 0xa4, 0xf7, 0x2b,
+	0x7c, 0xa1, 0x54, 0x75, 0x85, 0xdf, 0xaf, 0x44, 0xa2, 0x31, 0xeb, 0xbe, 0xf6, 0xb1, 0xba, 0xca,
+	0x63, 0x46, 0xff, 0x53, 0xe8, 0xe3, 0x22, 0xe7, 0xa1, 0x19, 0x8e, 0x89, 0xba, 0xc6, 0x78, 0x09,
+	0xda, 0x44, 0xc6, 0xc0, 0x64, 0xec, 0x84, 0x6a, 0x53, 0x96, 0xe1, 0x34, 0x7d, 0x04, 0x77, 0x0a,
+	0x52, 0x83, 0x66, 0x06, 0xba, 0x05, 0xf5, 0x43, 0x6f, 0xec, 0x86, 0xa2, 0x58, 0xf9, 0x02, 0xed,
+	0x43, 0x8d, 0xd9, 0x5a, 0x61, 0x95, 0xb8, 0x1d, 0x41, 0xfe, 0xb4, 0x14, 0x33, 0xd8, 0x2e, 0xfd,
+	0x27, 0xa5, 0x50, 0xe7, 0x9c, 0x10, 0xf1, 0x21, 0xd4, 0xa8, 0x12, 0x81, 0x87, 0x7a, 0xb9, 0x3d,
+	0x54, 0xd2, 0x60, 0xf2, 0xfa, 0x3f, 0x0a, 0x6c, 0x74, 0x03, 0xd3, 0x25, 0x97, 0x38, 0x60, 0xa2,
+	0x67, 0x57, 0x2e, 0x0e, 0x68, 0x41, 0x4a, 0xc9, 0xaf, 0x24, 0x93, 0xff, 0x3e, 0xac, 0x9e, 0x39,
+	0x16, 0x13, 0x4c, 0x80, 0x41, 0x8a, 0x4a, 0xe5, 0x3a, 0xf8, 0x4a, 0x96, 0xe3, 0x85, 0x92, 0xa2,
+	0xa6, 0xcb, 0xbb, 0x56, 0x0e, 0xb2, 0xf5, 0x14, 0xc8, 0xfe, 0xa8, 0xc0, 0xf2, 0x27, 0x9e, 0xed,
+	0xc6, 0x7d, 0xb9, 0xd8, 0x70, 0x5e, 0x65, 0xa7, 0x98, 0x10, 0xb3, 0x1f, 0xf5, 0x5b, 0x89, 0x52,
+	0x86, 0xe5, 0xd3, 0x8d, 0xd4, 0x7f, 0xad, 0xc0, 0x9d, 0x74, 0xb4, 0xe9, 0x6d, 0x7a, 0x2e, 0xc1,
+	0xa2, 0xdb, 0xc8, 0x27, 0x28, 0xe5, 0x6e, 0xa6, 0xf1, 0x55, 0xf2, 0xaa, 0x5a, 0x86, 0x45, 0xb5,
+	0x52, 0x2c, 0xaa, 0xa7, 0xb0, 0x48, 0xc2, 0x8d, 0x85, 0x24, 0x6e, 0x4c, 0x43, 0x9c, 0x74, 0x65,
+	0x2d, 0xe6, 0x54, 0xd6, 0x9f, 0x0a, 0xa8, 0xe7, 0x38, 0x64, 0x77, 0xcd, 0xc7, 0x1a, 0xbb, 0x37,
+	0xa0, 0xa3, 0x4d, 0xf9, 0x35, 0x69, 0xb0, 0x18, 0x03, 0x90, 0x08, 0x43, 0x0c, 0x3d, 0x53, 0xdb,
+	0xcc, 0x2c, 0xe1, 0x28, 0xcc, 0xa5, 0x4b, 0x58, 0x7e, 0x3e, 0xb6, 0xc3, 0x19, 0x52, 0xe9, 0x7a,
+	0x83, 0xc1, 0xef, 0x0a, 0x6c, 0x44, 0xb5, 0x39, 0x19, 0x07, 0xa7, 0x46, 0x65, 0xfe, 0xe6, 0x4b,
+	0x71, 0xe3, 0xc4, 0x76, 0x42, 0x1c, 0xb0, 0x88, 0xd4, 0x0d, 0xb1, 0xa2, 0xfa, 0x3a, 0xf8, 0x55,
+	0x78, 0x8e, 0x47, 0xa2, 0x1f, 0x45, 0x4b, 0xfd, 0x0f, 0x05, 0x36, 0xf3, 0x6c, 0x9c, 0x0b, 0x9e,
+	0x1e, 0x03, 0x0c, 0x27, 0x73, 0x32, 0x1f, 0x5f, 0x5a, 0xd9, 0x81, 0x83, 0xeb, 0x39, 0x19, 0x3b,
+	0x0e, 0x1b, 0x3d, 0xa4, 0x3d, 0x54, 0xa7, 0x2b, 0x0c, 0xe5, 0x1e, 0x44, 0x4b, 0xfd, 0x4d, 0xc6,
+	0xd0, 0x78, 0xc0, 0x2b, 0x85, 0x02, 0xc9, 0xa0, 0x0a, 0x9b, 0xfc, 0x64, 0x75, 0xd7, 0x83, 0x82,
+	0x5f, 0x14, 0xb8, 0x9d, 0x6b, 0xd2, 0xdb, 0x09, 0x9e, 0xfe, 0x97, 0x02, 0xe8, 0x53, 0xbb, 0x37,
+	0x90, 0xe4, 0xca, 0xc3, 0xf3, 0x00, 0x9a, 0x54, 0x9e, 0x77, 0x5f, 0x31, 0x1e, 0xf3, 0x20, 0x65,
+	0xe8, 0xd4, 0x6c, 0x03, 0x9b, 0x24, 0x7e, 0xa0, 0x88, 0x55, 0x3a, 0x4c, 0xf5, 0xf2, 0x12, 0x59,
+	0x48, 0x95, 0xc8, 0x23, 0x68, 0xb4, 0xad, 0x3d, 0x0e, 0x24, 0x85, 0x2f, 0x35, 0xa6, 0x9a, 0xc1,
+	0x0f, 0x7f, 0xab, 0x89, 0x95, 0xfe, 0x0d, 0xdc, 0xcc, 0xb8, 0x3b, 0x67, 0x5b, 0x5d, 0x89, 0xad,
+	0x90, 0xa2, 0xdf, 0x14, 0xfd, 0x35, 0xe6, 0x19, 0x49, 0x31, 0x7d, 0xcc, 0xea, 0x9b, 0xb6, 0x25,
+	0x6c, 0x31, 0x2b, 0xa2, 0xfa, 0x4e, 0xa2, 0x93, 0x92, 0x41, 0xa7, 0x16, 0x2c, 0x79, 0x59, 0x5c,
+	0xf1, 0x66, 0xc4, 0x95, 0x6f, 0x79, 0x29, 0x64, 0xf4, 0x5e, 0xeb, 0x9d, 0x35, 0xc3, 0x8b, 0x63,
+	0x22, 0xa8, 0xff, 0xad, 0xc0, 0xad, 0xb6, 0xfb, 0x95, 0x1d, 0x62, 0x6a, 0x53, 0xd7, 0x8b, 0xb1,
+	0x74, 0x3a, 0x62, 0x16, 0xb7, 0xb8, 0x49, 0x8a, 0xd5, 0x12, 0x29, 0xf6, 0x3e, 0xac, 0x73, 0x5d,
+	0x72, 0x9e, 0xd6, 0x59, 0x9e, 0x66, 0x19, 0xa5, 0xe9, 0xf6, 0x9d, 0x02, 0x1b, 0x39, 0x66, 0xff,
+	0xaf, 0x49, 0xe3, 0xc2, 0xad, 0x78, 0x60, 0x73, 0x9c, 0x59, 0xca, 0xf4, 0x7a, 0x0f, 0xb2, 0x9f,
+	0xa5, 0x2e, 0x24, 0x29, 0x7c, 0x3b, 0x18, 0xb5, 0xf7, 0x66, 0x11, 0xf8, 0x07, 0x21, 0xb4, 0x0f,
+	0x4b, 0xbd, 0xc9, 0x57, 0x02, 0xb4, 0x21, 0xe2, 0x96, 0xfc, 0xfc, 0xa2, 0x6d, 0xe6, 0x91, 0x89,
+	0x8f, 0x1e, 0x42, 0xe3, 0xcb, 0x68, 0x1c, 0x44, 0x37, 0x85, 0x90, 0x3c, 0x20, 0x6a, 0xeb, 0xd1,
+	0xce, 0xc9, 0x27, 0xa5, 0x87, 0xd0, 0x18, 0x45, 0x8d, 0x3f, 0xde, 0x24, 0x8f, 0x02, 0x79, 0x9b,
+	0x9e, 0xc0, 0x4a, 0x5f, 0x7e, 0xdd, 0xa3, 0xdb, 0xa9, 0xb1, 0x3b, 0xea, 0x43, 0x9a, 0x9a, 0xcf,
+	0x20, 0x3e, 0xfa, 0x08, 0x96, 0x89, 0xf4, 0x36, 0x47, 0x91, 0x57, 0xa9, 0x07, 0x7b, 0x9e, 0xfa,
+	0x2f, 0xe0, 0x76, 0x3f, 0x7f, 0xbe, 0x47, 0xf7, 0xca, 0xe7, 0x7f, 0x7a, 0xa0, 0x3e, 0x4d, 0x84,
+	0xf8, 0xe8, 0x18, 0x50, 0x98, 0x79, 0x1b, 0xa0, 0x2d, 0xb1, 0x33, 0xf7, 0xd9, 0x90, 0x67, 0xe8,
+	0x73, 0x50, 0xfb, 0x05, 0x73, 0x31, 0xd2, 0x13, 0x1f, 0xcb, 0x72, 0x07, 0xe7, 0xfc, 0x23, 0x51,
+	0x3f, 0x33, 0x9b, 0xc4, 0x96, 0xe5, 0x8e, 0x56, 0xda, 0xbb, 0x25, 0x5c, 0xe2, 0xa3, 0x2e, 0xdc,
+	0xec, 0x67, 0x5b, 0x36, 0xca, 0xdf, 0x15, 0xdf, 0xec, 0xdd, 0x32, 0x36, 0xf1, 0xd1, 0x33, 0x58,
+	0x1b, 0x24, 0x3b, 0x11, 0x8a, 0xbe, 0x0f, 0x66, 0x1b, 0xb2, 0xa6, 0x15, 0xb1, 0x62, 0x97, 0x53,
+	0xd0, 0x2e, 0xbb, 0x9c, 0xed, 0x36, 0xb2, 0xcb, 0x79, 0x3d, 0xa1, 0x03, 0xeb, 0x76, 0x1a, 0xf3,
+	0xd0, 0x9d, 0x08, 0xa6, 0x72, 0x40, 0x5c, 0xdb, 0x2a, 0x66, 0xf2, 0xf3, 0xfa, 0x69, 0x3c, 0x89,
+	0xcf, 0xcb, 0x83, 0x36, 0x6d, 0xab, 0x98, 0x49, 0xfc, 0x27, 0x6b, 0x9f, 0xaf, 0xec, 0xf0, 0x2f,
+	0xc6, 0x8f, 0xd8, 0xef, 0xcb, 0x05, 0xf6, 0x39, 0xf8, 0xe1, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0x22, 0xaf, 0xfb, 0xc7, 0x4d, 0x16, 0x00, 0x00,
 }
diff --git a/pkg/proto/sdk_ws/ws.pb.go b/pkg/proto/sdk_ws/ws.pb.go
index 6809ce398..979e03888 100644
--- a/pkg/proto/sdk_ws/ws.pb.go
+++ b/pkg/proto/sdk_ws/ws.pb.go
@@ -34,7 +34,7 @@ func (m *PullMessageBySeqListResp) Reset()         { *m = PullMessageBySeqListRe
 func (m *PullMessageBySeqListResp) String() string { return proto.CompactTextString(m) }
 func (*PullMessageBySeqListResp) ProtoMessage()    {}
 func (*PullMessageBySeqListResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{0}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{0}
 }
 func (m *PullMessageBySeqListResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_PullMessageBySeqListResp.Unmarshal(m, b)
@@ -109,7 +109,7 @@ func (m *PullMessageBySeqListReq) Reset()         { *m = PullMessageBySeqListReq
 func (m *PullMessageBySeqListReq) String() string { return proto.CompactTextString(m) }
 func (*PullMessageBySeqListReq) ProtoMessage()    {}
 func (*PullMessageBySeqListReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{1}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{1}
 }
 func (m *PullMessageBySeqListReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_PullMessageBySeqListReq.Unmarshal(m, b)
@@ -164,7 +164,7 @@ func (m *PullMessageReq) Reset()         { *m = PullMessageReq{} }
 func (m *PullMessageReq) String() string { return proto.CompactTextString(m) }
 func (*PullMessageReq) ProtoMessage()    {}
 func (*PullMessageReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{2}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{2}
 }
 func (m *PullMessageReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_PullMessageReq.Unmarshal(m, b)
@@ -228,7 +228,7 @@ func (m *PullMessageResp) Reset()         { *m = PullMessageResp{} }
 func (m *PullMessageResp) String() string { return proto.CompactTextString(m) }
 func (*PullMessageResp) ProtoMessage()    {}
 func (*PullMessageResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{3}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{3}
 }
 func (m *PullMessageResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_PullMessageResp.Unmarshal(m, b)
@@ -300,7 +300,7 @@ func (m *GetMaxAndMinSeqReq) Reset()         { *m = GetMaxAndMinSeqReq{} }
 func (m *GetMaxAndMinSeqReq) String() string { return proto.CompactTextString(m) }
 func (*GetMaxAndMinSeqReq) ProtoMessage()    {}
 func (*GetMaxAndMinSeqReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{4}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{4}
 }
 func (m *GetMaxAndMinSeqReq) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetMaxAndMinSeqReq.Unmarshal(m, b)
@@ -332,7 +332,7 @@ func (m *GetMaxAndMinSeqResp) Reset()         { *m = GetMaxAndMinSeqResp{} }
 func (m *GetMaxAndMinSeqResp) String() string { return proto.CompactTextString(m) }
 func (*GetMaxAndMinSeqResp) ProtoMessage()    {}
 func (*GetMaxAndMinSeqResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{5}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{5}
 }
 func (m *GetMaxAndMinSeqResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetMaxAndMinSeqResp.Unmarshal(m, b)
@@ -380,7 +380,7 @@ func (m *GatherFormat) Reset()         { *m = GatherFormat{} }
 func (m *GatherFormat) String() string { return proto.CompactTextString(m) }
 func (*GatherFormat) ProtoMessage()    {}
 func (*GatherFormat) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{6}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{6}
 }
 func (m *GatherFormat) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GatherFormat.Unmarshal(m, b)
@@ -427,7 +427,7 @@ func (m *UserSendMsgResp) Reset()         { *m = UserSendMsgResp{} }
 func (m *UserSendMsgResp) String() string { return proto.CompactTextString(m) }
 func (*UserSendMsgResp) ProtoMessage()    {}
 func (*UserSendMsgResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{7}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{7}
 }
 func (m *UserSendMsgResp) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_UserSendMsgResp.Unmarshal(m, b)
@@ -496,7 +496,7 @@ func (m *MsgData) Reset()         { *m = MsgData{} }
 func (m *MsgData) String() string { return proto.CompactTextString(m) }
 func (*MsgData) ProtoMessage()    {}
 func (*MsgData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{8}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{8}
 }
 func (m *MsgData) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_MsgData.Unmarshal(m, b)
@@ -657,7 +657,7 @@ func (m *OfflinePushInfo) Reset()         { *m = OfflinePushInfo{} }
 func (m *OfflinePushInfo) String() string { return proto.CompactTextString(m) }
 func (*OfflinePushInfo) ProtoMessage()    {}
 func (*OfflinePushInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{9}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{9}
 }
 func (m *OfflinePushInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_OfflinePushInfo.Unmarshal(m, b)
@@ -732,7 +732,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_ws_3380b8a9bc5ee255, []int{10}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{10}
 }
 func (m *GroupInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupInfo.Unmarshal(m, b)
@@ -834,7 +834,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_ws_3380b8a9bc5ee255, []int{11}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{11}
 }
 func (m *GroupMemberFullInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupMemberFullInfo.Unmarshal(m, b)
@@ -929,7 +929,7 @@ func (m *UserInfo) Reset()         { *m = UserInfo{} }
 func (m *UserInfo) String() string { return proto.CompactTextString(m) }
 func (*UserInfo) ProtoMessage()    {}
 func (*UserInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{12}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{12}
 }
 func (m *UserInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_UserInfo.Unmarshal(m, b)
@@ -1020,7 +1020,7 @@ func (m *PublicUserInfo) Reset()         { *m = PublicUserInfo{} }
 func (m *PublicUserInfo) String() string { return proto.CompactTextString(m) }
 func (*PublicUserInfo) ProtoMessage()    {}
 func (*PublicUserInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{13}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{13}
 }
 func (m *PublicUserInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_PublicUserInfo.Unmarshal(m, b)
@@ -1080,7 +1080,7 @@ func (m *TipsComm) Reset()         { *m = TipsComm{} }
 func (m *TipsComm) String() string { return proto.CompactTextString(m) }
 func (*TipsComm) ProtoMessage()    {}
 func (*TipsComm) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{14}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{14}
 }
 func (m *TipsComm) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TipsComm.Unmarshal(m, b)
@@ -1129,7 +1129,7 @@ func (m *MemberEnterTips) Reset()         { *m = MemberEnterTips{} }
 func (m *MemberEnterTips) String() string { return proto.CompactTextString(m) }
 func (*MemberEnterTips) ProtoMessage()    {}
 func (*MemberEnterTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{15}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{15}
 }
 func (m *MemberEnterTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_MemberEnterTips.Unmarshal(m, b)
@@ -1184,7 +1184,7 @@ func (m *MemberLeaveTips) Reset()         { *m = MemberLeaveTips{} }
 func (m *MemberLeaveTips) String() string { return proto.CompactTextString(m) }
 func (*MemberLeaveTips) ProtoMessage()    {}
 func (*MemberLeaveTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{16}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{16}
 }
 func (m *MemberLeaveTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_MemberLeaveTips.Unmarshal(m, b)
@@ -1226,20 +1226,20 @@ func (m *MemberLeaveTips) GetOperationTime() uint64 {
 }
 
 type MemberInvitedTips struct {
-	Group                *GroupInfo           `protobuf:"bytes,1,opt,name=Group" json:"Group,omitempty"`
-	OpUser               *GroupMemberFullInfo `protobuf:"bytes,2,opt,name=OpUser" json:"OpUser,omitempty"`
-	InvitedUser          *GroupMemberFullInfo `protobuf:"bytes,3,opt,name=InvitedUser" json:"InvitedUser,omitempty"`
-	OperationTime        uint64               `protobuf:"varint,4,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	Group                *GroupInfo             `protobuf:"bytes,1,opt,name=Group" json:"Group,omitempty"`
+	OpUser               *GroupMemberFullInfo   `protobuf:"bytes,2,opt,name=OpUser" json:"OpUser,omitempty"`
+	InvitedUserList      []*GroupMemberFullInfo `protobuf:"bytes,3,rep,name=InvitedUserList" json:"InvitedUserList,omitempty"`
+	OperationTime        uint64                 `protobuf:"varint,4,opt,name=OperationTime" json:"OperationTime,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
 }
 
 func (m *MemberInvitedTips) Reset()         { *m = MemberInvitedTips{} }
 func (m *MemberInvitedTips) String() string { return proto.CompactTextString(m) }
 func (*MemberInvitedTips) ProtoMessage()    {}
 func (*MemberInvitedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{17}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{17}
 }
 func (m *MemberInvitedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_MemberInvitedTips.Unmarshal(m, b)
@@ -1273,9 +1273,9 @@ func (m *MemberInvitedTips) GetOpUser() *GroupMemberFullInfo {
 	return nil
 }
 
-func (m *MemberInvitedTips) GetInvitedUser() *GroupMemberFullInfo {
+func (m *MemberInvitedTips) GetInvitedUserList() []*GroupMemberFullInfo {
 	if m != nil {
-		return m.InvitedUser
+		return m.InvitedUserList
 	}
 	return nil
 }
@@ -1288,20 +1288,20 @@ func (m *MemberInvitedTips) GetOperationTime() uint64 {
 }
 
 type MemberKickedTips struct {
-	Group                *GroupInfo           `protobuf:"bytes,1,opt,name=Group" json:"Group,omitempty"`
-	OpUser               *GroupMemberFullInfo `protobuf:"bytes,2,opt,name=OpUser" json:"OpUser,omitempty"`
-	KickedUser           *GroupMemberFullInfo `protobuf:"bytes,3,opt,name=KickedUser" json:"KickedUser,omitempty"`
-	OperationTime        uint64               `protobuf:"varint,4,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	Group                *GroupInfo             `protobuf:"bytes,1,opt,name=Group" json:"Group,omitempty"`
+	OpUser               *GroupMemberFullInfo   `protobuf:"bytes,2,opt,name=OpUser" json:"OpUser,omitempty"`
+	KickedUserList       []*GroupMemberFullInfo `protobuf:"bytes,3,rep,name=KickedUserList" json:"KickedUserList,omitempty"`
+	OperationTime        uint64                 `protobuf:"varint,4,opt,name=OperationTime" json:"OperationTime,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
 }
 
 func (m *MemberKickedTips) Reset()         { *m = MemberKickedTips{} }
 func (m *MemberKickedTips) String() string { return proto.CompactTextString(m) }
 func (*MemberKickedTips) ProtoMessage()    {}
 func (*MemberKickedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{18}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{18}
 }
 func (m *MemberKickedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_MemberKickedTips.Unmarshal(m, b)
@@ -1335,9 +1335,9 @@ func (m *MemberKickedTips) GetOpUser() *GroupMemberFullInfo {
 	return nil
 }
 
-func (m *MemberKickedTips) GetKickedUser() *GroupMemberFullInfo {
+func (m *MemberKickedTips) GetKickedUserList() []*GroupMemberFullInfo {
 	if m != nil {
-		return m.KickedUser
+		return m.KickedUserList
 	}
 	return nil
 }
@@ -1364,7 +1364,7 @@ func (m *MemberInfoChangedTips) Reset()         { *m = MemberInfoChangedTips{} }
 func (m *MemberInfoChangedTips) String() string { return proto.CompactTextString(m) }
 func (*MemberInfoChangedTips) ProtoMessage()    {}
 func (*MemberInfoChangedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{19}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{19}
 }
 func (m *MemberInfoChangedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_MemberInfoChangedTips.Unmarshal(m, b)
@@ -1433,7 +1433,7 @@ func (m *GroupCreatedTips) Reset()         { *m = GroupCreatedTips{} }
 func (m *GroupCreatedTips) String() string { return proto.CompactTextString(m) }
 func (*GroupCreatedTips) ProtoMessage()    {}
 func (*GroupCreatedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{20}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{20}
 }
 func (m *GroupCreatedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupCreatedTips.Unmarshal(m, b)
@@ -1494,7 +1494,7 @@ func (m *GroupInfoChangedTips) Reset()         { *m = GroupInfoChangedTips{} }
 func (m *GroupInfoChangedTips) String() string { return proto.CompactTextString(m) }
 func (*GroupInfoChangedTips) ProtoMessage()    {}
 func (*GroupInfoChangedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{21}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{21}
 }
 func (m *GroupInfoChangedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GroupInfoChangedTips.Unmarshal(m, b)
@@ -1535,7 +1535,7 @@ func (m *GroupInfoChangedTips) GetOpUser() *GroupMemberFullInfo {
 	return nil
 }
 
-type ReceiveJoinApplicationTips struct {
+type JoinGroupApplicationTips struct {
 	Group                *GroupInfo      `protobuf:"bytes,1,opt,name=Group" json:"Group,omitempty"`
 	Applicant            *PublicUserInfo `protobuf:"bytes,2,opt,name=Applicant" json:"Applicant,omitempty"`
 	Reason               string          `protobuf:"bytes,3,opt,name=Reason" json:"Reason,omitempty"`
@@ -1544,45 +1544,45 @@ type ReceiveJoinApplicationTips struct {
 	XXX_sizecache        int32           `json:"-"`
 }
 
-func (m *ReceiveJoinApplicationTips) Reset()         { *m = ReceiveJoinApplicationTips{} }
-func (m *ReceiveJoinApplicationTips) String() string { return proto.CompactTextString(m) }
-func (*ReceiveJoinApplicationTips) ProtoMessage()    {}
-func (*ReceiveJoinApplicationTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{22}
+func (m *JoinGroupApplicationTips) Reset()         { *m = JoinGroupApplicationTips{} }
+func (m *JoinGroupApplicationTips) String() string { return proto.CompactTextString(m) }
+func (*JoinGroupApplicationTips) ProtoMessage()    {}
+func (*JoinGroupApplicationTips) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{22}
 }
-func (m *ReceiveJoinApplicationTips) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ReceiveJoinApplicationTips.Unmarshal(m, b)
+func (m *JoinGroupApplicationTips) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_JoinGroupApplicationTips.Unmarshal(m, b)
 }
-func (m *ReceiveJoinApplicationTips) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ReceiveJoinApplicationTips.Marshal(b, m, deterministic)
+func (m *JoinGroupApplicationTips) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_JoinGroupApplicationTips.Marshal(b, m, deterministic)
 }
-func (dst *ReceiveJoinApplicationTips) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ReceiveJoinApplicationTips.Merge(dst, src)
+func (dst *JoinGroupApplicationTips) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_JoinGroupApplicationTips.Merge(dst, src)
 }
-func (m *ReceiveJoinApplicationTips) XXX_Size() int {
-	return xxx_messageInfo_ReceiveJoinApplicationTips.Size(m)
+func (m *JoinGroupApplicationTips) XXX_Size() int {
+	return xxx_messageInfo_JoinGroupApplicationTips.Size(m)
 }
-func (m *ReceiveJoinApplicationTips) XXX_DiscardUnknown() {
-	xxx_messageInfo_ReceiveJoinApplicationTips.DiscardUnknown(m)
+func (m *JoinGroupApplicationTips) XXX_DiscardUnknown() {
+	xxx_messageInfo_JoinGroupApplicationTips.DiscardUnknown(m)
 }
 
-var xxx_messageInfo_ReceiveJoinApplicationTips proto.InternalMessageInfo
+var xxx_messageInfo_JoinGroupApplicationTips proto.InternalMessageInfo
 
-func (m *ReceiveJoinApplicationTips) GetGroup() *GroupInfo {
+func (m *JoinGroupApplicationTips) GetGroup() *GroupInfo {
 	if m != nil {
 		return m.Group
 	}
 	return nil
 }
 
-func (m *ReceiveJoinApplicationTips) GetApplicant() *PublicUserInfo {
+func (m *JoinGroupApplicationTips) GetApplicant() *PublicUserInfo {
 	if m != nil {
 		return m.Applicant
 	}
 	return nil
 }
 
-func (m *ReceiveJoinApplicationTips) GetReason() string {
+func (m *JoinGroupApplicationTips) GetReason() string {
 	if m != nil {
 		return m.Reason
 	}
@@ -1603,7 +1603,7 @@ func (m *ApplicationProcessedTips) Reset()         { *m = ApplicationProcessedTi
 func (m *ApplicationProcessedTips) String() string { return proto.CompactTextString(m) }
 func (*ApplicationProcessedTips) ProtoMessage()    {}
 func (*ApplicationProcessedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{23}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{23}
 }
 func (m *ApplicationProcessedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ApplicationProcessedTips.Unmarshal(m, b)
@@ -1666,7 +1666,7 @@ func (m *FriendInfo) Reset()         { *m = FriendInfo{} }
 func (m *FriendInfo) String() string { return proto.CompactTextString(m) }
 func (*FriendInfo) ProtoMessage()    {}
 func (*FriendInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{24}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{24}
 }
 func (m *FriendInfo) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FriendInfo.Unmarshal(m, b)
@@ -1727,7 +1727,7 @@ func (m *FriendApplication) Reset()         { *m = FriendApplication{} }
 func (m *FriendApplication) String() string { return proto.CompactTextString(m) }
 func (*FriendApplication) ProtoMessage()    {}
 func (*FriendApplication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{25}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{25}
 }
 func (m *FriendApplication) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FriendApplication.Unmarshal(m, b)
@@ -1768,22 +1768,65 @@ func (m *FriendApplication) GetAddWording() string {
 	return ""
 }
 
-// user1 add user2
+type FromToUserID struct {
+	FromUserID           string   `protobuf:"bytes,1,opt,name=FromUserID" json:"FromUserID,omitempty"`
+	ToUserID             string   `protobuf:"bytes,2,opt,name=ToUserID" json:"ToUserID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FromToUserID) Reset()         { *m = FromToUserID{} }
+func (m *FromToUserID) String() string { return proto.CompactTextString(m) }
+func (*FromToUserID) ProtoMessage()    {}
+func (*FromToUserID) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{26}
+}
+func (m *FromToUserID) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FromToUserID.Unmarshal(m, b)
+}
+func (m *FromToUserID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FromToUserID.Marshal(b, m, deterministic)
+}
+func (dst *FromToUserID) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FromToUserID.Merge(dst, src)
+}
+func (m *FromToUserID) XXX_Size() int {
+	return xxx_messageInfo_FromToUserID.Size(m)
+}
+func (m *FromToUserID) XXX_DiscardUnknown() {
+	xxx_messageInfo_FromToUserID.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FromToUserID proto.InternalMessageInfo
+
+func (m *FromToUserID) GetFromUserID() string {
+	if m != nil {
+		return m.FromUserID
+	}
+	return ""
+}
+
+func (m *FromToUserID) GetToUserID() string {
+	if m != nil {
+		return m.ToUserID
+	}
+	return ""
+}
+
+// FromUserID apply to add ToUserID
 type FriendApplicationAddedTips struct {
-	OpUser               *PublicUserInfo    `protobuf:"bytes,1,opt,name=OpUser" json:"OpUser,omitempty"`
-	Application          *FriendApplication `protobuf:"bytes,2,opt,name=Application" json:"Application,omitempty"`
-	OpedUser             *PublicUserInfo    `protobuf:"bytes,3,opt,name=OpedUser" json:"OpedUser,omitempty"`
-	OperationTime        uint64             `protobuf:"varint,4,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
-	XXX_unrecognized     []byte             `json:"-"`
-	XXX_sizecache        int32              `json:"-"`
+	FromToUserID         *FromToUserID `protobuf:"bytes,1,opt,name=FromToUserID" json:"FromToUserID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
 }
 
 func (m *FriendApplicationAddedTips) Reset()         { *m = FriendApplicationAddedTips{} }
 func (m *FriendApplicationAddedTips) String() string { return proto.CompactTextString(m) }
 func (*FriendApplicationAddedTips) ProtoMessage()    {}
 func (*FriendApplicationAddedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{26}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{27}
 }
 func (m *FriendApplicationAddedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FriendApplicationAddedTips.Unmarshal(m, b)
@@ -1803,50 +1846,26 @@ func (m *FriendApplicationAddedTips) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_FriendApplicationAddedTips proto.InternalMessageInfo
 
-func (m *FriendApplicationAddedTips) GetOpUser() *PublicUserInfo {
+func (m *FriendApplicationAddedTips) GetFromToUserID() *FromToUserID {
 	if m != nil {
-		return m.OpUser
+		return m.FromToUserID
 	}
 	return nil
 }
 
-func (m *FriendApplicationAddedTips) GetApplication() *FriendApplication {
-	if m != nil {
-		return m.Application
-	}
-	return nil
-}
-
-func (m *FriendApplicationAddedTips) GetOpedUser() *PublicUserInfo {
-	if m != nil {
-		return m.OpedUser
-	}
-	return nil
-}
-
-func (m *FriendApplicationAddedTips) GetOperationTime() uint64 {
-	if m != nil {
-		return m.OperationTime
-	}
-	return 0
-}
-
-// user2 accept or reject
+// FromUserID accept or reject ToUserID
 type FriendApplicationProcessedTips struct {
-	OpUser               *PublicUserInfo `protobuf:"bytes,1,opt,name=OpUser" json:"OpUser,omitempty"`
-	OpedUser             *PublicUserInfo `protobuf:"bytes,2,opt,name=OpedUser" json:"OpedUser,omitempty"`
-	Result               int32           `protobuf:"varint,3,opt,name=result" json:"result,omitempty"`
-	OperationTime        uint64          `protobuf:"varint,4,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
+	FromToUserID         *FromToUserID `protobuf:"bytes,1,opt,name=FromToUserID" json:"FromToUserID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
 }
 
 func (m *FriendApplicationProcessedTips) Reset()         { *m = FriendApplicationProcessedTips{} }
 func (m *FriendApplicationProcessedTips) String() string { return proto.CompactTextString(m) }
 func (*FriendApplicationProcessedTips) ProtoMessage()    {}
 func (*FriendApplicationProcessedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{27}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{28}
 }
 func (m *FriendApplicationProcessedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FriendApplicationProcessedTips.Unmarshal(m, b)
@@ -1866,47 +1885,28 @@ func (m *FriendApplicationProcessedTips) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_FriendApplicationProcessedTips proto.InternalMessageInfo
 
-func (m *FriendApplicationProcessedTips) GetOpUser() *PublicUserInfo {
+func (m *FriendApplicationProcessedTips) GetFromToUserID() *FromToUserID {
 	if m != nil {
-		return m.OpUser
+		return m.FromToUserID
 	}
 	return nil
 }
 
-func (m *FriendApplicationProcessedTips) GetOpedUser() *PublicUserInfo {
-	if m != nil {
-		return m.OpedUser
-	}
-	return nil
-}
-
-func (m *FriendApplicationProcessedTips) GetResult() int32 {
-	if m != nil {
-		return m.Result
-	}
-	return 0
-}
-
-func (m *FriendApplicationProcessedTips) GetOperationTime() uint64 {
-	if m != nil {
-		return m.OperationTime
-	}
-	return 0
-}
-
+// FromUserID  Added a friend ToUserID
 type FriendAddedTips struct {
-	Friend               *FriendInfo `protobuf:"bytes,1,opt,name=Friend" json:"Friend,omitempty"`
-	OperationTime        uint64      `protobuf:"varint,2,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
-	XXX_unrecognized     []byte      `json:"-"`
-	XXX_sizecache        int32       `json:"-"`
+	Friend               *FriendInfo     `protobuf:"bytes,1,opt,name=Friend" json:"Friend,omitempty"`
+	OperationTime        uint64          `protobuf:"varint,2,opt,name=OperationTime" json:"OperationTime,omitempty"`
+	OpUser               *PublicUserInfo `protobuf:"bytes,3,opt,name=OpUser" json:"OpUser,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
 }
 
 func (m *FriendAddedTips) Reset()         { *m = FriendAddedTips{} }
 func (m *FriendAddedTips) String() string { return proto.CompactTextString(m) }
 func (*FriendAddedTips) ProtoMessage()    {}
 func (*FriendAddedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{28}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{29}
 }
 func (m *FriendAddedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FriendAddedTips.Unmarshal(m, b)
@@ -1940,19 +1940,26 @@ func (m *FriendAddedTips) GetOperationTime() uint64 {
 	return 0
 }
 
+func (m *FriendAddedTips) GetOpUser() *PublicUserInfo {
+	if m != nil {
+		return m.OpUser
+	}
+	return nil
+}
+
+// FromUserID  deleted a friend ToUserID
 type FriendDeletedTips struct {
-	Friend               *FriendInfo `protobuf:"bytes,1,opt,name=Friend" json:"Friend,omitempty"`
-	OperationTime        uint64      `protobuf:"varint,2,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
-	XXX_unrecognized     []byte      `json:"-"`
-	XXX_sizecache        int32       `json:"-"`
+	FromToUserID         *FromToUserID `protobuf:"bytes,1,opt,name=FromToUserID" json:"FromToUserID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
 }
 
 func (m *FriendDeletedTips) Reset()         { *m = FriendDeletedTips{} }
 func (m *FriendDeletedTips) String() string { return proto.CompactTextString(m) }
 func (*FriendDeletedTips) ProtoMessage()    {}
 func (*FriendDeletedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{29}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{30}
 }
 func (m *FriendDeletedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FriendDeletedTips.Unmarshal(m, b)
@@ -1972,87 +1979,25 @@ func (m *FriendDeletedTips) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_FriendDeletedTips proto.InternalMessageInfo
 
-func (m *FriendDeletedTips) GetFriend() *FriendInfo {
+func (m *FriendDeletedTips) GetFromToUserID() *FromToUserID {
 	if m != nil {
-		return m.Friend
-	}
-	return nil
-}
-
-func (m *FriendDeletedTips) GetOperationTime() uint64 {
-	if m != nil {
-		return m.OperationTime
-	}
-	return 0
-}
-
-type BlackInfo struct {
-	OwnerUser            *PublicUserInfo `protobuf:"bytes,1,opt,name=OwnerUser" json:"OwnerUser,omitempty"`
-	CreateTime           uint64          `protobuf:"varint,3,opt,name=CreateTime" json:"CreateTime,omitempty"`
-	BlackUser            *PublicUserInfo `protobuf:"bytes,4,opt,name=BlackUser" json:"BlackUser,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
-}
-
-func (m *BlackInfo) Reset()         { *m = BlackInfo{} }
-func (m *BlackInfo) String() string { return proto.CompactTextString(m) }
-func (*BlackInfo) ProtoMessage()    {}
-func (*BlackInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{30}
-}
-func (m *BlackInfo) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BlackInfo.Unmarshal(m, b)
-}
-func (m *BlackInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BlackInfo.Marshal(b, m, deterministic)
-}
-func (dst *BlackInfo) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BlackInfo.Merge(dst, src)
-}
-func (m *BlackInfo) XXX_Size() int {
-	return xxx_messageInfo_BlackInfo.Size(m)
-}
-func (m *BlackInfo) XXX_DiscardUnknown() {
-	xxx_messageInfo_BlackInfo.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BlackInfo proto.InternalMessageInfo
-
-func (m *BlackInfo) GetOwnerUser() *PublicUserInfo {
-	if m != nil {
-		return m.OwnerUser
-	}
-	return nil
-}
-
-func (m *BlackInfo) GetCreateTime() uint64 {
-	if m != nil {
-		return m.CreateTime
-	}
-	return 0
-}
-
-func (m *BlackInfo) GetBlackUser() *PublicUserInfo {
-	if m != nil {
-		return m.BlackUser
+		return m.FromToUserID
 	}
 	return nil
 }
 
 type BlackAddedTips struct {
-	Black                *BlackInfo `protobuf:"bytes,1,opt,name=Black" json:"Black,omitempty"`
-	OperationTime        uint64     `protobuf:"varint,2,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
-	XXX_unrecognized     []byte     `json:"-"`
-	XXX_sizecache        int32      `json:"-"`
+	FromToUserID         *FromToUserID `protobuf:"bytes,1,opt,name=FromToUserID" json:"FromToUserID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
 }
 
 func (m *BlackAddedTips) Reset()         { *m = BlackAddedTips{} }
 func (m *BlackAddedTips) String() string { return proto.CompactTextString(m) }
 func (*BlackAddedTips) ProtoMessage()    {}
 func (*BlackAddedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{31}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{31}
 }
 func (m *BlackAddedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_BlackAddedTips.Unmarshal(m, b)
@@ -2072,33 +2017,25 @@ func (m *BlackAddedTips) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_BlackAddedTips proto.InternalMessageInfo
 
-func (m *BlackAddedTips) GetBlack() *BlackInfo {
+func (m *BlackAddedTips) GetFromToUserID() *FromToUserID {
 	if m != nil {
-		return m.Black
+		return m.FromToUserID
 	}
 	return nil
 }
 
-func (m *BlackAddedTips) GetOperationTime() uint64 {
-	if m != nil {
-		return m.OperationTime
-	}
-	return 0
-}
-
 type BlackDeletedTips struct {
-	Black                *BlackInfo `protobuf:"bytes,1,opt,name=Black" json:"Black,omitempty"`
-	OperationTime        uint64     `protobuf:"varint,2,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
-	XXX_unrecognized     []byte     `json:"-"`
-	XXX_sizecache        int32      `json:"-"`
+	FromToUserID         *FromToUserID `protobuf:"bytes,1,opt,name=FromToUserID" json:"FromToUserID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
 }
 
 func (m *BlackDeletedTips) Reset()         { *m = BlackDeletedTips{} }
 func (m *BlackDeletedTips) String() string { return proto.CompactTextString(m) }
 func (*BlackDeletedTips) ProtoMessage()    {}
 func (*BlackDeletedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{32}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{32}
 }
 func (m *BlackDeletedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_BlackDeletedTips.Unmarshal(m, b)
@@ -2118,34 +2055,25 @@ func (m *BlackDeletedTips) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_BlackDeletedTips proto.InternalMessageInfo
 
-func (m *BlackDeletedTips) GetBlack() *BlackInfo {
+func (m *BlackDeletedTips) GetFromToUserID() *FromToUserID {
 	if m != nil {
-		return m.Black
+		return m.FromToUserID
 	}
 	return nil
 }
 
-func (m *BlackDeletedTips) GetOperationTime() uint64 {
-	if m != nil {
-		return m.OperationTime
-	}
-	return 0
-}
-
 type FriendInfoChangedTips struct {
-	Friend               *FriendInfo     `protobuf:"bytes,1,opt,name=Friend" json:"Friend,omitempty"`
-	OpUser               *PublicUserInfo `protobuf:"bytes,2,opt,name=OpUser" json:"OpUser,omitempty"`
-	OperationTime        uint64          `protobuf:"varint,3,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
+	FromToUserID         *FromToUserID `protobuf:"bytes,1,opt,name=FromToUserID" json:"FromToUserID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
 }
 
 func (m *FriendInfoChangedTips) Reset()         { *m = FriendInfoChangedTips{} }
 func (m *FriendInfoChangedTips) String() string { return proto.CompactTextString(m) }
 func (*FriendInfoChangedTips) ProtoMessage()    {}
 func (*FriendInfoChangedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{33}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{33}
 }
 func (m *FriendInfoChangedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FriendInfoChangedTips.Unmarshal(m, b)
@@ -2165,42 +2093,26 @@ func (m *FriendInfoChangedTips) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_FriendInfoChangedTips proto.InternalMessageInfo
 
-func (m *FriendInfoChangedTips) GetFriend() *FriendInfo {
+func (m *FriendInfoChangedTips) GetFromToUserID() *FromToUserID {
 	if m != nil {
-		return m.Friend
+		return m.FromToUserID
 	}
 	return nil
 }
 
-func (m *FriendInfoChangedTips) GetOpUser() *PublicUserInfo {
-	if m != nil {
-		return m.OpUser
-	}
-	return nil
-}
-
-func (m *FriendInfoChangedTips) GetOperationTime() uint64 {
-	if m != nil {
-		return m.OperationTime
-	}
-	return 0
-}
-
 // ////////////////////user/////////////////////
 type SelfInfoUpdatedTips struct {
-	SelfUserInfo         *UserInfo       `protobuf:"bytes,1,opt,name=SelfUserInfo" json:"SelfUserInfo,omitempty"`
-	OpUser               *PublicUserInfo `protobuf:"bytes,2,opt,name=OpUser" json:"OpUser,omitempty"`
-	OperationTime        uint64          `protobuf:"varint,3,opt,name=OperationTime" json:"OperationTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
+	UserID               string   `protobuf:"bytes,1,opt,name=UserID" json:"UserID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
 }
 
 func (m *SelfInfoUpdatedTips) Reset()         { *m = SelfInfoUpdatedTips{} }
 func (m *SelfInfoUpdatedTips) String() string { return proto.CompactTextString(m) }
 func (*SelfInfoUpdatedTips) ProtoMessage()    {}
 func (*SelfInfoUpdatedTips) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ws_3380b8a9bc5ee255, []int{34}
+	return fileDescriptor_ws_1ed69884ac12b8b9, []int{34}
 }
 func (m *SelfInfoUpdatedTips) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SelfInfoUpdatedTips.Unmarshal(m, b)
@@ -2220,25 +2132,11 @@ func (m *SelfInfoUpdatedTips) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_SelfInfoUpdatedTips proto.InternalMessageInfo
 
-func (m *SelfInfoUpdatedTips) GetSelfUserInfo() *UserInfo {
+func (m *SelfInfoUpdatedTips) GetUserID() string {
 	if m != nil {
-		return m.SelfUserInfo
-	}
-	return nil
-}
-
-func (m *SelfInfoUpdatedTips) GetOpUser() *PublicUserInfo {
-	if m != nil {
-		return m.OpUser
-	}
-	return nil
-}
-
-func (m *SelfInfoUpdatedTips) GetOperationTime() uint64 {
-	if m != nil {
-		return m.OperationTime
+		return m.UserID
 	}
-	return 0
+	return ""
 }
 
 func init() {
@@ -2265,134 +2163,130 @@ func init() {
 	proto.RegisterType((*MemberInfoChangedTips)(nil), "open_im_sdk.MemberInfoChangedTips")
 	proto.RegisterType((*GroupCreatedTips)(nil), "open_im_sdk.GroupCreatedTips")
 	proto.RegisterType((*GroupInfoChangedTips)(nil), "open_im_sdk.GroupInfoChangedTips")
-	proto.RegisterType((*ReceiveJoinApplicationTips)(nil), "open_im_sdk.ReceiveJoinApplicationTips")
+	proto.RegisterType((*JoinGroupApplicationTips)(nil), "open_im_sdk.JoinGroupApplicationTips")
 	proto.RegisterType((*ApplicationProcessedTips)(nil), "open_im_sdk.ApplicationProcessedTips")
 	proto.RegisterType((*FriendInfo)(nil), "open_im_sdk.FriendInfo")
 	proto.RegisterType((*FriendApplication)(nil), "open_im_sdk.FriendApplication")
+	proto.RegisterType((*FromToUserID)(nil), "open_im_sdk.FromToUserID")
 	proto.RegisterType((*FriendApplicationAddedTips)(nil), "open_im_sdk.FriendApplicationAddedTips")
 	proto.RegisterType((*FriendApplicationProcessedTips)(nil), "open_im_sdk.FriendApplicationProcessedTips")
 	proto.RegisterType((*FriendAddedTips)(nil), "open_im_sdk.FriendAddedTips")
 	proto.RegisterType((*FriendDeletedTips)(nil), "open_im_sdk.FriendDeletedTips")
-	proto.RegisterType((*BlackInfo)(nil), "open_im_sdk.BlackInfo")
 	proto.RegisterType((*BlackAddedTips)(nil), "open_im_sdk.BlackAddedTips")
 	proto.RegisterType((*BlackDeletedTips)(nil), "open_im_sdk.BlackDeletedTips")
 	proto.RegisterType((*FriendInfoChangedTips)(nil), "open_im_sdk.FriendInfoChangedTips")
 	proto.RegisterType((*SelfInfoUpdatedTips)(nil), "open_im_sdk.SelfInfoUpdatedTips")
 }
 
-func init() { proto.RegisterFile("sdk_ws/ws.proto", fileDescriptor_ws_3380b8a9bc5ee255) }
-
-var fileDescriptor_ws_3380b8a9bc5ee255 = []byte{
-	// 1769 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0x4f, 0x6f, 0x23, 0x4b,
-	0x11, 0xd7, 0xf8, 0x5f, 0xec, 0xb2, 0x37, 0xce, 0xce, 0xfe, 0x79, 0xc3, 0xf2, 0xb4, 0x32, 0x23,
-	0x84, 0x2c, 0xf4, 0x94, 0x27, 0x12, 0x21, 0x5e, 0x16, 0x01, 0xeb, 0xc4, 0x49, 0x08, 0xc4, 0xeb,
-	0x68, 0x9c, 0x88, 0xe3, 0x6a, 0xe2, 0x69, 0x3b, 0x8d, 0xc7, 0x3d, 0x4e, 0xf7, 0xd8, 0xbb, 0xb9,
-	0xf0, 0x2d, 0x10, 0x27, 0x24, 0x10, 0x07, 0x84, 0xe0, 0x80, 0x38, 0xf0, 0x11, 0x38, 0xf1, 0x29,
-	0x10, 0x7c, 0x01, 0x38, 0xc2, 0x01, 0x75, 0x75, 0xcf, 0x4c, 0x4f, 0x1c, 0x12, 0x27, 0x68, 0xf7,
-	0xf2, 0x6e, 0x53, 0x3f, 0x57, 0x75, 0xfd, 0xea, 0x4f, 0xd7, 0xd4, 0x24, 0xd0, 0x14, 0xc1, 0xe4,
-	0xed, 0x3b, 0xf1, 0xf9, 0x3b, 0xb1, 0x39, 0xe3, 0x51, 0x1c, 0xd9, 0xf5, 0x68, 0x46, 0xd8, 0x5b,
-	0x3a, 0x7d, 0x2b, 0x82, 0x89, 0xfb, 0x1f, 0x0b, 0x9c, 0x93, 0x79, 0x18, 0xf6, 0x88, 0x10, 0xfe,
-	0x98, 0xec, 0x5e, 0x0d, 0xc8, 0xe5, 0x31, 0x15, 0xb1, 0x47, 0xc4, 0xcc, 0x76, 0x60, 0x8d, 0x70,
-	0xbe, 0x17, 0x05, 0xc4, 0xb1, 0x5a, 0x56, 0xbb, 0xec, 0x25, 0xa2, 0xfd, 0x1c, 0x2a, 0x84, 0xf3,
-	0x9e, 0x18, 0x3b, 0x85, 0x96, 0xd5, 0xae, 0x79, 0x5a, 0x92, 0xf8, 0xd4, 0x7f, 0x3f, 0x20, 0x97,
-	0x4e, 0xb1, 0x65, 0xb5, 0x8b, 0x9e, 0x96, 0x10, 0xa7, 0x4c, 0xe2, 0x25, 0x8d, 0xa3, 0x64, 0xff,
-	0x00, 0x1e, 0x09, 0xca, 0xc6, 0x21, 0x39, 0x13, 0x04, 0x8f, 0x2b, 0xb7, 0x8a, 0xed, 0xfa, 0xd6,
-	0x57, 0x36, 0x0d, 0x8e, 0x9b, 0x87, 0x7e, 0x7c, 0x41, 0xf8, 0x41, 0xc4, 0xa7, 0x7e, 0xec, 0xe5,
-	0xf5, 0xed, 0xef, 0x41, 0x63, 0xcc, 0xa3, 0xf9, 0x2c, 0xb1, 0xaf, 0xdc, 0x65, 0x9f, 0x53, 0x77,
-	0xa7, 0xf0, 0xc9, 0xcd, 0xd1, 0x23, 0xe5, 0xb9, 0x20, 0xfc, 0xa8, 0x8b, 0xb1, 0xd7, 0x3c, 0x2d,
-	0xd9, 0x2d, 0x90, 0x09, 0xe4, 0x7e, 0x4c, 0x23, 0x76, 0xd4, 0xd5, 0xf1, 0x9b, 0x90, 0x4c, 0x9b,
-	0x50, 0xe7, 0x38, 0xc5, 0x56, 0xb1, 0x5d, 0xf4, 0x12, 0xd1, 0xfd, 0x19, 0xac, 0x1b, 0xee, 0x6e,
-	0xf3, 0xf2, 0x02, 0xaa, 0x82, 0x5c, 0xee, 0x92, 0x31, 0x65, 0xe8, 0xa2, 0xe8, 0xa5, 0xb2, 0xb4,
-	0x11, 0xe4, 0x72, 0x9f, 0x05, 0x49, 0x92, 0x95, 0x74, 0x9d, 0x59, 0x69, 0x89, 0x99, 0xfb, 0x2f,
-	0x0b, 0x9a, 0x39, 0x02, 0x5f, 0x8a, 0x22, 0x3f, 0x05, 0xfb, 0x90, 0xc4, 0x3d, 0xff, 0x7d, 0x87,
-	0x05, 0x3d, 0xa4, 0xe4, 0x91, 0x4b, 0x77, 0x1f, 0x9e, 0x2c, 0xa1, 0x62, 0x66, 0x04, 0x67, 0xfd,
-	0x8f, 0xe0, 0x0a, 0x66, 0x70, 0xee, 0x0f, 0xa1, 0x61, 0xba, 0xb6, 0xd7, 0xa1, 0x40, 0x03, 0x5d,
-	0xcc, 0x02, 0x0d, 0xec, 0x36, 0x94, 0x42, 0xd9, 0x09, 0x05, 0xe4, 0xfc, 0x34, 0xc7, 0xb9, 0x27,
-	0xc6, 0x5d, 0x3f, 0xf6, 0x3d, 0xd4, 0x70, 0x2f, 0xa1, 0x29, 0x19, 0x0f, 0x08, 0x0b, 0x7a, 0x62,
-	0x8c, 0x64, 0x5a, 0x50, 0x1f, 0x10, 0xbe, 0xc0, 0x30, 0xd2, 0x16, 0x31, 0x21, 0xa9, 0xb1, 0x17,
-	0x52, 0xc2, 0x62, 0xa5, 0xa1, 0xbb, 0xd1, 0x80, 0x54, 0x27, 0xb1, 0xe0, 0x94, 0x4e, 0x89, 0xae,
-	0x57, 0x2a, 0xbb, 0x7f, 0x2e, 0xc3, 0x9a, 0x26, 0xa1, 0xba, 0x8a, 0x05, 0x59, 0x27, 0x2a, 0x49,
-	0xe2, 0x9c, 0x0c, 0x17, 0xe9, 0xe1, 0x5a, 0x92, 0x7d, 0x83, 0x59, 0x3e, 0xea, 0xe2, 0xb1, 0x35,
-	0x2f, 0x11, 0x25, 0xa7, 0xa1, 0xc1, 0x49, 0xf7, 0xa1, 0x01, 0x49, 0x0d, 0x61, 0xc4, 0x55, 0x56,
-	0x1a, 0x06, 0x64, 0x7f, 0x13, 0x36, 0xa4, 0x7f, 0xc2, 0x4f, 0x42, 0x3f, 0x1e, 0x45, 0x7c, 0x7a,
-	0xd4, 0x75, 0x2a, 0xd8, 0x9e, 0x4b, 0xb8, 0xfd, 0x0d, 0x58, 0x57, 0xd8, 0x1b, 0x3a, 0x9c, 0xbc,
-	0xf1, 0xa7, 0xc4, 0x59, 0xc3, 0x03, 0xaf, 0xa1, 0xf6, 0xd7, 0xe1, 0x91, 0x42, 0x0e, 0xfc, 0x21,
-	0x39, 0xf3, 0x8e, 0x9d, 0x2a, 0xaa, 0xe5, 0x41, 0xc5, 0x4d, 0x08, 0x1a, 0xb1, 0xd3, 0xab, 0x19,
-	0x71, 0x6a, 0xe8, 0xd4, 0x84, 0x64, 0xe4, 0x53, 0x31, 0x3e, 0xe0, 0xd1, 0xd4, 0x01, 0x75, 0x63,
-	0xb4, 0x88, 0x91, 0x47, 0x2c, 0x26, 0x2c, 0x46, 0xdb, 0xba, 0xb2, 0x35, 0x20, 0x69, 0xab, 0x45,
-	0xa7, 0xd1, 0xb2, 0xda, 0x0d, 0x2f, 0x11, 0xed, 0x4f, 0xa1, 0x36, 0x8a, 0xf8, 0x90, 0xe0, 0xdc,
-	0x78, 0xd4, 0x2a, 0xb6, 0x6b, 0x5e, 0x06, 0xd8, 0x1b, 0x50, 0x14, 0xe4, 0xd2, 0x59, 0xc7, 0x02,
-	0xca, 0xc7, 0x5c, 0x5d, 0x9b, 0xf9, 0xba, 0xda, 0x2f, 0x01, 0x86, 0x9c, 0xf8, 0x31, 0xc1, 0x5f,
-	0x37, 0xf0, 0x57, 0x03, 0xb1, 0xbf, 0x0b, 0x6b, 0xfd, 0x99, 0x9c, 0x09, 0xc2, 0x79, 0x8c, 0x7d,
-	0xf9, 0xb5, 0x9b, 0xfa, 0x72, 0x53, 0xeb, 0xec, 0xb3, 0x98, 0x5f, 0x79, 0x89, 0x85, 0x7d, 0x00,
-	0xcd, 0x68, 0x34, 0x0a, 0x29, 0x23, 0x27, 0x73, 0x71, 0x71, 0xc4, 0x46, 0x91, 0x63, 0xb7, 0xac,
-	0x76, 0x7d, 0xeb, 0xd3, 0xdc, 0x21, 0xfd, 0xbc, 0x8e, 0x77, 0xdd, 0xe8, 0xc5, 0x2b, 0x68, 0x98,
-	0x0e, 0x64, 0x88, 0x13, 0x72, 0xa5, 0xbb, 0x4f, 0x3e, 0xda, 0x4f, 0xa1, 0xbc, 0xf0, 0xc3, 0x39,
-	0xc1, 0xce, 0xab, 0x7a, 0x4a, 0x78, 0x55, 0xf8, 0xc2, 0x72, 0x7f, 0x61, 0x41, 0xf3, 0x9a, 0x03,
-	0xa9, 0x7d, 0x4a, 0xe3, 0x90, 0xe8, 0x13, 0x94, 0x60, 0xdb, 0x50, 0xea, 0x12, 0x31, 0xd4, 0xcd,
-	0x8b, 0xcf, 0xd2, 0xd3, 0xfe, 0xfb, 0x58, 0xb7, 0xad, 0x7c, 0xb4, 0x5d, 0x68, 0xd0, 0xfe, 0x40,
-	0x1e, 0x35, 0x88, 0xe6, 0x2c, 0xd0, 0x3d, 0x9b, 0xc3, 0x64, 0xfb, 0xd0, 0xfe, 0x60, 0xd7, 0x0f,
-	0xc6, 0x64, 0x2f, 0x9a, 0xb3, 0x18, 0xdb, 0xb6, 0xea, 0xe5, 0x41, 0xf7, 0x0f, 0x05, 0xa8, 0x1d,
-	0xe2, 0x45, 0x90, 0x9c, 0x1c, 0x58, 0x3b, 0xd4, 0x97, 0x44, 0xb1, 0x4a, 0x44, 0x59, 0x6e, 0x7c,
-	0xc4, 0x7e, 0x55, 0xe4, 0x32, 0x40, 0xf2, 0x79, 0x13, 0xc5, 0x74, 0x44, 0x87, 0x38, 0xba, 0x35,
-	0xd5, 0x1c, 0x26, 0x75, 0x8e, 0x58, 0xcc, 0xa3, 0x60, 0x3e, 0x44, 0x1d, 0xcd, 0xd9, 0xc4, 0xa4,
-	0x7f, 0xec, 0x6b, 0x1e, 0xea, 0x4b, 0x96, 0x88, 0xf6, 0xb7, 0xa0, 0xdc, 0x7f, 0xc7, 0x08, 0xc7,
-	0x5b, 0x55, 0xdf, 0xfa, 0x6a, 0xae, 0x76, 0x27, 0xf3, 0xf3, 0x90, 0x0e, 0xe5, 0x34, 0xc2, 0xd2,
-	0x29, 0x4d, 0xd9, 0x55, 0x7b, 0x59, 0x57, 0xc9, 0x3b, 0x56, 0xf2, 0x0c, 0x44, 0x76, 0x7f, 0x8f,
-	0x4c, 0xcf, 0x09, 0x57, 0xe9, 0x91, 0xb7, 0xeb, 0x91, 0x67, 0x42, 0x49, 0xe2, 0x6b, 0x69, 0xe2,
-	0xdd, 0x9f, 0x17, 0xe0, 0x09, 0x86, 0xad, 0xd4, 0x0e, 0xe6, 0x61, 0x78, 0x47, 0xe2, 0x9e, 0x43,
-	0xe5, 0x4c, 0xbd, 0x31, 0xf5, 0x3c, 0x52, 0x92, 0xbd, 0x09, 0x76, 0x27, 0x98, 0x52, 0x46, 0x45,
-	0xcc, 0xfd, 0x38, 0xe2, 0xc7, 0x64, 0x41, 0x42, 0x4c, 0x5c, 0xd9, 0xbb, 0xe1, 0x17, 0x79, 0x7f,
-	0x7e, 0x14, 0x51, 0x86, 0xb1, 0x94, 0x30, 0x96, 0x54, 0x96, 0xbf, 0xa5, 0xb3, 0x44, 0xe5, 0x2d,
-	0x95, 0xcd, 0x94, 0x56, 0xf2, 0x29, 0x75, 0xa1, 0x71, 0xc0, 0x29, 0x61, 0x81, 0x47, 0xa6, 0x3e,
-	0x9f, 0xe8, 0x29, 0x94, 0xc3, 0xe4, 0xac, 0xea, 0xcc, 0x66, 0x3d, 0x9f, 0x8d, 0x89, 0x66, 0x58,
-	0x45, 0x86, 0xd7, 0x50, 0xf7, 0x2f, 0x16, 0x54, 0x93, 0xfc, 0x1b, 0x21, 0x5b, 0xb9, 0x90, 0x35,
-	0x4d, 0x96, 0xb5, 0x50, 0x2a, 0x9b, 0x34, 0x8b, 0x79, 0x9a, 0xcf, 0xa1, 0x72, 0x88, 0x13, 0x0f,
-	0xc3, 0x2e, 0x7b, 0x5a, 0x92, 0x78, 0x2f, 0x3a, 0xa7, 0x61, 0x12, 0xb2, 0x96, 0xe4, 0xbd, 0xda,
-	0xa5, 0x3c, 0xbe, 0xd0, 0xe1, 0x2a, 0x41, 0xa2, 0xfb, 0x53, 0x9f, 0x86, 0x3a, 0x4a, 0x25, 0x24,
-	0x05, 0xae, 0x66, 0x05, 0x5e, 0xc8, 0x95, 0xc7, 0xec, 0xa6, 0x8f, 0x13, 0x8d, 0xdb, 0x85, 0xea,
-	0x29, 0x9d, 0x89, 0xbd, 0x68, 0x3a, 0x95, 0x3a, 0x5d, 0x12, 0x4b, 0xb2, 0x16, 0xce, 0x5c, 0x2d,
-	0xc9, 0x86, 0xed, 0x92, 0x91, 0x3f, 0x0f, 0x63, 0xa9, 0x9a, 0xbc, 0x3c, 0x0d, 0xc8, 0xfd, 0x9d,
-	0x05, 0x4d, 0xd5, 0x99, 0xfb, 0x2c, 0x26, 0x5c, 0x62, 0xf6, 0x67, 0x50, 0xc6, 0x5e, 0xc4, 0xc3,
-	0xea, 0x5b, 0xcf, 0xf3, 0x6b, 0x48, 0x72, 0xf5, 0x3d, 0xa5, 0x64, 0xef, 0x42, 0x5d, 0x8e, 0x37,
-	0x9f, 0xc5, 0x32, 0x4c, 0xf4, 0x51, 0xdf, 0x6a, 0x2d, 0xdb, 0xe4, 0xfb, 0xdf, 0x33, 0x8d, 0xe4,
-	0xe4, 0xe9, 0x27, 0x5b, 0x5c, 0xfa, 0x1e, 0x2f, 0x79, 0x79, 0xd0, 0xfd, 0x6d, 0xca, 0xf5, 0x98,
-	0xf8, 0x0b, 0xf2, 0x00, 0xae, 0xaf, 0x01, 0xd0, 0x94, 0xdf, 0x8b, 0xaa, 0x61, 0xb3, 0x22, 0xd3,
-	0x7f, 0x58, 0xf0, 0x58, 0x1d, 0x72, 0xc4, 0x16, 0x34, 0x26, 0xc1, 0x03, 0xb8, 0x7e, 0x01, 0x95,
-	0xfe, 0xec, 0x5e, 0x3c, 0xb5, 0xbe, 0xac, 0x88, 0x76, 0x8b, 0xe6, 0xc5, 0x55, 0x2b, 0x62, 0x18,
-	0x2d, 0xc7, 0x59, 0xba, 0x29, 0xce, 0xbf, 0x59, 0xb0, 0xa1, 0x4e, 0xf9, 0x31, 0x1d, 0x4e, 0x3e,
-	0x72, 0x98, 0xaf, 0x01, 0x94, 0xd7, 0x7b, 0x45, 0x69, 0xd8, 0xac, 0x18, 0xe4, 0xbf, 0x2d, 0x78,
-	0x96, 0x14, 0x73, 0x14, 0xed, 0x5d, 0xc8, 0x21, 0xa6, 0x22, 0x95, 0xef, 0x0b, 0x14, 0x71, 0x19,
-	0x52, 0x1f, 0x17, 0x06, 0xf2, 0x7f, 0xc4, 0xf6, 0x7d, 0xa8, 0x1d, 0x50, 0xe6, 0x23, 0xb8, 0x72,
-	0x68, 0x99, 0x89, 0x1c, 0x35, 0xbd, 0xb9, 0x7e, 0x8f, 0xe9, 0xd9, 0x9f, 0xc8, 0x59, 0x7d, 0xca,
-	0x2b, 0xd4, 0xc7, 0xfd, 0xbb, 0x05, 0x1b, 0xf8, 0xa4, 0xde, 0x83, 0x0f, 0x29, 0xf1, 0x2b, 0x58,
-	0x43, 0xe3, 0x68, 0xf5, 0x3c, 0x24, 0x06, 0xb2, 0xc8, 0xfa, 0xca, 0x27, 0x5f, 0x9b, 0x2b, 0x15,
-	0x39, 0xb3, 0x59, 0xb1, 0xc8, 0xbf, 0xb2, 0xe0, 0x69, 0x4a, 0xdc, 0xac, 0xb1, 0xfc, 0xfe, 0xd0,
-	0x62, 0x56, 0x64, 0x13, 0xca, 0x92, 0x51, 0xb8, 0x5f, 0xbf, 0x17, 0xef, 0xd7, 0x13, 0xee, 0x2f,
-	0x2d, 0x78, 0xe1, 0x91, 0x21, 0xa1, 0x0b, 0x22, 0xdf, 0xe3, 0x9d, 0xd9, 0x2c, 0xd4, 0x9b, 0xd2,
-	0x03, 0x6a, 0xb2, 0x03, 0x35, 0x7d, 0x00, 0x8b, 0x35, 0xf1, 0x5b, 0x37, 0xa4, 0x4c, 0x5b, 0xbe,
-	0x6c, 0x3c, 0xe2, 0x8b, 0x74, 0x69, 0xd3, 0x92, 0xfb, 0x27, 0x0b, 0x1c, 0x83, 0xd4, 0x09, 0x8f,
-	0x86, 0x44, 0x88, 0x8f, 0x3c, 0x14, 0x90, 0x9c, 0x98, 0x87, 0xb1, 0x5e, 0x8c, 0xb4, 0x64, 0x90,
-	0x2e, 0xe5, 0x48, 0xff, 0xd1, 0x02, 0x50, 0xfb, 0x0b, 0xde, 0x9b, 0x6d, 0xa8, 0xe1, 0x2a, 0x88,
-	0xbe, 0x15, 0xd5, 0x67, 0x39, 0xdf, 0x59, 0x42, 0x52, 0x3d, 0x75, 0x36, 0x2e, 0x44, 0x85, 0xe4,
-	0x6c, 0x5c, 0x85, 0xf2, 0xeb, 0x64, 0x71, 0x69, 0x9d, 0xfc, 0x76, 0xe2, 0x1a, 0xbd, 0x95, 0x6e,
-	0xf3, 0x66, 0x28, 0xba, 0x13, 0x78, 0xac, 0x24, 0x23, 0xd9, 0x72, 0x7f, 0xe8, 0x04, 0xea, 0x5b,
-	0xc9, 0x42, 0x47, 0x89, 0x28, 0xf7, 0xf0, 0x4e, 0x10, 0x0c, 0xa2, 0x39, 0x1f, 0xa6, 0x7b, 0x78,
-	0x0a, 0x48, 0x8e, 0x9d, 0x20, 0xf8, 0x49, 0xc4, 0x03, 0xca, 0xc6, 0xba, 0xa0, 0x06, 0xe2, 0xfe,
-	0xd3, 0x82, 0x17, 0x4b, 0xde, 0x3a, 0x41, 0xa0, 0xcb, 0xba, 0x9d, 0x16, 0xca, 0xba, 0xbb, 0x87,
-	0xb2, 0xc1, 0x5d, 0x37, 0x0e, 0xd3, 0x25, 0x7e, 0x99, 0xb3, 0x5c, 0x72, 0xe9, 0x99, 0x26, 0xf6,
-	0x77, 0xa0, 0xda, 0x9f, 0xe5, 0x06, 0xff, 0xad, 0x8e, 0x53, 0xe5, 0x15, 0x87, 0xc1, 0x5f, 0x2d,
-	0x78, 0xb9, 0xc4, 0x20, 0xdf, 0xcf, 0x0f, 0x0a, 0xdc, 0xa4, 0x5d, 0xb8, 0x0f, 0x6d, 0xfc, 0x13,
-	0x85, 0xd9, 0xd5, 0x4a, 0x5a, 0x31, 0x9c, 0x0b, 0x68, 0xea, 0x68, 0xd2, 0xba, 0x7d, 0x0e, 0x15,
-	0x05, 0x69, 0xfa, 0x9f, 0xdc, 0x90, 0x7d, 0x45, 0x5d, 0x3d, 0x2f, 0x7b, 0x2a, 0xdc, 0xe4, 0xe9,
-	0xa7, 0x49, 0x6b, 0x76, 0x49, 0x48, 0xe2, 0x0f, 0xeb, 0xeb, 0xd7, 0x16, 0xd4, 0x76, 0x43, 0x7f,
-	0x38, 0xc1, 0x8b, 0xbb, 0xb3, 0x7c, 0x71, 0x6f, 0x9f, 0x67, 0xd9, 0xf5, 0xbd, 0xeb, 0x9a, 0xee,
-	0x68, 0x3f, 0xc6, 0x2d, 0xbd, 0xfd, 0xe8, 0x54, 0xdb, 0x0d, 0x60, 0x1d, 0x85, 0x2c, 0xf1, 0x9f,
-	0x41, 0x19, 0x91, 0x1b, 0xe7, 0x60, 0x1a, 0x8e, 0xa7, 0x94, 0x56, 0xcc, 0xc4, 0x08, 0x36, 0x50,
-	0xdd, 0x4c, 0xfa, 0x87, 0xf0, 0xf3, 0x1b, 0x0b, 0x9e, 0x65, 0xe5, 0x32, 0x5f, 0x92, 0xf7, 0x2e,
-	0xf1, 0xf6, 0xb5, 0x01, 0xbf, 0xd2, 0xf5, 0x59, 0x6d, 0xf7, 0xfe, 0xbd, 0x05, 0x4f, 0x06, 0x24,
-	0x1c, 0x49, 0xd3, 0xb3, 0x59, 0x90, 0xee, 0x2c, 0x3b, 0xd0, 0x90, 0x70, 0x72, 0xea, 0xed, 0xd3,
-	0x3d, 0xa7, 0xfa, 0x01, 0xd9, 0x9e, 0x57, 0xf0, 0x5f, 0x16, 0xdb, 0xff, 0x0d, 0x00, 0x00, 0xff,
-	0xff, 0x73, 0x31, 0x8b, 0x68, 0xc5, 0x18, 0x00, 0x00,
+func init() { proto.RegisterFile("sdk_ws/ws.proto", fileDescriptor_ws_1ed69884ac12b8b9) }
+
+var fileDescriptor_ws_1ed69884ac12b8b9 = []byte{
+	// 1703 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4f, 0x6f, 0x23, 0x4b,
+	0x11, 0xd7, 0xf8, 0x5f, 0xec, 0x72, 0x36, 0xce, 0xce, 0xfe, 0x79, 0xc3, 0xf2, 0xb4, 0x32, 0x23,
+	0x84, 0x2c, 0x04, 0x79, 0x22, 0x2b, 0xa4, 0xc7, 0xa2, 0x07, 0x38, 0x71, 0x92, 0x97, 0x65, 0xbd,
+	0x0e, 0xe3, 0x2c, 0x1c, 0x38, 0x44, 0x13, 0x4f, 0xdb, 0x19, 0x79, 0xa6, 0xc7, 0xe9, 0x1e, 0x67,
+	0x37, 0x17, 0xbe, 0x05, 0xe2, 0x80, 0x90, 0xb8, 0x21, 0x24, 0x0e, 0x88, 0x03, 0x1f, 0x81, 0x4f,
+	0xc2, 0x09, 0x89, 0x13, 0x47, 0x38, 0xa0, 0xaa, 0xee, 0x19, 0xf7, 0xd8, 0x79, 0xd9, 0x24, 0xbb,
+	0xda, 0xcb, 0xbb, 0x4d, 0xfd, 0x5c, 0x5d, 0xf5, 0xab, 0x3f, 0x5d, 0x5d, 0x09, 0xb4, 0x64, 0x30,
+	0x3d, 0x79, 0x23, 0x3f, 0x7b, 0x23, 0xb7, 0x66, 0x22, 0x49, 0x13, 0xbb, 0x99, 0xcc, 0x18, 0x3f,
+	0x09, 0xe3, 0x13, 0x19, 0x4c, 0xdd, 0xff, 0x59, 0xe0, 0x1c, 0xcd, 0xa3, 0xa8, 0xcf, 0xa4, 0xf4,
+	0x27, 0x6c, 0xe7, 0x72, 0xc8, 0xce, 0x5f, 0x86, 0x32, 0xf5, 0x98, 0x9c, 0xd9, 0x0e, 0xac, 0x31,
+	0x21, 0x76, 0x93, 0x80, 0x39, 0x56, 0xdb, 0xea, 0x54, 0xbd, 0x4c, 0xb4, 0x1f, 0x43, 0x8d, 0x09,
+	0xd1, 0x97, 0x13, 0xa7, 0xd4, 0xb6, 0x3a, 0x0d, 0x4f, 0x4b, 0x88, 0xc7, 0xfe, 0xdb, 0x21, 0x3b,
+	0x77, 0xca, 0x6d, 0xab, 0x53, 0xf6, 0xb4, 0x44, 0x78, 0xc8, 0x11, 0xaf, 0x68, 0x9c, 0x24, 0xfb,
+	0xa7, 0x70, 0x4f, 0x86, 0x7c, 0x12, 0xb1, 0xd7, 0x92, 0x91, 0xb9, 0x6a, 0xbb, 0xdc, 0x69, 0x6e,
+	0x7f, 0x63, 0xcb, 0xe0, 0xb8, 0x75, 0xe0, 0xa7, 0x67, 0x4c, 0xec, 0x27, 0x22, 0xf6, 0x53, 0xaf,
+	0xa8, 0x6f, 0x7f, 0x01, 0xeb, 0x13, 0x91, 0xcc, 0x67, 0xd9, 0xf9, 0xda, 0xbb, 0xce, 0x17, 0xd4,
+	0xdd, 0x18, 0x3e, 0xb9, 0x3a, 0x7a, 0xa2, 0x3c, 0x97, 0x4c, 0x1c, 0xf6, 0x28, 0xf6, 0x86, 0xa7,
+	0x25, 0xbb, 0x0d, 0x98, 0x40, 0xe1, 0xa7, 0x61, 0xc2, 0x0f, 0x7b, 0x3a, 0x7e, 0x13, 0xc2, 0xb4,
+	0x49, 0x65, 0xc7, 0x29, 0xb7, 0xcb, 0x9d, 0xb2, 0x97, 0x89, 0xee, 0x6f, 0x60, 0xc3, 0x70, 0x77,
+	0x9d, 0x97, 0x27, 0x50, 0x97, 0xec, 0x7c, 0x87, 0x4d, 0x42, 0x4e, 0x2e, 0xca, 0x5e, 0x2e, 0xe3,
+	0x19, 0xc9, 0xce, 0xf7, 0x78, 0x90, 0x25, 0x59, 0x49, 0xcb, 0xcc, 0x2a, 0x2b, 0xcc, 0xdc, 0xff,
+	0x58, 0xd0, 0x2a, 0x10, 0xf8, 0x5a, 0x14, 0xf9, 0x21, 0xd8, 0x07, 0x2c, 0xed, 0xfb, 0x6f, 0xbb,
+	0x3c, 0xe8, 0x13, 0x25, 0x8f, 0x9d, 0xbb, 0x7b, 0xf0, 0x60, 0x05, 0x95, 0x33, 0x23, 0x38, 0xeb,
+	0x2b, 0x82, 0x2b, 0x99, 0xc1, 0xb9, 0x5f, 0xc2, 0xba, 0xe9, 0xda, 0xde, 0x80, 0x52, 0x18, 0xe8,
+	0x62, 0x96, 0xc2, 0xc0, 0xee, 0x40, 0x25, 0xc2, 0x4e, 0x28, 0x11, 0xe7, 0x87, 0x05, 0xce, 0x7d,
+	0x39, 0xe9, 0xf9, 0xa9, 0xef, 0x91, 0x86, 0x7b, 0x0e, 0x2d, 0x64, 0x3c, 0x64, 0x3c, 0xe8, 0xcb,
+	0x09, 0x91, 0x69, 0x43, 0x73, 0xc8, 0xc4, 0x05, 0x85, 0x91, 0xb7, 0x88, 0x09, 0xa1, 0xc6, 0x6e,
+	0x14, 0x32, 0x9e, 0x2a, 0x0d, 0xdd, 0x8d, 0x06, 0xa4, 0x3a, 0x89, 0x07, 0xc7, 0x61, 0xcc, 0x74,
+	0xbd, 0x72, 0xd9, 0xfd, 0x7b, 0x15, 0xd6, 0x34, 0x09, 0xd5, 0x55, 0x3c, 0x58, 0x74, 0xa2, 0x92,
+	0x10, 0x17, 0x6c, 0x74, 0x91, 0x1b, 0xd7, 0x12, 0xf6, 0x0d, 0x65, 0xf9, 0xb0, 0x47, 0x66, 0x1b,
+	0x5e, 0x26, 0x22, 0xa7, 0x91, 0xc1, 0x49, 0xf7, 0xa1, 0x01, 0xa1, 0x86, 0x34, 0xe2, 0xaa, 0x2a,
+	0x0d, 0x03, 0xb2, 0xbf, 0x0b, 0x9b, 0xe8, 0x9f, 0x89, 0xa3, 0xc8, 0x4f, 0xc7, 0x89, 0x88, 0x0f,
+	0x7b, 0x4e, 0x8d, 0xda, 0x73, 0x05, 0xb7, 0xbf, 0x03, 0x1b, 0x0a, 0x7b, 0x15, 0x8e, 0xa6, 0xaf,
+	0xfc, 0x98, 0x39, 0x6b, 0x64, 0x70, 0x09, 0xb5, 0xbf, 0x0d, 0xf7, 0x14, 0xb2, 0xef, 0x8f, 0xd8,
+	0x6b, 0xef, 0xa5, 0x53, 0x27, 0xb5, 0x22, 0xa8, 0xb8, 0x49, 0x19, 0x26, 0xfc, 0xf8, 0x72, 0xc6,
+	0x9c, 0x06, 0x39, 0x35, 0x21, 0x8c, 0x3c, 0x96, 0x93, 0x7d, 0x91, 0xc4, 0x0e, 0xa8, 0x1b, 0xa3,
+	0x45, 0x8a, 0x3c, 0xe1, 0x29, 0xe3, 0x29, 0x9d, 0x6d, 0xaa, 0xb3, 0x06, 0x84, 0x67, 0xb5, 0xe8,
+	0xac, 0xb7, 0xad, 0xce, 0xba, 0x97, 0x89, 0xf6, 0xa7, 0xd0, 0x18, 0x27, 0x62, 0xc4, 0x68, 0x6e,
+	0xdc, 0x6b, 0x97, 0x3b, 0x0d, 0x6f, 0x01, 0xd8, 0x9b, 0x50, 0x96, 0xec, 0xdc, 0xd9, 0xa0, 0x02,
+	0xe2, 0x67, 0xa1, 0xae, 0xad, 0x62, 0x5d, 0xed, 0xa7, 0x00, 0x23, 0xc1, 0xfc, 0x94, 0xd1, 0xaf,
+	0x9b, 0xf4, 0xab, 0x81, 0xd8, 0x3f, 0x86, 0xb5, 0xc1, 0x0c, 0x67, 0x82, 0x74, 0xee, 0x53, 0x5f,
+	0x7e, 0xeb, 0xaa, 0xbe, 0xdc, 0xd2, 0x3a, 0x7b, 0x3c, 0x15, 0x97, 0x5e, 0x76, 0xc2, 0xde, 0x87,
+	0x56, 0x32, 0x1e, 0x47, 0x21, 0x67, 0x47, 0x73, 0x79, 0x76, 0xc8, 0xc7, 0x89, 0x63, 0xb7, 0xad,
+	0x4e, 0x73, 0xfb, 0xd3, 0x82, 0x91, 0x41, 0x51, 0xc7, 0x5b, 0x3e, 0xf4, 0xe4, 0x39, 0xac, 0x9b,
+	0x0e, 0x30, 0xc4, 0x29, 0xbb, 0xd4, 0xdd, 0x87, 0x9f, 0xf6, 0x43, 0xa8, 0x5e, 0xf8, 0xd1, 0x9c,
+	0x51, 0xe7, 0xd5, 0x3d, 0x25, 0x3c, 0x2f, 0x7d, 0x6e, 0xb9, 0xbf, 0xb3, 0xa0, 0xb5, 0xe4, 0x00,
+	0xb5, 0x8f, 0xc3, 0x34, 0x62, 0xda, 0x82, 0x12, 0x6c, 0x1b, 0x2a, 0x3d, 0x26, 0x47, 0xba, 0x79,
+	0xe9, 0x1b, 0x3d, 0xed, 0xbd, 0x4d, 0x75, 0xdb, 0xe2, 0xa7, 0xed, 0xc2, 0x7a, 0x38, 0x18, 0xa2,
+	0xa9, 0x61, 0x32, 0xe7, 0x81, 0xee, 0xd9, 0x02, 0x86, 0xed, 0x13, 0x0e, 0x86, 0x3b, 0x7e, 0x30,
+	0x61, 0xbb, 0xc9, 0x9c, 0xa7, 0xd4, 0xb6, 0x75, 0xaf, 0x08, 0xba, 0x7f, 0x29, 0x41, 0xe3, 0x80,
+	0x2e, 0x02, 0x72, 0x72, 0x60, 0xed, 0x40, 0x5f, 0x12, 0xc5, 0x2a, 0x13, 0xb1, 0xdc, 0xf4, 0x49,
+	0xfd, 0xaa, 0xc8, 0x2d, 0x00, 0xe4, 0xf3, 0x2a, 0x49, 0xc3, 0x71, 0x38, 0xa2, 0xd1, 0xad, 0xa9,
+	0x16, 0x30, 0xd4, 0x39, 0xe4, 0xa9, 0x48, 0x82, 0xf9, 0x88, 0x74, 0x34, 0x67, 0x13, 0x43, 0xff,
+	0xd4, 0xd7, 0x22, 0xd2, 0x97, 0x2c, 0x13, 0xed, 0x1f, 0x40, 0x75, 0xf0, 0x86, 0x33, 0x41, 0xb7,
+	0xaa, 0xb9, 0xfd, 0xcd, 0x42, 0xed, 0x8e, 0xe6, 0xa7, 0x51, 0x38, 0xc2, 0x69, 0x44, 0xa5, 0x53,
+	0x9a, 0xd8, 0x55, 0xbb, 0x8b, 0xae, 0xc2, 0x3b, 0x56, 0xf1, 0x0c, 0x04, 0xbb, 0xbf, 0xcf, 0xe2,
+	0x53, 0x26, 0x54, 0x7a, 0xf0, 0x76, 0xdd, 0xf3, 0x4c, 0x28, 0x4b, 0x7c, 0x23, 0x4f, 0xbc, 0xfb,
+	0xdb, 0x12, 0x3c, 0xa0, 0xb0, 0x95, 0xda, 0xfe, 0x3c, 0x8a, 0xde, 0x91, 0xb8, 0xc7, 0x50, 0x7b,
+	0xad, 0x5e, 0x4c, 0x3d, 0x8f, 0x94, 0x64, 0x6f, 0x81, 0xdd, 0x0d, 0xe2, 0x90, 0x87, 0x32, 0x15,
+	0x7e, 0x9a, 0x88, 0x97, 0xec, 0x82, 0x45, 0x94, 0xb8, 0xaa, 0x77, 0xc5, 0x2f, 0x78, 0x7f, 0x5e,
+	0x24, 0x21, 0xa7, 0x58, 0x2a, 0x14, 0x4b, 0x2e, 0xe3, 0x6f, 0xf9, 0x2c, 0x51, 0x79, 0xcb, 0x65,
+	0x33, 0xa5, 0xb5, 0x62, 0x4a, 0x5d, 0x58, 0xdf, 0x17, 0x21, 0xe3, 0x81, 0xc7, 0x62, 0x5f, 0x4c,
+	0xf5, 0x14, 0x2a, 0x60, 0x38, 0xab, 0xba, 0xb3, 0x59, 0xdf, 0xe7, 0x13, 0xa6, 0x19, 0xd6, 0x89,
+	0xe1, 0x12, 0xea, 0xfe, 0xc3, 0x82, 0x7a, 0x96, 0x7f, 0x23, 0x64, 0xab, 0x10, 0xb2, 0xa6, 0xc9,
+	0x17, 0x2d, 0x94, 0xcb, 0x26, 0xcd, 0x72, 0x91, 0xe6, 0x63, 0xa8, 0x1d, 0xd0, 0xc4, 0xa3, 0xb0,
+	0xab, 0x9e, 0x96, 0x10, 0xef, 0x27, 0xa7, 0x61, 0x94, 0x85, 0xac, 0x25, 0xbc, 0x57, 0x3b, 0xa1,
+	0x48, 0xcf, 0x74, 0xb8, 0x4a, 0x40, 0x74, 0x2f, 0xf6, 0xc3, 0x48, 0x47, 0xa9, 0x84, 0xac, 0xc0,
+	0xf5, 0x45, 0x81, 0x2f, 0x70, 0xe5, 0x31, 0xbb, 0xe9, 0xe3, 0x44, 0xe3, 0xf6, 0xa0, 0x7e, 0x1c,
+	0xce, 0xe4, 0x6e, 0x12, 0xc7, 0xa8, 0xd3, 0x63, 0x29, 0x92, 0xb5, 0x68, 0xe6, 0x6a, 0x09, 0x1b,
+	0xb6, 0xc7, 0xc6, 0xfe, 0x3c, 0x4a, 0x51, 0x35, 0x7b, 0x3c, 0x0d, 0xc8, 0xfd, 0xb3, 0x05, 0x2d,
+	0xd5, 0x99, 0x7b, 0x3c, 0x65, 0x02, 0x31, 0xfb, 0x7b, 0x50, 0xa5, 0x5e, 0x24, 0x63, 0xcd, 0xed,
+	0xc7, 0xc5, 0x35, 0x24, 0xbb, 0xfa, 0x9e, 0x52, 0xb2, 0x77, 0xa0, 0x89, 0xe3, 0xcd, 0xe7, 0x29,
+	0x86, 0x49, 0x3e, 0x9a, 0xdb, 0xed, 0xd5, 0x33, 0xc5, 0xfe, 0xf7, 0xcc, 0x43, 0x38, 0x79, 0x06,
+	0xd9, 0x16, 0x97, 0xbf, 0xe3, 0x15, 0xaf, 0x08, 0xba, 0x7f, 0xca, 0xb9, 0xbe, 0x64, 0xfe, 0x05,
+	0xbb, 0x03, 0xd7, 0x9f, 0x01, 0xd0, 0x51, 0x71, 0x2b, 0xaa, 0xc6, 0x99, 0x1b, 0x32, 0xfd, 0xb7,
+	0x05, 0xf7, 0x95, 0x91, 0x43, 0x7e, 0x11, 0xa6, 0x2c, 0xb8, 0x03, 0xd7, 0xcf, 0xa1, 0x36, 0x98,
+	0xdd, 0x8a, 0xa7, 0xd6, 0xb7, 0x5f, 0x40, 0x4b, 0xbb, 0x45, 0x31, 0x5f, 0xd3, 0x6f, 0x62, 0x62,
+	0xf9, 0xe0, 0x6a, 0xbc, 0x95, 0xab, 0xe2, 0xfd, 0x97, 0x05, 0x9b, 0xca, 0xd2, 0xcf, 0xc3, 0xd1,
+	0xf4, 0x23, 0x87, 0xfb, 0x25, 0x6c, 0x28, 0xaf, 0xb7, 0x8e, 0x76, 0xe9, 0xdc, 0x0d, 0x83, 0xfd,
+	0xaf, 0x05, 0x8f, 0xb2, 0xe2, 0x8e, 0x93, 0xdd, 0x33, 0x1c, 0x6a, 0x2a, 0x62, 0x7c, 0x3f, 0x48,
+	0xa4, 0xe5, 0x48, 0xfd, 0xb1, 0x61, 0x20, 0xef, 0x11, 0xe3, 0x4f, 0xa0, 0xb1, 0x1f, 0x72, 0x9f,
+	0x40, 0x6a, 0xb9, 0x9b, 0x1c, 0x5e, 0x1c, 0xc1, 0xd1, 0xd3, 0x9f, 0xeb, 0x77, 0x4d, 0xbf, 0x05,
+	0x99, 0xbc, 0xa8, 0x53, 0xf5, 0x06, 0x75, 0x72, 0xff, 0x69, 0xc1, 0x26, 0x7d, 0xa9, 0x77, 0xf1,
+	0x2e, 0xa5, 0x7e, 0x0e, 0x6b, 0x74, 0x38, 0xb9, 0x79, 0x1e, 0xb2, 0x03, 0x78, 0x83, 0xf5, 0x08,
+	0xb8, 0x4d, 0xa1, 0x8d, 0x33, 0x37, 0x2c, 0xf2, 0x1f, 0x2d, 0x78, 0x98, 0x13, 0x37, 0x6b, 0x8c,
+	0x7f, 0x8f, 0x68, 0x71, 0x51, 0x64, 0x13, 0x5a, 0x24, 0xa3, 0x74, 0xbb, 0xbe, 0x2f, 0xdf, 0xae,
+	0x27, 0xdc, 0xdf, 0x5b, 0xe0, 0xe0, 0x83, 0x4e, 0x3a, 0xdd, 0xd9, 0x2c, 0xd2, 0x7b, 0xd3, 0x1d,
+	0x2a, 0xf2, 0x23, 0x68, 0x68, 0x03, 0x3c, 0xd5, 0xb4, 0xaf, 0xdd, 0x97, 0x16, 0xda, 0xf8, 0xf4,
+	0x78, 0xcc, 0x97, 0xf9, 0x0a, 0xa7, 0x25, 0xf7, 0x6f, 0x16, 0x38, 0x06, 0xa9, 0x23, 0x91, 0x8c,
+	0x98, 0x94, 0x1f, 0x79, 0x34, 0x10, 0x39, 0x39, 0x8f, 0x52, 0xbd, 0x26, 0x69, 0xc9, 0x20, 0x5d,
+	0x29, 0x90, 0xfe, 0xab, 0x05, 0xa0, 0xb6, 0x19, 0xba, 0x35, 0xcf, 0xa0, 0x41, 0x8b, 0x21, 0xf9,
+	0x56, 0x54, 0x1f, 0x15, 0x7c, 0x2f, 0x12, 0x92, 0xeb, 0x29, 0xdb, 0xb4, 0x1e, 0x95, 0x32, 0xdb,
+	0xb4, 0x18, 0x15, 0x97, 0xcb, 0xf2, 0xca, 0x72, 0xf9, 0xc3, 0xcc, 0x35, 0x79, 0xab, 0x5c, 0xe7,
+	0xcd, 0x50, 0x74, 0xa7, 0x70, 0x5f, 0x49, 0x46, 0xb2, 0x71, 0x9b, 0xe8, 0x06, 0xea, 0x2f, 0x27,
+	0x8b, 0x1c, 0x65, 0x22, 0x6e, 0xe5, 0xdd, 0x20, 0x18, 0x26, 0x73, 0x31, 0xca, 0xb7, 0xf2, 0x1c,
+	0x40, 0x8e, 0xdd, 0x20, 0xf8, 0x55, 0x22, 0x82, 0x90, 0x4f, 0x74, 0x41, 0x0d, 0xc4, 0x7d, 0x81,
+	0x0b, 0x60, 0x12, 0x1f, 0x27, 0x7a, 0xa3, 0x79, 0x8a, 0x9c, 0x93, 0xb8, 0xb0, 0xed, 0x18, 0x08,
+	0x8e, 0x9d, 0x4c, 0x37, 0xdb, 0x78, 0x32, 0xd9, 0xfd, 0x35, 0x3c, 0x59, 0x21, 0xde, 0x0d, 0x02,
+	0xdd, 0x21, 0x5f, 0x14, 0x3d, 0xe9, 0xec, 0x17, 0xff, 0x23, 0x62, 0x2a, 0x78, 0x05, 0x75, 0xf7,
+	0x04, 0x9e, 0xae, 0x18, 0x2f, 0xb6, 0xe0, 0x7b, 0x3a, 0xf8, 0x83, 0x05, 0x2d, 0xed, 0x21, 0xe7,
+	0xfc, 0x19, 0xd4, 0x14, 0xa4, 0x8d, 0x7d, 0xb2, 0x64, 0x2c, 0xeb, 0x2b, 0x4f, 0xab, 0xad, 0x8e,
+	0xa2, 0xd2, 0x15, 0xa3, 0xc8, 0x7e, 0xb6, 0x34, 0x21, 0xae, 0xbd, 0x99, 0xd9, 0x70, 0xf0, 0xb2,
+	0xb6, 0xe8, 0xb1, 0x88, 0xa5, 0x1f, 0x26, 0xe6, 0x01, 0x6c, 0xec, 0x44, 0xfe, 0x68, 0xfa, 0xc1,
+	0xaa, 0xf4, 0x0b, 0xd8, 0x24, 0x83, 0x1f, 0x90, 0xe3, 0x2f, 0xe1, 0xd1, 0x22, 0xd1, 0xe6, 0xdc,
+	0x7e, 0x4f, 0xbb, 0xdf, 0x87, 0x07, 0x43, 0x16, 0x8d, 0xd1, 0xea, 0xeb, 0x59, 0x90, 0x3f, 0x7c,
+	0x5f, 0xb1, 0xea, 0x9f, 0xd6, 0xe8, 0x3f, 0xd1, 0xcf, 0xfe, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x45,
+	0x62, 0x8c, 0xef, 0x9c, 0x16, 0x00, 0x00,
 }
diff --git a/pkg/proto/sdk_ws/ws.proto b/pkg/proto/sdk_ws/ws.proto
index 3a20f1fcb..7ef3d4d22 100644
--- a/pkg/proto/sdk_ws/ws.proto
+++ b/pkg/proto/sdk_ws/ws.proto
@@ -164,7 +164,6 @@ message MemberEnterTips{
   uint64 OperationTime = 3;
 }
 
-
 //Actively leave the group
 message MemberLeaveTips{
   GroupInfo Group = 1;
@@ -175,20 +174,19 @@ message MemberLeaveTips{
 message MemberInvitedTips{
   GroupInfo Group = 1;
   GroupMemberFullInfo OpUser = 2;
-  GroupMemberFullInfo InvitedUser = 3;
+  repeated GroupMemberFullInfo InvitedUserList = 3;
   uint64 OperationTime = 4;
 }
 
 message MemberKickedTips{
   GroupInfo Group = 1;
   GroupMemberFullInfo OpUser = 2;
-  GroupMemberFullInfo KickedUser = 3;
+  repeated GroupMemberFullInfo KickedUserList = 3;
   uint64 OperationTime = 4;
 }
 
-
 message MemberInfoChangedTips{
-  int32 ChangeType = 1; //1:info changed; 2:mute
+  int32 ChangeType = 1; ///bitwise operators 0001:member info changed; 0010:mute ;
   GroupMemberFullInfo OpUser = 2; //who do this
   GroupMemberFullInfo FinalInfo = 3; //
   uint64 MuteTime = 4;
@@ -203,12 +201,12 @@ message GroupCreatedTips{
 }
 
 message GroupInfoChangedTips{
-  int32 ChangedType = 1; //bitwise operators: 1:groupName; 10:Notification  100:Introduction; 1000:FaceUrl
+  int32 ChangedType = 1; //bitwise operators: 0001:groupName; 0010:Notification  0100:Introduction; 1000:FaceUrl
   GroupInfo Group = 2;
   GroupMemberFullInfo OpUser = 3;
 }
 
-message ReceiveJoinApplicationTips{
+message JoinGroupApplicationTips{
   GroupInfo Group = 1;
   PublicUserInfo Applicant  = 2;
   string 	Reason = 3;
@@ -235,56 +233,52 @@ message FriendApplication{
   string AddWording = 3;
 }
 
-//user1 add user2
+message FromToUserID{
+  string FromUserID = 1;
+  string ToUserID = 2;
+}
+
+//FromUserID apply to add ToUserID
 message FriendApplicationAddedTips{
-  PublicUserInfo OpUser = 1; //user1
-  FriendApplication Application = 2;
-  PublicUserInfo  OpedUser = 3; //user2
-  uint64 OperationTime = 4;
+    FromToUserID FromToUserID = 1;
 }
 
-// user2 accept or reject
+//FromUserID accept or reject ToUserID
 message FriendApplicationProcessedTips{
-  PublicUserInfo     OpUser = 1;  //user2
-  PublicUserInfo     OpedUser = 2; //user1
-  int32 result = 3; //1: accept; -1: reject
-  uint64 OperationTime = 4;
+  FromToUserID FromToUserID = 1;
 }
 
+// FromUserID  Added a friend ToUserID
 message FriendAddedTips{
   FriendInfo Friend = 1;
   uint64 OperationTime = 2;
+  PublicUserInfo     OpUser = 3;  //who do this
+
 }
 
+// FromUserID  deleted a friend ToUserID
 message FriendDeletedTips{
-  FriendInfo Friend = 1;
-  uint64 OperationTime = 2;
+  FromToUserID FromToUserID = 1;
 }
 
-message BlackInfo{
-  PublicUserInfo OwnerUser = 1;
-  uint64 CreateTime = 3;
-  PublicUserInfo BlackUser = 4;
-}
+//message BlackInfo{
+//  PublicUserInfo OwnerUser = 1;
+//  uint64 CreateTime = 3;
+//  PublicUserInfo BlackUser = 4;
+//}
 
 message BlackAddedTips{
-  BlackInfo Black = 1;
-  uint64 OperationTime = 2;
+  FromToUserID FromToUserID = 1;
 }
 
 message BlackDeletedTips{
-  BlackInfo Black = 1;
-  uint64 OperationTime = 2;
+  FromToUserID FromToUserID = 1;
 }
 
 message FriendInfoChangedTips{
-  FriendInfo Friend = 1;
-  PublicUserInfo OpUser = 2;
-  uint64 OperationTime = 3;
+  FromToUserID FromToUserID = 1;
 }
 //////////////////////user/////////////////////
 message SelfInfoUpdatedTips{
-  UserInfo SelfUserInfo = 1;
-  PublicUserInfo OpUser = 2;
-  uint64 OperationTime = 3;
+  string UserID = 1;
 }