jp.ms.common.modules 1.0.43 → 1.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/common/rooms-manager.service.d.ts +61 -0
  2. package/dist/common/rooms-manager.service.js +148 -0
  3. package/dist/common/rooms-manager.service.js.map +1 -0
  4. package/dist/common/tournament-rooms-manager.service.d.ts +10 -0
  5. package/dist/common/tournament-rooms-manager.service.js +66 -0
  6. package/dist/common/tournament-rooms-manager.service.js.map +1 -0
  7. package/dist/dto/games/fool/fool-table.dto.d.ts +0 -1
  8. package/dist/dto/games/fool/fool-table.dto.js +0 -10
  9. package/dist/dto/games/fool/fool-table.dto.js.map +1 -1
  10. package/dist/exception/global-exception-filter.d.ts +2 -0
  11. package/dist/exception/global-exception-filter.js +23 -17
  12. package/dist/exception/global-exception-filter.js.map +1 -1
  13. package/dist/modules/anti-freeze-system/anti-freeze-system.service.d.ts +3 -0
  14. package/dist/modules/anti-freeze-system/anti-freeze-system.service.js +33 -23
  15. package/dist/modules/anti-freeze-system/anti-freeze-system.service.js.map +1 -1
  16. package/dist/modules/base-achievements/base-achievements.constants.d.ts +1 -0
  17. package/dist/modules/base-achievements/base-achievements.constants.js +5 -0
  18. package/dist/modules/base-achievements/base-achievements.constants.js.map +1 -0
  19. package/dist/modules/base-achievements/base-achievements.interfaces.d.ts +15 -0
  20. package/dist/modules/base-achievements/base-achievements.interfaces.js +3 -0
  21. package/dist/modules/base-achievements/base-achievements.interfaces.js.map +1 -0
  22. package/dist/modules/base-achievements/base-achievements.module.d.ts +29 -7
  23. package/dist/modules/base-achievements/base-achievements.module.js +166 -76
  24. package/dist/modules/base-achievements/base-achievements.module.js.map +1 -1
  25. package/dist/modules/base-achievements/index.d.ts +2 -0
  26. package/dist/modules/base-achievements/index.js +3 -1
  27. package/dist/modules/base-achievements/index.js.map +1 -1
  28. package/dist/modules/event-bus/events-bus.app.subscribe.service.d.ts +3 -3
  29. package/dist/modules/event-bus/events-bus.app.subscribe.service.js.map +1 -1
  30. package/dist/modules/index.d.ts +1 -1
  31. package/dist/modules/index.js +4 -3
  32. package/dist/modules/index.js.map +1 -1
  33. package/dist/modules/main/main.service.js +8 -6
  34. package/dist/modules/main/main.service.js.map +1 -1
  35. package/dist/modules/many-tables-tournament/many-tables-tournament.controller.js +1 -1
  36. package/dist/modules/many-tables-tournament/many-tables-tournament.controller.js.map +1 -1
  37. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.d.ts +1 -0
  38. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.js +4 -0
  39. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.js.map +1 -1
  40. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.d.ts +7 -5
  41. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.js +58 -38
  42. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.js.map +1 -1
  43. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.d.ts +1 -0
  44. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.js +4 -0
  45. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.js.map +1 -1
  46. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.d.ts +7 -5
  47. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.js +55 -35
  48. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.js.map +1 -1
  49. package/dist/modules/simple-rooms-manager/simple-rooms-manager.interfaces.d.ts +1 -0
  50. package/dist/modules/simple-rooms-manager/simple-rooms-manager.module.js +4 -0
  51. package/dist/modules/simple-rooms-manager/simple-rooms-manager.module.js.map +1 -1
  52. package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.d.ts +7 -5
  53. package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.js +53 -20
  54. package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.js.map +1 -1
  55. package/dist/tsconfig.tsbuildinfo +1 -1
  56. package/dist/views/achievement-snackbar.view.d.ts +8 -0
  57. package/dist/views/achievement-snackbar.view.js +26 -0
  58. package/dist/views/achievement-snackbar.view.js.map +1 -0
  59. package/dist/views/base-table.view.d.ts +13 -0
  60. package/dist/views/base-table.view.js +34 -0
  61. package/dist/views/base-table.view.js.map +1 -0
  62. package/dist/views/index.d.ts +3 -0
  63. package/dist/views/index.js +7 -1
  64. package/dist/views/index.js.map +1 -1
  65. package/dist/views/level-up-snackbar.view.d.ts +7 -0
  66. package/dist/views/level-up-snackbar.view.js +26 -0
  67. package/dist/views/level-up-snackbar.view.js.map +1 -0
  68. package/package.json +5 -5
  69. package/src/common/rooms-manager.service.ts +250 -0
  70. package/src/common/tournament-rooms-manager.service.ts +121 -0
  71. package/src/dto/games/fool/fool-table.dto.ts +0 -8
  72. package/src/exception/global-exception-filter.ts +34 -20
  73. package/src/modules/anti-freeze-system/anti-freeze-system.service.ts +48 -35
  74. package/src/modules/base-achievements/base-achievements.constants.ts +1 -0
  75. package/src/modules/base-achievements/base-achievements.interfaces.ts +22 -0
  76. package/src/modules/base-achievements/base-achievements.module.ts +347 -234
  77. package/src/modules/base-achievements/index.ts +5 -0
  78. package/src/modules/event-bus/events-bus.app.subscribe.service.ts +5 -5
  79. package/src/modules/index.ts +6 -1
  80. package/src/modules/main/main.service.ts +7 -5
  81. package/src/modules/many-tables-tournament/many-tables-tournament.controller.ts +1 -1
  82. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.ts +1 -0
  83. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.ts +7 -0
  84. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.ts +89 -41
  85. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.ts +1 -0
  86. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.ts +7 -0
  87. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.ts +89 -40
  88. package/src/modules/simple-rooms-manager/simple-rooms-manager.interfaces.ts +1 -0
  89. package/src/modules/simple-rooms-manager/simple-rooms-manager.module.ts +7 -0
  90. package/src/modules/simple-rooms-manager/simple-rooms-manager.service.ts +79 -33
  91. package/src/views/achievement-snackbar.view.ts +38 -0
  92. package/src/views/base-table.view.ts +57 -0
  93. package/src/views/index.ts +3 -0
  94. package/src/views/level-up-snackbar.view.ts +38 -0
  95. package/dist/utils/date.d.ts +0 -2
  96. package/dist/utils/date.js +0 -11
  97. package/dist/utils/date.js.map +0 -1
  98. package/dist/utils/game-table-result.d.ts +0 -40
  99. package/dist/utils/game-table-result.js +0 -152
  100. package/dist/utils/game-table-result.js.map +0 -1
  101. package/src/utils/date.ts +0 -7
  102. package/src/utils/game-table-result.ts +0 -190
