xy 1 日 前
コミット
b2831a30fe

+ 32 - 1
bin/client_msg/common.proto

@@ -313,6 +313,24 @@ message ResFriendList{
   repeated UserInfo list = 3;
 }
 
+//请求好友申请单个数据
+message FriendRequestItem{
+  UserInfo info = 1;
+  string request_msg = 2;
+}
+
+//请求好友申请列表
+message ReqFriendRequestList{
+  string user_id = 1;
+}
+
+//响应好友申请列表请求,暂时没做分页
+message ResFriendRequestList{
+  bool success = 1;
+  MsgError err_msg = 2;
+  repeated FriendRequestItem list = 3;
+ 
+}
 
 //请求添加好友
 message ReqAddFriend{
@@ -347,4 +365,17 @@ message ResSearchUser{
   bool success = 1;
   MsgError err_msg = 2;
   UserInfo info = 3;
-}
+}
+
+//删除好友
+message ReqDeleteFriend{
+  string ToUserID = 1;
+}
+
+//删除好友响应
+message ResDeleteFriend{
+  bool success = 1;
+  MsgError err_msg = 2;
+}
+
+

+ 66 - 0
src/server/datacenter/users.go

@@ -21,6 +21,72 @@ type User struct {
 	Password   string          `json:"-" db:"password"` // json:"-" 表示不序列化密码
 }
 
