game_sync/model/player.go

3170 lines
86 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 model
import (
"bytes"
"crypto/md5"
"encoding/gob"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"hash/crc32"
"io"
"math/rand"
"os"
"strconv"
"strings"
"time"
"github.com/globalsign/mgo/bson"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/game/common"
"mongo.games.com/game/protocol/webapi"
)
const (
VER_PLAYER_DEFAULT int32 = iota //初始版本
VER_PLAYER_MAX
)
const (
PLAYER_FLAGS_PRIVILEGE int64 = 1 << iota
PLAYER_FLAGS_FIRSTGAME //首次游戏
PLAYER_FLAGS_FIRSTBINDTEL //首次绑定账号
PLAYER_FLAGS_CANREBATE //是否能够返利
)
const (
DEFAULT_PLAYER_SAFEBOX_PWD = "" //保险箱默认密码
)
const (
MAX_RANK_COUNT = 50
)
type PlayerParams struct {
Platform int32 `json:"platform"` //0:web 1:ios 2:android
Ip string `json:"ip"` //ip地址
City string `json:"city"` //所在城市
Logininmodel string `json:"logininmodel"` //"app" 或者 "web"
Name string `json:"name"` //微信昵称
Head string `json:"head"` //微信头像
UnionId string `json:"unionid"` //微信unionid
IosIsStable bool `json:"iosIsStable"` //是否是IOS稳定版
AccountType int32 //账号类型
}
type LoginCallback func(pd *PlayerData)
var FirstLoginCB LoginCallback
type PlayerDiffData struct {
Coin int64 //金币
Diamond int64 //钻石
VCoin int64 //V卡
SafeBoxCoin int64 //保险箱金币
CoinPayTotal int64 //总充值金额
VIP int32 //vip等级
TotalConvertibleFlow int64 //流水值
ClubCoin int64 //俱乐部金币
Ticket int64 //比赛入场券
Grade int64 //积分
ChessGrade int64 // 象棋积分
RankScore map[int32]int64 // 排位积分
PhoneScore int64 //手机积分
InviteScore int64 // 邀请积分
Long int64 // 龙币
}
type PlayerBaseData struct {
SnId int32 //数字唯一id
Name string //名字
Sex int32 //性别
Coin int64 //金币
}
const (
TASKSTATUS_RUNNING int32 = iota //进行中
TASKSTATUS_COMPLETE //已完成
TASKSTATUS_PRIZEDRAWED //奖励已领取
TASKSTATUS_EXPIRE //已超期
)
const (
SystemFreeGive_GiveType_NewPlayer int32 = iota //创号赠送
SystemFreeGive_GiveType_ActSign //签到赠送
SystemFreeGive_GiveType_ActTurnplate //转盘
SystemFreeGive_GiveType_ActContinuousSign //累签
SystemFreeGive_GiveType_ShopAd //商城观看视频赠送
SystemFreeGive_GiveType_ReliefFund //破产补助
SystemFreeGive_GiveType_VipGift //vip领取
SystemFreeGive_GiveType_MatchSeason //赛季奖励
SystemFreeGive_GiveType_ActJybAward //礼包码兑换
SystemFreeGive_GiveType_MailSystemGive //邮件系统赠送
SystemFreeGive_GiveType_RankMatch //段位奖励
SystemFreeGive_GiveType_BindTel // 绑定手机号奖励
SystemFreeGive_GiveType_TaskInvite // 邀请任务
SystemFreeGive_GiveType_TaskNewPlayer // 新手任务
SystemFreeGive_GiveType_TaskAchievement // 成就任务
SystemFreeGive_GiveType_TaskEveryDay // 每日任务
SystemFreeGive_GiveType_TaskWeekActive // 周活跃奖励
SystemFreeGive_GiveType_PermitAward // 赛季通行证奖励
SystemFreeGive_GiveType_TaskPermit // 赛季通行证任务奖励
SystemFreeGive_GiveType_TaskPermitRank // 赛季通行证排名奖励
SystemFreeGive_PhoneLottery // 手机积分抽奖奖励
SystemFreeGive_PhoneLotterySwap // 手机积分兑换奖励
SystemFreeGive_CollectBox // 开启卡片礼盒奖励
SystemFreeGive_CollectBoxSwap // 卡片礼盒兑换奖励
)
const (
SystemFreeGive_CoinType_Coin int32 = iota //金币
SystemFreeGive_CoinType_Diamond //钻石
)
type PlayerGameCtrlData struct {
CtrlData map[string]*PlayerGameStatics
RechargeCoin int64 //充值金额
ExchangeCoin int64 //兑换金额
TodayConvertibleFlow int64 //今日流水
Ts int64 //日期
}
func NewPlayerGameCtrlData() *PlayerGameCtrlData {
t := &PlayerGameCtrlData{CtrlData: make(map[string]*PlayerGameStatics)}
t.Ts = time.Now().Unix()
return t
}
type PlayerGameStatics struct {
GameTimes int64 //总局数
WinGameTimes int64 //赢的局数
LoseGameTimes int64 //输的局数
DrawGameTimes int64 //和的局数
TotalIn int64 //总游戏投入(输掉的金币)
TotalOut int64 //总游戏产出(赢取的金币),税前
Tax int64 //总税收
MaxSysOut int64 //单局最大盈利,税前
Version int32 //数据版本,游戏有时候数据计算错误,需要重置所有玩家的数据
WinGameTimesNum int64 // 连赢次数
LoseGameTimesNum int64 // 连输次数
ChessWinTimes int64 // 象棋连赢次数
Other map[string]interface{} // 其他特殊统计信息(游戏自定义)
}
func NewPlayerGameStatics() *PlayerGameStatics {
return &PlayerGameStatics{
Other: make(map[string]interface{}),
}
}
func (this *PlayerGameStatics) Custom() map[string]interface{} {
if this.Other == nil {
this.Other = make(map[string]interface{})
}
return this.Other
}
func (this *PlayerGameStatics) SetCustom(key string, value interface{}) {
if this.Other == nil {
this.Other = make(map[string]interface{})
}
if value != nil {
this.Other[key] = value
}
}
func (this *PlayerGameStatics) GetString(key string) string {
if this.Other == nil {
this.Other = make(map[string]interface{})
}
ret, _ := this.Other[key].(string)
return ret
}
func (this *PlayerGameStatics) SetInt(key string, n int) {
this.SetCustom(key, n)
}
func (this *PlayerGameStatics) GetInt(key string) int {
if this.Other == nil {
this.Other = make(map[string]interface{})
}
ret, _ := this.Other[key].(int)
return ret
}
func (this *PlayerGameStatics) Incr(key string) {
this.SetInt(key, this.GetInt(key)+1)
}
type PlayerGameInfo struct {
Statics PlayerGameStatics //游戏统计类数据
FirstTime time.Time //首次参与游戏时间
Data []int64 //游戏场次数据
DataEx []byte //其他扩展数据,可自定义json或者其他二进制数据
Version int32 //数据版本,游戏有时候数据计算错误,需要重置所有玩家的数据
}
type PlayerGameTotal struct {
ProfitCoin int64 //盈利总额
BetCoin int64 //有效投注总额
FlowCoin int64 //流水总额
}
type ShopTotal struct {
AdLookedNum int32 //已经观看的次数
AdReceiveNum int32 //已经领取的次数
}
type ModEx struct {
Ts int64 //解锁时间戳
}
type SkillEx struct {
Ts int64 //解锁时间戳
}
type ModInfo struct {
ModUnlock map[int32]int32 //已经解锁的id:等级
Mod map[int32]*ModEx //模型数据
ModId int32 //使用中的id
SkillInfo map[int32]map[int32]int32 //技能等级 ModId:技能id:技能等级
Skill map[int32]map[int32]*SkillEx // 技能数据
}
// 七日签到数据
type SignData struct {
SignIndex int //签到次数
LastSignTickets int64 //上一次签到时间 时间戳
}
//// 在线奖励数据
//type OnlineRewardData struct {
// Version int32
// Ts int64 // 上次累计时间戳
// OnlineDuration uint32 // 累计在线时长
// RewardReceived uint32 // 奖励获取情况
//}
//
//// 幸运转盘数据
//type LuckyTurnTableData struct {
// Score int64 // 当前积分
// TomorrowScore int64 // 明日积分
// TomorrowFloatScore float64 // 明日积分64位的防止精度丢失导致的数据不正常
//
//}
// 排行榜
type Rank struct {
SnId int32
Name string
Head int32
VIP int32
TotalCoin int64
}
//
//// 余额宝数据
//type YebData struct {
// TotalIncome int64 // 累计收益
// PrevIncome int64 // 上轮收益
// Balance int64 // 余额(总金额)
// InterestTs int64 // 起息时间(该时间一小时后产生收益)
//}
//
//// 卡(周卡月卡)数据
//type CardData struct {
// BuyTs int64 // 购买时间
// ReceiveTs int64 // 领取时间
//}
//
//// 阶梯充值数据
//type StepRechargeData struct {
// Version int32 // 版本
// CurrentStep int32 // 当前阶段
// Ts int64 // (上次)充值时间
//}
// 财神任务数据
type GoldTaskData struct {
TaskId int32 //任务ID
Data int64 //任务数据
CompletedTimes int32 //已完成次数
}
type GoldTaskDatas struct {
ConfigVer int64 //时间戳
DataTaskIdMap map[string]*GoldTaskData //taskid
}
type RebateData struct {
TodayRebateCoin int64 //今日返利
YesterdayRebateCoin int64 //昨日返利
ValidBetTotal int64 //今日有效下注
YesterdayValidBetTotal int64 //昨日有效下注
TotalRebateCoin int64 //今日累计已领取的返利
TotalHaveRebateCoin int64 //往日累计未领取的返利
TotalHaveValidBetTotal int64 //往日累计有效下注
}
type ShopData struct {
Id int32 // 商品ID
AddArea int32 // 加送百分比
CostArea int32 // 消耗数量
IsBuy bool //是否购买
}
////vip数据
//type ActVipBonusData struct {
// Level int32 //等级礼包领取情况 位计算
// Day int32 //每日领取情况 0 未领取 1已领取
// Week int32 //每周领取情况 0 未领取 1已领取
// Month int32 //每月领取情况 0 未领取 1已领取
// LastWeek int64 //上次领取周时间
// LastMonth int64 //上次领取月时间
//}
// 状态
type PayActState struct {
Ts int64 //获得时间
}
func (this *GoldTaskDatas) GetData(taskid int32) *GoldTaskData {
if this.DataTaskIdMap != nil {
if td, ok := this.DataTaskIdMap[fmt.Sprintf("%v", taskid)]; ok {
return td
}
}
return nil
}
// 比赛免费报名记录
type MatchFreeSignupRec struct {
LastSignupTs int64 //最后一次报名时间
UseTimes int32 //累计使用免费次数
}
// WGPlayerInfo 游戏服玩家信息
// 大厅玩家信息发送给游戏服
type WGPlayerInfo struct {
*PlayerData
GameData map[int32]*PlayerGameData // 游戏数据,只允许存储玩家对应某个游戏需要持久化的数据
}
type PlayerData struct {
Id bson.ObjectId `bson:"_id"`
AccountId string //账号id
AccountType int32 //账号类型
SnId int32 //数字唯一id
NiceId int32 //靓号
Name string //名字
Remark string //备注
Platform string //平台
Channel string //渠道信息
ChannelId string // 渠道id和channel没关系
DeviceOS string //设备操作系统
DeviceId string //设备id
PackageID string //推广包标识 对应客户端的packagetag
Package string //包信息 android:包名 ios:bundleid
IsRob bool //是否是机器人
Head int32 //头像
HeadUrl string //头像
Sex int32 //性别
HeadOutLine int32 //头像框
VIP int32 //VIP帐号 等级
GMLevel int32 //GM等级
WinTimes int32 //胜利次数
FailTimes int32 //失败次数
DrawTimes int32 //平局次数
WinCoin int64 //总赢钱数量(税前)
FailCoin int64 //总输钱数量
TaxCoin int64 //总税收
Tel string //电话号码
Ip string //最后登录ip地址
RegIp string //注册ip地址
City string //城市
Params string //其他参数
AlipayAccount string //支付宝账号
AlipayAccName string //支付宝实名
Bank string //绑定的银行名称
BankAccount string //绑定的银行账号
BankAccName string //绑定的银行账号
Coin int64 //金豆
CoinPayTs int64 //金豆冲账时间戳
CoinPayTotal int64 //在线总充值金额
MoneyPayTotal int64 //VIP经验值注意这里是没有乘充V比之前的值
CoinExchangeTotal int64 //总提现金额 兑换
SafeBoxCoin int64 //保险箱金币
SafeBoxPassword string //保险箱密码
Diamond int64 //钻石
InviterId int32 //邀请人Id
InviterName string //邀请人名称
InviterHead int32 //邀请人头像
BeUnderAgentCode string //隶属经销商(推广人)
SubBeUnderAgentCode string //经销商子id
Flags int64 //标记
GameCoinTs int64 //游服金币对账时间戳
Ver int32 //数据版本号
CheckSum uint32 //校验码(预防暴库修改数据)
UpgradeTime time.Time //升级账号时间,绑定手机号时间
CreateTime time.Time //创建时间
LastLoginTime time.Time //最后登陆时间
LastLogoutTime time.Time //缓存数据清除时间,最后数据持久化时间
AllowSpeakTime int64 //允许下次发言的时间戳
AgentType int32 //代理类型 0:普通用户 其它为代理
GameTax int64 //总游戏税收
SafeBoxCoinTs int64 //保险箱冲账时间戳
WhiteFlag int32 //特殊白名单标记
WBCoinTotalOut int64 //加入黑白名单后玩家总产出
WBCoinTotalIn int64 //加入黑白名单后玩家总投入
WBCoinLimit int64 //黑白名单输赢额度,额度变为0时自动解除黑白名单
WBMaxNum int32 //黑白名单最大干预次数
WBTime time.Time //黑白名单操作时间
WBState int32 //调控状态
TotalCoin int64 //总金币
PromoterTree int32 //推广树信息
TotalConvertibleFlow int64 //玩家流水总额 默认1:1 //流水统计使用
TotalFlow int64 //历史总流水
CanExchangeBeforeRecharge int64 //充值之前可兑换金额 //流水统计使用
LastRechargeWinCoin int64 //充值后流水
BlacklistType int32 //黑名单作用域和后台一样都是采用位标记的表示形式 // 0是不限制 第1位是游戏登录 第2位是兑换 第3位是充值注意这个地方是黑名单管理的作用域+1 //主要是为了在mgo没有设置黑名单类型的时候默认是不限制的
ForceVip int32 //强制VIP等级通过后台设置如果设置了当前值就不再通过paytotal计算vip等级
LastExchangeTime int64 //最后兑换时间
LastExchangeOrder string //最后的赠与订单
LogicLevels []int32 //用户分层信息
AutomaticTags []int32 //用户自动化标记
TelephonePromoter int32 //电销推广员标识,用于电销标记
TelephoneCallNum int32 //电销次数
Ticket int64 //比赛券
TicketPayTs int64 //比赛券冲账时间点
TicketTotal int64 //累计总获得比赛券数量
TicketTotalDel int64 //累计清理掉的数量
Grade int64 //积分
TagKey int32 //包标识关键字
LoginTimes int //用户登录次数
YesterdayGameData *PlayerGameCtrlData //昨日游戏统计数据
TodayGameData *PlayerGameCtrlData //今日游戏统计数据
IsFoolPlayer map[string]bool //每个游戏是否是新手玩家
//TotalGameData map[int][]*PlayerGameTotal //统计数据 1.棋牌 2.电子 3.捕鱼 4.视讯 5.彩票 6.体育 7.个人房间 8.俱乐部房间 9.三方游戏
GDatas map[string]*PlayerGameInfo //玩家游戏统计数据 key:gameFreeId, key:gameid
MarkInfo string //用来备注玩家信息
DeviceInfo string //设备信息
WBLevel int32 //黑白名单 白:[1,10] 黑:[-1,-10]
ShopTotal map[int32]*ShopTotal //key为商品id
ShopLastLookTime map[int32]int64 //商品上一次的观看时间
Roles *ModInfo //人物
Pets *ModInfo //宠物
Skin *ModInfo //皮肤
WelfData *WelfareData //活动数据
*SignData
VipMatchTimes int32 //VIP比赛场参与次数
ChessGrade int64 // 国际象棋游戏积分
Addr []string //玩家地址
// 用于个人水池计算,新手玩家不计入统计
TotalIn int64 // 游戏总投入
TotalOut int64 // 游戏总产出(税前)
PlayerTax int64 // 游戏总税收
// 用于个人水池计算
DiamondToCoin int64 // 钻石兑换金币的金币数量
MoneyPond int64 //捕鱼个人金币池
UnMaxPower int64 //捕鱼解锁最大炮倍数
PowerList []int32 //解锁的炮台列表
Level int64 //玩家等级
Exp int64 //玩家经验值
VipShopData map[int32]*ShopData //玩家vip商店信息
VipShopRefreshCount int32 //vip当前已使用免费刷新次数
VipExtra int32 //VIP赛季加成
ShopID []int // 已经参与首冲翻倍的商品id
Age int32 // 年龄
Signature string // 签名
PhoneScore int64 //商城积分
LotteryCount int32 //抽奖次数
InitLotteryStatus bool //抽奖初始化状态
Delete int // 是否删除
WeekCardTime map[int32]int64 // 周卡结束时间 key:类型 value结束时间
WeekCardAward map[int32]bool // 周卡奖励领取状态false-未领取true已领取
ItemRecExpireTime int64 // 记牌器到期时间
RequestAddFriend map[int32]int64 // 玩家申请好友记录
IsTakeExpireItem bool // 是否领取
LastChannel string // 最后包类型
ICode string // 邀请码
IScore int64 // 邀请积分
PSnId int32 // 邀请人
PCode string // 绑定的邀请码
INum int64 // 邀请人数
IMoney int64 // 邀请人充值金额
IScoreTs time.Time // 邀请积分更新时间
Permit time.Time // 赛季通行证领取时间
PermitStartTs int64 // 赛季通行证开始时间戳
DiamondLotteryScore int64 //钻石抽奖幸运值
VCardCost int64 // 消耗v卡数量
MoneyTotal int64 // 现金总充值金额,不包含api加币时的现金
GuideStep int32 // 引导步骤;跳过引导后,该值会置为-1
}
// 七日签到数据
type NewSignData struct {
SignIndex int32 //签到次数
SignTickets int64 //签到时间 时间戳
AddupIndex []int32 //领取累计奖励
TurnplateIdx []int32 //领取转盘下标
VideoTicket int64 // 领取视频奖励时间戳
Addup2Data map[int32]map[int32]int64 // 进阶奖励key1 - day key2-次数 value-结束领取时间戳(-1代表已领取)
}
type TaskData struct {
N int64
Ts int64 // 任务完成时间戳
}
type PigBankData struct {
TakeTimes int32 //一共领取次数
BankCoin int64 //当前金币数量
DayBuyTimes int32 //当天领取次数
}
// 钻石储存罐数据
type DiamondBankData struct {
TakeTimes int32 //一共领取次数
BankDiamond float64 //当前钻石数量
DayBuyTimes int32 //当天领取次数
}
type WelfareData struct {
ReliefFundTimes int32 //救济金领取次数
Sign7 *NewSignData //七日签到
FirstPayDay int32 //首充天数
FirstPayTickets int64 //首充 时间戳
ContinuousPayDay int32 //连续充值天数
ContinuousPayTickets int64 //连续充值 时间戳
BlindBoxId int32 //已经领取盲盒序号
ContPayDay int32 //首充 从1开始
VIPBag map[int32]map[int32]int32 //VIP充值礼包 vip等级:商品id:商品获得类型;特殊用法, 商品id为0代表vip每日礼包 1代表vip等级礼包
Task map[int32]*TaskData // 任务
PhoneLotteryTask map[int32]*TaskData // 抽手机任务
PigBank *PigBankData // 存钱罐
DiamondBank *DiamondBankData // 钻石储存罐
PermitAward map[int32]int64 // 赛季通行证奖励领取时间
PermitExchange map[int32][]int64 // 赛季通行证兑换次数, 多次的兑换时间
}
func NewWelfareData() *WelfareData {
return &WelfareData{
Sign7: &NewSignData{},
VIPBag: make(map[int32]map[int32]int32),
Task: make(map[int32]*TaskData),
PhoneLotteryTask: make(map[int32]*TaskData),
PigBank: &PigBankData{},
DiamondBank: &DiamondBankData{},
PermitAward: make(map[int32]int64),
PermitExchange: make(map[int32][]int64),
}
}
type GradeShop struct {
ConsigneeName string //收货人名字
ConsigneeTel string //收货人电话
ConsigneeAddr string //收货人地址
ExchangeDay map[int32]int32 //今天兑换了多少
}
type PlayerBaseInfo struct {
SnId int32
AccountId string
Name string
Platform string
Channel string
BeUnderAgentCode string
DeviceOS string
PackageID string
Package string
Tel string
Head int32
HeadUrl string
Sex int32
GMLevel int32
Coin int64
SafeBoxCoin int64
PromoterTree int32
TelephoneCallNum int32
LastLogoutTime time.Time
Roles *ModInfo
LastChannel string // 最后包类型
}
type PlayerBaseInfo2 struct {
Name string
Roles *ModInfo
CreateTime time.Time
}
type PlayerDataForWeb struct {
AlipayAccName string
AlipayAccount string
Bank string
BankAccName string
BankAccount string
BlackLevel int32
Coin int64
CoinExchangeTotal int64
CoinPayTotal int64
CreateTime time.Time
DeviceId string
DeviceOS string
DrawTimes int32
FailCoin int64
FailTimes int32
GameTax int64
Ip string
IsRob bool
LastLoginTime time.Time
MarkInfo string
Name string
Online bool
Package string
PackageID string
Platform string
RegIp string
SafeBoxCoin int64
SnId int32
Tel string
VIP int32
WhiteLevel int32
WinCoin int64
WinTimes int32
}
type WebItem struct {
Id int64
N int64
Name string
}
type WebPlayerDataParam struct {
*PlayerData
RankScore map[int64]int64
PlayerPoolUpper, PlayerPoolLower, PlayerPoolCurrent, PlayerPoolOdds int64
RoleAdded, VipAdded, VipExp int64
Items []*WebItem
IsPermit bool
Long, PermitScore int64
}
func ConvertPlayerDataToWebData(param *WebPlayerDataParam) *webapi.PlayerData {
if param == nil || param.PlayerData == nil {
return nil
}
pdfw := new(webapi.PlayerData)
pdfw.Coin = param.Coin
pdfw.Diamond = param.Diamond
pdfw.CoinExchangeTotal = param.CoinExchangeTotal
pdfw.CoinPayTotal = param.CoinPayTotal
pdfw.CreateTime = param.CreateTime.Unix()
pdfw.DeviceId = param.DeviceId
pdfw.DeviceOS = param.DeviceOS
pdfw.DrawTimes = param.DrawTimes
pdfw.FailCoin = param.FailCoin
pdfw.FailTimes = param.FailTimes
pdfw.GameTax = param.GameTax
pdfw.Ip = param.Ip
pdfw.IsRob = param.IsRob
pdfw.LastLoginTime = param.LastLoginTime.Unix()
pdfw.MarkInfo = param.MarkInfo
pdfw.Name = param.Name
pdfw.Package = param.Package
pdfw.PackageID = param.PackageID
pdfw.Platform = param.Platform
pdfw.RegIp = param.RegIp
pdfw.SafeBoxCoin = param.SafeBoxCoin
pdfw.SnId = param.SnId
pdfw.Tel = param.Tel
pdfw.VIP = param.VIP
pdfw.WBLevel = param.WBLevel
pdfw.WinCoin = param.WinCoin
pdfw.WinTimes = param.WinTimes
pdfw.BlacklistType = param.BlacklistType
pdfw.AccountType = param.AccountType
if param.Roles != nil {
pdfw.RoleUnlock = int32(len(param.Roles.ModUnlock))
for k := range param.Roles.ModUnlock {
pdfw.RolesIds = append(pdfw.RolesIds, k)
}
}
if param.Pets != nil {
pdfw.PetUnlock = int32(len(param.Pets.ModUnlock))
for k := range param.Pets.ModUnlock {
pdfw.PetsIds = append(pdfw.PetsIds, k)
}
}
pdfw.ChessGrade = int32(param.ChessGrade)
pdfw.AllWinCoin = param.WinCoin - param.FailCoin
pdfw.AllFlow = param.TotalFlow
pdfw.RankScore = make(map[int64]int64)
if param.RankScore != nil {
pdfw.RankScore = param.RankScore
}
pdfw.PlayerPoolCurrent = param.PlayerPoolCurrent
pdfw.PlayerPoolUpper = param.PlayerPoolUpper
pdfw.PlayerPoolLower = param.PlayerPoolLower
pdfw.PlayerPoolRate = param.PlayerPoolOdds
pdfw.RoleAdded = param.RoleAdded
pdfw.VipAdded = param.VipAdded
pdfw.VipExp = param.VipExp
pdfw.ShopId = common.IntSliceToInt32(param.ShopID)
pdfw.Delete = int64(param.Delete)
pdfw.InviteCode = param.ICode
pdfw.InviteSnId = param.PSnId
pdfw.InviteScore = param.IScore
pdfw.Channel = param.Channel
pdfw.LastChannel = param.LastChannel
pdfw.ChannelID = param.ChannelId
for _, v := range param.Items {
pdfw.Items = append(pdfw.Items, &webapi.ItemInfo{
ItemId: int32(v.Id),
ItemNum: v.N,
Name: v.Name,
})
}
pdfw.IsPermit = param.IsPermit
pdfw.PermitScore = param.PermitScore
pdfw.Long = param.Long
pdfw.VCardCost = param.VCardCost
pdfw.MoneyTotal = param.MoneyTotal
if param.Roles != nil {
pdfw.UseRoleId = param.Roles.ModId
for k, v := range param.Roles.ModUnlock {
if v <= 0 {
continue
}
ts := int64(0)
if param.Roles.Mod[k] != nil {
ts = param.Roles.Mod[k].Ts
}
pdfw.RoleUnlockList = append(pdfw.RoleUnlockList, &webapi.ModInfo{
Id: k,
Level: v,
Ts: ts,
})
}
}
if param.Skin != nil {
pdfw.UseSkinId = param.Skin.ModId
for k, v := range param.Skin.ModUnlock {
if v > 0 {
pdfw.SkinIds = append(pdfw.SkinIds, k)
ts := int64(0)
if param.Skin.Mod[k] != nil {
ts = param.Skin.Mod[k].Ts
}
pdfw.SkinUnlockList = append(pdfw.SkinUnlockList, &webapi.ModInfo{
Id: k,
Level: v,
Ts: ts,
})
}
}
}
if param.Pets != nil {
for k, v := range param.Pets.ModUnlock {
if v <= 0 {
continue
}
ts := int64(0)
if param.Pets.Mod[k] != nil {
ts = param.Pets.Mod[k].Ts
}
pdfw.PetUnlockList = append(pdfw.PetUnlockList, &webapi.ModInfo{
Id: k,
Level: v,
Ts: ts,
})
}
for k, v := range param.Pets.SkillInfo {
for skillId, skillLevel := range v {
if skillLevel <= 0 {
continue
}
ts := int64(0)
if param.Pets.Skill[k] != nil && param.Pets.Skill[k][skillId] != nil {
ts = param.Pets.Skill[k][skillId].Ts
}
pdfw.PetSkillUnlockList = append(pdfw.PetSkillUnlockList, &webapi.ModInfo{
Id: skillId,
Level: skillLevel,
Ts: ts,
})
}
}
}
return pdfw
}
func (this *PlayerData) IsMarkFlag(flag int) bool {
return this.Flags&(1<<flag) != 0
}
func (this *PlayerData) MarkFlag(flag int) {
this.Flags |= (1 << flag)
}
func (this *PlayerData) UnmarkFlag(flag int) {
this.Flags &= ^(1 << flag)
}
func (this *PlayerData) GetSnId() int32 {
return this.SnId
}
func (this *PlayerData) GetCoin() int64 {
return this.Coin
}
func (this *PlayerData) GetTotalCoin() int64 {
return this.Coin + this.SafeBoxCoin //+ this.YebData.Balance
}
func (this *PlayerData) IsRobot() bool {
return this.IsRob
}
func (this *PlayerData) SetPayTs(payts int64) {
if this.CoinPayTs < payts {
this.CoinPayTs = payts
}
}
func (this *PlayerData) SetSafeBoxPayTs(payts int64) {
if this.SafeBoxCoinTs < payts {
this.SafeBoxCoinTs = payts
}
}
// func (pd *PlayerData) SetClubPayTs(payts int64) {
// if pd.ClubCoinPayTs < payts {
// pd.ClubCoinPayTs = payts
// }
// }
func (this *PlayerData) SetTicketPayTs(payts int64) {
if this.TicketPayTs < payts {
this.TicketPayTs = payts
}
}
func (this *PlayerData) GetTodayCoinFlowTotal() int64 {
if this.LastLogoutTime.Day() != time.Now().Day() {
return 0
}
if this.LastLogoutTime.Day() == time.Now().Day() && time.Now().Sub(this.LastLogoutTime) >= time.Hour*24 {
return 0
}
if this.TodayGameData != nil {
return this.TodayGameData.TodayConvertibleFlow
}
return 0
}
func (this *PlayerData) GetPlayerDataEncoder() (bytes.Buffer, error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
err := enc.Encode(this)
return buf, err
}
func (this *PlayerData) UpdateParams(params string) *PlayerParams {
if this.WhiteFlag > 0 {
return nil
}
this.Params = params
var pp PlayerParams
err := json.Unmarshal([]byte(params), &pp)
if err == nil {
if common.IsValidIP(pp.Ip) {
this.Ip = pp.Ip
if this.RegIp == "" {
this.RegIp = pp.Ip
}
} else if common.IsValidIP(this.RegIp) {
this.Ip = this.RegIp
} else {
this.Ip = ""
}
//if pp.City != "" {
// this.City = pp.City
//}
//switch pp.Platform {
//case 0:
// this.DeviceOS = common.WebStr
//case 1:
// this.DeviceOS = common.IOSStr
//case 2:
// this.DeviceOS = common.AndroidStr
//}
//if pp.Name != "" {
// this.Name = pp.Name
//}
}
return &pp
}
func NewPlayerData(acc string, name string, id int32, channel, platform string, params, tel string,
packTag, ip string, addCoin int64, unionid, deviceInfo string,
tagkey, accountType int32, channelId string) *PlayerData {
if len(name) == 0 {
logger.Logger.Trace("New player name is empty.")
return nil
}
//logger.Logger.Trace("New player information.")
//safebox password default is '111111'
raw := fmt.Sprintf("%v%v", DEFAULT_PLAYER_SAFEBOX_PWD, common.GetAppId())
h := md5.New()
io.WriteString(h, raw)
pwd := hex.EncodeToString(h.Sum(nil))
tNow := time.Now()
isRobot := channel == common.Channel_Rob
pd := &PlayerData{
Id: bson.NewObjectId(),
AccountId: acc,
AccountType: accountType,
Name: name,
Channel: channel,
ChannelId: channelId,
Platform: platform,
SnId: id,
Head: rand.Int31n(common.HeadRange),
SafeBoxPassword: pwd,
Ip: ip,
RegIp: ip,
Params: params,
Tel: tel,
AgentType: 0,
LastLoginTime: tNow.Local(),
LastLogoutTime: tNow.AddDate(0, 0, -1).Local(),
CreateTime: tNow.Local(),
Ver: VER_PLAYER_MAX - 1,
HeadOutLine: 1,
VIP: 0,
CoinPayTotal: 0,
MoneyPayTotal: 0,
IsRob: isRobot,
PackageID: packTag,
WBLevel: 0,
WBCoinTotalOut: 0,
WBCoinTotalIn: 0,
WBCoinLimit: 0,
YesterdayGameData: NewPlayerGameCtrlData(),
TodayGameData: NewPlayerGameCtrlData(),
//TotalGameData: make(map[int][]*PlayerGameTotal),
GDatas: make(map[string]*PlayerGameInfo),
TagKey: tagkey,
ShopTotal: make(map[int32]*ShopTotal),
ShopLastLookTime: make(map[int32]int64),
IsFoolPlayer: make(map[string]bool),
//测试数据
PowerList: []int32{1}, //默认炮台
UnMaxPower: 10, //初始化炮倍最小倍数
WeekCardTime: make(map[int32]int64),
WeekCardAward: make(map[int32]bool),
WelfData: NewWelfareData(),
RequestAddFriend: make(map[int32]int64),
}
if tel != "" {
pd.UpgradeTime = time.Now()
}
pd.InitNewData(params)
return pd
}
func NewPlayerDataThird(acc string, name, headUrl string, id int32, channel, platform string, params, tel string,
packTag, ip string, tagkey, accountType int32, deviceOS string) *PlayerData {
if len(name) == 0 {
logger.Logger.Trace("New player name is empty.")
return nil
}
tNow := time.Now()
pd := &PlayerData{
Id: bson.NewObjectId(),
AccountId: acc,
Name: name,
Channel: channel,
Platform: platform,
SnId: id,
Head: rand.Int31n(common.HeadRange),
HeadUrl: headUrl,
//Coin: int64(GameParamData.NewPlayerCoin),
Ip: ip,
RegIp: ip,
Params: params,
Tel: tel,
LastLoginTime: tNow.Local(),
LastLogoutTime: tNow.AddDate(0, 0, -1).Local(),
CreateTime: tNow.Local(),
Ver: VER_PLAYER_MAX - 1,
HeadOutLine: 1,
IsRob: false,
PackageID: packTag,
YesterdayGameData: NewPlayerGameCtrlData(),
TodayGameData: NewPlayerGameCtrlData(),
//TotalGameData: make(map[int][]*PlayerGameTotal),
GDatas: make(map[string]*PlayerGameInfo),
TagKey: tagkey,
ShopTotal: make(map[int32]*ShopTotal),
ShopLastLookTime: make(map[int32]int64),
AccountType: accountType,
DeviceOS: deviceOS,
}
pd.InitNewData(params)
return pd
}
func (this *PlayerData) InitNewData(params string) {
this.TotalCoin = this.GetTotalCoin()
//pd.ProfitCoin = pd.TotalCoin - pd.CoinPayTotal
//0:男 1:女
this.Sex = (this.Head%2 + 1) % 2
if !this.IsRob {
this.Sex = 0
}
//更新参数
this.UpdateParams(params)
//生成校验和
RecalcuPlayerCheckSum(this)
this.InitRolesAndPets()
}
func (this *PlayerData) InitRolesAndPets() {
now := time.Now()
f := func(id int32) *ModInfo {
ret := &ModInfo{
ModUnlock: make(map[int32]int32),
Mod: make(map[int32]*ModEx),
ModId: id,
SkillInfo: make(map[int32]map[int32]int32),
Skill: make(map[int32]map[int32]*SkillEx),
}
ret.ModUnlock[id] = 1
ret.Mod[id] = &ModEx{
Ts: now.Unix(),
}
return ret
}
f1 := func(mod *ModInfo) {
if mod.ModUnlock == nil {
mod.ModUnlock = make(map[int32]int32)
}
if mod.Mod == nil {
mod.Mod = make(map[int32]*ModEx)
}
if mod.SkillInfo == nil {
mod.SkillInfo = make(map[int32]map[int32]int32)
}
if mod.Skill == nil {
mod.Skill = make(map[int32]map[int32]*SkillEx)
}
}
if this.Roles == nil || len(this.Roles.ModUnlock) == 0 {
this.Roles = f(2000001)
}
if this.Pets == nil || len(this.Pets.ModUnlock) == 0 {
this.Pets = f(1000001)
}
if this.Skin == nil || len(this.Skin.ModUnlock) == 0 {
this.Skin = f(300001)
}
f1(this.Roles)
f1(this.Pets)
f1(this.Skin)
}
//func SavePlayerRebate(pd *PlayerData, thirdName string) error {
// if pd == nil {
// return nil
// }
// if rpcCli == nil {
// return nil
// }
// var ret bool
// err := rpcCli.CallWithTimeout("PlayerDataSvc.SavePlayerRebate", pd, &ret, time.Second*30)
// if err != nil {
// logger.Logger.Trace("SavePlayerRebate failed:", err)
// return err
// }
// return nil
//}
type GetAgentInfoArgs struct {
Plt string
Tel string
}
// 获取代理信息
func GetAgentInfo(plt, tel string) *PlayerData {
if rpcCli == nil {
return nil
}
args := &GetAgentInfoArgs{
Plt: plt,
Tel: tel,
}
var pbi *PlayerData
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetAgentInfo", args, &pbi, time.Second*30)
if err != nil {
logger.Logger.Trace("GetPlayerBaseInfo failed:", err)
return nil
}
return pbi
}
func ClonePlayerData(pd *PlayerData) *PlayerData {
if pd == nil {
return nil
}
pd.TotalCoin = pd.GetTotalCoin()
//pd.ProfitCoin = pd.TotalCoin - pd.CoinPayTotal
//增加可维护性,适度降低性能
buf, err := netlib.Gob.Marshal(pd)
if err != nil {
logger.Logger.Warnf("ClonePlayerData %v Gob.Marshal fail:%v", pd.SnId, err)
return nil
}
pdCopy := &PlayerData{}
err = netlib.Gob.Unmarshal(buf, pdCopy)
if err != nil {
logger.Logger.Warnf("ClonePlayerData %v Gob.Unmarshal fail:%v", pd.SnId, err)
return nil
}
return pdCopy
}
type GetPlayerDataArgs struct {
Plt string
Acc string
}
type PlayerDataRet struct {
Pd *PlayerData
IsNew bool
}
func GetPlayerData(plt, acc string) (*PlayerData, bool) {
if rpcCli == nil {
return nil, false
}
args := &GetPlayerDataArgs{
Plt: plt,
Acc: acc,
}
var ret PlayerDataRet
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerData", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("GetPlayerData failed:", err)
return nil, false
}
return ret.Pd, ret.IsNew
}
type CreatePlayer struct {
Plt string
AccId string
NickName string
HeadUrl string
}
func CreatePlayerDataByThird(plt, acc string, nickName, headUrl string) (*PlayerData, bool) {
if rpcCli == nil {
return nil, false
}
var args = &CreatePlayer{
Plt: plt,
AccId: acc,
NickName: nickName,
HeadUrl: headUrl,
}
var ret = &PlayerDataRet{}
err := rpcCli.CallWithTimeout("PlayerDataSvc.CreatePlayerDataByThird", args, ret, time.Second*30)
if err != nil {
logger.Logger.Trace("CreatePlayerDataByThird failed:", err)
return nil, false
}
return ret.Pd, ret.IsNew
}
type PlayerDataArg struct {
Plt string
AccId string
AddCoin int32
HeadUrl string
Name string
}
func CreatePlayerDataOnRegister(plt, acc string, addCoin int32, name, headUrl string) (*PlayerData, bool) {
if rpcCli == nil {
return nil, false
}
var args = &PlayerDataArg{
Plt: plt,
AccId: acc,
AddCoin: addCoin,
Name: name,
HeadUrl: headUrl,
}
var ret = &PlayerDataRet{}
err := rpcCli.CallWithTimeout("PlayerDataSvc.CreatePlayerDataOnRegister", args, ret, time.Second*30)
if err != nil {
logger.Logger.Trace("CreatePlayerDataOnRegister failed:", err)
return nil, false
}
return ret.Pd, true
}
type GetPlayerDataBySnIdArgs struct {
Plt string
SnId int32
CorrectData bool
CreateIfNotExist bool
}
func GetPlayerDataBySnId(plt string, snid int32, correctData, createIfNotExist bool) (*PlayerData, bool) {
if rpcCli == nil {
return nil, false
}
args := &GetPlayerDataBySnIdArgs{
Plt: plt,
SnId: snid,
CorrectData: correctData,
CreateIfNotExist: createIfNotExist,
}
var ret = &PlayerDataRet{}
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerDataBySnId", args, ret, time.Second*30)
if err != nil {
logger.Logger.Tracef("Get %v %v player data error:%v", plt, snid, err)
return nil, false
}
// 设置本地时区
ret.Pd.UpgradeTime = ret.Pd.UpgradeTime.Local()
ret.Pd.CreateTime = ret.Pd.CreateTime.Local()
ret.Pd.LastLoginTime = ret.Pd.LastLoginTime.Local()
ret.Pd.LastLogoutTime = ret.Pd.LastLogoutTime.Local()
ret.Pd.IScoreTs = ret.Pd.IScoreTs.Local()
ret.Pd.Permit = ret.Pd.Permit.Local()
ret.Pd.InitRolesAndPets()
return ret.Pd, ret.IsNew
}
//func UpdateCreateCreateClubNum(snId int32) error {
// if rpcCli == nil {
// return nil
// }
// var ret = &PlayerDataRet{}
// err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdateCreateCreateClubNum", snId, ret, time.Second*30)
// if err != nil {
// logger.Logger.Trace("Update player safeboxcoin error:", err)
// return err
// }
// return nil
//}
type GetPlayerDatasBySnIdsArgs struct {
Plt string
SnIds []int32
CorrectData bool
}
func GetPlayerDatasBySnIds(plt string, snIds []int32, correctData bool) []*PlayerData {
if rpcCli == nil {
return nil
}
args := &GetPlayerDatasBySnIdsArgs{
Plt: plt,
SnIds: snIds,
CorrectData: correctData,
}
var ret = []*PlayerData{}
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerDatasBySnIds", args, ret, time.Second*30)
if err != nil {
logger.Logger.Tracef("GetPlayerDatasBySnIds(snids=%v) error:%v", args, err)
return nil
}
return ret
}
type GetPlayerDataByUnionIdArgs struct {
Plt string
UnionId string
CorrectData bool
}
func GetPlayerDataByUnionId(plt, unionid string, correctData bool) (*PlayerData, bool) {
if rpcCli == nil {
return nil, false
}
args := &GetPlayerDataByUnionIdArgs{
Plt: plt,
UnionId: unionid,
CorrectData: correctData,
}
var ret = &PlayerDataRet{}
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerDataByUnionId", args, ret, time.Second*30)
if err != nil {
logger.Logger.Tracef("GetPlayerDataByUnionId % player data error:%v", args, err)
return nil, false
}
return ret.Pd, true
}
type GetPlayerTelArgs struct {
Plt string
Tel string
TagKey int32
}
type GetPlayerTelRet struct {
SnId int32
Err error
}
func GetPlayerTel(tel, platform string, tagkey int32) (int32, string) {
if rpcCli == nil {
return 0, "no find account"
}
args := &GetPlayerTelArgs{
Tel: tel,
Plt: platform,
TagKey: tagkey,
}
ret := &GetPlayerTelRet{}
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerTel", args, ret, time.Second*30)
if err != nil {
logger.Logger.Warn("playerdata.Find err:", err)
return 0, err.Error()
}
return ret.SnId, ""
}
type GetPlayerCoinArgs struct {
Plt string
SnId int32
}
type GetPlayerCoinRet struct {
Coin int64
SafeBoxCoin int64
Err error
}
func GetPlayerCoin(plt string, snid int32) (int64, int64, error) {
if rpcCli == nil {
return 0, 0, fmt.Errorf("db may be closed")
}
args := GetPlayerCoinArgs{
Plt: plt,
SnId: snid,
}
var ret = &GetPlayerCoinRet{}
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerCoin", args, ret, time.Second*30)
if err != nil {
logger.Logger.Trace("GetPlayerCoin error:", err)
return 0, 0, err
}
if ret.Err != nil {
return 0, 0, ret.Err
}
return ret.Coin, ret.SafeBoxCoin, nil
}
func ExtractPlayerPackageName(packageTag string) string {
segs := strings.Split(packageTag, ".")
if len(segs) > 3 {
packageName := strings.Join(segs[:3], ".")
return packageName
}
return packageTag
}
/*
* 保存玩家的全部信息
*/
func SavePlayerData(pd *PlayerData) bool {
if rpcCli == nil {
return false
}
if pd != nil {
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.SavePlayerData", pd, &ret, time.Second*30)
if err != nil {
logger.Logger.Errorf("SavePlayerData %v err:%v", pd.SnId, err)
return false
}
return ret
}
return false
}
func BackupPlayerData(pd *PlayerData) {
if pd == nil {
return
}
buf, err := json.Marshal(pd)
if err != nil {
logger.Logger.Info("BackupPlayerInfo json.Marshal error", err)
return
}
fileName := fmt.Sprintf("%v.json", pd.AccountId)
err = os.WriteFile(fileName, buf, os.ModePerm)
if err != nil {
logger.Logger.Info("BackupPlayerInfo os.WriteFile error", err)
}
}
func RestorePlayerData(fileName string) *PlayerData {
pd := &PlayerData{}
buf, err := os.ReadFile(fileName)
if err != nil {
logger.Logger.Info("RestorePlayerInfo os.ReadFile error", err)
return nil
}
err = json.Unmarshal(buf, pd)
if err != nil {
logger.Logger.Info("RestorePlayerInfo json.Unmarshal error", err)
}
return pd
}
type RemovePlayerArgs struct {
Plt string
SnId int32
}
func RemovePlayer(plt string, snid int32) error {
if rpcCli == nil {
return nil
}
args := &RemovePlayerArgs{
Plt: plt,
SnId: snid,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.RemovePlayer", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("Remove player failed.")
return err
}
return nil
}
type RemovePlayerByAccArgs struct {
Plt string
Acc string
}
func RemovePlayerByAcc(plt, acc string) error {
if rpcCli == nil {
return nil
}
args := &RemovePlayerByAccArgs{
Plt: plt,
Acc: acc,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.RemovePlayerByAcc", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("Remove player failed.")
return err
}
return nil
}
/*
* 检查手机号是否存在
*/
type GetPlayerSnidArgs struct {
Plt string
Acc string
}
type GetPlayerSnidRet struct {
SnId int32
}
func GetPlayerSnid(plt, acc string) int32 {
if rpcCli == nil {
return 0
}
args := &GetPlayerSnidArgs{
Plt: plt,
Acc: acc,
}
var ret int32
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerSnid", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.GetPlayerSnid is error ", err)
return 0
}
return ret
}
/*
* 检查昵称是否存在
*/
type PlayerNickIsExistArgs struct {
Plt string
Name string
}
func PlayerNickIsExist(plt, name string) bool {
if rpcCli == nil {
return false
}
args := &PlayerNickIsExistArgs{
Plt: plt,
Name: name,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.PlayerNickIsExist", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.PlayerNickIsExist is error ", err)
return false
}
if err != nil {
return false
}
return ret
}
/*
* 检查玩家是否存在
*/
type PlayerIsExistBySnIdArgs struct {
Plt string
SnId int32
}
func PlayerIsExistBySnId(plt string, snId int32) bool {
if rpcCli == nil {
return false
}
args := &PlayerIsExistBySnIdArgs{
Plt: plt,
SnId: snId,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.PlayerIsExistBySnId", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.PlayerIsExistBySnId is error", err)
return false
}
return ret
}
type UpdatePackageId struct {
AccId string
SnId int32
Tag string
Platform int32
Channel int32
Promoter int32
PlatformStr string
ChannelStr string
PromoterStr string
Inviterid int32
PromoterTree int32
PackageTag string
}
// 修改推广包标识
func UpdatePlayerPackageId(snid int32, tag string, platform, channel, promoter, inviterid, promoterTree int32) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePackageId{
SnId: snid,
Tag: tag,
Platform: platform,
Channel: channel,
Promoter: promoter,
Inviterid: inviterid,
PromoterTree: promoterTree,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerPackageId", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player packageid error:", err)
return err
}
return nil
}
func UpdatePlayerPackageIdByStr(snid int32, tag string, platform, channel, promoter string, inviterid, promoterTree int32) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePackageId{
SnId: snid,
Tag: tag,
PlatformStr: platform,
ChannelStr: channel,
PromoterStr: promoter,
Inviterid: inviterid,
PromoterTree: promoterTree,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerPackageIdByStr", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("UpdatePlayerPackageIdByStr error:", err)
return err
}
return nil
}
func UpdatePlayerPackageIdByAcc(accid string, tag string, platform, channel, promoter string, inviterid, promoterTree int32) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePackageId{
AccId: accid,
Tag: tag,
PlatformStr: platform,
ChannelStr: channel,
PromoterStr: promoter,
Inviterid: inviterid,
PromoterTree: promoterTree,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerPackageIdByAcc", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("UpdatePlayerPackageIdByAcc error:", err)
return err
}
return nil
}
// 修改平台
func UpdatePlayerPlatform(snid int, platform, channel string) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePackageId{
SnId: int32(snid),
PlatformStr: platform,
ChannelStr: channel,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerPlatform", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player nick error:", err)
return err
}
return nil
}
// 修改玩家无级代推广员id
func UpdatePlayerPromoterTree(plt string, snid int32, promoterTree int32) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePackageId{
PlatformStr: plt,
SnId: snid,
PromoterTree: promoterTree,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerPromoterTree", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("UpdatePlayerPromoterTree error:", err)
return err
}
return nil
}
// 修改玩家全民推广
func UpdatePlayerInviteID(plt string, snid int32, InviteID int32) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePackageId{
PlatformStr: plt,
SnId: snid,
Inviterid: InviteID,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerInviteID", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("UpdatePlayerInviteID error:", err)
return err
}
return nil
}
type UpdatePlayerInfo struct {
Plt string
Acc string
SnId int32
Nick string
BlacklistType int32
MarkInfo string
WhiteFlag int32
PayActState map[int32]*PayActState
TelephonePromoter int32
TelephoneCallNum int32
Head int32
Sex int32
}
/*
* 修改昵称
*/
func UpdatePlayerNick(plt, acc string, nick string) int {
if rpcCli == nil {
return 2
}
var args = &UpdatePlayerInfo{
Plt: plt,
Acc: acc,
Nick: nick,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerNick", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player nick error:", err)
return 1
}
if !ret {
return 1
}
return 0
}
/*
* 修改黑名单类型
*/
type UpdatePlayerBlacklistTypeArgs struct {
Plt string
SnId int32
BlackListType int32
}
func UpdatePlayerBlacklistType(plt string, snid int32, blacklisttype int32) {
if rpcCli == nil {
return
}
var args = &UpdatePlayerBlacklistTypeArgs{
Plt: plt,
SnId: snid,
BlackListType: blacklisttype,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerBlacklistType", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player blacklisttype error:", err)
return
}
}
/*
* 修改玩家备注信息
*/
type UpdatePlayerMarkInfoArgs struct {
Plt string
SnId int32
MarkInfo string
}
func UpdatePlayerMarkInfo(plt string, snid int32, mark string) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerMarkInfoArgs{
Plt: plt,
SnId: snid,
MarkInfo: mark,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerMarkInfo", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warnf("Update player mark error:", err)
return err
}
return nil
}
/*
* 修改玩家特殊白名单
*/
type UpdatePlayerWhiteFlagArgs struct {
Plt string
SnId int32
WhiteFlag int32
}
func UpdatePlayerWhiteFlag(plt string, snid int32, whiteFlag int32) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerWhiteFlagArgs{
Plt: plt,
SnId: snid,
WhiteFlag: whiteFlag,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerWhiteFlag", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warnf("Update player whiteFlag error:", err)
return err
}
return nil
}
/*
* 修改玩家支付信息
*/
type UpdatePlayerPayActArgs struct {
Plt string
SnId int32
PayActState map[int32]*PayActState
}
func UpdatePlayerPayAct(plt string, snid int32, player map[int32]*PayActState) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerPayActArgs{
Plt: plt,
SnId: snid,
PayActState: player,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerPayAct", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warnf("Update player payact error:", err)
return err
}
return nil
}
/*
* 修改玩家电销标记
*/
type UpdatePlayerTelephonePromoterArgs struct {
Plt string
SnId int32
TelephonePromoter string
TelephoneCallNum int32
}
func UpdatePlayerTelephonePromoter(plt string, snid int32, mark string) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerTelephonePromoterArgs{
Plt: plt,
SnId: snid,
TelephonePromoter: mark,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerTelephonePromoter", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warnf("Update player telephonepromoter error:", err)
return err
}
return nil
}
/*
* 修改玩家电销标记
*/
func UpdatePlayerTelephoneCallNum(plt string, snid int32, mark int32) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerTelephonePromoterArgs{
Plt: plt,
SnId: snid,
TelephoneCallNum: mark,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerTelephoneCallNum", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warnf("Update player telephonecallnum error:", err)
return err
}
return nil
}
/*
* 修改头像
*/
type UpdatePlayeIconArgs struct {
Plt string
Acc string
Head int32
}
func UpdatePlayeIcon(plt, acc string, icon int32) int {
if rpcCli == nil {
return 2
}
var args = &UpdatePlayeIconArgs{
Plt: plt,
Acc: acc,
Head: icon,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayeIcon", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player icon error:", err)
return 1
}
if !ret {
return 1
}
return 0
}
/*
* 修改性别
*/
type UpdatePlayeSexArgs struct {
Plt string
Acc string
Sex int32
}
func UpdatePlayeSex(plt, acc string, sex int32) int {
if rpcCli == nil {
return 2
}
var args = &UpdatePlayeSexArgs{
Plt: plt,
Acc: acc,
Sex: sex,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayeSex", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player sex error:", err)
return 1
}
if !ret {
return 1
}
return 0
}
/*
* 检查手机号是否存在
*/
type PlayerTelIsExistArgs struct {
Tel string
Platform string
TagKey int32
}
func PlayerTelIsExist(tel, platform string, tagkey int32) bool {
if rpcCli == nil {
return false
}
var args = &PlayerTelIsExistArgs{
Tel: tel,
Platform: platform,
TagKey: tagkey,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.PlayerTelIsExist", args, &ret, time.Second*30)
if err != nil {
return false
}
return ret
}
/*
* 绑定手机号
*/
type UpdatePlayerTelArgs struct {
Plt string
SnId int32
Tel string
}
func UpdatePlayerTel(plt string, snid int32, tel string) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerTelArgs{
Plt: plt,
SnId: snid,
Tel: tel,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerTel", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warn("UpdatePlayerTel error:", err)
return err
}
return nil
}
type ResetPlayerArgs struct {
Plt string
SnId int32
}
func ResetPlayer(plt string, snid int32) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &ResetPlayerArgs{
Plt: plt,
SnId: snid,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.ResetPlayer", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warn("ResetPlayer error:", err)
return err
}
return nil
}
type CountAlipayAccountCountArgs struct {
Platform string
AliPayAccount string
}
func CountAlipayAccountCount(platform, alipayAccount string) int {
if rpcCli == nil {
return 0
}
var args = &CountAlipayAccountCountArgs{
Platform: platform,
AliPayAccount: alipayAccount,
}
var count int
err := rpcCli.CallWithTimeout("PlayerDataSvc.CountAlipayAccountCount", args, &count, time.Second*30)
if err != nil {
logger.Logger.Warn("CountAlipayAccountCount error:", err)
return 0
}
return count
}
type CountBankAlipayNameCountArgs struct {
SnId int32
Platform string
AliPayAccName string
BankAccName string
}
func CountBankAlipayNameCount(platform, name string, snid int32) int {
if rpcCli == nil {
return 0
}
var args = &CountBankAlipayNameCountArgs{
SnId: snid,
Platform: platform,
AliPayAccName: name,
BankAccName: name,
}
var ret int
err := rpcCli.CallWithTimeout("PlayerDataSvc.CountBankAlipayNameCount", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warn("CountBankAlipayNameCount error:", err)
return 0
}
return ret
}
/*
* 绑定支付宝账号
*/
type UpdatePlayerAlipayArgs struct {
SnId int32
Platform string
AliPayAccount string
AliPayAccName string
}
func UpdatePlayerAlipay(plt string, snid int32, alipayAccount, alipayAccName string) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerAlipayArgs{
Platform: plt,
SnId: snid,
AliPayAccount: alipayAccount,
AliPayAccName: alipayAccName,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerAlipay", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warn("UpdatePlayerAlipay error:", err)
return err
}
return err
}
func UpdatePlayerAlipayAccount(plt string, snid int, alipayAccount string) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerAlipayArgs{
Platform: plt,
SnId: int32(snid),
AliPayAccount: alipayAccount,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerAlipayAccount", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warn("UpdatePlayerAlipay error:", err)
return err
}
return nil
}
func UpdatePlayerAlipayName(plt string, snid int, alipayAccName string) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerAlipayArgs{
Platform: plt,
SnId: int32(snid),
AliPayAccName: alipayAccName,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerAlipayName", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warn("UpdatePlayerAlipay error:", err)
return err
}
return nil
}
type CountBankAccountCountArgs struct {
Platform string
BankAccount string
}
func CountBankAccountCount(platform, bankAccount string) int {
if rpcCli == nil {
return 0
}
var args = &CountBankAccountCountArgs{
Platform: platform,
BankAccount: bankAccount,
}
var ret int
err := rpcCli.CallWithTimeout("PlayerDataSvc.CountBankAccountCount", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warn("CountBankAccountCount error:", err)
return 0
}
return ret
}
/*
* 绑定银行账号
*/
type UpdatePlayerBankArgs struct {
Plt string
SnId int32
Bank string
BankAccount string
BankAccName string
}
func UpdatePlayerBank(plt string, snid int32, bank, bankAccount, bankAccName string) error {
if rpcCli == nil {
return errors.New("user_playerinfo not open")
}
var args = &UpdatePlayerBankArgs{
Plt: plt,
SnId: snid,
Bank: bank,
BankAccount: bankAccount,
BankAccName: bankAccName,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerBank", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warn("UpdatePlayerBank error:", err)
return err
}
return nil
}
/*
* 修改玩家是否返利
*/
type UpdatePlayerIsRebateArgs struct {
Plt string
SnId int32
IsCanRebate int32
}
func UpdatePlayerIsRebate(plt string, snid int32, isRebate int32) int {
if rpcCli == nil {
return 2
}
var args = &UpdatePlayerIsRebateArgs{
Plt: plt,
SnId: snid,
IsCanRebate: isRebate,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerIsRebate", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player isRebate error:", err)
return 1
}
if !ret {
return 1
}
return 0
}
/*
* 修改玩家是否可以修改昵称
*/
type UpdatePlayerIsStopRenameArgs struct {
Plt string
SnId int32
IsStopReName int32
}
func UpdatePlayerIsStopRename(plt string, snid int32, isStop int32) error {
if rpcCli == nil {
return errors.New("param err")
}
var args = &UpdatePlayerIsStopRenameArgs{
Plt: plt,
SnId: snid,
IsStopReName: isStop,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerIsStopRename", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player isRename error:", err)
return err
}
return nil
}
type PlayerRebindSnIdArgs struct {
Plt string
SnId int32
NewSnId int32
}
func PlayerRebindSnId(plt string, snid int32, newSnId int32) error {
if snid == 0 || newSnId == 0 {
return errors.New("param err")
}
if rpcCli == nil {
return errors.New("rpcCli == nil")
}
var args = &PlayerRebindSnIdArgs{
Plt: plt,
SnId: snid,
NewSnId: newSnId,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.PlayerRebindSnId", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("PlayerRebindSnId error:", err)
return err
}
return nil
}
type PlayerSafeBoxArgs struct {
Acc string
OldPassWord string
PassWord string
Tel string
Platform string
TagKey int32
SnId int32
}
/*
* 修改保险箱密码
*/
func UpdateSafeBoxPassword(plt, acc string, oldpassword string, password string) int {
if rpcCli == nil {
return 2
}
var args = &PlayerSafeBoxArgs{
Platform: plt,
Acc: acc,
OldPassWord: oldpassword,
PassWord: password,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdateSafeBoxPassword", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player safeboxpassword error:", err)
return 1
}
if !ret {
return 1
}
return 0
}
/*
* 找回保险箱密码
*/
func GetBackSafeBoxPassword(tel string, password, platform string, tagkey int32) error {
if rpcCli == nil {
return errors.New("GetBackSafeBoxPassword error")
}
var args = &PlayerSafeBoxArgs{
Tel: tel,
PassWord: password,
Platform: platform,
TagKey: tagkey,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetBackSafeBoxPassword", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Update player safeboxpassword error:", err)
}
return err
}
/*
* 重置保险箱密码
*/
func ResetSafeBoxPassword(plt string, snid int, password string) error {
if rpcCli == nil {
return errors.New("ResetSafeBoxPassword error")
}
var args = &PlayerSafeBoxArgs{
Platform: plt,
SnId: int32(snid),
PassWord: password,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.ResetSafeBoxPassword", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Trace("Reset player safeboxpassword error:", err)
return err
}
return err
}
type PlayerSafeBoxCoin struct {
Plt string
SnId int32
Coin, Diamond, SafeBoxCoin, CoinPayTs, SafeBoxCoinTs, Money int64
LastexChangeTime int64
TotalConvertibleFlow int64
TotalFlow int64
LastexChangeOrder string
ShopId []int
}
func UpdatePlayerCoin(plt string, snid int32, coin, diamond, safeboxcoin, coinpayts, safeboxcoints, money int64, shopId []int) error {
if rpcCli == nil {
return fmt.Errorf("db may be closed")
}
var args = &PlayerSafeBoxCoin{
Plt: plt,
SnId: snid,
Coin: coin,
Diamond: diamond,
SafeBoxCoin: safeboxcoin,
CoinPayTs: coinpayts,
SafeBoxCoinTs: safeboxcoints,
Money: money,
ShopId: shopId,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerCoin", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Errorf("UpdatePlayerCoin param:%v-%v-%v", snid, coin, safeboxcoin)
logger.Logger.Error("UpdatePlayerCoin error:", err)
return err
}
return nil
}
func UpdatePlayerSetCoin(plt string, snid int32, coin int64) error {
if rpcCli == nil {
return fmt.Errorf("db may be closed")
}
var args = &PlayerSafeBoxCoin{
Plt: plt,
SnId: snid,
Coin: coin,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerSetCoin", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.UpdatePlayerSetCoin error:", err)
return err
}
return nil
}
func UpdatePlayerLastExchangeTime(plt string, snid int32, ts int64) error {
if rpcCli == nil {
return fmt.Errorf("db may be closed")
}
var args = &PlayerSafeBoxCoin{
Plt: plt,
SnId: snid,
LastexChangeTime: ts,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerLastExchangeTime", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.UpdatePlayerLastExchangeTime error:", err)
return err
}
return nil
}
func UpdatePlayerExchageFlow(plt string, snid int32, flow int64, flow2 int64) error {
if rpcCli == nil {
return fmt.Errorf("db may be closed")
}
var args = &PlayerSafeBoxCoin{
Plt: plt,
SnId: snid,
TotalConvertibleFlow: flow,
TotalFlow: flow2,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerExchageFlow", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.UpdatePlayerExchageFlow error:", err)
return err
}
return nil
}
func UpdatePlayerExchageFlowAndOrder(plt string, snid int32, flow int64, logid string) error {
if rpcCli == nil {
return fmt.Errorf("db may be closed")
}
var args = &PlayerSafeBoxCoin{
Plt: plt,
SnId: snid,
TotalConvertibleFlow: flow,
LastexChangeOrder: logid,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerExchageFlowAndOrder", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.UpdatePlayerExchageFlowAndOrder error:", err)
return err
}
return nil
}
// 重要数据要做校验和
func RecalcuPlayerCheckSum(pd *PlayerData) {
h := bytes.NewBuffer(nil)
io.WriteString(h, pd.AccountId)
io.WriteString(h, fmt.Sprintf("%v", pd.SnId))
io.WriteString(h, fmt.Sprintf("%v", pd.Tel))
io.WriteString(h, fmt.Sprintf("%v", pd.Coin))
io.WriteString(h, fmt.Sprintf("%v", pd.SafeBoxCoin))
io.WriteString(h, fmt.Sprintf("%v", pd.CoinPayTs))
io.WriteString(h, fmt.Sprintf("%v", pd.SafeBoxCoinTs))
io.WriteString(h, fmt.Sprintf("%v", pd.GameCoinTs))
io.WriteString(h, common.GetAppId())
pd.CheckSum = crc32.ChecksumIEEE(h.Bytes())
}
// 校验数据,防止数据被破坏或者爆库修改
func VerifyPlayerCheckSum(pd *PlayerData) bool {
h := bytes.NewBuffer(nil)
io.WriteString(h, pd.AccountId)
io.WriteString(h, fmt.Sprintf("%v", pd.SnId))
io.WriteString(h, fmt.Sprintf("%v", pd.Tel))
io.WriteString(h, fmt.Sprintf("%v", pd.Coin))
io.WriteString(h, fmt.Sprintf("%v", pd.SafeBoxCoin))
io.WriteString(h, fmt.Sprintf("%v", pd.CoinPayTs))
io.WriteString(h, fmt.Sprintf("%v", pd.SafeBoxCoinTs))
io.WriteString(h, fmt.Sprintf("%v", pd.GameCoinTs))
io.WriteString(h, common.GetAppId())
checkSum := crc32.ChecksumIEEE(h.Bytes())
return checkSum == pd.CheckSum
}
/*
* 查找多用户
*/
type PlayerSelect struct {
Id int
Tel string
NickName string
Coinl int
Coinh int
Ip string
Alipay string
Registerl int
Registerh int
Platform string
Channel string
Limit int
}
func FindPlayerList(id int, tel string, nickname string, coinl int, coinh int, ip string,
alipay string, registerl int, registerh int, platform, channel string, limit int) []*PlayerBaseInfo {
var args = &PlayerSelect{
Id: id,
Tel: tel,
NickName: nickname,
Coinl: coinl,
Coinh: coinh,
Ip: ip,
Alipay: alipay,
Registerl: registerl,
Registerh: registerh,
Platform: platform,
Channel: channel,
Limit: limit,
}
var ret []*PlayerBaseInfo
err := rpcCli.CallWithTimeout("PlayerDataSvc.FindPlayerList", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.FindPlayerList error:", err)
return nil
}
return ret
}
type UpdateElement struct {
Plt string
SnId int32
PlayerMap string
}
func UpdatePlayerElement(plt string, id int32, playerMap map[string]interface{}) error {
if rpcCli == nil {
return fmt.Errorf("db may be close")
}
pm, _ := json.Marshal(playerMap)
var args = &UpdateElement{
Plt: plt,
SnId: id,
PlayerMap: string(pm),
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdatePlayerElement", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warnf("UpdatePlayerElement error:%v", err)
return err
}
return nil
}
type GetPlayerBaseInfoArgs struct {
Plt string
SnId int32
}
func GetPlayerBaseInfo(plt string, snid int32) *PlayerBaseInfo {
if rpcCli == nil {
return nil
}
args := &GetPlayerBaseInfoArgs{
Plt: plt,
SnId: snid,
}
var ret PlayerBaseInfo
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerBaseInfo", args, &ret, time.Second*30)
if err != nil {
return nil
}
return &ret
}
type BlackWhiteLevel struct {
SnId, WBLevel, WbMaxNum int32
WbCoinTotalIn, WbCoinTotalOut, WbCoinLimit int64
Platform string
WbState int32
T time.Time
}
func SetBlackWhiteLevel(snid, wbLevel, wbMaxNum, wbState int32, wbCoinTotalIn, wbCoinTotalOut, wbCoinLimit int64, platform string, t time.Time) error {
if rpcCli == nil {
return nil
}
var args = &BlackWhiteLevel{
SnId: snid,
WBLevel: wbLevel,
WbMaxNum: wbMaxNum,
WbCoinTotalIn: wbCoinTotalIn,
WbCoinTotalOut: wbCoinTotalOut,
WbCoinLimit: wbCoinLimit,
Platform: platform,
WbState: wbState,
T: t,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.SetBlackWhiteLevel", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("SetBlackWhiteLevel error ", err)
return err
}
return nil
}
func SetBlackWhiteLevelUnReset(snid, wbLevel, wbMaxNum, wbState int32, wbCoinLimit int64, platform string, t time.Time) error {
if rpcCli == nil {
return nil
}
var args = &BlackWhiteLevel{
SnId: snid,
WBLevel: wbLevel,
WbMaxNum: wbMaxNum,
WbCoinLimit: wbCoinLimit,
Platform: platform,
WbState: wbState,
T: t,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.SetBlackWhiteLevelUnReset", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("SetBlackWhiteLevelUnReset error ", err)
return err
}
return nil
}
func UpdateAllPlayerPackageTag(packageTag, platform, channel, promoter string, promoterTree, tagkey int32) error {
if rpcCli == nil {
return nil
}
args := &UpdatePackageId{
PackageTag: packageTag,
PlatformStr: platform,
ChannelStr: channel,
PromoterStr: promoter,
PromoterTree: promoterTree,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.UpdateAllPlayerPackageTag", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("UpdateAllPlayerPackageTag error ", err)
return err
}
return nil
}
type SetPlayerAtt struct {
SnId int32
VipLevel int32
Platform string
GmLevel int32
}
func SetVipLevel(snid, vipLevel int32, platform string) error {
if rpcCli == nil {
return nil
}
args := &SetPlayerAtt{
SnId: snid,
VipLevel: vipLevel,
Platform: platform,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.SetVipLevel", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("SetVipLevel error ", err)
return err
}
return nil
}
func SetGMLevel(snid, gmLevel int32, platform string) error {
if rpcCli == nil {
return nil
}
args := &SetPlayerAtt{
SnId: snid,
GmLevel: gmLevel,
Platform: platform,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.SetGMLevel", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("SetGMLevel error ", err)
return err
}
return nil
}
type GetSameParamPlayerArgs struct {
Plt string
Param string
}
func GetSameIpPlayer(plt, ip string) []int32 {
if rpcCli == nil {
return nil
}
args := &GetSameParamPlayerArgs{
Plt: plt,
Param: ip,
}
var ret []int32
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetSameIpPlayer", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("GetSameIpPlayer error ", err)
return nil
}
return ret
}
func GetSameBankNamePlayer(plt, name string) []int32 {
if rpcCli == nil {
return nil
}
args := &GetSameParamPlayerArgs{
Plt: plt,
Param: name,
}
var ret []int32
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetSameBankNamePlayer", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("GetSameIpPlayer error ", err)
return nil
}
return ret
}
func GetSameBankCardPlayer(plt, card string) []int32 {
if rpcCli == nil {
return nil
}
args := &GetSameParamPlayerArgs{
Plt: plt,
Param: card,
}
var ret []int32
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetSameBankCardPlayer", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("GetSameBankCardPlayer error ", err)
return nil
}
return ret
}
func GetRobotPlayers(limit int) []*PlayerData {
if rpcCli == nil {
return nil
}
var ret []*PlayerData
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetRobotPlayers", limit, &ret, time.Second*30)
if err != nil {
logger.Logger.Info("GetSameBankCardPlayer error ", err)
return nil
}
return ret
}
type BackupPlayerRet struct {
Err error
IsSuccess bool
Pd *PlayerData
}
/*
* 保存玩家的删除备份全部信息
*/
func SaveDelBackupPlayerData(pd *PlayerData) bool {
if rpcCli == nil {
logger.Logger.Error("model.SaveDelBackupPlayerData rpcCli is nil")
return false
}
if pd != nil {
var ret bool
err := rpcCli.CallWithTimeout("PlayerDelBackupDataSvc.SaveDelBackupPlayerData", pd, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.SaveDelBackupPlayerData is error", err)
return false
}
return ret
}
return false
}
func GetDelBackupPlayerData(plt string, snid int32) *PlayerData {
if rpcCli == nil {
return nil
}
args := &PlayerIsExistBySnIdArgs{
Plt: plt,
SnId: snid,
}
ret := new(PlayerData)
err := rpcCli.CallWithTimeout("PlayerDelBackupDataSvc.GetPlayerData", args, ret, time.Second*30)
if err != nil {
logger.Logger.Trace("GetPlayerData failed:", err)
return nil
}
return ret
}
type LogicInfoArg struct {
SnIds []int32
LogicLevel int32
Platform string
}
func SetLogicLevel(snids []int32, logicLevel int32, platform string) error {
if rpcCli == nil {
return nil
}
args := &LogicInfoArg{
SnIds: snids,
LogicLevel: logicLevel,
Platform: platform,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.SetLogicLevel", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.SetLogicLevel error ", err)
return err
}
return nil
}
func ClrLogicLevel(snids []int32, logicLevel int32, platform string) error {
if rpcCli == nil {
return nil
}
args := &LogicInfoArg{
SnIds: snids,
LogicLevel: logicLevel,
Platform: platform,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.ClrLogicLevel", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.ClrLogicLevel error ", err)
return err
}
return nil
}
func GetPlayerInviteSnid(plt string, snid int32) (int32, error) {
if rpcCli == nil {
return 0, errors.New("rpcCli is nil")
}
args := &PlayerIsExistBySnIdArgs{
Plt: plt,
SnId: snid,
}
var ret int32
err := rpcCli.CallWithTimeout("PlayerDataSvc.GetPlayerInviteSnid", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Error("model.GetPlayerInviteSnid error ", err)
return 0, err
}
return ret, nil
}
// 所有游戏都要加上当天统计数据
func (this *PlayerData) GetDaliyGameData(id int) (*PlayerGameStatics, *PlayerGameStatics) {
gameId := strconv.Itoa(id)
if this.TodayGameData == nil {
this.TodayGameData = NewPlayerGameCtrlData()
}
if this.TodayGameData.CtrlData == nil {
this.TodayGameData.CtrlData = make(map[string]*PlayerGameStatics)
}
if _, ok := this.TodayGameData.CtrlData[gameId]; !ok {
this.TodayGameData.CtrlData[gameId] = NewPlayerGameStatics()
}
if this.YesterdayGameData == nil {
this.YesterdayGameData = NewPlayerGameCtrlData()
}
if this.YesterdayGameData.CtrlData == nil {
this.YesterdayGameData.CtrlData = make(map[string]*PlayerGameStatics)
}
if _, ok := this.YesterdayGameData.CtrlData[gameId]; !ok {
this.YesterdayGameData.CtrlData[gameId] = NewPlayerGameStatics()
}
return this.TodayGameData.CtrlData[gameId], this.YesterdayGameData.CtrlData[gameId]
}
func (this *PlayerData) GetTodayGameData(gameFreeid int32) *PlayerGameStatics {
gameFreeStr := strconv.Itoa(int(gameFreeid))
if this.TodayGameData == nil {
this.TodayGameData = NewPlayerGameCtrlData()
}
if this.TodayGameData.CtrlData == nil {
this.TodayGameData.CtrlData = make(map[string]*PlayerGameStatics)
}
if _, ok := this.TodayGameData.CtrlData[gameFreeStr]; !ok {
this.TodayGameData.CtrlData[gameFreeStr] = NewPlayerGameStatics()
}
return this.TodayGameData.CtrlData[gameFreeStr]
}
func (this *PlayerData) GetYestosdayGameData(gameFreeid string) *PlayerGameStatics {
if this.YesterdayGameData == nil {
this.YesterdayGameData = &PlayerGameCtrlData{}
}
if this.YesterdayGameData.CtrlData == nil {
this.YesterdayGameData.CtrlData = make(map[string]*PlayerGameStatics)
}
if _, ok := this.YesterdayGameData.CtrlData[gameFreeid]; !ok {
this.YesterdayGameData.CtrlData[gameFreeid] = NewPlayerGameStatics()
}
return this.YesterdayGameData.CtrlData[gameFreeid]
}
func (this *PlayerData) HasAutoTag(tag int32) bool {
return common.InSliceInt32(this.AutomaticTags, tag)
}
func (this *PlayerData) MarkAutoTag(tag int32) bool {
if this.HasAutoTag(tag) {
return false
}
this.AutomaticTags = append(this.AutomaticTags, tag)
return true
}
func (this *PlayerData) GetGameFreeIdData(id string) *PlayerGameInfo {
data, ok := this.GDatas[id]
if !ok {
data = new(PlayerGameInfo)
this.GDatas[id] = data
}
return data
}
// WBUpdate 更新黑白名单玩家投入产出
// 返回 溢出数量
func (this *PlayerData) WBUpdate(gain int64) int64 {
var n int64
clearWB := false
if this.WBLevel != 0 /*&& this.WBState > 0*/ {
if gain > 0 {
this.WBCoinTotalOut += gain
} else {
this.WBCoinTotalIn += -gain
}
if this.WBCoinLimit != 0 {
if this.WBLevel > 0 && this.WBCoinTotalOut-this.WBCoinTotalIn >= this.WBCoinLimit { //自动解除白名单
clearWB = true
n = (this.WBCoinTotalOut - this.WBCoinTotalIn) - this.WBCoinLimit
} else if this.WBLevel < 0 && this.WBCoinTotalIn-this.WBCoinTotalOut >= this.WBCoinLimit { //自动解除黑名单
clearWB = true
n = (this.WBCoinTotalIn - this.WBCoinTotalOut) - this.WBCoinLimit
}
}
if this.WBMaxNum > 0 {
if this.WBLevel > 0 && gain > 0 {
this.WBMaxNum -= 100
if this.WBMaxNum <= 0 {
clearWB = true
}
} else if this.WBLevel < 0 && gain < 0 {
this.WBMaxNum -= 100
if this.WBMaxNum <= 0 {
clearWB = true
}
}
}
}
if clearWB { //自动解除黑白名单
this.WBCoinTotalIn = 0
this.WBCoinTotalOut = 0
this.WBCoinLimit = 0
this.WBMaxNum = 0
this.WBState = 0
this.WBLevel = 0
}
return n
}
// 解锁炮倍
func (this *PlayerData) UnPlayerPower(power int64) bool {
if power == 0 {
return false
}
logger.Logger.Tracef("解锁炮倍 当前最大解锁炮倍:%v,要解锁的炮倍:%v", this.UnMaxPower, power)
if this.UnMaxPower >= power {
logger.Logger.Trace("当前解锁炮倍小于最大解锁炮倍!!! snid = %v", this.SnId)
return false
}
this.UnMaxPower = power
return true
}
// 解锁炮台 不要直接调用 调用player.UnPlayerPowerListEx()接口
func (this *PlayerData) UnPlayerPowerList(powerId int32) bool {
//判断有没有这个炮台
status := true
for _, id := range this.PowerList {
if id == powerId {
status = false
break
}
}
if status {
this.PowerList = append(this.PowerList, powerId)
}
return status
}
func (this *PlayerData) GetVipShopData(id, vipShopId int32) *ShopData {
for i, data := range this.VipShopData {
if data.Id == id && vipShopId == i {
return data
}
}
return nil
}
func (this *PlayerData) GetPoolUpper(data *webapi.PlayerPool) int64 {
if data == nil {
return 0
}
var gameCoin int64
var upRate int32
// 按不同游戏类型获取 gameCoin 变量
// 1:百人类/2对战类/3.拉霸类/4.捕鱼类/5.休闲类/6.小游戏类
info := this.GDatas[common.GetKeyGameType(2)]
if info != nil {
gameCoin = info.Statics.TotalOut + info.Statics.TotalIn
}
upRate = data.GetFightUp()
//todo 其它游戏类型
// 上线: 初始上线+(游戏输赢绝对值)*-0.01 + 兑换金币*2游戏输赢绝对值按游戏类型分类统计,税前
upLine := data.GetUpperLimit() + int64(float64(gameCoin)*-float64(upRate)/1000.0+float64(this.DiamondToCoin)*float64(data.GetPayUp())/1000.0)
return upLine
}
func (this *PlayerData) GetPoolLower(data *webapi.PlayerPool) int64 {
if data == nil {
return 0
}
var gameCoin int64
var downRate int32
// 按不同游戏类型获取 gameCoin 变量
// 1:百人类/2对战类/3.拉霸类/4.捕鱼类/5.休闲类/6.小游戏类
info := this.GDatas[common.GetKeyGameType(2)]
if info != nil {
gameCoin = info.Statics.TotalOut + info.Statics.TotalIn
}
downRate = data.GetFightDown()
//todo 其它游戏类型
// 下线:初始下线+(游戏输赢绝对值)*-0.06 + 兑换金币*-2游戏输赢绝对值按游戏类型分类统计
lowLine := data.GetLowerLimit() + int64(float64(gameCoin)*-float64(downRate)/1000.0+float64(this.DiamondToCoin)*-float64(data.GetPayDown())/1000.0)
return lowLine
}
func (this *PlayerData) GetPoolCurrent() int64 {
return this.TotalOut - this.PlayerTax - this.TotalIn
}
func (this *PlayerData) GetPoolOdds(data *webapi.PlayerPool) int64 {
if data == nil {
return 0
}
pCoin := this.GetPoolCurrent()
lowLine := this.GetPoolLower(data)
upLine := this.GetPoolUpper(data)
q := float64(upLine-lowLine) * float64(data.GetQuDu()) / 1000.0
up := pCoin - upLine
low := pCoin - lowLine
var odds int64
if up > 0 {
odds = int64(common.SliceMaxValue([]int{int(data.GetLowerOdds()) + int(float64(up)/q*float64(data.GetLowerOddsMax()-data.GetLowerOdds())), int(data.GetLowerOddsMax())}))
} else if low < 0 {
odds = int64(common.SliceMinValue([]int{int(data.GetUpperOdds()) + int(float64(low)/q*float64(data.GetUpperOdds()-data.GetUpperOddsMax())), int(data.GetUpperOddsMax())}))
}
return odds
}
func (this *PlayerData) GetRoleId() int32 {
if this.Roles != nil && this.Roles.ModId != 0 {
return this.Roles.ModId
}
return common.DefaultRoleId
}
// GetSkillAdd2 获取技能加成
// id 技能id
func (this *PlayerData) GetSkillAdd2(id int32, cfg *ConfigMgr) int32 {
if cfg == nil {
return 0
}
for k, v := range this.Skin.ModUnlock {
levelCfg := cfg.GetSkinLevel(this.Platform, k, v)
skinCfg := cfg.GetSkinInfo(this.Platform, k)
if v > 0 && levelCfg.GetSkillId() == id && (skinCfg.GetSkillType() == 0 || this.Skin.ModId == k) {
return levelCfg.GetSkillValue()
}
}
return 0
}
type BindArgs struct {
Platform string
PSnId, SnId int32
PCode string
}
func BindInviteSnId(platform string, snId, pSnId int32, code string) error {
if rpcCli == nil {
return fmt.Errorf("db may be close")
}
var args = &BindArgs{
Platform: platform,
PSnId: pSnId,
SnId: snId,
PCode: code,
}
var ret bool
err := rpcCli.CallWithTimeout("PlayerDataSvc.BindInviteSnId", args, &ret, time.Second*30)
if err != nil {
logger.Logger.Warnf("BindInviteSnId error:%v", err)
return err
}
if ret {
return nil
}
return errors.New("bind error")
}