| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- package player
- import (
- actorRemote "f1-game/internal/actor_remote"
- cherryApp "f1-game/internal/cherry_app"
- "f1-game/internal/code"
- "f1-game/internal/component/sdk"
- sdkFacade "f1-game/internal/component/sdk/define/facade"
- sdkKey "f1-game/internal/component/sdk/define/key"
- "f1-game/internal/constant"
- "f1-game/internal/data"
- "f1-game/internal/enum"
- nameLocal "f1-game/internal/name/local"
- nameRemote "f1-game/internal/name/remote"
- "f1-game/internal/pb"
- "f1-game/internal/sessions"
- "f1-game/nodes/game/internal/db"
- gameFacade "f1-game/nodes/game/internal/facade"
- ao "f1-game/nodes/game/player/asset/origin"
- "f1-game/nodes/game/player/charge"
- cstring "github.com/cherry-game/cherry/extend/string"
- ctime "github.com/cherry-game/cherry/extend/time"
- cproto "github.com/cherry-game/cherry/net/proto"
- )
- func (p *actorPlayer) initCharge() {
- p.Local().Register(nameLocal.Player_ChargeCreate, p.chargeCreate)
- p.Local().Register(nameLocal.Player_ChargeCardReward, p.chargeCardReward)
- p.Remote().Register(nameRemote.Player_ChargeDeliver, p.chargeDeliver)
- }
- // chargeCreate 充值项订单创建
- func (p *actorPlayer) chargeCreate(session *cproto.Session, req *pb.ChargeCreate) {
- chargeRow, found := data.Charge.GetByID(req.ChargeID)
- if !found || chargeRow.Amount < 1 {
- p.ResponseCode(session, code.PayChargeIDError)
- return
- }
- pid := sessions.GetPID(session)
- sdkRow := data.SDK.Get(pid)
- if sdkRow == nil {
- p.ResponseCode(session, code.PIDError)
- return
- }
- sdkInvoke, err := sdk.GetInvoke(sdkRow.SdkID)
- if err != nil {
- p.ResponseCode(session, code.PIDError)
- return
- }
- // 根据chargeID,检查充值项
- errCode := charge.Service().OnCheck(p.playerID, req.ChargeID, chargeRow.ChargeType, req.ChargeParams)
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- // 通过order actor 创建订单,返回订单id
- orderID, errCode := p.createPayOrder(session, req, chargeRow)
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- // 构建订单签名
- input := sdkFacade.ParamsMap{}
- input.Put(sdkKey.GameNodeID, cherryApp.NodeID())
- input.Put(sdkKey.PID, sessions.GetPID(session))
- input.Put(sdkKey.OpenID, sessions.GetOpenID(session))
- input.Put(sdkKey.UID, session.Uid)
- input.Put(sdkKey.PlayerID, sessions.GetPlayerID(session))
- input.Put(sdkKey.OrderID, orderID)
- params, errCode := sdkInvoke.OrderSign(sdkRow, chargeRow, input)
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- rsp := &pb.ChargeCreateResponse{
- ChargeID: req.ChargeID,
- OrderID: orderID,
- Params: params,
- }
- p.Response(session, rsp)
- }
- func (p *actorPlayer) createPayOrder(session *cproto.Session, req *pb.ChargeCreate, chargeRow *data.ChargeRow) (int64, int32) {
- playerTable := p.PlayerTable()
- createOrder := &pb.CreateOrder{
- PID: playerTable.PID,
- UID: playerTable.UID,
- GameNodeID: playerTable.NodeID,
- PlayerID: playerTable.PlayerID,
- ChargeID: chargeRow.ID,
- Amount: chargeRow.Amount,
- ClientOS: 0, // 需要在玩家登录的时候带入到session里,然后直接读取
- Ip: session.Ip,
- Extra: map[string]string{
- constant.ChargeKeyType: cstring.ToString(chargeRow.ChargeType),
- constant.ChargeKeyParams: cstring.ToString(req.ChargeParams),
- constant.ChargeKeyGameNodeID: cstring.ToString(playerTable.NodeID),
- },
- }
- // 调用order actor 创建订单ID信息,下发给客户端
- return actorRemote.GameOrder.Create(createOrder)
- }
- // 每日周月卡奖励领取
- func (p *actorPlayer) chargeCardReward(session *cproto.Session, req *pb.I32) {
- cardID := req.Value
- if cardID < 1 {
- p.ResponseCode(session, code.IllegalArgument)
- return
- }
- row, ok := data.ShopCard.GetByID(cardID)
- if !ok {
- p.ResponseCode(session, code.ConfigNotFound_ShopCard)
- return
- }
- chargeTable := db.GetChargeTable(p.playerID)
- card, ok := chargeTable.Cards.Get(cardID)
- if !ok {
- p.ResponseCode(session, code.IllegalArgument)
- return
- }
- if card.ExpireTime < ctime.Now().ToMillisecond() {
- p.ResponseCode(session, code.VipCardExpired)
- return
- }
- if card.IsReceive {
- p.ResponseCode(session, code.VipCardAlreadyReceived)
- return
- }
- // 先保存,再发放奖励
- card.IsReceive = true
- chargeTable.Save2Queue()
- gameFacade.Asset.Adds(p.playerID, row.DayRewards, ao.None, true)
- p.ResponseCode(session, code.OK)
- p.Debug("[chargeCardReward] receive success. playerID = %d, cardID = %d", p.playerID, cardID)
- }
- // chargeDeliver 充值项订单发货 {server-id}.player.orderDeliver
- func (p *actorPlayer) chargeDeliver(req *pb.OrderDeliver) int32 {
- chargeRow, found := data.Charge.GetByID(req.ChargeID)
- if !found {
- return code.PayChargeIDError
- }
- if req.Extra == nil {
- return code.PayChargeParamsError
- }
- chargeType, ok := req.GetExtraI32(constant.ChargeKeyType)
- if !ok || chargeRow.ChargeType != chargeType {
- return code.PayChargeTypeError
- }
- chargeParams, ok := req.GetExtraI32(constant.ChargeKeyParams)
- if !ok {
- return code.PayChargeParamsError
- }
- errCode := charge.Service().OnDeliver(p.playerID, req.ChargeID, chargeType, chargeParams)
- if code.IsFail(errCode) {
- p.Warn("[chargeDeliver] OnDeliver fail. req = %v, errCode = %d", req, errCode)
- }
- // 统一逻辑,加充值积分
- if chargeRow.ChargePoints > 0 {
- gameFacade.Asset.Add(p.playerID, enum.ItemIDChargePoint, int64(chargeRow.ChargePoints), ao.None, true)
- }
- return code.OK
- }
|