player.go 27 KB

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