game_sync/worldsrv/action_welfare.go

1354 lines
38 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 main
import (
"errors"
"fmt"
"time"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/goserver/core/task"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/proto"
webapiproto "mongo.games.com/game/protocol/webapi"
"mongo.games.com/game/protocol/welfare"
"mongo.games.com/game/srvdata"
"mongo.games.com/game/webapi"
)
// 救济金
type CSGetReliefFundPacketFactory struct {
}
type CSGetReliefFundHandler struct {
}
func (this *CSGetReliefFundPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSGetReliefFund{}
return pack
}
func (this *CSGetReliefFundHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGetReliefFund Process recv ", data)
if msg, ok := data.(*welfare.CSGetReliefFund); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSGetReliefFundHandler p == nil")
return nil
}
WelfareMgrSington.GetReliefFund(p, msg.GetIsVideo())
}
return nil
}
// 转动转盘
type CSGetTurnplatePacketFactory struct {
}
type CSGetTurnplateHandler struct {
}
func (this *CSGetTurnplatePacketFactory) CreatePacket() interface{} {
pack := &welfare.CSGetTurnplate{}
return pack
}
func (this *CSGetTurnplateHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGetTurnplate Process recv ", data)
if msg, ok := data.(*welfare.CSGetTurnplate); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSGetTurnplateHandler p == nil")
return nil
}
if msg.GetIsVideo() {
// 看视频可以再领一次
WelfareMgrSington.GetTurnplteVideo(p)
return nil
}
WelfareMgrSington.GetTurnplate(p)
}
return nil
}
// 累计签到
type CSGetAddupSignPacketFactory struct {
}
type CSGetAddupSignHandler struct {
}
func (this *CSGetAddupSignPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSGetAddupSign{}
return pack
}
func (this *CSGetAddupSignHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGetAddupSign Process recv ", data)
if msg, ok := data.(*welfare.CSGetAddupSign); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSGetAddupSignHandler p == nil")
return nil
}
WelfareMgrSington.GetAddupSign(p, msg.GetAddUpDay())
WelfareMgrSington.UpdateAddUp2Date(p, 0, msg.GetAddUpDay(), time.Now().Unix()+3600)
}
return nil
}
// 福利信息
type CSWelfaredInfoPacketFactory struct {
}
type CSWelfaredInfoHandler struct {
}
func (this *CSWelfaredInfoPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSWelfaredInfo{}
return pack
}
func (this *CSWelfaredInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSWelfaredInfo Process recv ", data)
if _, ok := data.(*welfare.CSWelfaredInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSWelfaredInfoHandler p == nil")
return nil
}
WelfareMgrSington.WelfaredInfo(p)
}
return nil
}
// 查看盲盒
type CSBlindBoxInfoPacketFactory struct {
}
type CSBlindBoxInfoHandler struct {
}
func (this *CSBlindBoxInfoPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSBlindBoxInfo{}
return pack
}
func (this *CSBlindBoxInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSBlindBoxInfo Process recv ", data)
if msg, ok := data.(*welfare.CSBlindBoxInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSBlindBoxInfoHandler p == nil")
return nil
}
WelfareMgrSington.BlindBoxInfo(p, msg.GetId())
}
return nil
}
// 购买盲盒
type CSBuyBlindBoxPacketFactory struct {
}
type CSBuyBlindBoxHandler struct {
}
func (this *CSBuyBlindBoxPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSGetBlindBox{}
return pack
}
func (this *CSBuyBlindBoxHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGetBlindBox Process recv ", data)
if _, ok := data.(*welfare.CSGetBlindBox); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSBuyBlindBoxHandler p == nil")
return nil
}
//WelfareMgrSington.BuyBlindBox(p, msg.GetId(), msg.ConfigPayId)
}
return nil
}
// 查看首充
type CSFirstPayInfoPacketFactory struct {
}
type CSFirstPayInfoHandler struct {
}
func (this *CSFirstPayInfoPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSWelfareFirstPayData{}
return pack
}
func (this *CSFirstPayInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSWelfareFirstPayData Process recv ", data)
if _, ok := data.(*welfare.CSWelfareFirstPayData); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSFirstPayInfoHandler p == nil")
return nil
}
WelfareMgrSington.FirstPayInfo(p)
}
return nil
}
// 领取首充
type CSBuyFirstPayPacketFactory struct {
}
type CSBuyFirstPayHandler struct {
}
func (this *CSBuyFirstPayPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSWelfareFirstPay{}
return pack
}
func (this *CSBuyFirstPayHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSWelfareFirstPay Process recv ", data)
if _, ok := data.(*welfare.CSWelfareFirstPay); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSBuyFirstPayHandler p == nil")
return nil
}
//WelfareMgrSington.BuyFirstPay(p, msg.ConfigPayId)
}
return nil
}
// 查看连续充值
type CSContinuousPayInfoPacketFactory struct {
}
type CSContinuousPayInfoHandler struct {
}
func (this *CSContinuousPayInfoPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSWelfareContinuousPayData{}
return pack
}
func (this *CSContinuousPayInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSWelfareContinuousPayData Process recv ", data)
if _, ok := data.(*welfare.CSWelfareContinuousPayData); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSContinuousPayInfoHandler p == nil")
return nil
}
WelfareMgrSington.ContinuousPayInfo(p)
}
return nil
}
// 领取连续充值
type CSBuyContinuousPayPacketFactory struct {
}
type CSBuyContinuousPayHandler struct {
}
func (this *CSBuyContinuousPayPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSWelfareContinuousPay{}
return pack
}
func (this *CSBuyContinuousPayHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSWelfareContinuousPay Process recv ", data)
if _, ok := data.(*welfare.CSWelfareContinuousPay); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSBuyContinuousPayHandler p == nil")
return nil
}
//WelfareMgrSington.BuyContinuousPay(p, msg.ConfigPayId)
}
return nil
}
func CSWelfRelief(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSWelfRelief Process recv %v", data)
_, ok := data.(*welfare.CSWelfareRelief)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
conf := srvdata.PBDB_GameSubsidyMgr.GetData(GameSubsidyid)
ret := &welfare.SCWelfareRelief{
LimitNum: conf.GetLimitNum(),
Get: conf.GetGet(),
Times: conf.GetTimes(),
}
p.SendToClient(int(welfare.SPacketID_PACKET_SCWelfRelief), ret)
logger.Logger.Tracef("SCWelfRelief %v", ret)
return nil
}
func CSInviteInfo(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSInviteInfo Process recv %v", data)
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
link := model.GameParamData.InviteUrl
f := func() string {
return fmt.Sprintf("%s?user=%s", link, p.ICode)
}
var res []byte
var err error
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
req := &webapiproto.ASPlayerInviteLink{
Platform: p.Platform,
SnId: p.SnId,
}
res, err = webapi.ApiGetInviteLink(common.GetAppId(), req)
return nil
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
info := webapiproto.SAPlayerInviteLink{}
if err != nil || res == nil {
logger.Logger.Errorf("ApiGetInviteLink err %v or not return", err)
} else {
proto.Unmarshal(res, &info)
logger.Logger.Infof("ApiGetInviteLink info %v", info.String())
link = info.Link
}
ret := &welfare.SCInviteInfo{
Num: int32(p.INum),
Code: p.ICode,
InviteUrl: f(),
Score: p.IScore,
OtherCode: p.PCode,
}
cfg := PlatformMgrSingleton.GetConfig(p.Platform).ActInviteConfig
if cfg != nil {
ret.BindScore = cfg.GetBindScore()
ret.RechargeScore = cfg.GetRechargeScore()
ret.PayScore = cfg.GetPayScore()
for _, v := range cfg.GetAwards1() {
ret.Awards1 = append(ret.Awards1, &welfare.RankAward{
Start: v.GetStart(),
End: v.GetEnd(),
Num: v.GetNum(),
})
}
for _, v := range cfg.GetAwards2() {
ret.Awards2 = append(ret.Awards2, &welfare.RankAward{
Start: v.GetStart(),
End: v.GetEnd(),
Num: v.GetNum(),
})
}
for _, v := range cfg.GetAwards3() {
ret.Awards3 = append(ret.Awards3, &welfare.RankAward{
Start: v.GetStart(),
End: v.GetEnd(),
Num: v.GetNum(),
})
}
ret.Rates = cfg.GetRates()
}
p.SendToClient(int(welfare.SPacketID_PACKET_SCInviteInfo), ret)
logger.Logger.Tracef("SCInviteInfo %v", ret)
})).Start()
return nil
}
func CSBindInvite(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSBindInvite Process recv %v", data)
msg, ok := data.(*welfare.CSBindInvite)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
if !PlatformMgrSingleton.IsOn(p.Platform, common.ChannelSwitchInvite, p.LastChannel) {
return nil
}
ret := &welfare.SCBindInvite{
OpRetCode: welfare.OpResultCode_OPRC_Error,
}
var inviteSnId int32
var err error
now := time.Now()
cfg := PlatformMgrSingleton.GetConfig(p.Platform).ActInviteConfig
send := func() {
p.SendToClient(int(welfare.SPacketID_PACKET_SCBindInvite), ret)
logger.Logger.Tracef("SCBindInvite %v", ret)
if ret.OpRetCode == welfare.OpResultCode_OPRC_Sucess {
// 玩家自己的绑定任务
TaskSubjectSingleton.Touch(common.TaskTypeBindInviter, &TaskData{SnId: p.SnId, Num: 1})
}
}
if p.PSnId != 0 {
ret.OpRetCode = welfare.OpResultCode_OPRC_AlreadyBind
send()
return nil
}
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
inviteSnId, err = model.GetSnIdByCode(p.Platform, msg.GetCode())
return nil
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
if err != nil || inviteSnId == 0 {
logger.Logger.Tracef("GetSnIdByCode not found %v %v", err, msg.GetCode())
ret.OpRetCode = welfare.OpResultCode_OPRC_NotExist
send()
return
}
// 3级父级不能是自己
var err error
tmpSnId := inviteSnId
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
// todo 优化查找顶级代理
for i := 0; i < 10000; i++ {
if tmpSnId == p.SnId {
ret.OpRetCode = welfare.OpResultCode_OPRC_BindSelf
err = errors.New("bind error")
return nil
}
tmpSnId, err = model.GetPlayerInviteSnid(p.Platform, tmpSnId)
if err != nil {
ret.OpRetCode = welfare.OpResultCode_OPRC_Error
return nil
}
if tmpSnId == 0 {
break
}
}
if err == nil {
err = model.BindInviteSnId(p.Platform, p.SnId, inviteSnId, msg.Code)
}
if err == nil {
SaveInviteScore(&model.InviteScore{
Platform: p.Platform,
SnId: p.SnId,
InviteSnId: inviteSnId,
Tp: common.InviteScoreTypeBind,
Score: cfg.GetBindScore(),
Ts: now.Unix(),
Money: 0,
})
}
return nil
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
if err != nil {
send()
return
}
p.PSnId = inviteSnId
p.PCode = msg.GetCode()
ret.OpRetCode = welfare.OpResultCode_OPRC_Sucess
send()
})).StartByFixExecutor("invite_score")
})).Start()
return nil
}
// IsPermitReward 是否已经领取
func IsPermitReward(p *Player, id int32) bool {
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
return true
}
startTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitStartTs
endTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitEndTs
if p.WelfData != nil && p.WelfData.Task != nil {
ts := p.WelfData.PermitAward[id]
if ts == 0 {
return false
}
if ts >= startTs && ts < endTs {
return true
}
}
return false
}
// IsPermitCanReward 是否可以领取
func IsPermitCanReward(p *Player, id int32) bool {
if IsPermitReward(p, id) {
return false
}
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
return false
}
exp := int64(0)
item := BagMgrSingleton.GetItem(p.SnId, common.ItemIDPermit)
if item != nil {
exp = item.ItemNum
}
level := PlatformMgrSingleton.GetPermitLevel(p.Platform, p.LastChannel, exp)
for _, v := range channelConfig.GetLevelConfig() {
if v.GetRank() == id || v.GetRank()*1000 == id {
if v.GetRank() == id {
return level >= int64(v.GetRank())
} else {
return p.GetIsPermit() && level >= int64(v.GetRank())
}
}
}
return false
}
// SendPermitReward 发赛季通行证奖励
// tp 1普通2典藏
func SendPermitReward(p *Player, m map[int64]int64, tp int32) {
var items []*Item
for k, v := range m {
items = append(items, &Item{
ItemId: int32(k),
ItemNum: v,
})
}
gain := int32(0)
giveType := int32(-1)
switch tp {
case 1:
gain = common.GainWayPermitAward
giveType = model.SystemFreeGive_GiveType_PermitAward
case 2:
gain = common.GainWayPermitAward
giveType = model.SystemFreeGive_GiveType_PermitAward
}
BagMgrSingleton.AddItems(p, items, 0, gain, "system", "通行证奖励", 0, 0, false)
for _, v := range items {
tp1 := int32(-1)
if v.ItemId == common.ItemIDCoin {
tp1 = model.SystemFreeGive_CoinType_Coin
} else if v.ItemId == common.ItemIDDiamond {
tp1 = model.SystemFreeGive_CoinType_Diamond
}
if !p.IsRob && tp1 >= 0 && giveType >= 0 {
LogChannelSingleton.WriteMQData(
model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, p.Channel, giveType, tp1, v.ItemNum))
}
}
}
func CSPermitInfo(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSPermitInfo Process recv %v", data)
_, ok := data.(*welfare.CSPermitInfo)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
if p.LastChannel == "" {
logger.Logger.Errorf("CSPermitInfo not channel %v", p.SnId)
return nil
}
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
logger.Logger.Errorf("CSPermitInfo not channelConfig %v", p.SnId)
return nil
}
startTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitStartTs
endTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitEndTs
if startTs == 0 || endTs == 0 {
logger.Logger.Errorf("CSPermitInfo not startTs %v", p.SnId)
return nil
}
// 赛季积分
exp := int64(0)
item := BagMgrSingleton.GetItem(p.SnId, common.ItemIDPermit)
if item != nil {
exp = item.ItemNum
}
// 等级
level := PlatformMgrSingleton.GetPermitLevel(p.Platform, p.LastChannel, exp)
pack := &welfare.SCPermitInfo{
Exp: exp,
Level: level,
Timestamp: []int64{startTs, endTs - 1},
IsPermit: p.GetIsPermit(),
RefreshTs: common.GetDayNextStartTs(time.Now().Unix()),
}
// 等级奖励
for _, v := range channelConfig.GetLevelConfig() {
var a1, a2 []*welfare.PropInfo
for _, vv := range v.GetAward1() {
a1 = append(a1, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
for _, vv := range v.GetAward2() {
a2 = append(a2, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
status1 := 0
if IsPermitReward(p, v.GetRank()) {
status1 = 2
} else {
if IsPermitCanReward(p, v.GetRank()) {
status1 = 1
}
}
status2 := 0
if IsPermitReward(p, v.GetRank()*1000) {
status2 = 2
} else {
if IsPermitCanReward(p, v.GetRank()*1000) {
status2 = 1
}
}
pack.Award = append(pack.Award, &welfare.PermitAward{
Exp: v.GetScore(),
Level: int64(v.GetRank()),
Award1: &welfare.PropItem{
Award: a1,
Status: int64(status1),
Id: v.GetRank(),
},
Award2: &welfare.PropItem{
Award: a2,
Status: int64(status2),
Id: v.GetRank() * 1000,
},
})
}
// 排行奖励
for _, v := range channelConfig.GetRankConfig() {
var items []*welfare.PropInfo
for _, vv := range v.GetItemId() {
items = append(items, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
pack.RankAward = append(pack.RankAward, &welfare.PermitRankAward{
Start: v.GetStart(),
End: v.GetEnd(),
ItemId: items,
})
}
// 客户端轮播配置
for _, v := range srvdata.PBDB_PassShowMgr.Datas.GetArr() {
pack.ShowList = append(pack.ShowList, &welfare.PermitShow{
ShowType: v.GetShowType(),
ShowVolume: v.GetShowVolume(),
Location: v.GetLocation(),
})
}
p.SendToClient(int(welfare.SPacketID_PACKET_SCPermitInfo), pack)
logger.Logger.Tracef("SCPermitInfo: %v", pack)
return nil
}
func CSPermitAward(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSPermitAward Process recv %v", data)
msg, ok := data.(*welfare.CSPermitAward)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
if p.LastChannel == "" {
logger.Logger.Errorf("CSPermitAward not channel %v", p.SnId)
return nil
}
if !PlatformMgrSingleton.IsOn(p.Platform, common.ChannelSwitchPermit, p.LastChannel) {
return nil
}
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
logger.Logger.Errorf("CSPermitAward not channelConfig %v", p.SnId)
return nil
}
startTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitStartTs
endTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitEndTs
now := time.Now()
if startTs == 0 || endTs == 0 || now.Unix() < startTs || now.Unix() >= endTs {
logger.Logger.Errorf("CSPermitAward not startTs %v", p.SnId)
return nil
}
pack := &welfare.SCPermitAward{
OpRetCode: welfare.OpResultCode_OPRC_Sucess,
Tp: msg.GetTp(),
Id: msg.GetId(),
}
switch msg.GetTp() {
case 0: // 所有
for _, v := range channelConfig.GetLevelConfig() {
if IsPermitCanReward(p, v.GetRank()) {
for _, vv := range v.GetAward1() {
pack.Award1 = append(pack.Award1, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
p.WelfData.PermitAward[v.GetRank()] = now.Unix()
}
if IsPermitCanReward(p, v.GetRank()*1000) {
for _, vv := range v.GetAward2() {
pack.Award2 = append(pack.Award2, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
p.WelfData.PermitAward[v.GetRank()*1000] = now.Unix()
}
}
case 1: // 普通
for _, v := range channelConfig.GetLevelConfig() {
if msg.GetId() == 0 {
if IsPermitCanReward(p, v.GetRank()) {
for _, vv := range v.GetAward1() {
pack.Award1 = append(pack.Award1, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
p.WelfData.PermitAward[v.GetRank()] = now.Unix()
}
} else {
if v.GetRank() == msg.GetId() {
if IsPermitCanReward(p, v.GetRank()) {
for _, vv := range v.GetAward1() {
pack.Award1 = append(pack.Award1, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
p.WelfData.PermitAward[v.GetRank()] = now.Unix()
} else {
pack.OpRetCode = welfare.OpResultCode_OPRC_NoTimes
}
break
}
}
}
case 2: // 典藏
for _, v := range channelConfig.GetLevelConfig() {
if msg.GetId() == 0 {
if IsPermitCanReward(p, v.GetRank()*1000) {
for _, vv := range v.GetAward2() {
pack.Award2 = append(pack.Award2, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
p.WelfData.PermitAward[v.GetRank()*1000] = now.Unix()
}
} else {
if v.GetRank()*1000 == msg.GetId() {
if IsPermitCanReward(p, msg.GetId()) {
for _, vv := range v.GetAward2() {
pack.Award2 = append(pack.Award2, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
p.WelfData.PermitAward[v.GetRank()*1000] = now.Unix()
} else {
pack.OpRetCode = welfare.OpResultCode_OPRC_NoTimes
}
break
}
}
}
}
// 奖励合并
var award1 = map[int32]*welfare.PropInfo{}
var award2 = map[int32]*welfare.PropInfo{}
var awards1 = map[int64]int64{}
var awards2 = map[int64]int64{}
for _, v := range pack.GetAward1() {
e, ok := award1[v.GetItemId()]
if !ok {
e = &welfare.PropInfo{
ItemId: v.GetItemId(),
ItemNum: v.GetItemNum(),
}
award1[v.GetItemId()] = e
} else {
e.ItemNum = e.GetItemNum() + v.GetItemNum()
}
awards1[int64(v.GetItemId())] = awards1[int64(v.GetItemId())] + v.GetItemNum()
}
for _, v := range pack.GetAward2() {
e, ok := award2[v.GetItemId()]
if !ok {
e = &welfare.PropInfo{
ItemId: v.GetItemId(),
ItemNum: v.GetItemNum(),
}
award2[v.GetItemId()] = e
} else {
e.ItemNum = e.GetItemNum() + v.GetItemNum()
}
awards2[int64(v.GetItemId())] = awards2[int64(v.GetItemId())] + v.GetItemNum()
}
// 发奖
SendPermitReward(p, awards1, 1)
SendPermitReward(p, awards2, 2)
pack.Award1 = nil
pack.Award2 = nil
for _, v := range award1 {
pack.Award1 = append(pack.Award1, &welfare.PropInfo{
ItemId: v.GetItemId(),
ItemNum: v.GetItemNum(),
})
}
for _, v := range award2 {
pack.Award2 = append(pack.Award2, &welfare.PropInfo{
ItemId: v.GetItemId(),
ItemNum: v.GetItemNum(),
})
}
p.SendToClient(int(welfare.SPacketID_PACKET_SCPermitAward), pack)
logger.Logger.Tracef("SCPermitAward: %v", pack)
return nil
}
// GetPermitExchangeNum 获取已兑换次数
func GetPermitExchangeNum(p *Player, id int32) int {
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
return 0
}
return len(p.WelfData.PermitExchange[id])
}
// GetPermitCanExchange 是否可以兑换
// 1等级不足 2需要典藏通行证 3兑换次数不足 4商品不存在
func GetPermitCanExchange(p *Player, id int32) (bool, int) {
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
return false, 0
}
times := GetPermitExchangeNum(p, id)
exp := int64(0)
item := BagMgrSingleton.GetItem(p.SnId, common.ItemIDPermit)
if item != nil {
exp = item.ItemNum
}
level := PlatformMgrSingleton.GetPermitLevel(p.Platform, p.LastChannel, exp)
for _, v := range channelConfig.GetExchangeConfig() {
if v.GetId() == id {
if !v.GetIsShow() {
return false, 3
}
// 等级
if level < v.GetLevel() {
return false, 1
}
// 通行证
if v.GetIsPermit() && !p.GetIsPermit() {
return false, 2
}
// 剩余兑换次数
if v.GetTimes() > 0 && int64(times) >= v.GetTimes() {
return false, 3
}
return true, 0
}
}
return false, 4
}
func CSPermitExchangeList(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSPermitExchangeList Process recv %v", data)
_, ok := data.(*welfare.CSPermitExchangeList)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
if p.LastChannel == "" {
logger.Logger.Errorf("CSPermitExchangeList not channel %v", p.SnId)
return nil
}
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
logger.Logger.Errorf("CSPermitExchangeList not channelConfig %v", p.SnId)
return nil
}
startTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitStartTs
endTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitEndTs
if startTs == 0 || endTs == 0 {
logger.Logger.Errorf("CSPermitExchangeList not startTs %v", p.SnId)
return nil
}
pack := &welfare.SCPermitExchangeList{}
for _, v := range channelConfig.GetExchangeConfig() {
if !v.GetIsShow() {
continue
}
var gain, cost []*welfare.PropInfo
for _, vv := range v.GetGain() {
gain = append(gain, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
for _, vv := range v.GetCost() {
cost = append(cost, &welfare.PropInfo{
ItemId: vv.GetItemId(),
ItemNum: vv.GetItemNum(),
})
}
times := int32(v.GetTimes()) - int32(GetPermitExchangeNum(p, v.GetId()))
exchangeTimes := v.GetTimes()
if exchangeTimes == 0 {
exchangeTimes = -1
}
pack.List = append(pack.List, &welfare.ShopInfo{
Id: v.GetId(),
Gain: gain,
Cost: cost,
ExchangeTimes: int32(exchangeTimes),
RemainTimes: times,
Level: v.GetLevel(),
NeedPermit: v.GetIsPermit(),
SortId: v.GetSortId(),
})
}
p.SendToClient(int(welfare.SPacketID_PACKET_SCPermitExchangeList), pack)
logger.Logger.Tracef("SCPermitExchangeList: %v", pack)
return nil
}
func CSPermitExchange(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSPermitExchange Process recv %v", data)
msg, ok := data.(*welfare.CSPermitExchange)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
if p.LastChannel == "" {
logger.Logger.Errorf("CSPermitExchange not channel %v", p.SnId)
return nil
}
if !PlatformMgrSingleton.IsOn(p.Platform, common.ChannelSwitchPermit, p.LastChannel) {
return nil
}
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
logger.Logger.Errorf("CSPermitExchange not channelConfig %v", p.SnId)
return nil
}
startTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitStartTs
endTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitEndTs
now := time.Now()
if startTs == 0 || endTs == 0 || now.Unix() < startTs || now.Unix() >= endTs {
logger.Logger.Errorf("CSPermitExchange not startTs %v", p.SnId)
return nil
}
isExchange, code := GetPermitCanExchange(p, msg.GetId())
pack := &welfare.SCPermitExchange{
OpRetCode: welfare.OpResultCode_OPRC_Sucess,
}
send := func(d welfare.OpResultCode) {
// 1等级不足 2需要典藏通行证 3兑换次数不足 4商品不存在
switch code {
case 1:
pack.OpRetCode = welfare.OpResultCode_OPRC_ExchangeLevelLimit
case 2:
pack.OpRetCode = welfare.OpResultCode_OPRC_NeedPermit
case 3:
pack.OpRetCode = welfare.OpResultCode_OPRC_ExchangeLimit
case 4:
pack.OpRetCode = welfare.OpResultCode_OPRC_NotFound
}
if code == 0 {
pack.OpRetCode = d
}
p.SendToClient(int(welfare.SPacketID_PACKET_SCPermitExchange), pack)
logger.Logger.Tracef("SCPermitExchange: %v", pack)
}
if isExchange {
var exchangeConfig *webapiproto.PermitExchangeConfig
for _, v := range channelConfig.GetExchangeConfig() {
if v.GetId() == msg.GetId() {
exchangeConfig = v
break
}
}
if exchangeConfig != nil {
// 检查背包是否足够
var items []*model.Item
var costItems []*Item
var cost, gain []model.AwardItem
var cost1 []*model.Item
for _, v := range exchangeConfig.GetCost() {
item := BagMgrSingleton.GetItem(p.SnId, v.GetItemId())
if item == nil || item.ItemNum < v.GetItemNum() {
send(welfare.OpResultCode_OPRC_ErrCost)
return nil
}
info := srvdata.GameItemMgr.Get(p.Platform, v.GetItemId())
if info != nil {
costItems = append(costItems, &Item{
ItemId: v.GetItemId(),
ItemNum: v.GetItemNum(),
Name: info.Name,
})
cost = append(cost, model.AwardItem{
Id: v.GetItemId(),
Num: v.GetItemNum(),
})
cost1 = append(cost1, &model.Item{
ItemId: v.GetItemId(),
ItemNum: v.GetItemNum(),
})
}
}
for _, v := range exchangeConfig.GetGain() {
info := srvdata.GameItemMgr.Get(p.Platform, v.GetItemId())
if info != nil {
items = append(items, &model.Item{
ItemId: v.GetItemId(),
ItemNum: v.GetItemNum(),
})
gain = append(gain, model.AwardItem{
Id: v.GetItemId(),
Num: v.GetItemNum(),
})
}
}
// 扣除背包物品
for _, item := range costItems {
BagMgrSingleton.AddItem(p, int64(item.ItemId), -item.ItemNum, 0,
common.GainWayPermitExchangeCost, "system", "赛季通行证兑换消耗", 0, 0, false)
}
// 增加背包物品
BagMgrSingleton.AddItemsV2(&model.AddItemParam{
P: p.PlayerData,
Change: items,
Cost: cost1,
Add: 0,
GainWay: common.GainWayPermitExchangeGain,
Operator: "system",
Remark: "赛季通行证兑换获得",
GameId: 0,
GameFreeId: 0,
NoLog: false,
})
p.WelfData.PermitExchange[msg.GetId()] = append(p.WelfData.PermitExchange[msg.GetId()], now.Unix())
// 兑换记录
LogChannelSingleton.WriteLog(&model.BackendPermitExchange{
Platform: p.Platform,
StartTs: startTs,
SnId: p.SnId,
Id: exchangeConfig.Id,
Cost: cost,
Gain: gain,
Ts: now.Unix(),
})
}
}
send(welfare.OpResultCode_OPRC_Sucess)
return nil
}
func CSPermitShop(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSPermitShop Process recv %v", data)
_, ok := data.(*welfare.CSPermitShop)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
if p.LastChannel == "" {
logger.Logger.Errorf("CSPermitShop not channel %v", p.SnId)
return nil
}
channelConfig := PlatformMgrSingleton.GetPermitConfig(p.Platform, p.LastChannel)
if channelConfig == nil {
logger.Logger.Errorf("CSPermitShop not channelConfig %v", p.SnId)
return nil
}
startTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitStartTs
endTs := PlatformMgrSingleton.GetConfig(p.Platform).PermitEndTs
if startTs == 0 || endTs == 0 {
logger.Logger.Errorf("CSPermitShop not startTs %v", p.SnId)
return nil
}
shopInfo := ShopMgrSington.GetShopInfo(common.ShopIdPermit, p)
if shopInfo == nil {
logger.Logger.Errorf("CSPermitShop is null %v", p.SnId)
return nil
}
price := int64(0)
if len(shopInfo.CostArea) > 0 {
price = int64(shopInfo.CostArea[0])
}
pack := &welfare.SCPermitShop{
Id: shopInfo.Id,
Name: shopInfo.Name,
Consume: shopInfo.ConstType,
Price: price,
}
p.SendToClient(int(welfare.SPacketID_PACKET_SCPermitShop), pack)
logger.Logger.Tracef("SCPermitShop: %v", pack)
return nil
}
// ------------------------------------------------
type CSPigBankGetInfoPacketFactory struct {
}
type CSPigBankGetInfoHandler struct {
}
func (this *CSPigBankGetInfoPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSPigbankGetInfo{}
return pack
}
func (this *CSPigBankGetInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPigbankGetInfo Process recv ", data)
if _, ok := data.(*welfare.CSPigbankGetInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSPigBankGetInfoHandler p == nil")
return nil
}
WelfareMgrSington.PigbankGetInfo(p)
}
return nil
}
// ------------------------------------------------
type CSPigBankTakeCoinPacketFactory struct {
}
type CSPigBankTakeCoinHandler struct {
}
func (this *CSPigBankTakeCoinPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSPigbankTakeCoin{}
return pack
}
func (this *CSPigBankTakeCoinHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPigbankTakeCoin Process recv ", data)
if _, ok := data.(*welfare.CSPigbankTakeCoin); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSPigBankTakeCoinHandler p == nil")
return nil
}
WelfareMgrSington.PigbankTakeCoin(p)
}
return nil
}
// GetAddUp2Award
type CSSignDayAddup2AwardPacketFactory struct {
}
type CSSignDayAddup2AwardHandler struct {
}
func (this *CSSignDayAddup2AwardPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSSignDayAddup2Award{}
return pack
}
func (this *CSSignDayAddup2AwardHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSSignDayAddup2Award Process recv ", data)
if msg, ok := data.(*welfare.CSSignDayAddup2Award); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSPigBankTakeCoinHandler p == nil")
return nil
}
WelfareMgrSington.GetAddUp2Award(p, msg.Day)
}
return nil
}
type CSDiamondBankGetInfoPacketFactory struct {
}
type CSDiamondBankGetInfoHandler struct {
}
func (this *CSDiamondBankGetInfoPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSDiamondBankGetInfo{}
return pack
}
func (this *CSDiamondBankGetInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSDiamondBankGetInfo Process recv ", data)
if _, ok := data.(*welfare.CSDiamondBankGetInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSPigBankTakeCoinHandler p == nil")
return nil
}
WelfareMgrSington.DiamondBankGetInfo(p)
}
return nil
}
/*// 钻石储存罐
type CSDiamondBankTakeDiamondPacketFactory struct {
}
type CSDiamondBankTakeDiamondHandler struct {
}
func (this *CSDiamondBankTakeDiamondPacketFactory) CreatePacket() interface{} {
pack := &welfare.CSDiamondBankTakeDiamond{}
return pack
}
func (this *CSDiamondBankTakeDiamondHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSDiamondBankGetInfo Process recv ", data)
if _, ok := data.(*welfare.CSDiamondBankTakeDiamond); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSPigBankTakeCoinHandler p == nil")
return nil
}
WelfareMgrSington.DiamondBankTakeCoin(p)
}
return nil
}*/
func init() {
// 领取救济金
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_GETRELIEFFUND), &CSGetReliefFundHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_GETRELIEFFUND), &CSGetReliefFundPacketFactory{})
//转动转盘
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_GETTURNPLATE), &CSGetTurnplateHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_GETTURNPLATE), &CSGetTurnplatePacketFactory{})
//累计签到
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_GETADDUPSIGN), &CSGetAddupSignHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_GETADDUPSIGN), &CSGetAddupSignPacketFactory{})
//福利信息
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_WELFAREINFO), &CSWelfaredInfoHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_WELFAREINFO), &CSWelfaredInfoPacketFactory{})
//查看盲盒
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_BLINBOXINFO), &CSBlindBoxInfoHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_BLINBOXINFO), &CSBlindBoxInfoPacketFactory{})
//购买盲盒
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_GETBLINBOX), &CSBuyBlindBoxHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_GETBLINBOX), &CSBuyBlindBoxPacketFactory{})
//查看首充
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_FIRSTPAYINFO), &CSFirstPayInfoHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_FIRSTPAYINFO), &CSFirstPayInfoPacketFactory{})
//领取首充
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_FIRSTPAY), &CSBuyFirstPayHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_FIRSTPAY), &CSBuyFirstPayPacketFactory{})
//查看连续充值
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_CONTINPAYINFO), &CSContinuousPayInfoHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_CONTINPAYINFO), &CSContinuousPayInfoPacketFactory{})
//领取连续充值
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_CONTINPAY), &CSBuyContinuousPayHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_WELF_CONTINPAY), &CSBuyContinuousPayPacketFactory{})
// 破产补助信息
common.Register(int(welfare.SPacketID_PACKET_CSWelfRelief), welfare.CSWelfareRelief{}, CSWelfRelief)
// 邀请信息
common.Register(int(welfare.SPacketID_PACKET_CSInviteInfo), welfare.CSInviteInfo{}, CSInviteInfo)
// 绑定信息
common.Register(int(welfare.SPacketID_PACKET_CSBindInvite), welfare.CSBindInvite{}, CSBindInvite)
//获取存钱罐数据
common.RegisterHandler(int(welfare.SPacketID_PACKET_CSPigbankGetInfo), &CSPigBankGetInfoHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CSPigbankGetInfo), &CSPigBankGetInfoPacketFactory{})
//领取存钱罐金币
common.RegisterHandler(int(welfare.SPacketID_PACKET_CSPigbankTakeCoin), &CSPigBankTakeCoinHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CSPigbankTakeCoin), &CSPigBankTakeCoinPacketFactory{})
//领取七日签到进阶奖励
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_SignDay_Addup2Award), &CSSignDayAddup2AwardHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CS_SignDay_Addup2Award), &CSSignDayAddup2AwardPacketFactory{})
//钻石储存罐信息
common.RegisterHandler(int(welfare.SPacketID_PACKET_CSDiamondBankGetInfo), &CSDiamondBankGetInfoHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CSDiamondBankGetInfo), &CSDiamondBankGetInfoPacketFactory{})
//领取钻石储存罐
/* common.RegisterHandler(int(welfare.SPacketID_PACKET_CSDiamondBankTakeDiamond), &CSDiamondBankTakeDiamondHandler{})
netlib.RegisterFactory(int(welfare.SPacketID_PACKET_CSDiamondBankTakeDiamond), &CSDiamondBankTakeDiamondPacketFactory{})*/
// 赛季通行证信息
common.Register(int(welfare.SPacketID_PACKET_CSPermitInfo), welfare.CSPermitInfo{}, CSPermitInfo)
// 赛季通行证奖励领取
common.Register(int(welfare.SPacketID_PACKET_CSPermitAward), welfare.CSPermitAward{}, CSPermitAward)
// 赛季通行证兑换列表
common.Register(int(welfare.SPacketID_PACKET_CSPermitExchangeList), welfare.CSPermitExchangeList{}, CSPermitExchangeList)
// 赛季通行证兑换
common.Register(int(welfare.SPacketID_PACKET_CSPermitExchange), welfare.CSPermitExchange{}, CSPermitExchange)
// 赛季典藏通行证商品信息
common.Register(int(welfare.SPacketID_PACKET_CSPermitShop), welfare.CSPermitShop{}, CSPermitShop)
}