player.go 25 KB

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