diff --git a/common/rpc/client.go b/common/rpc/client.go index e3537280f..4b2cea990 100644 --- a/common/rpc/client.go +++ b/common/rpc/client.go @@ -73,7 +73,7 @@ type CommendSvrInfo struct { FriendInfoLen uint32 `struc:"sizeof=FriendInfo"` FriendInfo []FriendInfo // 好友id BlackInfoLen uint32 `struc:"sizeof=BlackInfo"` - BlackInfo []BlackInfo // 黑名单id + BlackInfo []uint32 // 黑名单id } // NewInInfo 创建并返回一个新的 commendSvrInfo 结构体实例 @@ -87,7 +87,7 @@ func NewInInfo() *CommendSvrInfo { ServerInfoLen: 0, ServerList: make([]ServerInfo, 0), FriendInfo: make([]FriendInfo, 0), - BlackInfo: make([]BlackInfo, 0), + //Reversed: 0, } } @@ -120,15 +120,10 @@ func newServerInfo() *ServerInfo { } type FriendInfo struct { - BlackInfo + Userid uint32 TimePoke uint32 } -type BlackInfo struct { - Userid uint32 - //TimePoke uint32 -} - // func Refurh() { // l.Lock() // defer l.Unlock() diff --git a/logic/controller/login_getserver.go b/logic/controller/login_getserver.go index 5957c15b3..1227435f5 100644 --- a/logic/controller/login_getserver.go +++ b/logic/controller/login_getserver.go @@ -38,11 +38,16 @@ func (h Controller) GetServerOnline(data *user.SidInfo, c gnet.Conn) (result *rp result.IsVip = 1 result.ServerList = rpc.GetServerInfoList(service.NewBaseSysUserService().GetPerson(data.Head.UserID).Debug) + ser := playerservice.NewUserService(data.Head.UserID) + f, b := ser.Friend.Get() + for _, v := range f { + result.FriendInfo = append(result.FriendInfo, rpc.FriendInfo{v, 1}) + } + result.BlackInfo = b defer func() { // share.ShareManager.DeleteSession(t1) - ser := playerservice.NewUserService(data.Head.UserID) kickErr := ser.Info.Kick(data.Head.UserID) if kickErr != nil { fmt.Println("踢人失败", kickErr) diff --git a/logic/controller/pet_info.go b/logic/controller/pet_info.go index 53302601a..514101352 100644 --- a/logic/controller/pet_info.go +++ b/logic/controller/pet_info.go @@ -3,7 +3,6 @@ package controller import ( "blazing/common/data/xmlres" "blazing/common/socket/errorcode" - "blazing/cool" "blazing/logic/service/fight" "blazing/logic/service/pet" "blazing/logic/service/player" @@ -120,9 +119,8 @@ func (h Controller) TogglePetBagWarehouse( index, pet, ok := player.FindPet(data.CatchTime) if ok { - if cool.Config.ServerInfo.IsVip == 0 { //正式服才会真正放会精灵 - player.Service.Pet.UPdate(*pet) - } + + player.Service.Pet.UPdate(*pet) player.Info.PetList = append(player.Info.PetList[:index], player.Info.PetList[index+1:]...) } diff --git a/logic/controller/user_friend.go b/logic/controller/user_friend.go index 0dd6e6506..f781bc75e 100644 --- a/logic/controller/user_friend.go +++ b/logic/controller/user_friend.go @@ -2,6 +2,7 @@ package controller import ( "blazing/common/socket/errorcode" + "blazing/logic/service/fight" "blazing/logic/service/friend" "blazing/logic/service/player" ) @@ -15,3 +16,53 @@ func (h Controller) GetOnlineFriends(data *friend.SeeOnlineInboundInfo, c *playe result.Friends = make([]friend.OnlineInfo, 0) return } + +// FriendAdd 处理添加好友请求 +// data: 包含要添加好友的用户ID +// c: 当前玩家对象 +// 返回: 无数据内容的响应和错误码 +func (h Controller) FriendAdd(data *friend.FriendAddInboundInfo, c *player.Player) (result fight.NullOutboundInfo, err errorcode.ErrorCode) { + + v, ok := c.GetSpace().User.Load(data.UserID) + + if ok { + v.SendPackCmd(8001, friend.InformMessage{ + UserID: c.Info.UserID, + Nick: c.Info.Nick, + Type: data.Head.CMD, + }) + + } + return +} + +// FriendAnswer 处理好友请求的回复 +// data: 包含发起好友请求的用户ID和回复标志(1为同意,0为拒绝) +// c: 当前玩家对象 +// 返回: 无数据内容的响应和错误码 +func (h Controller) FriendAnswer(data *friend.FriendAnswerInboundInfo, c *player.Player) (result fight.NullOutboundInfo, err errorcode.ErrorCode) { + v, ok := c.GetSpace().User.Load(data.UserID) + + if ok { + v.SendPackCmd(8001, friend.InformMessage{ + UserID: c.Info.UserID, + Nick: c.Info.Nick, + Type: data.Head.CMD, + Accept: data.Flag, + }) + + v.(*player.Player).Service.Friend.Add(c.Info.UserID) + c.Service.Friend.Add(data.UserID) + + } + return +} + +// FriendRemove 删除好友 +// data: 包含要删除的好友ID +// c: 当前玩家对象 +// 返回: 无数据内容的响应和错误码 +func (h Controller) FriendRemove(data *friend.FriendRemoveInboundInfo, c *player.Player) (result fight.NullOutboundInfo, err errorcode.ErrorCode) { + c.Service.Friend.Del(data.UserID) + return +} diff --git a/logic/service/friend/friend.go b/logic/service/friend/friend.go index 4dbdd5708..cfc22961b 100644 --- a/logic/service/friend/friend.go +++ b/logic/service/friend/friend.go @@ -2,7 +2,7 @@ package friend import "blazing/logic/service/common" -//基地查看好友列表 +// 基地查看好友列表 type SeeOnlineInboundInfo struct { Head common.TomeeHeader `cmd:"2157" struc:"skip"` @@ -20,3 +20,34 @@ type SeeOnlineOutboundInfo struct { FriendsLen uint32 `json:"friendsLen" struc:"sizeof=Friends"` Friends []OnlineInfo `json:"friends" fieldDescription:"好友在线列表" ` } + +// 添加好友请求 +type FriendAddInboundInfo struct { + Head common.TomeeHeader `cmd:"2151" struc:"skip"` + UserID uint32 `json:"userID"` // 添加人的玩家id +} + +// 回复好友请求 +type FriendAnswerInboundInfo struct { + Head common.TomeeHeader `cmd:"2152" struc:"skip"` + UserID uint32 `json:"userID"` // 添加人的玩家id + Flag uint32 `json:"flag"` // 1为同意添加好友 0为拒绝 +} + +// 删除好友请求 +type FriendRemoveInboundInfo struct { + Head common.TomeeHeader `cmd:"2153" struc:"skip"` + UserID uint32 `json:"userID"` // 删除的玩家id +} + +// 通知消息结构 - 服务器主动发送给前端 +type InformMessage struct { + Type uint32 `json:"type"` // cmdid,如2151(添加好友)、2152(回复好友) + UserID uint32 `json:"userID"` // 对方的userid + Nick string `struc:"[16]byte"` + Accept uint32 `json:"accept"` // 是否接受: 1为接受,0为拒绝 + ServerID uint32 `json:"serverID"` // 对方服务器ID + MapType uint32 `json:"mapType"` // 对方地图类型 + MapID uint32 `json:"mapID"` // 对方地图ID + MapName string `struc:"[64]byte"` // 对方的地图名称,64字节UTF8 +} diff --git a/modules/player/model/FRIEND.go b/modules/player/model/FRIEND.go new file mode 100644 index 000000000..cd4d47371 --- /dev/null +++ b/modules/player/model/FRIEND.go @@ -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{}) +} diff --git a/modules/player/model/title.go b/modules/player/model/title.go index 3c4794191..aedaba93f 100644 --- a/modules/player/model/title.go +++ b/modules/player/model/title.go @@ -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 返回表名 diff --git a/modules/player/service/Barge.go b/modules/player/service/Barge.go index 67fe062ac..07c505a4a 100644 --- a/modules/player/service/Barge.go +++ b/modules/player/service/Barge.go @@ -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 { diff --git a/modules/player/service/friend.go b/modules/player/service/friend.go new file mode 100644 index 000000000..1a3ba1405 --- /dev/null +++ b/modules/player/service/friend.go @@ -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()}, + }, + } + +} diff --git a/modules/player/service/info.go b/modules/player/service/info.go index 2a7da4666..1af56ad97 100644 --- a/modules/player/service/info.go +++ b/modules/player/service/info.go @@ -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+昵称+颜色 diff --git a/modules/player/service/item.go b/modules/player/service/item.go index fcabe9ad6..6c97e912d 100644 --- a/modules/player/service/item.go +++ b/modules/player/service/item.go @@ -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 diff --git a/modules/player/service/pet.go b/modules/player/service/pet.go index 38ca5021a..a2ef79af6 100644 --- a/modules/player/service/pet.go +++ b/modules/player/service/pet.go @@ -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 diff --git a/modules/player/service/talk.go b/modules/player/service/talk.go index 8d70098cb..895a9169b 100644 --- a/modules/player/service/talk.go +++ b/modules/player/service/talk.go @@ -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) } diff --git a/modules/player/service/title.go b/modules/player/service/title.go index fe22d814a..08ac772ce 100644 --- a/modules/player/service/title.go +++ b/modules/player/service/title.go @@ -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 } diff --git a/modules/player/service/user.go b/modules/player/service/user.go index eed9c5bab..296f4d6b3 100644 --- a/modules/player/service/user.go +++ b/modules/player/service/user.go @@ -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), } }