player.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  1. package models
  2. import (
  3. "context"
  4. "fmt"
  5. mhayaString "github.com/mhaya/extend/string"
  6. mhayaTime "github.com/mhaya/extend/time"
  7. "github.com/mhaya/game/game_cluster/internal/constant"
  8. "github.com/mhaya/game/game_cluster/internal/data"
  9. "github.com/mhaya/game/game_cluster/internal/mdb"
  10. "github.com/mhaya/game/game_cluster/internal/param"
  11. "github.com/mhaya/game/game_cluster/internal/third"
  12. "github.com/mhaya/game/game_cluster/internal/token"
  13. mhayaLogger "github.com/mhaya/logger"
  14. "math/rand"
  15. "strings"
  16. "time"
  17. )
  18. type Player struct {
  19. UserName string `json:"userName" bson:"userName"` // 用户名
  20. OpenId string `json:"openId" bson:"openId"` // 对应tgid
  21. UserNameMaybe string `json:"userNameMaybe" bson:"userNameMaybe"` // 昵称
  22. NickName string `json:"nickName" bson:"nickName"` // 昵称
  23. Pid string `json:"pid" bson:"pid"` // 上级ID
  24. XID string `json:"xID" bson:"xID"` // 绑定推特ID
  25. TonWall string `json:"tonWall" bson:"tonWall"` // 绑定钱包地址
  26. Email string `json:"email" bson:"email"` // 邮箱
  27. Mobile string `json:"mobile" bson:"mobile"` // 手机号
  28. Avatar string `json:"avatar" bson:"avatar"` // 头像
  29. Password string `json:"-" bson:"password"` //账户密码
  30. Salt string `json:"-" bson:"salt"` //密码盐
  31. IsSetPwd bool `json:"isSetPwd" bson:"-"` //是否设置密码
  32. PwdErrTimes int `json:"pwdErrTimes" bson:"pwdErrTimes"` //密码错误次数
  33. PwdErrRefreshTime int64 `json:"pwdErrRefreshTime" bson:"pwdErrRefreshTime"` //密码到期时间
  34. IsCashOut int `json:"-" bson:"IsCashOut"` //服务器判断是否有提现的数据 0 否 1是
  35. IsRobot int `json:"isRobot" bson:"isRobot"` // 是否为机器人
  36. IsLeader int `json:"isLeader" bson:"isLeader"` // 是否是社区长
  37. IsVip int `json:"isVip" bson:"isVip"` // 是否为VIP
  38. IsFirstBindingXID int `json:"isFirstBindingXID" bson:"isFirstBindingXID"` // 是否是第一次绑定推特
  39. Level int `json:"level" bson:"level"` // 等级
  40. Exp int `json:"exp" bson:"exp"` // 经验
  41. Gender int `json:"gender" bson:"gender"` // 性别
  42. Birthday string `json:"birthday" bson:"birthday"` // 生日
  43. Successions int `json:"successions" bson:"successions"` // 连续登陆天数
  44. MaxSuccessions int `json:"maxSuccessions" bson:"maxSuccessions"` // 最大连续等级天数
  45. PrevTime int64 `json:"prevTime" bson:"prevTime"` // 上次登陆时间
  46. LoginTime int64 `json:"loginTime" bson:"loginTime"` // 登陆时间
  47. LoginIP string `json:"loginIP" bson:"loginIP"` // 登录IP
  48. LoginFailure int `json:"loginFailure" bson:"loginFailure"` // 登陆失败次数
  49. JoinIP string `json:"joinIP" bson:"joinIP"` // 注册IP
  50. Rank int `json:"rank" bson:"rank"` // 排名
  51. JoinTime int64 `json:"joinTime" bson:"joinTime"` // 注册时间
  52. CreateTime int64 `json:"createTime" bson:"createTime"` // 创建时间
  53. UpdateTime int64 `json:"updateTime" bson:"updateTime"` // 更新时间
  54. DailyRefreshTime int64 `json:"dailyRefreshTime" bson:"dailyRefreshTime"` // 每日刷新时间
  55. HourRefreshTime int64 `json:"hourRefreshTime" bson:"hourRefreshTime"` // 每小时更新
  56. WeeklyRefreshTime int64 `json:"weeklyRefreshTime" bson:"weeklyRefreshTime"` // 每周刷新时间
  57. RollDay int64 `json:"rollDay" bson:"rollDay"` // 抽奖日期
  58. Status int `json:"status" bson:"status"` // 状态
  59. Roll *Roll `json:"roll" bson:"roll"` // 抽奖
  60. Guide int `json:"guide" bson:"guide"` //
  61. Share *Share `json:"share" bson:"share"` // 分享
  62. FirstReward int `json:"firstReward" bson:"firstReward"` // 首次登陆奖励
  63. Index int `json:"-" bson:"index"` // 索引
  64. Item ItemBasePack `json:"item" bson:"item"` // 道具
  65. SinIn SignIn `json:"sinIn" bson:"sinIn"` // 签到
  66. DailyTask DailyTask `json:"dailyTask" bson:"dailyTask"` // 日常任务
  67. AchieveTask AchieveTask `json:"achieveTask" bson:"achieveTask"` // 成就任务
  68. RankReward RankReward `json:"rankReward" bson:"rankReward"` // 排行奖励
  69. Invite Invite `json:"invite" bson:"invite"` // 邀请
  70. InviteReward *InviteReward `json:"inviteReward" bson:"inviteReward"` // 邀请奖励
  71. PlayerReward map[int]*PlayerRewardBase `json:"-" bson:"-"`
  72. }
  73. func NewPlayer(token *token.Token) *Player {
  74. return &Player{
  75. UserName: token.PlayerID,
  76. OpenId: token.OpenID,
  77. NickName: token.Nickname,
  78. IsRobot: 0,
  79. Successions: 1,
  80. MaxSuccessions: 1,
  81. LoginTime: mhayaTime.Now().Unix(),
  82. CreateTime: mhayaTime.Now().Unix(),
  83. UpdateTime: mhayaTime.Now().Unix(),
  84. RollDay: mhayaTime.Now().Unix(),
  85. Exp: 0,
  86. Status: 1,
  87. Rank: 0,
  88. Item: NewItem(),
  89. Guide: 1,
  90. Level: 1,
  91. Index: 1,
  92. FirstReward: 1,
  93. Roll: &Roll{RollNums: 0, RollDays: 0},
  94. DailyTask: NewDailyTask(),
  95. Share: &Share{IsDrawShare: 0},
  96. SinIn: NewSignIn(),
  97. AchieveTask: NewAchieveTask(),
  98. RankReward: NewRankReward(),
  99. Invite: NewInvite(),
  100. }
  101. }
  102. func NewBotPlayer(token *token.Token) *Player {
  103. return &Player{
  104. UserName: token.PlayerID,
  105. OpenId: token.OpenID,
  106. NickName: token.Nickname,
  107. IsRobot: 1,
  108. Successions: 1,
  109. MaxSuccessions: 1,
  110. LoginTime: mhayaTime.Now().Unix(),
  111. CreateTime: mhayaTime.Now().Unix(),
  112. UpdateTime: mhayaTime.Now().Unix(),
  113. RollDay: mhayaTime.Now().Unix(),
  114. Exp: 0,
  115. Status: 1,
  116. Rank: 0,
  117. Item: NewItem(),
  118. Guide: 1,
  119. Level: 1,
  120. Index: 1,
  121. FirstReward: 1,
  122. Roll: &Roll{RollNums: 0, RollDays: 0},
  123. DailyTask: NewDailyTask(),
  124. Share: &Share{IsDrawShare: 0},
  125. SinIn: NewSignIn(),
  126. AchieveTask: NewAchieveTask(),
  127. RankReward: NewRankReward(),
  128. Invite: NewInvite(),
  129. }
  130. }
  131. func (p *Player) Init() {
  132. if p.InviteReward == nil {
  133. p.InviteReward = &InviteReward{IsClaim: 0}
  134. }
  135. }
  136. // InitDaily 每日刷新
  137. func (p *Player) InitDaily() {
  138. if !mhayaTime.CreateFromTimestamp(p.DailyRefreshTime).IsToday() {
  139. //刷新每日任务
  140. p.DailyTask.RefreshDailyTask()
  141. //刷新抽奖每日分享
  142. p.Share.RefreshShare()
  143. //刷新是否有排行榜奖励
  144. p.RankReward.InitRank(p.UserName, 1)
  145. //更新时间到当天
  146. p.DailyRefreshTime = mhayaTime.Now().Unix()
  147. }
  148. }
  149. func (p *Player) InitWeekly() {
  150. if !mhayaTime.CreateFromTimestamp(p.WeeklyRefreshTime).IsThisWeek() {
  151. //p.SinIn.RefreshSignIn()
  152. // 刷新是否有排行榜奖励
  153. p.RankReward.InitRank(p.UserName, 2)
  154. p.WeeklyRefreshTime = mhayaTime.Now().Unix()
  155. }
  156. }
  157. func (p *Player) InitSignIn() {
  158. ret := data.WeeklySignInConfig.GetAll()
  159. // 最近一次签到
  160. last, exists := p.SinIn.Sign[p.SinIn.Num]
  161. if !exists {
  162. // 签到数据初始化
  163. p.SinIn.RefreshSignIn()
  164. return
  165. }
  166. // 将时间戳转换为 time.Time 类型
  167. t := time.Unix(last.SignTime, 0)
  168. // todo 测试代码
  169. // 减去一天
  170. //t = t.Add(-24 * time.Hour)
  171. // 计算第二天的开始时间(即第二天的零点)
  172. nextDayStart := t.Add(24 * time.Hour).Truncate(24 * time.Hour)
  173. if p.SinIn.Num >= len(ret)-1 && time.Now().After(nextDayStart) {
  174. // 签到周期满的第二天
  175. p.SinIn.RefreshSignIn()
  176. }
  177. }
  178. func (p *Player) InitAchieveTask() {
  179. p.AchieveTask.RefreshAchieveTask()
  180. }
  181. func (p *Player) LevelUp() bool {
  182. ret, ok := data.LevelConfig.Get(p.Level + 1)
  183. if !ok {
  184. return false
  185. }
  186. curLevel := p.Level
  187. if p.Item[ItemRoll].CurNum >= ret.DiceNum && p.Item[ItemInvite].CurNum >= ret.Invite {
  188. p.Level += 1
  189. if p.Level > curLevel {
  190. p.Item[ItemRoll].AddMaxNum(ret.DiceLimit)
  191. p.Item[ItemRoll].CurNum -= ret.DiceNum
  192. p.Item[ItemInvite].CurNum -= ret.Invite
  193. go p.SetPassiveInviteReward()
  194. //添加日志
  195. mhayaLogger.Infof("player level up, playerName=%v,level=%v", p.UserName, p.Level)
  196. p.SetPlayerRewardLog(SourceLevelUp, p.Level, []data.ItemReward{{ItemID: ItemAllRoll, ItemBaseType: 2, Amount: ret.DiceLimit}}, []data.ItemReward{}, p.Level)
  197. return true
  198. }
  199. }
  200. return false
  201. }
  202. func (p *Player) RefreshRoll() bool {
  203. ret, ok := data.DiscreteRuleConfig.Get(RefreshRoll)
  204. if !ok {
  205. return false
  206. }
  207. arr := strings.Split(ret.Condition, ",")
  208. if len(arr) == 0 {
  209. return false
  210. }
  211. h, _ := mhayaString.ToInt64(arr[0])
  212. //m, _ := mhayaString.ToInt64(arr[1])
  213. s := mhayaTime.CreateFromTimestamp(p.RollDay).DiffInSeconds(mhayaTime.Now())
  214. if s >= h {
  215. p.RollDay = mhayaTime.Now().Unix()
  216. num := p.Item[ItemRoll].AddAll()
  217. if num > 0 {
  218. p.SetPlayerRewardLog(SourceRefreshRoll, 1, []data.ItemReward{{ItemID: ItemRoll, ItemBaseType: 1, Amount: num}}, []data.ItemReward{}, 0)
  219. }
  220. mhayaLogger.Infof("RefreshRoll by condition 1 rollDay:%d,num:%v", s, num)
  221. return true
  222. }
  223. return false
  224. }
  225. func (p *Player) CheckTaskByType1(openid int64, id int) bool {
  226. ret := data.AchieveTaskConfig.GetAll()
  227. for _, v := range ret {
  228. if v.Type == 2 {
  229. continue
  230. }
  231. if v.ID == id {
  232. if v.ID == 2 {
  233. if third.GetIfChannel(openid) == 1 {
  234. return true
  235. } else {
  236. return false
  237. }
  238. } else {
  239. return true
  240. }
  241. }
  242. }
  243. return false
  244. }
  245. func (p *Player) FinishAchieveTaskByType1(id int) bool {
  246. if a, ok := p.AchieveTask[id]; ok {
  247. if a.Num == 0 && a.Validate == 1 { //待验证
  248. openid, ok1 := mhayaString.ToInt64(p.OpenId)
  249. if !ok1 {
  250. mhayaLogger.Warnf("FinishAchieveTaskByType1 验证失败 username :%v, id : %v", p.UserName, id)
  251. return false
  252. }
  253. if p.CheckTaskByType1(openid, id) {
  254. p.AchieveTask[id].Validate = 2 //验证成功
  255. p.AchieveTask[id].Num = 1
  256. p.AchieveTask[id].Status = 1
  257. p.AchieveTask[id].RewardNum = 1
  258. //处理邀请订阅顺序问题
  259. if id == 2 {
  260. go p.SetPassiveInviteReward()
  261. }
  262. } else {
  263. p.AchieveTask[id].Validate = 0 //验证成功
  264. p.AchieveTask[id].Status = 0
  265. mhayaLogger.Warnf("FinishAchieveTaskByType1 验证失败 username :%v, id : %v", p.UserName, id)
  266. return false
  267. }
  268. } else {
  269. if a.Validate == 0 {
  270. p.AchieveTask[id].Validate = 1
  271. }
  272. }
  273. return true
  274. }
  275. return false
  276. }
  277. // FinishAchieveTaskByType2 完成成就类型2
  278. func (p *Player) FinishAchieveTaskByType2() bool {
  279. //var range data.RangeInt32{}
  280. for _, v := range p.AchieveTask {
  281. if v.Type == 2 {
  282. ret, ok := data.AchieveTaskConfig.Get(v.ID)
  283. if !ok {
  284. continue
  285. }
  286. if p.Item[ItemInvite].Num <= ret.Condition.Max && p.AchieveTask[v.ID].Num != ret.Condition.Max {
  287. p.AchieveTask[v.ID].Num += 1
  288. if p.AchieveTask[v.ID].Num >= ret.Condition.Min && p.AchieveTask[v.ID].Num <= ret.Condition.Max {
  289. p.AchieveTask[v.ID].Status = 1
  290. p.AchieveTask[v.ID].RewardNum += 1
  291. }
  292. }
  293. }
  294. }
  295. return false
  296. }
  297. func (p *Player) FinishDailyTask(tp, num int) bool {
  298. var f bool
  299. for i := 0; i < num; i++ {
  300. for _, v := range p.DailyTask {
  301. if v.Type == tp && v.Status == 0 {
  302. p.DailyTask[v.ID].Num += 1
  303. if p.DailyTask[v.ID].Num == v.Condition {
  304. p.DailyTask[v.ID].Status = 1
  305. f = true
  306. continue
  307. }
  308. }
  309. }
  310. }
  311. return f
  312. }
  313. func (p *Player) RollOnce(num int) *param.RollOnce {
  314. var roll param.RollOnce
  315. levelConfig, ok := data.LevelConfig.Get(p.Level)
  316. if !ok {
  317. return nil
  318. }
  319. if levelConfig == nil {
  320. return nil
  321. }
  322. r1 := rand.Int31n(6) + 1
  323. r2 := rand.Int31n(6) + 1
  324. r3 := rand.Int31n(6) + 1
  325. //rule 4
  326. if (r1 == 1 && r2 == 1 && r3 == 1) || (r1 == 6 && r2 == 6 && r3 == 6) {
  327. roll.Score = levelConfig.Ratio * levelConfig.Rule4
  328. roll.RollType = constant.RollSpecialTripleBet
  329. } else if r1 == r2 && r2 == r3 {
  330. roll.Score = levelConfig.Ratio * levelConfig.Rule3
  331. roll.RollType = constant.RollTripleBet
  332. } else if r1 == r2 || r1 == r3 || r2 == r3 {
  333. roll.Score = levelConfig.Ratio * levelConfig.Rule2
  334. roll.RollType = constant.RollDoubleBet
  335. } else {
  336. roll.Score = levelConfig.Ratio * levelConfig.Rule1
  337. if r1+r2+r3 > 9 {
  338. roll.RollType = constant.RollBigBet
  339. } else {
  340. roll.RollType = constant.RollSmallBet
  341. }
  342. }
  343. roll.Rand = make(map[int]int32)
  344. roll.Rand[1] = r1
  345. roll.Rand[2] = r2
  346. roll.Rand[3] = r3
  347. p.Item[ItemScore].Add(roll.Score * num)
  348. p.Item[ItemRoll].Sub(1 * num)
  349. p.SetPlayerRewardLog(SourceRoll, 0, []data.ItemReward{{ItemID: ItemScore, ItemBaseType: 1, Amount: roll.Score * num}}, []data.ItemReward{{ItemID: ItemRoll, ItemBaseType: 1, Amount: 1 * num}}, roll)
  350. p.Roll.RollNums += 1 * num
  351. roll.IsDailyTask = p.FinishDailyTask(1, num)
  352. roll.IsLevelUp = p.LevelUp()
  353. return &roll
  354. }
  355. // Draw 最多尝试重复执行50次
  356. func (p *Player) Draw() *param.Draw {
  357. for i := 0; i < 50; i++ {
  358. draw, ok := p.DrawOnce()
  359. if ok {
  360. return draw
  361. }
  362. }
  363. return nil
  364. }
  365. func (p *Player) NewPlayer10Draw() {
  366. if p.Roll.DrawTotal == 0 {
  367. ret, ok := data.DiscreteRuleConfig.Get(NewPlayer10Draw)
  368. if !ok {
  369. return
  370. }
  371. arr := strings.Split(ret.Condition, ",")
  372. if len(arr) != 2 {
  373. return
  374. }
  375. minC := mhayaString.ToIntD(arr[0], 4)
  376. MaxC := mhayaString.ToIntD(arr[1], 6)
  377. p.Roll.NewDraw = make(map[int]int)
  378. wei := []int{1, 2, 4, 5, 12}
  379. wei2 := []int{1, 2, 4, 12}
  380. var m []int
  381. for i := 0; i < minC; i++ {
  382. r := rand.Intn(2)
  383. if r == 0 {
  384. m = append(m, 5)
  385. } else {
  386. m = append(m, 5)
  387. }
  388. }
  389. var num = len(m)
  390. var num2 = 0
  391. for i := 0; i < 10-minC; i++ {
  392. if num2 == 0 {
  393. if num >= MaxC {
  394. k2 := rand.Intn(len(wei2))
  395. cur := wei2[k2]
  396. if cur == 11 || cur == 5 {
  397. num++
  398. }
  399. if cur == 4 || cur == 12 {
  400. num2++
  401. }
  402. m = append(m, cur)
  403. } else {
  404. k := rand.Intn(len(wei))
  405. cur := wei[k]
  406. if cur == 11 || cur == 5 {
  407. num++
  408. }
  409. if cur == 4 || cur == 12 {
  410. num2++
  411. }
  412. m = append(m, cur)
  413. }
  414. } else {
  415. if num >= MaxC-1 {
  416. k2 := rand.Intn(len(wei2))
  417. cur := wei2[k2]
  418. if cur == 11 || cur == 5 {
  419. num++
  420. }
  421. if cur == 4 || cur == 12 {
  422. num2++
  423. }
  424. m = append(m, cur)
  425. } else {
  426. k := rand.Intn(len(wei))
  427. cur := wei[k]
  428. if cur == 11 || cur == 5 {
  429. num++
  430. }
  431. if cur == 4 || cur == 12 {
  432. num2++
  433. }
  434. m = append(m, cur)
  435. }
  436. }
  437. }
  438. m = Shuffle(m)
  439. for key, v := range m {
  440. p.Roll.NewDraw[key+1] = v
  441. }
  442. }
  443. }
  444. func Shuffle(slice []int) []int {
  445. rand.Seed(time.Now().UnixNano())
  446. for i := len(slice) - 1; i > 0; i-- {
  447. j := rand.Intn(i + 1)
  448. slice[i], slice[j] = slice[j], slice[i]
  449. }
  450. return slice
  451. }
  452. func (p *Player) DrawOnce() (*param.Draw, bool) {
  453. var ret map[int]*data.DrawConfigRow
  454. var draw param.Draw
  455. var wg = 0
  456. p.NewPlayer10Draw()
  457. if p.Roll.DrawTotal < 10 {
  458. ret = data.DrawConfig.GetByType(1)
  459. for _, v := range ret {
  460. wg += v.Weight
  461. }
  462. } else {
  463. ret = data.DrawConfig.GetByType(2)
  464. for _, v := range ret {
  465. wg += v.Weight
  466. }
  467. }
  468. if wg == 0 {
  469. return nil, false
  470. }
  471. var cur int
  472. var curID int
  473. //出去新手10连后规则
  474. if p.Roll.DrawTotal >= 10 {
  475. weight := int(rand.Int31n(int32(wg))) + 1
  476. for _, v := range ret {
  477. if v.Weight == 0 {
  478. continue
  479. }
  480. if weight > cur && weight <= cur+v.Weight {
  481. curID = v.ID
  482. break
  483. }
  484. cur += v.Weight
  485. }
  486. } else {
  487. curID = p.Roll.NewDraw[p.Roll.DrawTotal+1]
  488. //0.1u兼容处理
  489. if curID == 11 {
  490. curID = 5
  491. }
  492. }
  493. if d, ok := ret[curID]; ok {
  494. if d.HourTotalCondition > 0 {
  495. i, err := GetDrawHour(curID)
  496. if err != nil {
  497. return nil, false
  498. }
  499. if int(i) > d.HourTotalCondition {
  500. return nil, false
  501. }
  502. }
  503. if d.DailyTotalCondition > 0 {
  504. i, err := GetDrawDailyKey(curID)
  505. if err != nil {
  506. return nil, false
  507. }
  508. if int(i) > d.DailyTotalCondition {
  509. return nil, false
  510. }
  511. }
  512. if d.WeeklyTotalCondition > 0 {
  513. i, err := GetDrawWeeklyKey(curID)
  514. if err != nil {
  515. return nil, false
  516. }
  517. if int(i) > d.WeeklyTotalCondition {
  518. return nil, false
  519. }
  520. }
  521. p.Item.AddItem(d.Reward)
  522. p.Item[ItemDrawsNumber].Sub(1)
  523. draw.Reward = d.Reward
  524. draw.ID = d.Order
  525. draw.CurID = curID
  526. if len(p.Roll.Draw) == 0 {
  527. p.Roll.Draw = make(map[int]int)
  528. }
  529. if len(p.Roll.DrawRatio) == 0 {
  530. p.Roll.DrawRatio = make(map[int]float64)
  531. }
  532. p.Roll.Draw[curID] += 1
  533. p.Roll.DrawTotal += 1
  534. p.Roll.DrawRatio[curID] = float64(p.Roll.Draw[curID]) / float64(p.Roll.DrawTotal)
  535. p.SetPlayerRewardLog(SourceDraw, 0, draw.Reward, []data.ItemReward{{1, ItemDrawsNumber, 1}}, draw)
  536. } else {
  537. return nil, false
  538. }
  539. return &draw, true
  540. }
  541. func GetDrawHour(id int) (int64, error) {
  542. s := mhayaTime.CreateFromTime(mhayaTime.Now().Hour(), 0, 0).ToDateTimeFormat()
  543. key := fmt.Sprintf("%v:%v:%v", constant.DrawHourKey, id, s)
  544. return mdb.RDB.IncrBy(context.Background(), key, 1).Result()
  545. }
  546. func GetDrawDailyKey(id int) (int64, error) {
  547. key := fmt.Sprintf("%v:%v:%v", constant.DrawDailyKey, id, mhayaTime.Now().Format(mhayaTime.DateFormat))
  548. return mdb.RDB.IncrBy(context.Background(), key, 1).Result()
  549. }
  550. func GetDrawWeeklyKey(id int) (int64, error) {
  551. key := fmt.Sprintf("%v:%v:%v", constant.DrawWeeklyKey, id, mhayaTime.Now().Week())
  552. return mdb.RDB.IncrBy(context.Background(), key, 1).Result()
  553. }
  554. func (p *Player) SignIn() *param.ChangeData {
  555. var sign param.ChangeData
  556. p.SinIn.SignDailyTime = mhayaTime.Now().Unix()
  557. p.SinIn.Sign[p.SinIn.Num].IsSign = 1
  558. p.SinIn.Sign[p.SinIn.Num].SignTime = mhayaTime.Now().Unix()
  559. var addItem AddItem
  560. at := addItem.Add(p.SinIn.Sign[p.SinIn.Num].Reward)
  561. sign.AddItem = at
  562. p.Item.AddItem(p.SinIn.Sign[p.SinIn.Num].Reward)
  563. p.SinIn.Num += 1
  564. p.SetPlayerRewardLog(SourceSignIn, p.SinIn.Num, p.SinIn.Sign[p.SinIn.Num].Reward, []data.ItemReward{}, nil)
  565. sign.IsLevelUp = p.LevelUp()
  566. return &sign
  567. }
  568. func (p *Player) SetPlayerRewardLog(tp, tid int, addReward, subReward []data.ItemReward, desc interface{}) {
  569. p.Index += 1
  570. if len(p.PlayerReward) == 0 {
  571. p.PlayerReward = make(map[int]*PlayerRewardBase)
  572. }
  573. p.PlayerReward[p.Index] = &PlayerRewardBase{
  574. UserName: p.UserName,
  575. AddReward: addReward,
  576. SubReward: subReward,
  577. Desc: desc,
  578. Source: tp,
  579. SourceId: tid,
  580. CreateTime: mhayaTime.Now().Unix(),
  581. }
  582. }
  583. func (p *Player) SetPassiveInviteReward() {
  584. ret2, ok := data.DiscreteRuleConfig.Get(InvitePlayer)
  585. c, tok := mhayaString.ToInt(ret2.Condition)
  586. if !ok || !tok || c != p.Level {
  587. return
  588. }
  589. ret3, ok := data.DiscreteRuleConfig.Get(InviteVipPlayer)
  590. c, tok = mhayaString.ToInt(ret3.Condition)
  591. if !ok || !tok || c != p.Level {
  592. return
  593. }
  594. var isCheck bool
  595. if ts, ok := p.AchieveTask[2]; ok {
  596. if ts.Num == 1 {
  597. isCheck = true
  598. }
  599. }
  600. if !isCheck {
  601. // 升级邀请奖励
  602. openid, _ := mhayaString.ToInt64(p.OpenId)
  603. if third.GetIfChannel(openid) == 0 {
  604. mhayaLogger.Infof("player SetPassiveInviteReward,Not following the channel playerName=%v,level=%v,pid=%v", p.UserName, p.Level, p.Pid)
  605. return
  606. }
  607. }
  608. //被邀请人
  609. key := fmt.Sprintf("%v:1:%v", constant.InviteKey, p.UserName)
  610. //获取邀请人
  611. pUid := mdb.RDB.Get(context.Background(), key).Val()
  612. /* pbase := mdb.RDB.HGet(context.Background(), constant.PlayerBaseKey, pUid).Val()
  613. mdb.RDB.Del(context.Background(), key)
  614. var base param.PlayerBase
  615. err := jsoniter.Unmarshal([]byte(pbase), &base)
  616. if err != nil {
  617. return
  618. }*/
  619. var addItem []data.ItemReward
  620. if p.IsVip == 0 {
  621. //主动邀请记录, 设置邀请人数量+1
  622. key = fmt.Sprintf("%v:%v:%v", constant.InviteKey, InvitePlayer, pUid)
  623. err := mdb.RDB.IncrBy(context.Background(), key, 1).Err()
  624. if err != nil {
  625. mhayaLogger.Infof("player SetPassiveInviteReward,not vip invite playerName=%v,level=%v,param=%v,err=%v", p.UserName, p.Level, key, err)
  626. }
  627. addItem = append(addItem, ret2.Reward...)
  628. } else {
  629. //主动邀请记录, 设置邀请人数量+1
  630. key = fmt.Sprintf("%v:%v:%v", constant.InviteKey, InviteVipPlayer, pUid)
  631. err := mdb.RDB.IncrBy(context.Background(), key, 1).Err()
  632. if err != nil {
  633. mhayaLogger.Infof("player SetPassiveInviteReward, vip invite playerName=%v,level=%v,param=%v,err=%v", p.UserName, p.Level, key, err)
  634. }
  635. addItem = append(addItem, ret3.Reward...)
  636. }
  637. /* //社区长额外奖励
  638. if base.IsLeader == 1 {
  639. ret, ok := data.DiscreteRuleConfig.Get(InvitePlayerByLeader)
  640. if !ok {
  641. return
  642. }
  643. addItem = append(addItem, ret.Reward...)
  644. }*/
  645. if p.InviteReward.IsClaim == 2 {
  646. p.InviteReward.Reward = []data.ItemReward{}
  647. p.InviteReward.IsClaim = 0
  648. p.InviteReward.RewardTime = 0
  649. }
  650. p.InviteReward.Reward = append(p.InviteReward.Reward, addItem...)
  651. p.InviteReward.Merge()
  652. }
  653. func (p *Player) SetInviteReward() {
  654. ret, ok := data.DiscreteRuleConfig.Get(InvitePlayerByLeader)
  655. if !ok {
  656. return
  657. }
  658. ret2, ok := data.DiscreteRuleConfig.Get(InvitePlayer)
  659. if !ok {
  660. return
  661. }
  662. ret3, ok := data.DiscreteRuleConfig.Get(InviteVipPlayer)
  663. if !ok {
  664. return
  665. }
  666. var addItem []data.ItemReward
  667. key1 := fmt.Sprintf("%v:%v:%v", constant.InviteKey, InvitePlayer, p.UserName)
  668. key2 := fmt.Sprintf("%v:%v:%v", constant.InviteKey, InviteVipPlayer, p.UserName)
  669. //自己作为邀请人判断奖励
  670. freeNum, _ := mdb.RDB.Get(context.Background(), key1).Int()
  671. VipNum, _ := mdb.RDB.Get(context.Background(), key2).Int()
  672. for i := 0; i < freeNum; i++ {
  673. addItem = append(addItem, ret2.Reward...)
  674. p.SetPlayerRewardLog(SourceInvite, InvitePlayer, []data.ItemReward{}, []data.ItemReward{}, 2)
  675. if p.IsLeader == 1 {
  676. addItem = append(addItem, ret.Reward...)
  677. p.SetPlayerRewardLog(SourceInvite, InvitePlayerByLeader, []data.ItemReward{}, []data.ItemReward{}, 2)
  678. }
  679. p.Item[ItemInvite].Num += 1
  680. p.Item[ItemInvite].CurNum += 1
  681. p.Invite.Set(InvitePlayer, ret.Reward)
  682. p.FinishAchieveTaskByType2()
  683. mdb.RDB.DecrBy(context.Background(), key1, 1)
  684. }
  685. for i := 0; i < VipNum; i++ {
  686. addItem = append(addItem, ret3.Reward...)
  687. p.SetPlayerRewardLog(SourceInvite, InviteVipPlayer, []data.ItemReward{}, []data.ItemReward{}, 2)
  688. if p.IsLeader == 1 {
  689. addItem = append(addItem, ret.Reward...)
  690. p.SetPlayerRewardLog(SourceInvite, InvitePlayerByLeader, []data.ItemReward{}, []data.ItemReward{}, 2)
  691. }
  692. p.Item[ItemInvite].Num += 1
  693. p.Item[ItemInvite].CurNum += 1
  694. p.Invite.Set(InviteVipPlayer, ret.Reward)
  695. p.FinishAchieveTaskByType2()
  696. mdb.RDB.DecrBy(context.Background(), key2, 1)
  697. }
  698. if (freeNum + VipNum) > 0 {
  699. SetRank(constant.RankSourceInvite, p.IsRobot, p.UserName, freeNum+VipNum)
  700. }
  701. if p.InviteReward.IsClaim == 2 {
  702. p.InviteReward.Reward = []data.ItemReward{}
  703. p.InviteReward.IsClaim = 0
  704. p.InviteReward.RewardTime = 0
  705. }
  706. p.InviteReward.Reward = append(p.InviteReward.Reward, addItem...)
  707. p.InviteReward.Merge()
  708. }
  709. func (p *Player) SetInvite(uid string) bool {
  710. key := fmt.Sprintf("%v:1:%v", constant.InviteKey, p.UserName)
  711. ret, ok := data.DiscreteRuleConfig.Get(InviteMaxExpireTime)
  712. if !ok {
  713. return false
  714. }
  715. t, _ := mhayaString.ToInt64(ret.Condition)
  716. err := mdb.RDB.Set(context.Background(), key, uid, time.Duration(t)*24*time.Hour).Err()
  717. if err != nil {
  718. return false
  719. }
  720. return true
  721. }
  722. func (p *Player) ClaimRankReward(id int) param.ChangeData {
  723. var resp param.ChangeData
  724. if rank, ok := p.RankReward[id]; ok {
  725. if rank.Status == 1 && len(rank.Reward) > 0 {
  726. var addItem AddItem
  727. resp.AddItem = addItem.Add(rank.Reward)
  728. p.Item.AddItem(rank.Reward)
  729. p.RankReward[id].Status = 2
  730. p.RankReward[id].ClaimTime = mhayaTime.Now().Unix()
  731. p.SetPlayerRewardLog(SourceRank, id, rank.Reward, []data.ItemReward{}, nil)
  732. }
  733. }
  734. p.LevelUp()
  735. return resp
  736. }
  737. func (p *Player) ClaimInviteReward(id int) param.ChangeData {
  738. var resp param.ChangeData
  739. if len(p.InviteReward.Reward) > 0 {
  740. var addItem AddItem
  741. resp.AddItem = addItem.Add(p.InviteReward.Reward)
  742. p.Item.AddItem(p.InviteReward.Reward)
  743. p.InviteReward.IsClaim = 2
  744. p.InviteReward.RewardTime = mhayaTime.Now().Unix()
  745. p.InviteReward.Reward = []data.ItemReward{}
  746. p.SetPlayerRewardLog(SourceInvite, id, p.InviteReward.Reward, []data.ItemReward{}, nil)
  747. }
  748. p.LevelUp()
  749. return resp
  750. }
  751. func (p *Player) ClaimAchieveTaskReward(id int) param.ChangeData {
  752. var resp param.ChangeData
  753. if ach, ok := p.AchieveTask[id]; ok {
  754. if ach.Status == 1 && ach.RewardNum > 0 {
  755. var addItem AddItem
  756. resp.AddItem = addItem.Add(ach.Reward)
  757. p.Item.AddItem(ach.Reward)
  758. ach.RewardNum -= 1
  759. p.SetPlayerRewardLog(SourceAchieveTask, id, ach.Reward, []data.ItemReward{}, nil)
  760. }
  761. if ach.RewardNum == 0 {
  762. ret, _ := data.AchieveTaskConfig.Get(ach.ID)
  763. if ret.Condition.Max == ach.Num {
  764. p.AchieveTask[id].Status = 2
  765. } else {
  766. p.AchieveTask[id].Status = 0
  767. }
  768. }
  769. }
  770. p.LevelUp()
  771. return resp
  772. }
  773. func (p *Player) ClaimDailyTaskReward(id int) param.ChangeData {
  774. var resp param.ChangeData
  775. if task, ok := p.DailyTask[id]; ok {
  776. if task.Status == 1 {
  777. var addItem AddItem
  778. resp.AddItem = addItem.Add(task.Reward)
  779. p.Item.AddItem(task.Reward)
  780. task.Status = 2
  781. p.SetPlayerRewardLog(SourceDailyTask, id, task.Reward, []data.ItemReward{}, nil)
  782. }
  783. }
  784. p.LevelUp()
  785. return resp
  786. }