DailyUpdates.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import { saveRoot } from '../saveCompent/MySave';
  2. import { SaveBase } from '../saveCompent/SaveBase';
  3. // 定义每天更新的数据,每天充值为默认值
  4. const DailyDate = {
  5. //金币不足领取次数
  6. rewardCoinTimes: 0,
  7. }
  8. const WeekDate = {
  9. }
  10. const MonthDate = {
  11. }
  12. export interface UpdateType {
  13. Daily: any,
  14. Week: any,
  15. Month: any
  16. }
  17. const UpdateEum = {
  18. Daily: DailyDate,
  19. Week: WeekDate,
  20. Month: MonthDate,
  21. }
  22. /**
  23. * 固定时间更新数据
  24. */
  25. @saveRoot('Update')
  26. export class Update<T = typeof UpdateEum> extends SaveBase {
  27. private data: { [key: string]: any } = {}
  28. private lastTime: number = 0
  29. private conf: T = UpdateEum as T
  30. // 提供序列化跟新,和手动跟新两种形式
  31. serialize() {
  32. let res = {
  33. data: this.data,
  34. lastTime: this.lastTime
  35. }
  36. return res
  37. }
  38. unserialize(data: any): this {
  39. if (!data) {
  40. this.data = {}
  41. this.lastTime = 0
  42. } else {
  43. let d = data
  44. this.data = d.data || {}
  45. this.lastTime = d.lastTime ?? 0
  46. }
  47. let now = this.getNowTime();
  48. this.checkDate(now)
  49. this.lastTime = now
  50. return this
  51. }
  52. private getNowTime() {
  53. return chsdk.date.now()
  54. // return 0
  55. }
  56. getDaly<T>(name: keyof (typeof DailyDate)) {
  57. let type = 'Daily'
  58. let t = type as string
  59. let dailyDate = this.data[t]
  60. if (!dailyDate) {
  61. return this.conf[t][name]
  62. }
  63. return dailyDate[name] ?? this.conf[t][name]
  64. }
  65. setDaly<T>(name: keyof (typeof DailyDate),value: any) {
  66. let t = 'Daily'
  67. let dailyDate = this.data[t] || {}
  68. dailyDate[name] = value
  69. this.data[t] = dailyDate
  70. }
  71. getData<C extends (keyof T)>(type: C, name: keyof (T[C])) {
  72. let t = type as string
  73. let dailyDate = this.data[t]
  74. if (!dailyDate) {
  75. return this.conf[t][name]
  76. }
  77. return dailyDate[name] ?? this.conf[t][name]
  78. }
  79. setData<C extends (keyof T)>(type: C, name: keyof (T[C]), value: any) {
  80. let t = type as string
  81. let dailyDate = this.data[t] || {}
  82. dailyDate[name] = value
  83. this.data[t] = dailyDate
  84. }
  85. private reset(type: keyof UpdateType) {
  86. let t = type as string
  87. this.data[t] = {}
  88. }
  89. private checkDate(now: number) {
  90. let data = this.data || {}
  91. if (!now) {
  92. this.data = data
  93. this.lastTime = now
  94. return
  95. }
  96. if (!this.isSameDate(now, this.lastTime)) {
  97. this.reset('Daily')
  98. }
  99. if (!this.areDatesInSameWeek(now, this.lastTime)) {
  100. this.reset('Week')
  101. }
  102. if (!this.areDatesInSameMonth(now, this.lastTime)) {
  103. this.reset('Month')
  104. }
  105. }
  106. /**判定两个时间是否是同一天*/
  107. private isSameDate(timestamp1: number, timestamp2: number): boolean {
  108. let date1 = new Date(timestamp1); let date2 = new Date(timestamp2);
  109. return date1.getFullYear() == date2.getFullYear() && date1.getMonth() == date2.getMonth() && date1.getDate() == date2.getDate();
  110. }
  111. /**判定两个时间是否是同一周*/
  112. private areDatesInSameWeek(date1: number, date2: number): boolean {
  113. const startOfWeek1 = this.getStartOfWeek(new Date(date1));
  114. const startOfWeek2 = this.getStartOfWeek(new Date(date2));
  115. return startOfWeek1.getTime() === startOfWeek2.getTime();
  116. }
  117. private getStartOfWeek(date: Date): Date {
  118. const startOfWeek = new Date(date);
  119. const day = startOfWeek.getDay(); // 星期日是 0,星期一是 1,依此类推
  120. const diff = startOfWeek.getDate() - day; // 计算当前日期所在周的第一天
  121. startOfWeek.setDate(diff); // 设置为该周的第一天
  122. startOfWeek.setHours(0, 0, 0, 0); // 设置时间为 00:00:00
  123. return startOfWeek;
  124. }
  125. private areDatesInSameMonth(date1: number, date2: number): boolean {
  126. const d1 = new Date(date1);
  127. const d2 = new Date(date2);
  128. return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth();
  129. }
  130. }
  131. // let update = new Update()
  132. // update.getDate('Daily', 'aa')