player.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  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. isToday := mhayaTime.CreateFromTimestamp(p.RollDay).IsToday()
  225. if isToday {
  226. slice = slices.DeleteFunc(slice, func(x int) bool {
  227. return x <= rollHour
  228. })
  229. }
  230. if slices.Contains(slice, curHour) {
  231. p.RollDay = mhayaTime.Now().Unix()
  232. num := p.Item[ItemRoll].AddSameTwo(8)
  233. if num > 0 {
  234. p.SetPlayerRewardLog(SourceRefreshRoll, 2, []data.ItemReward{{ItemID: ItemRoll, ItemBaseType: 1, Amount: num}}, []data.ItemReward{}, 0)
  235. }
  236. mhayaLogger.Infof("RefreshRoll by condition 2 rollDay:%d,num:%v", p.RollDay, num)
  237. return true
  238. }
  239. return false
  240. }
  241. func (p *Player) CheckTaskByType1(openid int64, id int) bool {
  242. ret := data.AchieveTaskConfig.GetAll()
  243. for _, v := range ret {
  244. if v.Type == 2 {
  245. continue
  246. }
  247. if v.ID == id {
  248. if v.ID == 2 {
  249. if third.GetIfChannel(openid) == 1 {
  250. return true
  251. } else {
  252. return false
  253. }
  254. } else {
  255. return true
  256. }
  257. }
  258. }
  259. return false
  260. }
  261. func (p *Player) FinishAchieveTaskByType1(id int) bool {
  262. if a, ok := p.AchieveTask[id]; ok {
  263. if a.Num == 0 && a.Validate == 1 { //待验证
  264. openid, ok1 := mhayaString.ToInt64(p.OpenId)
  265. if !ok1 {
  266. mhayaLogger.Warnf("FinishAchieveTaskByType1 验证失败 username :%v, id : %v", p.UserName, id)
  267. return false
  268. }
  269. if p.CheckTaskByType1(openid, id) {
  270. p.AchieveTask[id].Validate = 2 //验证成功
  271. p.AchieveTask[id].Num = 1
  272. p.AchieveTask[id].Status = 1
  273. p.AchieveTask[id].RewardNum = 1
  274. //处理邀请订阅顺序问题
  275. if id == 2 {
  276. go p.SetPassiveInviteReward()
  277. }
  278. } else {
  279. p.AchieveTask[id].Validate = 0 //验证成功
  280. p.AchieveTask[id].Status = 0
  281. mhayaLogger.Warnf("FinishAchieveTaskByType1 验证失败 username :%v, id : v%", p.UserName, id)
  282. return false
  283. }
  284. } else {
  285. if a.Validate == 0 {
  286. p.AchieveTask[id].Validate = 1
  287. }
  288. }
  289. return true
  290. }
  291. return false
  292. }
  293. // FinishAchieveTaskByType2 完成成就类型2
  294. func (p *Player) FinishAchieveTaskByType2() bool {
  295. //var range data.RangeInt32{}
  296. for _, v := range p.AchieveTask {
  297. if v.Type == 2 {
  298. ret, ok := data.AchieveTaskConfig.Get(v.ID)
  299. if !ok {
  300. continue
  301. }
  302. if p.Item[ItemInvite].Num <= ret.Condition.Max && p.AchieveTask[v.ID].Num != ret.Condition.Max {
  303. p.AchieveTask[v.ID].Num += 1
  304. if p.AchieveTask[v.ID].Num >= ret.Condition.Min && p.AchieveTask[v.ID].Num <= ret.Condition.Max {
  305. p.AchieveTask[v.ID].Status = 1
  306. p.AchieveTask[v.ID].RewardNum += 1
  307. }
  308. }
  309. }
  310. }
  311. return false
  312. }
  313. func (p *Player) FinishDailyTask(tp, num int) bool {
  314. var f bool
  315. for i := 0; i < num; i++ {
  316. for _, v := range p.DailyTask {
  317. if v.Type == tp && v.Status == 0 {
  318. p.DailyTask[v.ID].Num += 1
  319. if p.DailyTask[v.ID].Num == v.Condition {
  320. p.DailyTask[v.ID].Status = 1
  321. f = true
  322. continue
  323. }
  324. }
  325. }
  326. }
  327. return f
  328. }
  329. func (p *Player) RollOnce(num int) *param.RollOnce {
  330. var roll param.RollOnce
  331. levelConfig, ok := data.LevelConfig.Get(p.Level)
  332. if !ok {
  333. return nil
  334. }
  335. if levelConfig == nil {
  336. return nil
  337. }
  338. r1 := rand.Int31n(5) + 1
  339. r2 := rand.Int31n(5) + 1
  340. r3 := rand.Int31n(5) + 1
  341. //rule 4
  342. if (r1 == 1 && r2 == 1 && r3 == 1) || (r1 == 6 && r2 == 6 && r3 == 6) {
  343. roll.Score = levelConfig.Ratio * levelConfig.Rule4
  344. roll.RollType = constant.RollSpecialTripleBet
  345. } else if r1 == r2 && r2 == r3 {
  346. roll.Score = levelConfig.Ratio * levelConfig.Rule3
  347. roll.RollType = constant.RollTripleBet
  348. } else if r1 == r2 || r1 == r3 || r2 == r3 {
  349. roll.Score = levelConfig.Ratio * levelConfig.Rule2
  350. roll.RollType = constant.RollDoubleBet
  351. } else {
  352. roll.Score = levelConfig.Ratio * levelConfig.Rule1
  353. if r1+r2+r3 > 9 {
  354. roll.RollType = constant.RollBigBet
  355. } else {
  356. roll.RollType = constant.RollSmallBet
  357. }
  358. }
  359. roll.Rand = make(map[int]int32)
  360. roll.Rand[1] = r1
  361. roll.Rand[2] = r2
  362. roll.Rand[3] = r3
  363. p.Item[ItemScore].Add(roll.Score * num)
  364. p.Item[ItemRoll].Sub(1 * num)
  365. p.SetPlayerRewardLog(SourceRoll, 0, []data.ItemReward{{ItemID: ItemScore, ItemBaseType: 1, Amount: roll.Score * num}}, []data.ItemReward{{ItemID: ItemRoll, ItemBaseType: 1, Amount: 1 * num}}, roll)
  366. p.Roll.RollNums += 1 * num
  367. roll.IsDailyTask = p.FinishDailyTask(1, num)
  368. roll.IsLevelUp = p.LevelUp()
  369. return &roll
  370. }
  371. // Draw 最多尝试重复执行50次
  372. func (p *Player) Draw() *param.Draw {
  373. for i := 0; i < 50; i++ {
  374. draw, ok := p.DrawOnce()
  375. if ok {
  376. return draw
  377. }
  378. }
  379. return nil
  380. }
  381. func (p *Player) NewPlayer10Draw() {
  382. if p.Roll.DrawTotal == 0 {
  383. ret, ok := data.DiscreteRuleConfig.Get(NewPlayer10Draw)
  384. if !ok {
  385. return
  386. }
  387. arr := strings.Split(ret.Condition, ",")
  388. if len(arr) != 2 {
  389. return
  390. }
  391. minC := mhayaString.ToIntD(arr[0], 4)
  392. MaxC := mhayaString.ToIntD(arr[1], 6)
  393. p.Roll.NewDraw = make(map[int]int)
  394. wei := []int{1, 2, 4, 5, 11, 12}
  395. wei2 := []int{1, 2, 4, 12}
  396. var m []int
  397. for i := 0; i < minC; i++ {
  398. r := rand.Intn(2)
  399. if r == 0 {
  400. m = append(m, 5)
  401. } else {
  402. m = append(m, 11)
  403. }
  404. }
  405. var num = len(m)
  406. var num2 = 0
  407. for i := 0; i < 10-minC; i++ {
  408. if num2 == 0 {
  409. if num >= MaxC {
  410. k2 := rand.Intn(len(wei2))
  411. cur := wei2[k2]
  412. if cur == 11 || cur == 5 {
  413. num++
  414. }
  415. if cur == 4 || cur == 12 {
  416. num2++
  417. }
  418. m = append(m, cur)
  419. } else {
  420. k := rand.Intn(len(wei))
  421. cur := wei[k]
  422. if cur == 11 || cur == 5 {
  423. num++
  424. }
  425. if cur == 4 || cur == 12 {
  426. num2++
  427. }
  428. m = append(m, cur)
  429. }
  430. } else {
  431. if num >= MaxC-1 {
  432. k2 := rand.Intn(len(wei2))
  433. cur := wei2[k2]
  434. if cur == 11 || cur == 5 {
  435. num++
  436. }
  437. if cur == 4 || cur == 12 {
  438. num2++
  439. }
  440. m = append(m, cur)
  441. } else {
  442. k := rand.Intn(len(wei))
  443. cur := wei[k]
  444. if cur == 11 || cur == 5 {
  445. num++
  446. }
  447. if cur == 4 || cur == 12 {
  448. num2++
  449. }
  450. m = append(m, cur)
  451. }
  452. }
  453. }
  454. m = Shuffle(m)
  455. for key, v := range m {
  456. p.Roll.NewDraw[key+1] = v
  457. }
  458. }
  459. }
  460. func Shuffle(slice []int) []int {
  461. rand.Seed(time.Now().UnixNano())
  462. for i := len(slice) - 1; i > 0; i-- {
  463. j := rand.Intn(i + 1)
  464. slice[i], slice[j] = slice[j], slice[i]
  465. }
  466. return slice
  467. }
  468. func (p *Player) DrawOnce() (*param.Draw, bool) {
  469. var ret map[int]*data.DrawConfigRow
  470. var draw param.Draw
  471. var wg = 0
  472. p.NewPlayer10Draw()
  473. if p.Roll.DrawTotal < 10 {
  474. ret = data.DrawConfig.GetByType(1)
  475. for _, v := range ret {
  476. wg += v.Weight
  477. }
  478. } else {
  479. ret = data.DrawConfig.GetByType(2)
  480. for _, v := range ret {
  481. wg += v.Weight
  482. }
  483. }
  484. if wg == 0 {
  485. return nil, false
  486. }
  487. var cur int
  488. var curID int
  489. //出去新手10连后规则
  490. if p.Roll.DrawTotal >= 10 {
  491. weight := int(rand.Int31n(int32(wg))) + 1
  492. for _, v := range ret {
  493. if v.Weight == 0 {
  494. continue
  495. }
  496. if weight > cur && weight <= cur+v.Weight {
  497. curID = v.ID
  498. break
  499. }
  500. cur += v.Weight
  501. }
  502. } else {
  503. curID = p.Roll.NewDraw[p.Roll.DrawTotal+1]
  504. }
  505. if d, ok := ret[curID]; ok {
  506. if d.HourTotalCondition > 0 {
  507. i, err := GetDrawHour(curID)
  508. if err != nil {
  509. return nil, false
  510. }
  511. if int(i) > d.HourTotalCondition {
  512. return nil, false
  513. }
  514. }
  515. if d.DailyTotalCondition > 0 {
  516. i, err := GetDrawDailyKey(curID)
  517. if err != nil {
  518. return nil, false
  519. }
  520. if int(i) > d.DailyTotalCondition {
  521. return nil, false
  522. }
  523. }
  524. if d.WeeklyTotalCondition > 0 {
  525. i, err := GetDrawWeeklyKey(curID)
  526. if err != nil {
  527. return nil, false
  528. }
  529. if int(i) > d.WeeklyTotalCondition {
  530. return nil, false
  531. }
  532. }
  533. p.Item.AddItem(d.Reward)
  534. p.Item[ItemDrawsNumber].Sub(1)
  535. draw.Reward = d.Reward
  536. draw.ID = d.Order
  537. draw.CurID = curID
  538. if len(p.Roll.Draw) == 0 {
  539. p.Roll.Draw = make(map[int]int)
  540. }
  541. if len(p.Roll.DrawRatio) == 0 {
  542. p.Roll.DrawRatio = make(map[int]float64)
  543. }
  544. p.Roll.Draw[curID] += 1
  545. p.Roll.DrawTotal += 1
  546. p.Roll.DrawRatio[curID] = float64(p.Roll.Draw[curID]) / float64(p.Roll.DrawTotal)
  547. p.SetPlayerRewardLog(SourceDraw, 0, draw.Reward, []data.ItemReward{{1, ItemDrawsNumber, 1}}, draw)
  548. } else {
  549. return nil, false
  550. }
  551. return &draw, true
  552. }
  553. func GetDrawHour(id int) (int64, error) {
  554. s := mhayaTime.CreateFromTime(mhayaTime.Now().Hour(), 0, 0).ToDateTimeFormat()
  555. key := fmt.Sprintf("%v:%v:%v", constant.DrawHourKey, id, s)
  556. return mdb.RDB.IncrBy(context.Background(), key, 1).Result()
  557. }
  558. func GetDrawDailyKey(id int) (int64, error) {
  559. key := fmt.Sprintf("%v:%v:%v", constant.DrawDailyKey, id, mhayaTime.Now().Format(mhayaTime.DateFormat))
  560. return mdb.RDB.IncrBy(context.Background(), key, 1).Result()
  561. }
  562. func GetDrawWeeklyKey(id int) (int64, error) {
  563. key := fmt.Sprintf("%v:%v:%v", constant.DrawWeeklyKey, id, mhayaTime.Now().Week())
  564. return mdb.RDB.IncrBy(context.Background(), key, 1).Result()
  565. }
  566. func (p *Player) SignIn() *param.ChangeData {
  567. var sign param.ChangeData
  568. p.SinIn.SignDailyTime = mhayaTime.Now().Unix()
  569. p.SinIn.Sign[p.SinIn.Num].IsSign = 1
  570. p.SinIn.Sign[p.SinIn.Num].SignTime = mhayaTime.Now().Unix()
  571. var addItem AddItem
  572. at := addItem.Add(p.SinIn.Sign[p.SinIn.Num].Reward)
  573. sign.AddItem = at
  574. p.Item.AddItem(p.SinIn.Sign[p.SinIn.Num].Reward)
  575. p.SinIn.Num += 1
  576. p.SetPlayerRewardLog(SourceSignIn, p.SinIn.Num, p.SinIn.Sign[p.SinIn.Num].Reward, []data.ItemReward{}, nil)
  577. sign.IsLevelUp = p.LevelUp()
  578. return &sign
  579. }
  580. func (p *Player) SetPlayerRewardLog(tp, tid int, addReward, subReward []data.ItemReward, desc interface{}) {
  581. p.Index += 1
  582. if len(p.PlayerReward) == 0 {
  583. p.PlayerReward = make(map[int]*PlayerRewardBase)
  584. }
  585. p.PlayerReward[p.Index] = &PlayerRewardBase{
  586. UserName: p.UserName,
  587. AddReward: addReward,
  588. SubReward: subReward,
  589. Desc: desc,
  590. Source: tp,
  591. SourceId: tid,
  592. CreateTime: mhayaTime.Now().Unix(),
  593. }
  594. }
  595. func (p *Player) SetPassiveInviteReward() {
  596. ret2, ok := data.DiscreteRuleConfig.Get(InvitePlayer)
  597. c, tok := mhayaString.ToInt(ret2.Condition)
  598. if !ok || !tok || c != p.Level {
  599. return
  600. }
  601. ret3, ok := data.DiscreteRuleConfig.Get(InviteVipPlayer)
  602. c, tok = mhayaString.ToInt(ret3.Condition)
  603. if !ok || !tok || c != p.Level {
  604. return
  605. }
  606. var isCheck bool
  607. if ts, ok := p.AchieveTask[2]; ok {
  608. if ts.Num == 1 {
  609. isCheck = true
  610. }
  611. }
  612. if !isCheck {
  613. // 升级邀请奖励
  614. openid, _ := mhayaString.ToInt64(p.OpenId)
  615. if third.GetIfChannel(openid) == 0 {
  616. mhayaLogger.Infof("player SetPassiveInviteReward,Not following the channel playerName=%v,level=%v,pid=%v", p.UserName, p.Level, p.Pid)
  617. return
  618. }
  619. }
  620. //被邀请人
  621. key := fmt.Sprintf("%v:1:%v", constant.InviteKey, p.UserName)
  622. //获取邀请人
  623. pUid := mdb.RDB.Get(context.Background(), key).Val()
  624. pbase := mdb.RDB.HGet(context.Background(), constant.PlayerBaseKey, pUid).Val()
  625. mdb.RDB.Del(context.Background(), key)
  626. var base param.PlayerBase
  627. err := jsoniter.Unmarshal([]byte(pbase), &base)
  628. if err != nil {
  629. return
  630. }
  631. var addItem []data.ItemReward
  632. if p.IsVip == 0 {
  633. //主动邀请记录, 设置邀请人数量+1
  634. key = fmt.Sprintf("%v:%v:%v", constant.InviteKey, InvitePlayer, pUid)
  635. err = mdb.RDB.IncrBy(context.Background(), key, 1).Err()
  636. if err != nil {
  637. mhayaLogger.Infof("player SetPassiveInviteReward,not vip invite playerName=%v,level=%v,param=%v,err=%v", p.UserName, p.Level, key, err)
  638. }
  639. addItem = append(addItem, ret2.Reward...)
  640. } else {
  641. //主动邀请记录, 设置邀请人数量+1
  642. key = fmt.Sprintf("%v:%v:%v", constant.InviteKey, InviteVipPlayer, pUid)
  643. err = mdb.RDB.IncrBy(context.Background(), key, 1).Err()
  644. if err != nil {
  645. mhayaLogger.Infof("player SetPassiveInviteReward, vip invite playerName=%v,level=%v,param=%v,err=%v", p.UserName, p.Level, key, err)
  646. }
  647. addItem = append(addItem, ret3.Reward...)
  648. }
  649. //社区长额外奖励
  650. if base.IsLeader == 1 {
  651. ret, ok := data.DiscreteRuleConfig.Get(InvitePlayerByLeader)
  652. if !ok {
  653. return
  654. }
  655. addItem = append(addItem, ret.Reward...)
  656. }
  657. if p.InviteReward.IsClaim == 2 {
  658. p.InviteReward.Reward = []data.ItemReward{}
  659. p.InviteReward.IsClaim = 0
  660. p.InviteReward.RewardTime = 0
  661. }
  662. p.InviteReward.Reward = append(p.InviteReward.Reward, addItem...)
  663. p.InviteReward.Merge()
  664. }
  665. func (p *Player) SetInviteReward() {
  666. ret, ok := data.DiscreteRuleConfig.Get(InvitePlayerByLeader)
  667. if !ok {
  668. return
  669. }
  670. ret2, ok := data.DiscreteRuleConfig.Get(InvitePlayer)
  671. if !ok {
  672. return
  673. }
  674. ret3, ok := data.DiscreteRuleConfig.Get(InviteVipPlayer)
  675. if !ok {
  676. return
  677. }
  678. var addItem []data.ItemReward
  679. key1 := fmt.Sprintf("%v:%v:%v", constant.InviteKey, InvitePlayer, p.UserName)
  680. key2 := fmt.Sprintf("%v:%v:%v", constant.InviteKey, InviteVipPlayer, p.UserName)
  681. //自己作为邀请人判断奖励
  682. freeNum, _ := mdb.RDB.Get(context.Background(), key1).Int()
  683. VipNum, _ := mdb.RDB.Get(context.Background(), key2).Int()
  684. for i := 0; i < freeNum; i++ {
  685. addItem = append(addItem, ret2.Reward...)
  686. p.SetPlayerRewardLog(SourceInvite, InvitePlayer, []data.ItemReward{}, []data.ItemReward{}, 2)
  687. if p.IsLeader == 1 {
  688. addItem = append(addItem, ret.Reward...)
  689. p.SetPlayerRewardLog(SourceInvite, InvitePlayerByLeader, []data.ItemReward{}, []data.ItemReward{}, 2)
  690. }
  691. p.Item[ItemInvite].Num += 1
  692. p.Item[ItemInvite].CurNum += 1
  693. p.Invite.Set(InvitePlayer, ret.Reward)
  694. p.FinishAchieveTaskByType2()
  695. mdb.RDB.DecrBy(context.Background(), key1, 1)
  696. }
  697. for i := 0; i < VipNum; i++ {
  698. addItem = append(addItem, ret3.Reward...)
  699. p.SetPlayerRewardLog(SourceInvite, InviteVipPlayer, []data.ItemReward{}, []data.ItemReward{}, 2)
  700. if p.IsLeader == 1 {
  701. addItem = append(addItem, ret.Reward...)
  702. p.SetPlayerRewardLog(SourceInvite, InvitePlayerByLeader, []data.ItemReward{}, []data.ItemReward{}, 2)
  703. }
  704. p.Item[ItemInvite].Num += 1
  705. p.Item[ItemInvite].CurNum += 1
  706. p.Invite.Set(InviteVipPlayer, ret.Reward)
  707. p.FinishAchieveTaskByType2()
  708. mdb.RDB.DecrBy(context.Background(), key2, 1)
  709. }
  710. if (freeNum + VipNum) > 0 {
  711. SetRank(constant.RankSourceInvite, p.IsRobot, p.UserName, freeNum+VipNum)
  712. }
  713. if p.InviteReward.IsClaim == 2 {
  714. p.InviteReward.Reward = []data.ItemReward{}
  715. p.InviteReward.IsClaim = 0
  716. p.InviteReward.RewardTime = 0
  717. }
  718. p.InviteReward.Reward = append(p.InviteReward.Reward, addItem...)
  719. p.InviteReward.Merge()
  720. }
  721. func (p *Player) SetInvite(uid string) bool {
  722. key := fmt.Sprintf("%v:1:%v", constant.InviteKey, p.UserName)
  723. ret, ok := data.DiscreteRuleConfig.Get(InviteMaxExpireTime)
  724. if !ok {
  725. return false
  726. }
  727. t, _ := mhayaString.ToInt64(ret.Condition)
  728. err := mdb.RDB.Set(context.Background(), key, uid, time.Duration(t)*24*time.Hour).Err()
  729. if err != nil {
  730. return false
  731. }
  732. return true
  733. }
  734. func (p *Player) ClaimRankReward(id int) param.ChangeData {
  735. var resp param.ChangeData
  736. if rank, ok := p.RankReward[id]; ok {
  737. if rank.Status == 1 && len(rank.Reward) > 0 {
  738. var addItem AddItem
  739. resp.AddItem = addItem.Add(rank.Reward)
  740. p.Item.AddItem(rank.Reward)
  741. p.RankReward[id].Status = 2
  742. p.RankReward[id].ClaimTime = mhayaTime.Now().Unix()
  743. p.SetPlayerRewardLog(SourceRank, id, rank.Reward, []data.ItemReward{}, nil)
  744. }
  745. }
  746. p.LevelUp()
  747. return resp
  748. }
  749. func (p *Player) ClaimInviteReward(id int) param.ChangeData {
  750. var resp param.ChangeData
  751. if len(p.InviteReward.Reward) > 0 {
  752. var addItem AddItem
  753. resp.AddItem = addItem.Add(p.InviteReward.Reward)
  754. p.Item.AddItem(p.InviteReward.Reward)
  755. p.InviteReward.IsClaim = 2
  756. p.InviteReward.RewardTime = mhayaTime.Now().Unix()
  757. p.InviteReward.Reward = []data.ItemReward{}
  758. p.SetPlayerRewardLog(SourceInvite, id, p.InviteReward.Reward, []data.ItemReward{}, nil)
  759. }
  760. p.LevelUp()
  761. return resp
  762. }
  763. func (p *Player) ClaimAchieveTaskReward(id int) param.ChangeData {
  764. var resp param.ChangeData
  765. if ach, ok := p.AchieveTask[id]; ok {
  766. if ach.Status == 1 && ach.RewardNum > 0 {
  767. var addItem AddItem
  768. resp.AddItem = addItem.Add(ach.Reward)
  769. p.Item.AddItem(ach.Reward)
  770. ach.RewardNum -= 1
  771. p.SetPlayerRewardLog(SourceAchieveTask, id, ach.Reward, []data.ItemReward{}, nil)
  772. }
  773. if ach.RewardNum == 0 {
  774. ret, _ := data.AchieveTaskConfig.Get(ach.ID)
  775. if ret.Condition.Max == ach.Num {
  776. p.AchieveTask[id].Status = 2
  777. } else {
  778. p.AchieveTask[id].Status = 0
  779. }
  780. }
  781. }
  782. p.LevelUp()
  783. return resp
  784. }
  785. func (p *Player) ClaimDailyTaskReward(id int) param.ChangeData {
  786. var resp param.ChangeData
  787. if task, ok := p.DailyTask[id]; ok {
  788. if task.Status == 1 {
  789. var addItem AddItem
  790. resp.AddItem = addItem.Add(task.Reward)
  791. p.Item.AddItem(task.Reward)
  792. task.Status = 2
  793. p.SetPlayerRewardLog(SourceDailyTask, id, task.Reward, []data.ItemReward{}, nil)
  794. }
  795. }
  796. p.LevelUp()
  797. return resp
  798. }