player.go 26 KB

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