pet_home_server/src/server/game/mod/friend/Friend.go
2025-09-16 17:09:33 +08:00

396 lines
9.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package friend
import (
"fmt"
"server/GoUtil"
cardCfg "server/conf/card"
"server/game/mod/card"
"server/game/mod/item"
"server/msg"
)
type FriendMod struct {
FriendList map[int]struct{} // 好友列表
NewFriendList map[int]*FriendInfo // 好友列表
ApplyList map[int]int64 // 好友请求列表
SendApply map[int]int64 // 发送的申请
Apply []*ApplyInfo // 其他请求列表
Card map[string]*card.CardInfo // 收到的申请交换
Log []*LogInfo // 日志
AutoId int
Id int64 // 已同步msg ID
Npc []int // npc id
Bubble map[int]*BubbleInfo // 气泡
}
type BubbleInfo struct {
Id int // 气泡ID
Time int64 // 气泡时间
Type int
}
type FriendInfo struct {
AddTime int64
Interact []*Interact // 拜访记录
}
type Interact struct {
VisitTime int64 // 拜访时间
Type int // 1:拜访 2:点赞
}
type ApplyInfo struct {
Type int // 1:申请 2:同意 3:拒绝 4:删除
Time int64
Uid int64
}
// 24小时内与玩家进行过以下互动的用户若被选中参加本次宠物宝藏在其头像旁添加礼物盒
const (
INTERACT_TYPE_VISIT = 1 // 拜访过玩家的Pet Playroom并进行过小游戏或点赞的用户
INTERACT_TYPE_UPVOTE = 2 // 为玩家的图鉴全收集信息点过赞的用户
INTERACT_TYPE_CARD = 3 // 向玩家赠送过卡牌的用户
INTERACT_TYPE_EX = 4 // 向玩家发起过卡牌交换
INTERACT_TYPE_WISH = 5 // 邀请玩家一同参加活动的用户
)
const (
LOG_TYPE_FRIEND_APPLY = 1 // 收到申请好友
LOG_TYPE_FRIEND_BECOME = 2 // 成为好友
LOG_TYPE_CARD_EX_SEND = 3 // 发起卡牌交换申请
LOG_TYPE_CARD_SEND = 4 // 赠送卡牌
LOG_TYPE_CARD_GIVE = 5 // 请求卡牌
LOG_TYPE_CARD_SELECT_GET = 6 // 选择卡牌交换
LOG_TYPE_CARD_ACCEPT_GIVE = 7 // 接受卡牌
LOG_TYPE_CARD_EX_GET = 8 // 收到卡牌交换申请
LOG_TYPE_CARD_SELECT_SEND = 9 // 选择卡牌交换
LOG_TYPE_CARD_EX_SUCCESS_1 = 10 // 卡牌交换成功
LOG_TYPE_CARD_EX_SUCCESS_2 = 11 // 卡牌交换成功
LOG_TYPE_FRIEND_DELETE = 14 // 删除好友
LOG_TYPE_PLAYROOM_VISIT = 15 // 非小猫游戏,他人偷走了玩家的猫币
LOG_TYPE_HANDBOOK = 16 // 图鉴收集
LOG_TYPE_HANDBOOK_UPVOTE = 17 // 图鉴点赞
LOG_TYPE_CHARGE_SEND = 18 // 赠送充值礼物
LOG_TYPE_CHARGE_RECEIVE = 19 // 收到充值礼物
LOG_TYPE_WISH = 20 // 心愿单请求
LOG_TYPE_FRIEND_BECOME_NPC = 21 // npc成为好友
LOG_TYPE_PLAYROOM_UPVOTE = 22 // playroom点赞
LOG_TYPE_PLAYROOM_CHAMPSHIP = 23 // 竞标赛排名
LOG_TYPE_TREASURE = 24 // 好友宝藏
LOG_TYPE_CARD_SEND_ACCEPT = 25 // 收到赠送卡牌
LOG_TYPE_PLAYROOM_CAT_WIN = 26 // 小猫游戏,给小猫成功装箱
LOG_TYPE_PLAYROOM_CAT_LOSE = 27 // 小猫游戏,装箱小猫未成功
LOG_TYPE_CARD_GIVE_ACCEPT = 28 // 接受卡牌请求
LOG_TYPE_FRIEND_INVITE = 29 // 邀请注册
LOG_TYPE_TREASURE_HELP = 30 // 好友宝藏帮助
)
const (
FRIEND_NOTIFY_APPLY = 1
FRIEND_NOTIFY_AGREE = 2
FRIEND_NOTIFY_REFUSE = 3
FRIEND_NOTIFY_DEL = 4
)
const (
APPLY_TYPE_WISH = 1 // 心愿单请求
)
type LogInfo struct {
Id int
Uid int
Type int
Time int64
Param string
Upvote bool // 点赞
Reward bool // 是否已领取奖励
}
func (f *FriendMod) InitData() {
if f.FriendList == nil {
f.FriendList = make(map[int]struct{})
}
if f.ApplyList == nil {
f.ApplyList = make(map[int]int64)
}
if f.Card == nil {
f.Card = make(map[string]*card.CardInfo)
}
if f.SendApply == nil {
f.SendApply = make(map[int]int64)
}
if f.NewFriendList == nil {
f.NewFriendList = make(map[int]*FriendInfo)
}
if f.Bubble == nil {
f.Bubble = make(map[int]*BubbleInfo)
}
if len(f.FriendList) > 0 && len(f.NewFriendList) == 0 {
for k := range f.FriendList {
f.NewFriendList[k] = &FriendInfo{
AddTime: GoUtil.Now(),
}
}
}
}
func (f *FriendMod) GetNpc() []int {
return f.Npc
}
func (f *FriendMod) SetNpc(id int) {
f.Npc = append(f.Npc, id)
}
func (f *FriendMod) GetSyncId() int64 {
return f.Id
}
func (f *FriendMod) SetSyncId(Id int64) {
f.Id = Id
}
func (f *FriendMod) Interact(id, t int, T int64) {
if _, ok := f.NewFriendList[id]; !ok {
return
}
for _, v := range f.NewFriendList[id].Interact {
if v.Type == t && v.VisitTime < T {
v.VisitTime = T
return
}
}
f.NewFriendList[id].Interact = append(f.NewFriendList[id].Interact, &Interact{
VisitTime: T,
Type: t,
})
}
func (f *FriendMod) GetInteractTime(id int) int64 {
if _, ok := f.NewFriendList[id]; !ok {
return 0
}
LastTime := int64(0)
// 获取最近一次拜访或点赞的时间
for _, v := range f.NewFriendList[id].Interact {
if v.VisitTime > LastTime {
LastTime = v.VisitTime
}
}
return LastTime
}
func (f *FriendMod) AddFriend(id int) {
f.NewFriendList[id] = &FriendInfo{
AddTime: GoUtil.Now(),
}
delete(f.ApplyList, id)
}
func (f *FriendMod) GetCardInfo(Id string) *card.CardInfo {
v, ok := f.Card[Id]
if !ok {
return nil
}
return v
}
func (f *FriendMod) SetCardInfo(CardInfo *card.CardInfo) {
f.Card[CardInfo.Id] = CardInfo
}
func (f *FriendMod) DelCardInfo(Id string) {
delete(f.Card, Id)
}
func (f *FriendMod) DelFriend(id int) {
delete(f.NewFriendList, id)
}
func (f *FriendMod) CheckFriend(Uid int) bool {
_, ok := f.NewFriendList[Uid]
return ok
}
func (f *FriendMod) RefuseApply(id int) {
delete(f.ApplyList, id)
delete(f.SendApply, id)
}
func (f *FriendMod) CheckApply(id int) bool {
_, ok := f.ApplyList[id]
return ok
}
func (f *FriendMod) GetFriendNum() int {
return len(f.NewFriendList)
}
func (f *FriendMod) GetFriendList() map[int]*FriendInfo {
return f.NewFriendList
}
func (f *FriendMod) GetSimpleFriendList() []int {
rs := make([]int, 0, len(f.NewFriendList))
for k := range f.NewFriendList {
rs = append(rs, k)
}
return rs
}
// 收到申请
func (f *FriendMod) AddFriendApply(Uid int) {
f.ApplyList[Uid] = GoUtil.Now()
}
// 发送申请
func (f *FriendMod) AddSendApply(Uid int) bool {
if _, ok := f.SendApply[Uid]; ok {
return true
}
f.SendApply[Uid] = GoUtil.Now()
return false
}
func (f *FriendMod) CheckSendApply(Id int) bool {
_, ok := f.SendApply[Id]
return ok
}
func (f *FriendMod) AgreeApply(UId int) {
f.AddFriend(UId)
delete(f.SendApply, UId)
delete(f.ApplyList, UId)
}
func (f *FriendMod) AddLog(Uid, Type int, Param string) int {
f.AutoId++
f.Log = append(f.Log, &LogInfo{
Id: f.AutoId,
Uid: Uid,
Type: Type,
Time: GoUtil.Now(),
Param: Param,
})
switch Type {
case LOG_TYPE_HANDBOOK_UPVOTE:
f.AddBubble(f.AutoId, Type)
case LOG_TYPE_PLAYROOM_UPVOTE:
f.AddBubble(f.AutoId, Type)
case LOG_TYPE_TREASURE_HELP:
f.AddBubble(f.AutoId, Type)
}
if len(f.Log) > 30 {
f.Log = f.Log[len(f.Log)-30:]
}
return f.AutoId
}
func (f *FriendMod) AddBubble(Id, Type int) {
f.Bubble[Id] = &BubbleInfo{
Id: Id,
Time: GoUtil.Now(),
Type: Type,
}
}
func (f *FriendMod) GetBubbble(Id int) *msg.FriendBubbleInfo {
if v, ok := f.Bubble[Id]; ok {
return &msg.FriendBubbleInfo{
Id: int32(v.Id),
Type: int32(v.Type),
}
}
return nil
}
func (f *FriendMod) BubbleBackData() *msg.ResFriendBubble {
rs := make([]*msg.FriendBubbleInfo, 0, len(f.Bubble))
for _, v := range f.Bubble {
rs = append(rs, &msg.FriendBubbleInfo{
Id: int32(v.Id),
Type: int32(v.Type),
})
}
return &msg.ResFriendBubble{
Bubble: rs,
}
}
func (f *FriendMod) ResetGoldCardEx() {
for _, v := range f.Card {
if cardCfg.CheckCardIsGold(v.CardId) || cardCfg.CheckCardIsGold(v.ExId) {
v.EndTime = 1
}
}
}
func (f *FriendMod) Upvote(Id int) ([]*item.Item, int, error) {
info := &LogInfo{}
for _, v := range f.Log {
if v.Id == Id {
info = v
break
}
}
if info.Id == 0 {
return nil, 0, fmt.Errorf("log not exist")
}
if info.Upvote {
return nil, 0, fmt.Errorf("already upvote")
}
info.Upvote = true
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, 5)}, info.Uid, nil
}
func (f *FriendMod) GetReward(Id int) ([]*item.Item, error) {
info, ok := f.Bubble[Id]
if !ok {
return nil, fmt.Errorf("bubble not exist")
}
reward := []*item.Item{}
switch info.Type {
case LOG_TYPE_HANDBOOK_UPVOTE:
reward = append(reward, item.NewItem(item.ITEM_ENERGY_ID, 5))
case LOG_TYPE_PLAYROOM_UPVOTE:
reward = append(reward, item.NewItem(item.ITEM_ENERGY_ID, 5))
default:
return nil, fmt.Errorf("log type not support")
}
delete(f.Bubble, Id)
return reward, nil
}
func (f *FriendMod) AddWishApply(Uid int64) error {
for _, v := range f.Apply {
if v.Type == APPLY_TYPE_WISH && v.Uid == Uid {
return fmt.Errorf("wish apply already exist")
}
}
f.Apply = append(f.Apply, &ApplyInfo{
Type: APPLY_TYPE_WISH,
Uid: Uid,
Time: GoUtil.Now(),
})
return nil
}
func (f *FriendMod) GetWishApply() []*ApplyInfo {
rs := []*ApplyInfo{}
for _, v := range f.Apply {
if v.Type == APPLY_TYPE_WISH {
rs = append(rs, v)
}
}
return rs
}
func (f *FriendMod) ApplyWish(Uid int64) error {
for k, v := range f.Apply {
if v.Type == APPLY_TYPE_WISH && v.Uid == Uid {
r := make([]*ApplyInfo, len(f.Apply)-1)
copy(r, f.Apply[:k])
f.Apply = append(r, f.Apply[k+1:]...)
return nil
}
}
return fmt.Errorf("wish apply not exist")
}