+// GetUsersByIDs 根据用户ID数组批量获取用户信息
+func GetUsersByIDs(ids []string) ([]*User, error) {
+	// 处理空数组情况
+	if len(ids) == 0 {
+		return []*User{}, nil
+	}
+
+	// 构建IN查询参数
+	query, args := buildInQuery("SELECT id, user_id, friend_ids, name, head, coin, create_time FROM users WHERE user_id IN", ids)
+
+	// 执行查询
+	rows, err := mysqlmgr.Query(query, args...)
+	if err != nil {
+		return nil, fmt.Errorf("批量查询用户失败: %v", err)
+	}
+	defer rows.Close()
+
+	// 处理结果集
+	var users []*User
+	for rows.Next() {
+		var user User
+		var friendData []byte
+		var createTime sql.NullTime
+
+		err := rows.Scan(
+			&user.ID,
+			&user.UserID,
+			&friendData,
+			&user.Name,
+			&user.Head,
+			&user.Coin,
+			&createTime,
+		)
+		if err != nil {
+			return nil, fmt.Errorf("解析用户数据失败: %v", err)
+		}
+
+		// 处理JSON和NULL字段
+		user.FriendIDs = json.RawMessage(friendData)
+		if createTime.Valid {
+			user.CreateTime = createTime.Time
+		}
+
+		users = append(users, &user)
+	}
+
+	if err = rows.Err(); err != nil {
+		return nil, fmt.Errorf("遍历结果集失败: %v", err)
+	}
+
+	return users, nil
+}
+
+// buildInQuery 构建安全的IN查询语句
+func buildInQuery(baseQuery string, ids []string) (string, []interface{}) {
+	placeholders := make([]string, len(ids))
+	args := make([]interface{}, len(ids))
+
+	for i, id := range ids {
+		placeholders[i] = "?"
+		args[i] = id
+	}
+
+	return fmt.Sprintf("%s (%s)", baseQuery, strings.Join(placeholders, ",")), args
+}
+
 func GetUserByID(userID string) (*User, error) {
 	var user User
 	var friendData []byte // 接收数据库中的JSON原始数据

+ 2 - 0
src/server/gate/router.go

@@ -19,6 +19,8 @@ func init() {
 	msg.Processor.SetRouter(&msg.RecvAddFriendRequest{}, hall.ChanRPC)
 	msg.Processor.SetRouter(&msg.OptAddFriendRequest{}, hall.ChanRPC)
 	msg.Processor.SetRouter(&msg.SearchUser{}, hall.ChanRPC)
+	msg.Processor.SetRouter(&msg.ReqFriendRequestList{}, hall.ChanRPC)
+	msg.Processor.SetRouter(&msg.ReqDeleteFriend{}, hall.ChanRPC)
 
 	msg.Processor.SetRouter(&msg.ReqHeartBeat{}, game.ChanRPC)
 	msg.Processor.SetRouter(&msg.SendColorSz{}, game.ChanRPC)

+ 56 - 0
src/server/hall/friends/friends.go

@@ -53,6 +53,62 @@ func GetFriendsListByUserId(args []interface{}) {
 
 }
 
+func DeleteFriend(args []interface{}) {
+
+}
+
+// 获取好友申请列表
+func GetFriendRquestList(args []interface{}) {
+	m := args[0].(*msg.ReqFriendRequestList)
+	a := args[1].(gate.Agent)
+	user_id := m.UserId
+	list, err := requestaddfriend.GetPendingRequests(user_id)
+	if err != nil {
+		a.WriteMsg(&msg.ResFriendRequestList{
+			Success: false,
+			ErrMsg: &msg.MsgError{
+				ErrorCode: 101,
+				ErrorMsg:  "error",
+			},
+		})
+		return
+	}
+	var ids = make([]string, 0)
+	var msg_list = map[string]string{}
+	for _, v := range list {
+		ids = append(ids, v.FromUserID)
+		msg_list[v.FromUserID] = v.Message
+	}
+	users, err := usercenter.GetUsersByIDs(ids)
+
+	if err == nil {
+		var temp = make([]*msg.FriendRequestItem, 0)
+		for _, v := range users {
+			temp = append(temp, &msg.FriendRequestItem{
+				RequestMsg: msg_list[v.UserID],
+				Info: &msg.UserInfo{
+					UserId: v.UserID,
+					MHead:  v.Head,
+					Name:   v.Name,
+				},
+			})
+		}
+		a.WriteMsg(&msg.ResFriendRequestList{
+			Success: true,
+			List:    temp,
+		})
+	} else {
+		a.WriteMsg(&msg.ResFriendRequestList{
+			Success: false,
+			ErrMsg: &msg.MsgError{
+				ErrorCode: 101,
+				ErrorMsg:  "error",
+			},
+		})
+	}
+
+}
+
 // 添加好友请求
 func AddFriendrRquest(args []interface{}) {
 	m := args[0].(*msg.ReqAddFriend)

+ 2 - 0
src/server/hall/internal/handler.go

@@ -27,6 +27,8 @@ func init() {
 	HandleMsg(&msg.ReqAddFriend{}, friends.AddFriendrRquest)
 	HandleMsg(&msg.OptAddFriendRequest{}, friends.OptFriendrRquest)
 	HandleMsg(&msg.SearchUser{}, friends.SearchUser)
+	HandleMsg(&msg.ReqFriendRequestList{}, friends.GetFriendRquestList)
+	HandleMsg(&msg.ReqDeleteFriend{}, friends.DeleteFriend)
 }
 
 func enterHall(args []interface{}) {

+ 330 - 40
src/server/msg/common.pb.go

@@ -2652,13 +2652,14 @@ func (x *BuyShopItem) GetId() string {
 	return ""
 }
 
+// 好友请求的结构
 type RequestAddFriendItem struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	Id            int32                  `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
-	RequestID     string                 `protobuf:"bytes,2,opt,name=RequestID,proto3" json:"RequestID,omitempty"`
+	RequestID     string                 `protobuf:"bytes,2,opt,name=RequestID,proto3" json:"RequestID,omitempty"` //请求id
 	FromUserID    string                 `protobuf:"bytes,3,opt,name=FromUserID,proto3" json:"FromUserID,omitempty"`
 	ToUserID      string                 `protobuf:"bytes,4,opt,name=ToUserID,proto3" json:"ToUserID,omitempty"`
-	Status        int32                  `protobuf:"varint,5,opt,name=Status,proto3" json:"Status,omitempty"`
+	Status        int32                  `protobuf:"varint,5,opt,name=Status,proto3" json:"Status,omitempty"` //状态
 	Message       string                 `protobuf:"bytes,6,opt,name=Message,proto3" json:"Message,omitempty"`
 	unknownFields protoimpl.UnknownFields
 	sizeCache     protoimpl.SizeCache
@@ -2736,6 +2737,7 @@ func (x *RequestAddFriendItem) GetMessage() string {
 	return ""
 }
 
+// 请求好友列表
 type ReqFriendList struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	UserId        string                 `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
@@ -2780,6 +2782,7 @@ func (x *ReqFriendList) GetUserId() string {
 	return ""
 }
 
+// 响应好友列表请求,暂时没做分页
 type ResFriendList struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	Success       bool                   `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
@@ -2840,6 +2843,166 @@ func (x *ResFriendList) GetList() []*UserInfo {
 	return nil
 }
 
+// 请求好友申请单个数据
+type FriendRequestItem struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Info          *UserInfo              `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"`
+	RequestMsg    string                 `protobuf:"bytes,2,opt,name=request_msg,json=requestMsg,proto3" json:"request_msg,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *FriendRequestItem) Reset() {
+	*x = FriendRequestItem{}
+	mi := &file_common_proto_msgTypes[41]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *FriendRequestItem) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FriendRequestItem) ProtoMessage() {}
+
+func (x *FriendRequestItem) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[41]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FriendRequestItem.ProtoReflect.Descriptor instead.
+func (*FriendRequestItem) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *FriendRequestItem) GetInfo() *UserInfo {
+	if x != nil {
+		return x.Info
+	}
+	return nil
+}
+
+func (x *FriendRequestItem) GetRequestMsg() string {
+	if x != nil {
+		return x.RequestMsg
+	}
+	return ""
+}
+
+// 请求好友申请列表
+type ReqFriendRequestList struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	UserId        string                 `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *ReqFriendRequestList) Reset() {
+	*x = ReqFriendRequestList{}
+	mi := &file_common_proto_msgTypes[42]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ReqFriendRequestList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReqFriendRequestList) ProtoMessage() {}
+
+func (x *ReqFriendRequestList) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[42]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReqFriendRequestList.ProtoReflect.Descriptor instead.
+func (*ReqFriendRequestList) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *ReqFriendRequestList) GetUserId() string {
+	if x != nil {
+		return x.UserId
+	}
+	return ""
+}
+
+// 响应好友申请列表请求,暂时没做分页
+type ResFriendRequestList struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Success       bool                   `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
+	ErrMsg        *MsgError              `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"`
+	List          []*FriendRequestItem   `protobuf:"bytes,3,rep,name=list,proto3" json:"list,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *ResFriendRequestList) Reset() {
+	*x = ResFriendRequestList{}
+	mi := &file_common_proto_msgTypes[43]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ResFriendRequestList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ResFriendRequestList) ProtoMessage() {}
+
+func (x *ResFriendRequestList) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[43]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ResFriendRequestList.ProtoReflect.Descriptor instead.
+func (*ResFriendRequestList) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *ResFriendRequestList) GetSuccess() bool {
+	if x != nil {
+		return x.Success
+	}
+	return false
+}
+
+func (x *ResFriendRequestList) GetErrMsg() *MsgError {
+	if x != nil {
+		return x.ErrMsg
+	}
+	return nil
+}
+
+func (x *ResFriendRequestList) GetList() []*FriendRequestItem {
+	if x != nil {
+		return x.List
+	}
+	return nil
+}
+
+// 请求添加好友
 type ReqAddFriend struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	ToUserID      string                 `protobuf:"bytes,1,opt,name=ToUserID,proto3" json:"ToUserID,omitempty"`
@@ -2850,7 +3013,7 @@ type ReqAddFriend struct {
 
 func (x *ReqAddFriend) Reset() {
 	*x = ReqAddFriend{}
-	mi := &file_common_proto_msgTypes[41]
+	mi := &file_common_proto_msgTypes[44]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -2862,7 +3025,7 @@ func (x *ReqAddFriend) String() string {
 func (*ReqAddFriend) ProtoMessage() {}
 
 func (x *ReqAddFriend) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[41]
+	mi := &file_common_proto_msgTypes[44]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2875,7 +3038,7 @@ func (x *ReqAddFriend) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ReqAddFriend.ProtoReflect.Descriptor instead.
 func (*ReqAddFriend) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{41}
+	return file_common_proto_rawDescGZIP(), []int{44}
 }
 
 func (x *ReqAddFriend) GetToUserID() string {
@@ -2892,6 +3055,7 @@ func (x *ReqAddFriend) GetMsg() string {
 	return ""
 }
 
+// 客户端接收到请求消息
 type RecvAddFriendRequest struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	Info          *UserInfo              `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"`
@@ -2901,7 +3065,7 @@ type RecvAddFriendRequest struct {
 
 func (x *RecvAddFriendRequest) Reset() {
 	*x = RecvAddFriendRequest{}
-	mi := &file_common_proto_msgTypes[42]
+	mi := &file_common_proto_msgTypes[45]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -2913,7 +3077,7 @@ func (x *RecvAddFriendRequest) String() string {
 func (*RecvAddFriendRequest) ProtoMessage() {}
 
 func (x *RecvAddFriendRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[42]
+	mi := &file_common_proto_msgTypes[45]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2926,7 +3090,7 @@ func (x *RecvAddFriendRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RecvAddFriendRequest.ProtoReflect.Descriptor instead.
 func (*RecvAddFriendRequest) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{42}
+	return file_common_proto_rawDescGZIP(), []int{45}
 }
 
 func (x *RecvAddFriendRequest) GetInfo() *UserInfo {
@@ -2936,6 +3100,7 @@ func (x *RecvAddFriendRequest) GetInfo() *UserInfo {
 	return nil
 }
 
+// 接收到的玩家对消息进行操作
 type OptAddFriendRequest struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	Info          *RequestAddFriendItem  `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"`
@@ -2945,7 +3110,7 @@ type OptAddFriendRequest struct {
 
 func (x *OptAddFriendRequest) Reset() {
 	*x = OptAddFriendRequest{}
-	mi := &file_common_proto_msgTypes[43]
+	mi := &file_common_proto_msgTypes[46]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -2957,7 +3122,7 @@ func (x *OptAddFriendRequest) String() string {
 func (*OptAddFriendRequest) ProtoMessage() {}
 
 func (x *OptAddFriendRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[43]
+	mi := &file_common_proto_msgTypes[46]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2970,7 +3135,7 @@ func (x *OptAddFriendRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptAddFriendRequest.ProtoReflect.Descriptor instead.
 func (*OptAddFriendRequest) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{43}
+	return file_common_proto_rawDescGZIP(), []int{46}
 }
 
 func (x *OptAddFriendRequest) GetInfo() *RequestAddFriendItem {
@@ -2980,6 +3145,7 @@ func (x *OptAddFriendRequest) GetInfo() *RequestAddFriendItem {
 	return nil
 }
 
+// 通知请求的玩家,对方的操作结果
 type NotifyOptFriend struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	Info          *RequestAddFriendItem  `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"`
@@ -2989,7 +3155,7 @@ type NotifyOptFriend struct {
 
 func (x *NotifyOptFriend) Reset() {
 	*x = NotifyOptFriend{}
-	mi := &file_common_proto_msgTypes[44]
+	mi := &file_common_proto_msgTypes[47]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -3001,7 +3167,7 @@ func (x *NotifyOptFriend) String() string {
 func (*NotifyOptFriend) ProtoMessage() {}
 
 func (x *NotifyOptFriend) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[44]
+	mi := &file_common_proto_msgTypes[47]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3014,7 +3180,7 @@ func (x *NotifyOptFriend) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use NotifyOptFriend.ProtoReflect.Descriptor instead.
 func (*NotifyOptFriend) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{44}
+	return file_common_proto_rawDescGZIP(), []int{47}
 }
 
 func (x *NotifyOptFriend) GetInfo() *RequestAddFriendItem {
@@ -3024,6 +3190,7 @@ func (x *NotifyOptFriend) GetInfo() *RequestAddFriendItem {
 	return nil
 }
 
+// 根据玩家id搜索玩家
 type SearchUser struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	UserId        string                 `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
@@ -3033,7 +3200,7 @@ type SearchUser struct {
 
 func (x *SearchUser) Reset() {
 	*x = SearchUser{}
-	mi := &file_common_proto_msgTypes[45]
+	mi := &file_common_proto_msgTypes[48]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -3045,7 +3212,7 @@ func (x *SearchUser) String() string {
 func (*SearchUser) ProtoMessage() {}
 
 func (x *SearchUser) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[45]
+	mi := &file_common_proto_msgTypes[48]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3058,7 +3225,7 @@ func (x *SearchUser) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SearchUser.ProtoReflect.Descriptor instead.
 func (*SearchUser) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{45}
+	return file_common_proto_rawDescGZIP(), []int{48}
 }
 
 func (x *SearchUser) GetUserId() string {
@@ -3068,6 +3235,7 @@ func (x *SearchUser) GetUserId() string {
 	return ""
 }
 
+// 响应搜索结果
 type ResSearchUser struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	Success       bool                   `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
@@ -3079,7 +3247,7 @@ type ResSearchUser struct {
 
 func (x *ResSearchUser) Reset() {
 	*x = ResSearchUser{}
-	mi := &file_common_proto_msgTypes[46]
+	mi := &file_common_proto_msgTypes[49]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -3091,7 +3259,7 @@ func (x *ResSearchUser) String() string {
 func (*ResSearchUser) ProtoMessage() {}
 
 func (x *ResSearchUser) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[46]
+	mi := &file_common_proto_msgTypes[49]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3104,7 +3272,7 @@ func (x *ResSearchUser) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ResSearchUser.ProtoReflect.Descriptor instead.
 func (*ResSearchUser) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{46}
+	return file_common_proto_rawDescGZIP(), []int{49}
 }
 
 func (x *ResSearchUser) GetSuccess() bool {
@@ -3128,6 +3296,104 @@ func (x *ResSearchUser) GetInfo() *UserInfo {
 	return nil
 }
 
+// 删除好友
+type ReqDeleteFriend struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	ToUserID      string                 `protobuf:"bytes,1,opt,name=ToUserID,proto3" json:"ToUserID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *ReqDeleteFriend) Reset() {
+	*x = ReqDeleteFriend{}
+	mi := &file_common_proto_msgTypes[50]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ReqDeleteFriend) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReqDeleteFriend) ProtoMessage() {}
+
+func (x *ReqDeleteFriend) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[50]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReqDeleteFriend.ProtoReflect.Descriptor instead.
+func (*ReqDeleteFriend) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{50}
+}
+
+func (x *ReqDeleteFriend) GetToUserID() string {
+	if x != nil {
+		return x.ToUserID
+	}
+	return ""
+}
+
+// 删除好友响应
+type ResDeleteFriend struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Success       bool                   `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
+	ErrMsg        *MsgError              `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *ResDeleteFriend) Reset() {
+	*x = ResDeleteFriend{}
+	mi := &file_common_proto_msgTypes[51]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ResDeleteFriend) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ResDeleteFriend) ProtoMessage() {}
+
+func (x *ResDeleteFriend) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[51]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ResDeleteFriend.ProtoReflect.Descriptor instead.
+func (*ResDeleteFriend) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{51}
+}
+
+func (x *ResDeleteFriend) GetSuccess() bool {
+	if x != nil {
+		return x.Success
+	}
+	return false
+}
+
+func (x *ResDeleteFriend) GetErrMsg() *MsgError {
+	if x != nil {
+		return x.ErrMsg
+	}
+	return nil
+}
+
 var File_common_proto protoreflect.FileDescriptor
 
 const file_common_proto_rawDesc = "" +
@@ -3312,7 +3578,17 @@ const file_common_proto_rawDesc = "" +
 	"\rResFriendList\x12\x18\n" +
 	"\asuccess\x18\x01 \x01(\bR\asuccess\x12\"\n" +
 	"\aerr_msg\x18\x02 \x01(\v2\t.MsgErrorR\x06errMsg\x12\x1d\n" +
-	"\x04list\x18\x03 \x03(\v2\t.UserInfoR\x04list\"<\n" +
+	"\x04list\x18\x03 \x03(\v2\t.UserInfoR\x04list\"S\n" +
+	"\x11FriendRequestItem\x12\x1d\n" +
+	"\x04info\x18\x01 \x01(\v2\t.UserInfoR\x04info\x12\x1f\n" +
+	"\vrequest_msg\x18\x02 \x01(\tR\n" +
+	"requestMsg\"/\n" +
+	"\x14ReqFriendRequestList\x12\x17\n" +
+	"\auser_id\x18\x01 \x01(\tR\x06userId\"|\n" +
+	"\x14ResFriendRequestList\x12\x18\n" +
+	"\asuccess\x18\x01 \x01(\bR\asuccess\x12\"\n" +
+	"\aerr_msg\x18\x02 \x01(\v2\t.MsgErrorR\x06errMsg\x12&\n" +
+	"\x04list\x18\x03 \x03(\v2\x12.FriendRequestItemR\x04list\"<\n" +
 	"\fReqAddFriend\x12\x1a\n" +
 	"\bToUserID\x18\x01 \x01(\tR\bToUserID\x12\x10\n" +
 	"\x03msg\x18\x02 \x01(\tR\x03msg\"5\n" +
@@ -3328,7 +3604,12 @@ const file_common_proto_rawDesc = "" +
 	"\rResSearchUser\x12\x18\n" +
 	"\asuccess\x18\x01 \x01(\bR\asuccess\x12\"\n" +
 	"\aerr_msg\x18\x02 \x01(\v2\t.MsgErrorR\x06errMsg\x12\x1d\n" +
-	"\x04info\x18\x03 \x01(\v2\t.UserInfoR\x04info*K\n" +
+	"\x04info\x18\x03 \x01(\v2\t.UserInfoR\x04info\"-\n" +
+	"\x0fReqDeleteFriend\x12\x1a\n" +
+	"\bToUserID\x18\x01 \x01(\tR\bToUserID\"O\n" +
+	"\x0fResDeleteFriend\x12\x18\n" +
+	"\asuccess\x18\x01 \x01(\bR\asuccess\x12\"\n" +
+	"\aerr_msg\x18\x02 \x01(\v2\t.MsgErrorR\x06errMsg*K\n" +
 	"\broleType\x12\x15\n" +
 	"\x11ROLE_TYPE_UNKNOWN\x10\x00\x12\a\n" +
 	"\x03RED\x10\x01\x12\b\n" +
@@ -3379,7 +3660,7 @@ func file_common_proto_rawDescGZIP() []byte {
 }
 
 var file_common_proto_enumTypes = make([]protoimpl.EnumInfo, 7)
-var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 47)
+var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 52)
 var file_common_proto_goTypes = []any{
 	(RoleType)(0),                // 0: roleType
 	(OptType)(0),                 // 1: OptType
@@ -3429,12 +3710,17 @@ var file_common_proto_goTypes = []any{
 	(*RequestAddFriendItem)(nil), // 45: RequestAddFriendItem
 	(*ReqFriendList)(nil),        // 46: ReqFriendList
 	(*ResFriendList)(nil),        // 47: ResFriendList
-	(*ReqAddFriend)(nil),         // 48: ReqAddFriend
-	(*RecvAddFriendRequest)(nil), // 49: RecvAddFriendRequest
-	(*OptAddFriendRequest)(nil),  // 50: OptAddFriendRequest
-	(*NotifyOptFriend)(nil),      // 51: NotifyOptFriend
-	(*SearchUser)(nil),           // 52: SearchUser
-	(*ResSearchUser)(nil),        // 53: ResSearchUser
+	(*FriendRequestItem)(nil),    // 48: FriendRequestItem
+	(*ReqFriendRequestList)(nil), // 49: ReqFriendRequestList
+	(*ResFriendRequestList)(nil), // 50: ResFriendRequestList
+	(*ReqAddFriend)(nil),         // 51: ReqAddFriend
+	(*RecvAddFriendRequest)(nil), // 52: RecvAddFriendRequest
+	(*OptAddFriendRequest)(nil),  // 53: OptAddFriendRequest
+	(*NotifyOptFriend)(nil),      // 54: NotifyOptFriend
+	(*SearchUser)(nil),           // 55: SearchUser
+	(*ResSearchUser)(nil),        // 56: ResSearchUser
+	(*ReqDeleteFriend)(nil),      // 57: ReqDeleteFriend
+	(*ResDeleteFriend)(nil),      // 58: ResDeleteFriend
 }
 var file_common_proto_depIdxs = []int32{
 	0,  // 0: round.m_color:type_name -> roleType
@@ -3489,16 +3775,20 @@ var file_common_proto_depIdxs = []int32{
 	8,  // 49: ResLudoRoomInfo.info:type_name -> RoomInfo
 	31, // 50: ResFriendList.err_msg:type_name -> MsgError
 	21, // 51: ResFriendList.list:type_name -> UserInfo
-	21, // 52: RecvAddFriendRequest.info:type_name -> UserInfo
-	45, // 53: OptAddFriendRequest.info:type_name -> RequestAddFriendItem
-	45, // 54: NotifyOptFriend.info:type_name -> RequestAddFriendItem
-	31, // 55: ResSearchUser.err_msg:type_name -> MsgError
-	21, // 56: ResSearchUser.info:type_name -> UserInfo
-	57, // [57:57] is the sub-list for method output_type
-	57, // [57:57] is the sub-list for method input_type
-	57, // [57:57] is the sub-list for extension type_name
-	57, // [57:57] is the sub-list for extension extendee
-	0,  // [0:57] is the sub-list for field type_name
+	21, // 52: FriendRequestItem.info:type_name -> UserInfo
+	31, // 53: ResFriendRequestList.err_msg:type_name -> MsgError
+	48, // 54: ResFriendRequestList.list:type_name -> FriendRequestItem
+	21, // 55: RecvAddFriendRequest.info:type_name -> UserInfo
+	45, // 56: OptAddFriendRequest.info:type_name -> RequestAddFriendItem
+	45, // 57: NotifyOptFriend.info:type_name -> RequestAddFriendItem
+	31, // 58: ResSearchUser.err_msg:type_name -> MsgError
+	21, // 59: ResSearchUser.info:type_name -> UserInfo
+	31, // 60: ResDeleteFriend.err_msg:type_name -> MsgError
+	61, // [61:61] is the sub-list for method output_type
+	61, // [61:61] is the sub-list for method input_type
+	61, // [61:61] is the sub-list for extension type_name
+	61, // [61:61] is the sub-list for extension extendee
+	0,  // [0:61] is the sub-list for field type_name
 }
 
 func init() { file_common_proto_init() }
@@ -3512,7 +3802,7 @@ func file_common_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: unsafe.Slice(unsafe.StringData(file_common_proto_rawDesc), len(file_common_proto_rawDesc)),
 			NumEnums:      7,
-			NumMessages:   47,
+			NumMessages:   52,
 			NumExtensions: 0,
 			NumServices:   0,
 		},

+ 5 - 0
src/server/msg/msg.go

@@ -66,6 +66,11 @@ func init() {
 	Processor.Register(&SearchUser{})
 	Processor.Register(&ResSearchUser{})
 
+	Processor.Register(&ReqFriendRequestList{})
+	Processor.Register(&ResFriendRequestList{})
+	Processor.Register(&ReqDeleteFriend{})
+	Processor.Register(&ResDeleteFriend{})
+
 	Processor.Range(func(id uint16, t reflect.Type) {
 		log.Debug("消息ID: %d, 消息类型: %s\n", id, t.Elem().Name())
 		msgList = append(msgList, MsgInfo{