feat(friend): 添加好友系统功能实现

完善好友管理功能,包括添加好友、回复好友请求、删除好友等操作,
同时优化了相关数据结构和接口定义。

BREAKING CHANGE: 调整了黑名单数据结构,将BlackInfo从结构体改为uint32数组
```
This commit is contained in:
昔念
2026-01-20 06:15:55 +08:00
parent fcb55d3a46
commit 07d25b3e96
15 changed files with 255 additions and 82 deletions

View File

@@ -0,0 +1,38 @@
package model
import (
"blazing/cool"
)
// 表名常量
const TableNamePlayerFriend = "player_friend"
// Friend 对应数据库表 player_cdk_log用于记录CDK兑换日志
type Friend struct {
Base
PlayerID uint64 `gorm:"not null;index:idx_player_friend_by_player_id;comment:'所属玩家ID'" json:"player_id"`
Friend []uint32 `gorm:"type:jsonb; comment:'好友列表'" json:"friend"`
Black []uint32 `gorm:"type:jsonb; comment:'黑名单列表'" json:"black"`
}
// TableName 返回表名
func (*Friend) TableName() string {
return TableNamePlayerFriend
}
// GroupName 返回表组名
func (*Friend) GroupName() string {
return "default"
}
// NewFriend 创建一个新的CDK记录
func NewFriend() *Friend {
return &Friend{
Base: *NewBase(),
}
}
// init 程序启动时自动创建表
func init() {
cool.CreateTable(&Friend{})
}

View File

@@ -13,7 +13,7 @@ type Title struct {
PlayerID uint64 `gorm:"not null;index:idx_player_title_by_player_id;comment:'所属玩家ID'" json:"player_id"`
//TitleID uint32 `gorm:"not null;comment:'称号ID'" json:"title_id"`
//可用称号
AvailableTitle []uint32 `gorm:"type:json; comment:'可用称号'" json:"available_title"`
AvailableTitle []uint32 `gorm:"type:jsonb; comment:'可用称号'" json:"available_title"`
}
// TableName 返回表名

View File

@@ -29,7 +29,7 @@ func (s *BargeService) Update(petid uint32, isskill bool) {
cool.Logger.Info(context.TODO(), "测试服不消耗物品玩家数据", s.userid)
return
}
if t, _ := s.PModel(s.Model).Where("pet_id", petid).Count(); t != 0 {
if t, _ := s.PModel(s.Model).Where("pet_id", petid).Exist(); t {
if isskill {
s.PModel(s.Model).Where("pet_id", petid).Increment("killed_count", 1)
} else {

View File

@@ -0,0 +1,71 @@
package service
import (
"blazing/cool"
"blazing/modules/player/model"
"fmt"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
)
type FriendService struct {
BaseService
}
func (s *FriendService) Get() ([]uint32, []uint32) {
m1 := s.TestModel(s.Model)
var talks *model.Friend
m1.Scan(&talks)
if talks == nil {
return []uint32{}, []uint32{}
}
return talks.Friend, talks.Black
}
func (s *FriendService) Add(id uint32) bool {
m1, _ := s.TestModel(s.Model).Exist()
if !m1 {
m := s.TestModel(s.Model)
data := g.Map{
"player_id": s.userid,
"friend": []uint32{},
"black": []uint32{},
"is_vip": cool.Config.ServerInfo.IsVip,
}
m.Data(data).Insert()
return true
}
m := s.TestModel(s.Model)
m.Data(g.Map{
"friend": gdb.Raw(fmt.Sprintf("friend|| '%d'::jsonb", id)),
}).Update()
return true
}
func (s *FriendService) Del(id uint32) bool {
m := s.TestModel(s.Model)
m.Data(g.Map{
"friend": gdb.Raw(fmt.Sprintf("jsonb_array_remove(friend, '%d'::jsonb)", id)),
}).Update()
return true
}
func NewFriendService(id uint32) *FriendService {
return &FriendService{
BaseService: BaseService{userid: id,
Service: &cool.Service{Model: model.NewFriend()},
},
}
}

View File

@@ -25,14 +25,9 @@ func (s *InfoService) IsReg() bool {
m := s.PModel(s.Model)
record, err := m.One()
if err != nil {
return false
}
if record != nil {
return true
}
return false
record, _ := m.Exist()
return record
}
// 实现注册,id+昵称+颜色

View File

@@ -9,13 +9,12 @@ import (
)
func (s *ItemService) Get(min, max uint32) []model.Item {
m := s.TestModel(s.Model).Where(g.Map{
"item_id <=": max,
"item_id >=": min,
})
var ttt []model.Item
m.Scan(&ttt)
s.TestModel(s.Model).Where(g.Map{
"item_id <=": max,
"item_id >=": min,
}).Scan(&ttt)
return ttt

View File

@@ -48,9 +48,9 @@ func (s *PetService) UPdateFree(ctime uint32, free uint32) {
func (s *PetService) UPdate(t model.PetInfo) {
m := s.TestModel(s.Model).Where("player_id", s.userid).Where("catch_time", t.CatchTime)
var tt model.PetEX
var tt *model.PetEX
m.Scan(&tt)
if tt.CatchTime == 0 {
if tt == nil {
return
}
tt.Data = t

View File

@@ -31,10 +31,6 @@ func (s *TalkService) Cheak(mapid uint32, flag int) (int, bool) {
var talks *model.Talk
m1.Where("talk_id", flag).Scan(&talks)
if talks == nil {
talks = model.NewTalk()
talks.PlayerID = uint64(s.userid)
talks.TalkID = uint32(flag)
s.PModel(s.Model).Data(talks).FieldsEx("id").Insert()
return 0, true //如果表里没有记载数据,那么就可以直接挖矿
}
@@ -61,15 +57,14 @@ func (s *TalkService) Update(flag int) {
cool.Logger.Info(context.TODO(), "测试服不消耗物品玩家数据", s.userid)
return
}
m := s.PModel(s.Model).Where("talk_id", flag)
if condition, _ := m.Exist(); !condition {
talks := model.NewTalk()
talks.PlayerID = uint64(s.userid)
talks.TalkID = uint32(flag)
s.PModel(s.Model).Data(talks).FieldsEx("id").Insert()
}
m1 := s.PModel(s.Model)
var talks model.Talk
m1.Where("talk_id", flag).Scan(&talks)
//talks.PlayerID = uint64(s.userid)
//talks.TalkID = uint32(flag)
talks.Count += 1
m1.Save(talks)
s.PModel(s.Model).Where("talk_id", flag).Increment("count", 1)
}

View File

@@ -3,9 +3,10 @@ package service
import (
"blazing/cool"
"blazing/modules/player/model"
"fmt"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/samber/lo"
)
type TitleService struct {
@@ -27,27 +28,15 @@ func (s *TitleService) Get() []uint32 {
func (s *TitleService) Can(id uint32) bool {
m1 := s.TestModel(s.Model)
var talks *model.Title
ok, _ := m1.Wheref(`available_title @> ?::jsonb`, id).Exist()
m1.Scan(&talks)
if talks == nil {
return false
}
_, ok := lo.Find(talks.AvailableTitle, func(item uint32) bool {
return item == id
})
return ok
}
func (s *TitleService) Give(id uint32) bool {
m1 := s.TestModel(s.Model)
m1, _ := s.TestModel(s.Model).Exist()
var talks *model.Title
m1.Scan(&talks)
if talks == nil {
if !m1 {
m := s.TestModel(s.Model)
data := g.Map{
"player_id": s.userid,
@@ -58,8 +47,12 @@ func (s *TitleService) Give(id uint32) bool {
m.Data(data).Insert()
return true
}
talks.AvailableTitle = append(talks.AvailableTitle, id)
m1.Save()
m := s.TestModel(s.Model)
m.Data(g.Map{
"available_title": gdb.Raw(fmt.Sprintf("available_title|| '%d'::jsonb", id)),
}).Update()
return true
}

View File

@@ -11,31 +11,33 @@ type BaseService struct {
*cool.Service
}
type UserService struct {
Talk *TalkService //挖矿
Task *TaskService //任务
Info *InfoService //信息
Pet *PetService //精灵
Item *ItemService //物品
Done *DoneService //完成
Room *RoomService
Barge *BargeService
Title *TitleService
Cdk *CdkService
Talk *TalkService //挖矿
Task *TaskService //任务
Info *InfoService //信息
Pet *PetService //精灵
Item *ItemService //物品
Done *DoneService //完成
Room *RoomService
Barge *BargeService
Title *TitleService
Cdk *CdkService
Friend *FriendService
}
func NewUserService(id uint32) *UserService {
return &UserService{
Task: NewTaskService(id),
Info: NewInfoService(id),
Pet: NewPetService(id),
Item: NewItemService(id),
Talk: NewTalkService(id),
Done: NewDoneService(id),
Room: NewRoomService(id),
Barge: NewBargeService(id),
Title: NewTitleService(id),
Cdk: NewCdkService(id),
Task: NewTaskService(id),
Info: NewInfoService(id),
Pet: NewPetService(id),
Item: NewItemService(id),
Talk: NewTalkService(id),
Done: NewDoneService(id),
Room: NewRoomService(id),
Barge: NewBargeService(id),
Title: NewTitleService(id),
Cdk: NewCdkService(id),
Friend: NewFriendService(id),
}
}