@@ -1,4 +1,4 @@
1
- import { Global, InternalServerErrorException, Module } from '@nestjs/common';
1
+ import { Inject, Module } from '@nestjs/common';
2
2
  import { MongooseModule } from '@nestjs/mongoose';
3
3
  import {
4
4
  ActivityLog,
@@ -15,30 +15,27 @@ import {
15
15
  UsersAchievementsRepository,
16
16
  } from 'jp.db.schemas';
17
17
  import {
18
- BaseAppEvent,
19
- BaseUserAppEvent,
20
- EarnOneMillionAchievement,
21
- GotLevel10Achievement,
22
- GotLevel3Achievement,
23
- Playd10GamesAchievement,
24
18
  SnackbarSendToPlayerWsEvent,
25
- Take1PlaceOnManyTablesTournamentAchievement,
26
- Take2Or3PlaceOnManyTablesTournamentAchievement,
27
19
  UserGotNewLevelAppEvent,
28
- UserPlayedTheGameAppEvent,
29
- UserWonManyTablesTournamentAppEvent,
30
- UserWonOneTableTournamentAppEvent,
31
- UserWonTheGameAppEvent,
32
- Won3GamesAchievement,
33
- Won3ProfiAchievement,
34
- WonOneTableTournament3TimesAchievement,
20
+ BaseAchievement,
21
+ BaseUserAppEvent,
22
+ AchievementsCodesEnum,
23
+ GamePlayerRoundFinishedAppEvent,
24
+ GamePlayerMovedAppEvent,
25
+ GamePlayerManyTablesTournamentFinishedAppEvent,
26
+ GamePlayerOneTableTournamentFinishedAppEvent,
27
+ LocalService,
28
+ TournamentMaster,
35
29
  } from 'jp.ms.common.engine';
36
- import { AppScreenIconEnum, LanguageTypeEnum } from 'jp.common.models';
30
+ import { LanguageTypeEnum } from 'jp.common.models';
37
31
 
38
32
  import { EventsBusAppSubscribeService } from '../event-bus/events-bus.app.subscribe.service';
39
33
  import { PlayersManagerService } from '../players-manager';
34
+ import { AchievementSnackbarView } from '../../views';
35
+
36
+ import { BASE_ACHIEVEMENTS_OPTIONS } from './base-achievements.constants';
37
+ import { BaseAchievementsFactoryOptions } from './base-achievements.interfaces';
40
38
 
41
- @Global()
42
39
  @Module({
43
40
  imports: [
44
41
  MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
@@ -57,10 +54,13 @@ import { PlayersManagerService } from '../players-manager';
57
54
  ActivityLogRepository,
58
55
  AchievementRepository,
59
56
  UsersAchievementsRepository,
60
- EventsBusAppSubscribeService,
61
57
  ],
62
58
  })
63
59
  export abstract class BaseAchievementsModule {
60
+ protected allAchievements: Array<Achievement> = [];
61
+ protected achievemnts: Map<string, BaseAchievement> = new Map();
62
+ protected usersAchievements: Map<string, UsersAchievement[]> = new Map();
63
+
64
64
  constructor(
65
65
  protected readonly eventsBusAppSubscribeService: EventsBusAppSubscribeService,
66
66
  protected readonly playersManager: PlayersManagerService,
@@ -68,257 +68,370 @@ export abstract class BaseAchievementsModule {
68
68
  protected readonly activityLogRepository: ActivityLogRepository,
69
69
  protected readonly achievementRepository: AchievementRepository,
70
70
  protected readonly usersAchievementRepository: UsersAchievementsRepository,
71
+ @Inject(BASE_ACHIEVEMENTS_OPTIONS)
72
+ private readonly options: BaseAchievementsFactoryOptions,
71
73
  ) {}
72
74
 
73
- onModuleInit() {
75
+ abstract createAchievemnt(code: string, gameType: string): BaseAchievement;
76
+
77
+ async onModuleInit() {
74
78
  this.eventsBusAppSubscribeService.subscribe((event) => {
75
79
  void this.onHandleAppEvent(event);
76
80
  });
81
+
82
+ this.allAchievements = await this.achievementRepository.findAchievements(
83
+ this.options.gameType,
84
+ );
85
+
86
+ for (const achievement of this.allAchievements) {
87
+ const objAchievemnt = this.createAchievemnt(
88
+ achievement.code,
89
+ this.options.gameType,
90
+ );
91
+
92
+ this.achievemnts.set(objAchievemnt.getCode(), objAchievemnt);
93
+ }
77
94
  }
78
95
 
79
- protected async onHandleAppEvent(event: BaseAppEvent) {
80
- if (event instanceof BaseUserAppEvent) {
81
- const userId = event.userId;
82
- const player = this.playersManager.getPlayerById(userId);
83
- const foundUser = await this.usersRepository.findById(userId);
84
- const allAchievements: Array<Achievement> =
85
- await this.achievementRepository.findAchievements(event.game);
86
- const usersAchievements: Array<UsersAchievement> =
87
- await this.usersAchievementRepository.findAchivementsByUserId(userId);
88
-
89
- if (!player || !foundUser) {
90
- throw new InternalServerErrorException();
91
- }
96
+ protected async onHandleAppEvent(event: BaseUserAppEvent) {
97
+ const usersAchievemnets =
98
+ await this.usersAchievementRepository.findAchivementsByUserId(
99
+ event.userId,
100
+ );
101
+ this.usersAchievements.set(event.userId, usersAchievemnets);
92
102
 
93
- if (event instanceof UserGotNewLevelAppEvent) {
94
- // TODO подумать куда перенести LEVEL UP
95
- player.sendMessage(
96
- new SnackbarSendToPlayerWsEvent(
97
- event.game,
98
- player.id,
99
- AppScreenIconEnum.ARROW_UPWARD,
100
- 'level up',
101
- 'buttonText',
102
- ),
103
+ switch (event.constructor.name) {
104
+ case UserGotNewLevelAppEvent.name: {
105
+ this.handleUserGotLevelUp(event as UserGotNewLevelAppEvent);
106
+ break;
107
+ }
108
+ case GamePlayerRoundFinishedAppEvent.name: {
109
+ await this.handleGamePlayerRoundFinishedAppEvent(
110
+ event as GamePlayerRoundFinishedAppEvent,
111
+ );
112
+ break;
113
+ }
114
+ case GamePlayerMovedAppEvent.name: {
115
+ this.handleGamePlayerMovedAppEvent(event as GamePlayerMovedAppEvent);
116
+ break;
117
+ }
118
+ case GamePlayerManyTablesTournamentFinishedAppEvent.name: {
119
+ this.handleGamePlayerManyTablesTournamentFinishedAppEvent(
120
+ event as GamePlayerManyTablesTournamentFinishedAppEvent,
121
+ );
122
+ break;
123
+ }
124
+ case GamePlayerOneTableTournamentFinishedAppEvent.name: {
125
+ await this.handleGamePlayerOneTableTournamentFinishedAppEvent(
126
+ event as GamePlayerOneTableTournamentFinishedAppEvent,
103
127
  );
128
+ break;
129
+ }
130
+ }
131
+
132
+ this.usersAchievements.delete(event.userId);
133
+ }
104
134
 
105
- if (
106
- this.userHasNoAchievement(
107
- usersAchievements,
108
- GotLevel3Achievement.code,
109
- )
110
- ) {
111
- if (new GotLevel3Achievement(event.newLevel).userGotAchievement()) {
112
- void this.giveAchievement(
113
- allAchievements,
114
- GotLevel3Achievement.code,
115
- foundUser,
116
- event.game,
117
- );
118
- }
119
- }
120
-
121
- if (
122
- this.userHasNoAchievement(
123
- usersAchievements,
124
- GotLevel10Achievement.code,
125
- )
126
- ) {
127
- if (new GotLevel10Achievement(event.newLevel).userGotAchievement()) {
128
- void this.giveAchievement(
129
- allAchievements,
130
- GotLevel10Achievement.code,
131
- foundUser,
132
- event.game,
133
- );
134
- }
135
- }
136
- } else if (event instanceof UserPlayedTheGameAppEvent) {
137
- if (
138
- this.userHasNoAchievement(
139
- usersAchievements,
140
- Playd10GamesAchievement.code,
141
- )
142
- ) {
143
- const playdGamesCount =
144
- await this.activityLogRepository.getUserPlayedGamesCount(userId);
145
-
146
- if (
147
- new Playd10GamesAchievement(playdGamesCount).userGotAchievement()
148
- ) {
149
- void this.giveAchievement(
150
- allAchievements,
151
- Playd10GamesAchievement.code,
152
- foundUser,
153
- event.game,
154
- );
155
- }
156
- }
157
- } else if (event instanceof UserWonTheGameAppEvent) {
158
- if (
159
- this.userHasNoAchievement(
160
- usersAchievements,
161
- Won3GamesAchievement.code,
162
- )
163
- ) {
164
- const wonGamesCount =
165
- await this.activityLogRepository.getUserWonGamesCount(userId);
166
-
167
- if (new Won3GamesAchievement(wonGamesCount).userGotAchievement()) {
168
- void this.giveAchievement(
169
- allAchievements,
170
- Won3GamesAchievement.code,
171
- foundUser,
172
- event.game,
173
- );
174
- }
175
- }
176
-
177
- if (
178
- this.userHasNoAchievement(
179
- usersAchievements,
180
- Won3ProfiAchievement.code,
181
- )
182
- ) {
183
- const wonProfiCount =
184
- await this.activityLogRepository.getUserWonProfiCount(userId);
185
- if (new Won3ProfiAchievement(wonProfiCount).userGotAchievement()) {
186
- void this.giveAchievement(
187
- allAchievements,
188
- Won3ProfiAchievement.code,
189
- foundUser,
190
- event.game,
191
- );
192
- }
193
- }
194
-
195
- if (
196
- this.userHasNoAchievement(
197
- usersAchievements,
198
- EarnOneMillionAchievement.code,
199
- )
200
- ) {
201
- if (
202
- new EarnOneMillionAchievement(
203
- foundUser.balance,
204
- ).userGotAchievement()
205
- ) {
206
- void this.giveAchievement(
207
- allAchievements,
208
- EarnOneMillionAchievement.code,
209
- foundUser,
210
- event.game,
211
- );
212
- }
213
- }
214
- } else if (event instanceof UserWonOneTableTournamentAppEvent) {
215
- if (
216
- this.userHasNoAchievement(
217
- usersAchievements,
218
- WonOneTableTournament3TimesAchievement.code,
219
- )
220
- ) {
221
- const wonFastTournamentCount =
222
- await this.activityLogRepository.getUserWonOneTableTournamentCount(
223
- userId,
224
- );
225
- if (
226
- new WonOneTableTournament3TimesAchievement(
227
- wonFastTournamentCount,
228
- ).userGotAchievement()
229
- ) {
230
- void this.giveAchievement(
231
- allAchievements,
232
- WonOneTableTournament3TimesAchievement.code,
233
- foundUser,
234
- event.game,
235
- );
236
- }
237
- }
238
- } else if (event instanceof UserWonManyTablesTournamentAppEvent) {
239
- if (
240
- this.userHasNoAchievement(
241
- usersAchievements,
242
- Take1PlaceOnManyTablesTournamentAchievement.code,
243
- )
244
- ) {
245
- if (
246
- new Take1PlaceOnManyTablesTournamentAchievement(
247
- event.rank,
248
- ).userGotAchievement()
249
- ) {
250
- void this.giveAchievement(
251
- allAchievements,
252
- Take1PlaceOnManyTablesTournamentAchievement.code,
253
- foundUser,
254
- event.game,
255
- );
256
- }
257
- }
258
-
259
- if (
260
- this.userHasNoAchievement(
261
- usersAchievements,
262
- Take2Or3PlaceOnManyTablesTournamentAchievement.code,
263
- )
264
- ) {
265
- if (
266
- new Take2Or3PlaceOnManyTablesTournamentAchievement(
267
- event.rank,
268
- ).userGotAchievement()
269
- ) {
270
- void this.giveAchievement(
271
- allAchievements,
272
- Take2Or3PlaceOnManyTablesTournamentAchievement.code,
273
- foundUser,
274
- event.game,
275
- );
276
- }
277
- }
135
+ protected async handleGamePlayerRoundFinishedAppEvent(
136
+ event: GamePlayerRoundFinishedAppEvent,
137
+ ) {
138
+ this.processEarnOneMillion(event);
139
+ await this.processFailNTimes(event);
140
+ await this.processPlayNTimes(event);
141
+ await this.processPlayNTimesADay(event);
142
+ await this.processWinNTimes(event);
143
+ this.processWinNTimesARow(event);
144
+ await this.processWinNProfi(event);
145
+ }
146
+
147
+ protected abstract handleGamePlayerMovedAppEvent(
148
+ event: GamePlayerMovedAppEvent,
149
+ );
150
+
151
+ protected handleGamePlayerManyTablesTournamentFinishedAppEvent(
152
+ event: GamePlayerManyTablesTournamentFinishedAppEvent,
153
+ ) {
154
+ this.processTakeNPlaceOnManyTablesTournament(event);
155
+ }
156
+
157
+ protected async handleGamePlayerOneTableTournamentFinishedAppEvent(
158
+ event: GamePlayerOneTableTournamentFinishedAppEvent,
159
+ ) {
160
+ await this.processWinNTimesOneTableTournament(event);
161
+ }
162
+
163
+ protected handleUserGotLevelUp(event: UserGotNewLevelAppEvent) {
164
+ const levelsAchievements = [
165
+ AchievementsCodesEnum.GLOBAL_GET_LEVEL_3,
166
+ AchievementsCodesEnum.GLOBAL_GET_LEVEL_10,
167
+ AchievementsCodesEnum.GLOBAL_GET_LEVEL_50,
168
+ AchievementsCodesEnum.GLOBAL_GET_LEVEL_100,
169
+ AchievementsCodesEnum.GLOBAL_GET_LEVEL_200,
170
+ AchievementsCodesEnum.GLOBAL_GET_LEVEL_300,
171
+ AchievementsCodesEnum.GLOBAL_GET_LEVEL_500,
172
+ AchievementsCodesEnum.GLOBAL_GET_LEVEL_1000,
173
+ ] as Array<string>;
174
+
175
+ for (const achievementCode of levelsAchievements) {
176
+ if (
177
+ this.achievemnts
178
+ .get(achievementCode)
179
+ ?.userGotAchievement(event.newLevel)
180
+ ) {
181
+ void this.giveAchievement(
182
+ achievementCode,
183
+ event.userId,
184
+ event.fullName,
185
+ event.game,
186
+ );
278
187
  }
279
188
  }
280
189
  }
281
190
 
282
- protected userHasNoAchievement(
283
- usersAchievements: Array<UsersAchievement>,
284
- achievementCode: string,
191
+ private processEarnOneMillion(event: GamePlayerRoundFinishedAppEvent) {
192
+ if (
193
+ this.achievemnts
194
+ .get(AchievementsCodesEnum.GLOBAL_EARN_ONE_MILLION)
195
+ ?.userGotAchievement(event.getPlayer().balance)
196
+ ) {
197
+ void this.giveAchievement(
198
+ AchievementsCodesEnum.GLOBAL_EARN_ONE_MILLION,
199
+ event.userId,
200
+ event.fullName,
201
+ event.game,
202
+ );
203
+ }
204
+ }
205
+
206
+ private async processFailNTimes(event: GamePlayerRoundFinishedAppEvent) {
207
+ const achievements = [
208
+ AchievementsCodesEnum.GB_FAIL_10_TIMES,
209
+ AchievementsCodesEnum.GB_FAIL_100_TIMES,
210
+ ] as Array<string>;
211
+
212
+ const failGamesCount =
213
+ await this.activityLogRepository.getUserFailedGamesCount(
214
+ event.userId,
215
+ event.game,
216
+ );
217
+
218
+ this.processManyGBAchievements(
219
+ achievements,
220
+ failGamesCount,
221
+ event.userId,
222
+ event.fullName,
223
+ event.game,
224
+ );
225
+ }
226
+
227
+ private async processPlayNTimes(event: GamePlayerRoundFinishedAppEvent) {
228
+ const achievements = [
229
+ AchievementsCodesEnum.GB_PLAY_1000_TIMES,
230
+ ] as Array<string>;
231
+
232
+ const playdGamesCount =
233
+ await this.activityLogRepository.getUserPlayedGamesCount(
234
+ event.userId,
235
+ event.game,
236
+ );
237
+
238
+ this.processManyGBAchievements(
239
+ achievements,
240
+ playdGamesCount,
241
+ event.userId,
242
+ event.fullName,
243
+ event.game,
244
+ );
245
+ }
246
+
247
+ private async processPlayNTimesADay(event: GamePlayerRoundFinishedAppEvent) {
248
+ const achievements = [
249
+ AchievementsCodesEnum.GB_PLAY_50_TIMES_A_DAY,
250
+ AchievementsCodesEnum.GB_PLAY_100_TIMES_A_DAY,
251
+ ] as Array<string>;
252
+
253
+ const playdGamesADayCount =
254
+ await this.activityLogRepository.getUserPlayedGamesADayCount(
255
+ event.userId,
256
+ event.game,
257
+ );
258
+
259
+ this.processManyGBAchievements(
260
+ achievements,
261
+ playdGamesADayCount,
262
+ event.userId,
263
+ event.fullName,
264
+ event.game,
265
+ );
266
+ }
267
+
268
+ private async processWinNTimes(event: GamePlayerRoundFinishedAppEvent) {
269
+ const achievements = [
270
+ AchievementsCodesEnum.GB_WIN_1_TIMES,
271
+ AchievementsCodesEnum.GB_WIN_10_TIMES,
272
+ AchievementsCodesEnum.GB_WIN_100_TIMES,
273
+ ] as Array<string>;
274
+
275
+ const wonGamesCount = await this.activityLogRepository.getUserWonGamesCount(
276
+ event.userId,
277
+ event.game,
278
+ );
279
+
280
+ this.processManyGBAchievements(
281
+ achievements,
282
+ wonGamesCount,
283
+ event.userId,
284
+ event.fullName,
285
+ event.game,
286
+ );
287
+ }
288
+
289
+ private processWinNTimesARow(event: GamePlayerRoundFinishedAppEvent) {
290
+ const achievements = [
291
+ AchievementsCodesEnum.GB_WIN_3_TIMES_A_ROW,
292
+ AchievementsCodesEnum.GB_WIN_10_TIMES_A_ROW,
293
+ ] as Array<string>;
294
+
295
+ this.processManyGBAchievements(
296
+ achievements,
297
+ event.getPlayer().getWinTimesARow(),
298
+ event.userId,
299
+ event.fullName,
300
+ event.game,
301
+ );
302
+ }
303
+
304
+ private async processWinNProfi(event: GamePlayerRoundFinishedAppEvent) {
305
+ const achievements = [
306
+ AchievementsCodesEnum.GB_WIN_3_PROFI,
307
+ ] as Array<string>;
308
+
309
+ const wonProfiCount = await this.activityLogRepository.getUserWonProfiCount(
310
+ event.userId,
311
+ event.game,
312
+ );
313
+
314
+ this.processManyGBAchievements(
315
+ achievements,
316
+ wonProfiCount,
317
+ event.userId,
318
+ event.fullName,
319
+ event.game,
320
+ );
321
+ }
322
+
323
+ private processTakeNPlaceOnManyTablesTournament(
324
+ event: GamePlayerManyTablesTournamentFinishedAppEvent,
325
+ ) {
326
+ const achievements = [
327
+ AchievementsCodesEnum.GB_TAKE_1_PLACE_ON_MANY_TABLES_TOURNAMENT,
328
+ AchievementsCodesEnum.GB_TAKE_2_OR_3_PLACE_AT_MANY_TABLES_TOURNAMENT,
329
+ ] as Array<string>;
330
+
331
+ const foundPlayer = event
332
+ .getRoomMaster<TournamentMaster>()
333
+ .getTournamentResult()
334
+ .find((player) => player.playerId == event.getPlayer().id);
335
+
336
+ this.processManyGBAchievements(
337
+ achievements,
338
+ foundPlayer?.rank ?? 0,
339
+ event.userId,
340
+ event.fullName,
341
+ event.game,
342
+ );
343
+ }
344
+
345
+ private async processWinNTimesOneTableTournament(
346
+ event: GamePlayerOneTableTournamentFinishedAppEvent,
285
347
  ) {
286
- return !usersAchievements.find(
287
- (item) => item.achievementCode === achievementCode,
348
+ const achievements = [
349
+ AchievementsCodesEnum.GB_WIN_ONE_TABLE_TOURNAMENT_3_TIMES,
350
+ ] as Array<string>;
351
+
352
+ const winCount =
353
+ await this.activityLogRepository.getUserWonOneTableTournamentCount(
354
+ event.userId,
355
+ event.game,
356
+ );
357
+
358
+ this.processManyGBAchievements(
359
+ achievements,
360
+ winCount,
361
+ event.userId,
362
+ event.fullName,
363
+ event.game,
288
364
  );
289
365
  }
290
366
 
291
367
  protected async giveAchievement(
292
- allAchievements: Array<Achievement>,
293
368
  achievementCode: string,
294
- user: User,
369
+ userId: string,
370
+ fullName: string,
295
371
  game: string,
296
372
  ) {
297
- const foundAchievement = allAchievements.find(
373
+ const foundAchievement = this.allAchievements.find(
298
374
  (item) => item.code === achievementCode,
299
375
  );
300
- const player = this.playersManager.getPlayerById(user.userId);
376
+ const player = this.playersManager.getPlayerById(userId);
377
+ const hasAchievemnt = this.usersAchievements
378
+ .get(userId)
379
+ ?.find((item) => item.achievementCode !== achievementCode);
301
380
 
302
- if (foundAchievement && player) {
381
+ if (foundAchievement && player && !hasAchievemnt) {
303
382
  await this.usersAchievementRepository.addUsersAchievement(
304
- user.userId,
305
- user.fullName,
383
+ userId,
384
+ fullName,
306
385
  foundAchievement.achievementId,
307
386
  foundAchievement.title[LanguageTypeEnum.RU],
308
- foundAchievement.code,
387
+ achievementCode,
309
388
  foundAchievement.prize,
310
- '',
389
+ game,
311
390
  );
312
391
 
313
392
  player.sendMessage(
314
393
  new SnackbarSendToPlayerWsEvent(
315
- game,
394
+ this.options.gameType,
316
395
  player.id,
317
- AppScreenIconEnum.EMOJI_EVENTS,
318
- foundAchievement.title[player.language],
319
- foundAchievement.description[player.language],
396
+ new AchievementSnackbarView(
397
+ this.options.i18n as LocalService,
398
+ player.language,
399
+ foundAchievement,
400
+ this.options.achievementBonus,
401
+ ).build(),
320
402
  ),
321
403
  );
322
404
  }
323
405
  }
406
+
407
+ protected gameTypedCode(achievementCode: string): string {
408
+ return `${this.options.gameType}_${achievementCode}`;
409
+ }
410
+
411
+ protected processManyGBAchievements(
412
+ achievements: Array<string>,
413
+ count: number,
414
+ userId: string,
415
+ fullName: string,
416
+ game: string,
417
+ ) {
418
+ for (const achievementCode of achievements) {
419
+ const gbCode = this.gameTypedCode(achievementCode);
420
+ if (this.achievemnts.get(gbCode)?.userGotAchievement(count)) {
421
+ void this.giveAchievement(gbCode, userId, fullName, game);
422
+ }
423
+ }
424
+ }
425
+
426
+ protected processOneUniqAchievement(
427
+ achievementCode: string,
428
+ count: number,
429
+ userId: string,
430
+ fullName: string,
431
+ game: string,
432
+ ) {
433
+ if (this.achievemnts.get(achievementCode)?.userGotAchievement(count)) {
434
+ void this.giveAchievement(achievementCode, userId, fullName, game);
435
+ }
436
+ }
324
437
  }
@@ -1 +1,6 @@
1
1
  export { BaseAchievementsModule } from './base-achievements.module';
2
+ export { BASE_ACHIEVEMENTS_OPTIONS } from './base-achievements.constants';
3
+ export {
4
+ BaseAchievementsOptions,
5
+ BaseAchievementsFactoryOptions,
6
+ } from './base-achievements.interfaces';
@@ -1,20 +1,20 @@
1
1
  import { Injectable } from '@nestjs/common';
2
- import { BaseAppEvent } from 'jp.ms.common.engine';
2
+ import { BaseUserAppEvent } from 'jp.ms.common.engine';
3
3
  import { Subject } from 'rxjs';
4
4
 
5
5
  @Injectable()
6
6
  export class EventsBusAppSubscribeService {
7
- private readonly appEventSubject: Subject<BaseAppEvent>;
7
+ private readonly appEventSubject: Subject<BaseUserAppEvent>;
8
8
 
9
9
  constructor() {
10
- this.appEventSubject = new Subject<BaseAppEvent>();
10
+ this.appEventSubject = new Subject<BaseUserAppEvent>();
11
11
  }
12
12
 
13
- pushNewEvent(event: BaseAppEvent) {
13
+ pushNewEvent(event: BaseUserAppEvent) {
14
14
  this.appEventSubject.next(event);
15
15
  }
16
16
 
17
- subscribe(onHandleAppEvent: (event: BaseAppEvent) => void) {
17
+ subscribe(onHandleAppEvent: (event: BaseUserAppEvent) => void) {
18
18
  this.appEventSubject.subscribe(onHandleAppEvent);
19
19
  }
20
20
  }
@@ -24,5 +24,10 @@ export {
24
24
  EventsBusModule,
25
25
  EventsBusMainTablesSubscribeService,
26
26
  } from './event-bus';
27
- export { BaseAchievementsModule } from './base-achievements/base-achievements.module';
27
+ export {
28
+ BaseAchievementsModule,
29
+ BaseAchievementsFactoryOptions,
30
+ BASE_ACHIEVEMENTS_OPTIONS,
31
+ BaseAchievementsOptions,
32
+ } from './base-achievements/';
28
33
  export { ConfirmationMessageManagerModule } from './confirmation-message-manager/confirmation-message-manager.module';