jp.ms.common.modules 1.0.40 → 1.0.41

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 (163) hide show
  1. package/dist/dto/app-table/bids-panel-item.dto.d.ts +6 -0
  2. package/dist/dto/app-table/bids-panel-item.dto.js +52 -0
  3. package/dist/dto/app-table/bids-panel-item.dto.js.map +1 -0
  4. package/dist/dto/app-table/bids-panel.dto.d.ts +7 -0
  5. package/dist/dto/app-table/bids-panel.dto.js +50 -0
  6. package/dist/dto/app-table/bids-panel.dto.js.map +1 -0
  7. package/dist/dto/app-table/index.d.ts +2 -0
  8. package/dist/dto/app-table/index.js +5 -1
  9. package/dist/dto/app-table/index.js.map +1 -1
  10. package/dist/dto/games/poker/poker-table.dto.d.ts +2 -1
  11. package/dist/dto/games/poker/poker-table.dto.js +6 -0
  12. package/dist/dto/games/poker/poker-table.dto.js.map +1 -1
  13. package/dist/modules/base-achievements/base-achievements.module.js +3 -3
  14. package/dist/modules/base-achievements/base-achievements.module.js.map +1 -1
  15. package/dist/modules/main/main.service.js +1 -1
  16. package/dist/modules/menu/menu-screen.view.js +1 -1
  17. package/dist/modules/menu/menu-screen.view.js.map +1 -1
  18. package/dist/modules/menu/menu.service.js +1 -1
  19. package/dist/modules/menu/menu.service.js.map +1 -1
  20. package/dist/tsconfig.tsbuildinfo +1 -1
  21. package/package.json +57 -57
  22. package/src/dto/app-screen/app-screen-app-bar.dto.ts +36 -36
  23. package/src/dto/app-screen/app-screen-dialog.dto.ts +64 -64
  24. package/src/dto/app-screen/app-screen-field-list-item.dto.ts +42 -42
  25. package/src/dto/app-screen/app-screen-field.dto.ts +59 -59
  26. package/src/dto/app-screen/app-screen-section-button.dto.ts +60 -60
  27. package/src/dto/app-screen/app-screen-section-buttons.dto.ts +14 -14
  28. package/src/dto/app-screen/app-screen-section-image.dto.ts +33 -33
  29. package/src/dto/app-screen/app-screen-section-list-item.dto.ts +105 -105
  30. package/src/dto/app-screen/app-screen-section-req.dto.ts +33 -33
  31. package/src/dto/app-screen/app-screen-section.dto.ts +76 -76
  32. package/src/dto/app-screen/app-screen.dto.ts +50 -50
  33. package/src/dto/app-screen/base-app-screen.dto.ts +16 -16
  34. package/src/dto/app-screen/index.ts +10 -10
  35. package/src/dto/app-table/bids-panel-item.dto.ts +33 -0
  36. package/src/dto/app-table/bids-panel.dto.ts +32 -0
  37. package/src/dto/app-table/card.dto.ts +54 -54
  38. package/src/dto/app-table/cards-deck.dto.ts +22 -22
  39. package/src/dto/app-table/cards-pair-slots-item.dto.ts +45 -45
  40. package/src/dto/app-table/cards-pair-slots.dto.ts +13 -13
  41. package/src/dto/app-table/cards-panel.dto.ts +48 -48
  42. package/src/dto/app-table/cards-player.dto.ts +14 -14
  43. package/src/dto/app-table/cards-slots-item.dto.ts +40 -40
  44. package/src/dto/app-table/cards-slots.dto.ts +13 -13
  45. package/src/dto/app-table/index.ts +15 -13
  46. package/src/dto/app-table/moves-panel-button.dto.ts +24 -24
  47. package/src/dto/app-table/moves-panel.dto.ts +23 -23
  48. package/src/dto/app-table/player.dto.ts +69 -69
  49. package/src/dto/app-table/summary-item.dto.ts +51 -51
  50. package/src/dto/app-table/summary.dto.ts +13 -13
  51. package/src/dto/common/find-free-table.dto.ts +3 -3
  52. package/src/dto/common/index.ts +2 -2
  53. package/src/dto/common/join-tournament.dto.ts +33 -33
  54. package/src/dto/common/log.dto.ts +9 -9
  55. package/src/dto/common/many-tables-tournament-create.dto.ts +125 -125
  56. package/src/dto/common/many-tables-tournament-update.dto.ts +3 -3
  57. package/src/dto/common/player-check-state.dto.ts +33 -33
  58. package/src/dto/common/player-connected.dto.ts +58 -58
  59. package/src/dto/games/fool/fool-player.dto.ts +3 -3
  60. package/src/dto/games/fool/fool-table.dto.ts +81 -81
  61. package/src/dto/games/index.ts +2 -2
  62. package/src/dto/games/poker/poker-player.dto.ts +3 -3
  63. package/src/dto/games/poker/poker-table.dto.ts +81 -76
  64. package/src/dto/index.ts +4 -4
  65. package/src/exception/error-code.enum.ts +4 -4
  66. package/src/exception/global-exception-filter.ts +53 -53
  67. package/src/exception/http-exception-wth-snackbar.ts +27 -27
  68. package/src/exception/index.ts +4 -4
  69. package/src/exception/not-enough-money-for-purchase.exception.ts +14 -14
  70. package/src/exception/not-found-free-room-for-fast-game.exception.ts +14 -14
  71. package/src/index.ts +4 -4
  72. package/src/modules/anti-freeze-system/anti-freeze-system.constants.ts +1 -1
  73. package/src/modules/anti-freeze-system/anti-freeze-system.interfaces.ts +20 -20
  74. package/src/modules/anti-freeze-system/anti-freeze-system.module.ts +55 -55
  75. package/src/modules/anti-freeze-system/anti-freeze-system.service.ts +105 -105
  76. package/src/modules/anti-freeze-system/index.ts +1 -1
  77. package/src/modules/base-achievements/base-achievements.module.ts +322 -322
  78. package/src/modules/base-achievements/index.ts +1 -1
  79. package/src/modules/event-bus/events-bus.app.subscribe.service.ts +20 -20
  80. package/src/modules/event-bus/events-bus.main-tables.subscribe.service.ts +34 -34
  81. package/src/modules/event-bus/events-bus.many-tables-tournament.subscribe.service.ts +6 -6
  82. package/src/modules/event-bus/events-bus.module.ts +23 -23
  83. package/src/modules/event-bus/events-bus.one-table-tournament.subscribe.service.ts +6 -6
  84. package/src/modules/event-bus/events-bus.tournament.subscribe.service.ts +18 -18
  85. package/src/modules/event-bus/index.ts +5 -5
  86. package/src/modules/events/events.constants.ts +1 -1
  87. package/src/modules/events/events.gateway.ts +70 -70
  88. package/src/modules/events/events.interfaces.ts +17 -17
  89. package/src/modules/events/events.module.ts +32 -32
  90. package/src/modules/events/index.ts +1 -1
  91. package/src/modules/index.ts +27 -27
  92. package/src/modules/logger/index.ts +2 -2
  93. package/src/modules/logger/jp-logger.module.ts +10 -10
  94. package/src/modules/logger/jp-logger.service.ts +38 -38
  95. package/src/modules/main/index.ts +1 -1
  96. package/src/modules/main/main-tables-list-screen.view.ts +275 -275
  97. package/src/modules/main/main.constants.ts +1 -1
  98. package/src/modules/main/main.controller.ts +72 -72
  99. package/src/modules/main/main.interfaces.ts +17 -17
  100. package/src/modules/main/main.module.ts +73 -73
  101. package/src/modules/main/main.service.ts +183 -183
  102. package/src/modules/many-tables-tournament/index.ts +1 -1
  103. package/src/modules/many-tables-tournament/many-tables-tournament-status-screen.view.ts +143 -143
  104. package/src/modules/many-tables-tournament/many-tables-tournament-tables-list-screen.view.ts +63 -63
  105. package/src/modules/many-tables-tournament/many-tables-tournament.constants.ts +3 -3
  106. package/src/modules/many-tables-tournament/many-tables-tournament.controller.ts +151 -151
  107. package/src/modules/many-tables-tournament/many-tables-tournament.interfaces.ts +20 -20
  108. package/src/modules/many-tables-tournament/many-tables-tournament.module.ts +80 -80
  109. package/src/modules/many-tables-tournament/many-tables-tournament.service.ts +208 -208
  110. package/src/modules/many-tables-tournament-rooms-manager/index.ts +2 -2
  111. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.constants.ts +3 -3
  112. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.ts +37 -37
  113. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.ts +84 -84
  114. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.ts +331 -331
  115. package/src/modules/menu/index.ts +1 -1
  116. package/src/modules/menu/menu-screen.view.ts +71 -71
  117. package/src/modules/menu/menu.constants.ts +1 -1
  118. package/src/modules/menu/menu.controller.ts +16 -16
  119. package/src/modules/menu/menu.interfaces.ts +17 -17
  120. package/src/modules/menu/menu.module.ts +39 -39
  121. package/src/modules/menu/menu.service.ts +39 -35
  122. package/src/modules/one-table-tournament/index.ts +1 -1
  123. package/src/modules/one-table-tournament/one-table-tournament-status-screen.view.ts +166 -166
  124. package/src/modules/one-table-tournament/one-table-tournament.constants.ts +3 -3
  125. package/src/modules/one-table-tournament/one-table-tournament.controller.ts +104 -104
  126. package/src/modules/one-table-tournament/one-table-tournament.interfaces.ts +20 -20
  127. package/src/modules/one-table-tournament/one-table-tournament.module.ts +76 -76
  128. package/src/modules/one-table-tournament/one-table-tournament.service.ts +146 -146
  129. package/src/modules/one-table-tournament-rooms-manager/index.ts +2 -2
  130. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.constants.ts +3 -3
  131. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.ts +31 -31
  132. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.ts +66 -66
  133. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.ts +220 -220
  134. package/src/modules/players-manager/index.ts +2 -2
  135. package/src/modules/players-manager/players-manager.module.ts +9 -9
  136. package/src/modules/players-manager/players-manager.service.ts +27 -27
  137. package/src/modules/simple-rooms/index.ts +1 -1
  138. package/src/modules/simple-rooms/simple-rooms.constants.ts +1 -1
  139. package/src/modules/simple-rooms/simple-rooms.controller.ts +63 -63
  140. package/src/modules/simple-rooms/simple-rooms.interfaces.ts +20 -20
  141. package/src/modules/simple-rooms/simple-rooms.module.ts +39 -39
  142. package/src/modules/simple-rooms/simple-rooms.service.ts +95 -95
  143. package/src/modules/simple-rooms-manager/index.ts +2 -2
  144. package/src/modules/simple-rooms-manager/simple-rooms-manager.constants.ts +3 -3
  145. package/src/modules/simple-rooms-manager/simple-rooms-manager.interfaces.ts +26 -26
  146. package/src/modules/simple-rooms-manager/simple-rooms-manager.module.ts +60 -60
  147. package/src/modules/simple-rooms-manager/simple-rooms-manager.service.ts +190 -190
  148. package/src/modules/support/dump.service.ts +11 -11
  149. package/src/modules/support/index.ts +1 -1
  150. package/src/modules/support/metric.service.ts +41 -41
  151. package/src/modules/support/support.constants.ts +1 -1
  152. package/src/modules/support/support.controller.ts +79 -79
  153. package/src/modules/support/support.interfaces.ts +16 -16
  154. package/src/modules/support/support.module.ts +35 -35
  155. package/src/modules/support/support.service.ts +27 -27
  156. package/src/utils/date.ts +7 -7
  157. package/src/utils/game-table-result.ts +129 -129
  158. package/src/views/index.ts +5 -5
  159. package/src/views/many-tables-tournament-conifrm-exit-dialog.view.ts +37 -37
  160. package/src/views/one-table-tournament-conifrm-exit-dialog.view.ts +37 -37
  161. package/src/views/simple-room-conifrm-exit-dialog.view.ts +37 -37
  162. package/src/views/table-summary.view.ts +104 -104
  163. package/src/views/tournament-buy-ticket-dialog.view.ts +34 -34
@@ -1,331 +1,331 @@
1
- import { InjectConnection } from '@nestjs/mongoose';
2
- import { Connection } from 'mongoose';
3
- import dayjs from 'dayjs';
4
- import schedule, { Job } from 'node-schedule';
5
- import {
6
- Inject,
7
- Injectable,
8
- InternalServerErrorException,
9
- } from '@nestjs/common';
10
- import {
11
- BaseGameEvent,
12
- GameMaster,
13
- GamePlayer,
14
- GameTableFinishedEvent,
15
- GameTournamentCancelledEvent,
16
- GameTournamentFinishedEvent,
17
- GameTournamentPlayerJoinedTheTournamentEvent,
18
- GameTournamentPlayerLeavedTheTournamentEvent,
19
- GameTournamentStartedEvent,
20
- GameTournamentWaitedEvent,
21
- LocalService,
22
- ManyTablesTournamentRoom,
23
- ManyTablesTournamentRoomConfig,
24
- NoStartStrategy,
25
- RoomUpdateStateEvent,
26
- TournamentMaster,
27
- } from 'jp.ms.common.engine';
28
- import {
29
- GameResultRepository,
30
- PurchaseRepository,
31
- ManyTablesTournamentRoomDocument,
32
- ManyTablesTournamentRoomsRepository,
33
- UsersRepository,
34
- } from 'jp.db.schemas';
35
-
36
- import {
37
- saveGameTablesResult,
38
- saveTournamentResult,
39
- } from '../../utils/game-table-result';
40
- import { JpLoggerService } from '../logger';
41
- import { getHours, getMinutes } from '../../utils/date';
42
- import { ManyTablesTournamentCreateDto } from '../../dto/common/many-tables-tournament-create.dto';
43
- import { ManyTablesTournamentUpdateDto } from '../../dto/common/many-tables-tournament-update.dto';
44
- import {
45
- EventsBusMainTablesSubscribeService,
46
- EventsBusManyTablesTournamentSubscribeService,
47
- } from '../event-bus';
48
-
49
- import { MANY_TABLES_TOURNAMENT_ROOMS_MANAGER_OPTIONS } from './many-tables-tournament-rooms-manager.constants';
50
- import { ManyTablesTournamentRoomsFactoryOptions } from './many-tables-tournament-rooms-manager.interfaces';
51
-
52
- @Injectable()
53
- export class ManyTablesTournamentRoomsManagerService {
54
- private readonly rooms: Map<string, ManyTablesTournamentRoom>;
55
- private createDailyTournamentJob: Job | null;
56
-
57
- constructor(
58
- private readonly tournamentRepository: ManyTablesTournamentRoomsRepository,
59
- private readonly usersRepository: UsersRepository,
60
- private readonly gameResultRepository: GameResultRepository,
61
- private readonly purchaseRepository: PurchaseRepository,
62
- private readonly eventsBusMainTablesSubscribeService: EventsBusMainTablesSubscribeService,
63
- private readonly eventsBusManyTablesTournamentSubscribeService: EventsBusManyTablesTournamentSubscribeService,
64
- @Inject(MANY_TABLES_TOURNAMENT_ROOMS_MANAGER_OPTIONS)
65
- private readonly options: ManyTablesTournamentRoomsFactoryOptions,
66
- @InjectConnection() private readonly connection: Connection,
67
- @Inject() private readonly logger: JpLoggerService,
68
- ) {
69
- this.rooms = new Map<string, ManyTablesTournamentRoom>();
70
- this.createDailyTournamentJob = null;
71
- }
72
-
73
- get gameType() {
74
- return this.options.gameType;
75
- }
76
-
77
- getRoomById(roomId: string): ManyTablesTournamentRoom | undefined {
78
- return this.rooms.get(roomId);
79
- }
80
-
81
- getRoomByTableId(tableId: string): ManyTablesTournamentRoom | undefined {
82
- const { roomId } = GameMaster.parseTableId(tableId);
83
-
84
- return this.getRoomById(roomId);
85
- }
86
-
87
- getRooms(): Array<ManyTablesTournamentRoom> {
88
- return Array.from(this.rooms.values());
89
- }
90
-
91
- getTables(): Array<GameMaster> {
92
- return this.getRooms().reduce((result, currentValue) => {
93
- return [...result, ...currentValue.getMasters()];
94
- }, [] as Array<GameMaster>);
95
- }
96
-
97
- addRoom(room: ManyTablesTournamentRoom) {
98
- this.rooms.set(room.getId(), room);
99
- }
100
-
101
- async hydrateTournamentsFromDB() {
102
- const templates = await this.tournamentRepository.findActualTournaments(
103
- this.gameType,
104
- );
105
- templates.forEach((item) => {
106
- this.addRoom(
107
- this.options.createTournamentRoom(
108
- this.manyTablesTournamentDocumentToTournamentRoom(item),
109
- ),
110
- );
111
- });
112
- }
113
-
114
- async runDailyTournamentJob() {
115
- if (
116
- this.options.dailyTournamentScheduleTaskTime &&
117
- this.options.dailyTournamentTime
118
- ) {
119
- await this.createDailyTournament(this.options.dailyTournamentTime);
120
-
121
- this.createDailyTournamentJob = schedule.scheduleJob(
122
- this.options.dailyTournamentScheduleTaskTime,
123
- () => this.createDailyTournament(this.options.dailyTournamentTime),
124
- );
125
- }
126
- }
127
-
128
- async createTournament(createTournamentDto: ManyTablesTournamentCreateDto) {
129
- const newTournament =
130
- await this.tournamentRepository.createTournament(createTournamentDto);
131
-
132
- this.addRoom(
133
- this.options.createTournamentRoom(
134
- this.manyTablesTournamentDocumentToTournamentRoom(newTournament),
135
- ),
136
- );
137
- }
138
-
139
- async updateTournament(
140
- tournamentId: string,
141
- updateTournamentDto: ManyTablesTournamentUpdateDto,
142
- ) {
143
- const updatedTournament = await this.tournamentRepository.updateTournament(
144
- tournamentId,
145
- updateTournamentDto,
146
- );
147
-
148
- this.getRoomById(tournamentId)
149
- ?.getRoomMaster<TournamentMaster>()
150
- .cancelTournament();
151
-
152
- this.addRoom(
153
- this.options.createTournamentRoom(
154
- this.manyTablesTournamentDocumentToTournamentRoom(updatedTournament),
155
- ),
156
- );
157
- }
158
-
159
- async removeTournament(tournamentId: string) {
160
- await this.tournamentRepository.removeTournament(tournamentId);
161
- }
162
-
163
- async buyTicket(tournamentId: string, player: GamePlayer) {
164
- const tournament = this.getRoomById(tournamentId);
165
- const user = await this.usersRepository.findById(player.id);
166
-
167
- if (!tournament || !user) {
168
- throw new InternalServerErrorException();
169
- }
170
-
171
- const session = await this.connection.startSession();
172
- session.startTransaction();
173
-
174
- try {
175
- player.decreaseBalance(tournament.getTicketPrice());
176
- tournament.addParticipant(player);
177
- void this.purchaseRepository.addManyTablesTournamentTicketPurchase(
178
- player.id,
179
- player.fullName,
180
- tournamentId,
181
- tournament.getTicketPrice(),
182
- tournament.getGameType(),
183
- );
184
- void this.usersRepository.subtractFromBalance(
185
- player.id,
186
- tournament.getTicketPrice(),
187
- );
188
-
189
- await this.tournamentRepository.addPlayerToParticipants(tournamentId, {
190
- playerId: player.id,
191
- playerAvatarUrl: player.avatarUrl,
192
- playerName: player.fullName,
193
- });
194
-
195
- await session.commitTransaction();
196
- } catch (error) {
197
- await session.abortTransaction();
198
- throw error;
199
- } finally {
200
- await session.endSession();
201
- }
202
- }
203
-
204
- private manyTablesTournamentDocumentToTournamentRoom(
205
- tournamentDocument: ManyTablesTournamentRoomDocument,
206
- ): ManyTablesTournamentRoomConfig {
207
- return {
208
- id: tournamentDocument.tournamentId,
209
- gameType: tournamentDocument.gameType,
210
- roomType: tournamentDocument.roomType,
211
- rulesType: tournamentDocument.rulesType,
212
- deckType: tournamentDocument.deckType,
213
- tableSize: tournamentDocument.tableSize,
214
- bet: tournamentDocument.bet,
215
- ticketPrice: tournamentDocument.ticketPrice,
216
- title: tournamentDocument.title,
217
- subtitle: tournamentDocument.subtitle,
218
- description: tournamentDocument.description,
219
- enableForFastGame: false,
220
- scheduleDate: tournamentDocument.scheduleDate,
221
- turnTimeout: this.options.playersTurnTimeout,
222
- restartTimeout: this.options.restartGameTimeout,
223
- instantFinishMode: this.options.instantFinishMode,
224
- minPlayersForMergeTables: this.options.minPlayersForMergeTables,
225
- localeService: this.options.i18n as LocalService,
226
- startStrategy: new NoStartStrategy(),
227
- onRoomEvent: this.handleRoomEvent,
228
- tournamentPrizeTable: this.options.tournamentPrizeTable,
229
- tournamentInitialStatus: tournamentDocument.status,
230
- tournamentWinners: tournamentDocument.winners,
231
- maxParticipants: tournamentDocument.maxParticipants,
232
- participants: tournamentDocument.participants,
233
- };
234
- }
235
-
236
- private handleRoomEvent = (event: BaseGameEvent) => {
237
- this.logger.log(event.toLog());
238
-
239
- if (event instanceof GameTableFinishedEvent) {
240
- void this.handleRoomTableGameFinished(event.master);
241
- } else if (event instanceof GameTournamentStartedEvent) {
242
- void this.handleTournamentRoomStarted(event.room.getRoomMaster());
243
- } else if (event instanceof GameTournamentCancelledEvent) {
244
- void this.handleTournamentRoomCancelled(event.room.getRoomMaster());
245
- } else if (event instanceof GameTournamentFinishedEvent) {
246
- void this.handleTournamentRoomFinished(event.room.getRoomMaster());
247
- } else if (
248
- event instanceof GameTournamentPlayerJoinedTheTournamentEvent ||
249
- event instanceof GameTournamentPlayerLeavedTheTournamentEvent ||
250
- event instanceof GameTournamentCancelledEvent ||
251
- event instanceof GameTournamentWaitedEvent ||
252
- event instanceof GameTournamentStartedEvent ||
253
- event instanceof GameTournamentFinishedEvent
254
- ) {
255
- void this.handleRoomStatusUpdated(
256
- new RoomUpdateStateEvent(event.gameType, event.roomId),
257
- );
258
- }
259
- };
260
-
261
- private handleRoomTableGameFinished = async (master: GameMaster) => {
262
- await saveGameTablesResult(
263
- master,
264
- this.connection,
265
- this.gameResultRepository,
266
- this.usersRepository,
267
- false,
268
- );
269
- };
270
-
271
- private handleTournamentRoomStarted = async (master: TournamentMaster) => {
272
- await this.tournamentRepository.startTournament(master.getTournamentId());
273
- };
274
-
275
- private handleTournamentRoomCancelled = async (master: TournamentMaster) => {
276
- await this.tournamentRepository.cancelTournament(master.getTournamentId());
277
- };
278
-
279
- private handleTournamentRoomFinished = async (master: TournamentMaster) => {
280
- await saveTournamentResult(
281
- master,
282
- this.connection,
283
- this.tournamentRepository,
284
- this.usersRepository,
285
- );
286
- };
287
-
288
- private handleRoomStatusUpdated = (event: RoomUpdateStateEvent) => {
289
- this.eventsBusMainTablesSubscribeService.pushNewRoomState(event);
290
- this.eventsBusManyTablesTournamentSubscribeService.pushNewRoomState(event);
291
- };
292
-
293
- private createDailyTournament = async (dailyTournamentTime: string) => {
294
- const hour = getHours(dailyTournamentTime);
295
- const minutes = getMinutes(dailyTournamentTime);
296
- const jobEveningDate = dayjs()
297
- .set('hour', hour)
298
- .set('minute', minutes)
299
- .set('second', 0);
300
- const addingDay = dayjs().isBefore(jobEveningDate) ? 0 : 1;
301
-
302
- const startDate = dayjs().add(addingDay, 'day').startOf('day');
303
- const endDate = dayjs().add(addingDay, 'day').endOf('day');
304
-
305
- const tournamentDate = dayjs()
306
- .add(addingDay, 'day')
307
- .set('hour', hour)
308
- .set('minute', minutes);
309
-
310
- const waitedTournament =
311
- await this.tournamentRepository.findWaitingTournamentByDate(
312
- this.gameType,
313
- startDate.toDate(),
314
- endDate.toDate(),
315
- );
316
-
317
- if (!waitedTournament) {
318
- const newTournament =
319
- await this.tournamentRepository.scheduleTournamentFromMasterTemplate(
320
- this.gameType,
321
- tournamentDate.toDate(),
322
- );
323
-
324
- this.addRoom(
325
- this.options.createTournamentRoom(
326
- this.manyTablesTournamentDocumentToTournamentRoom(newTournament),
327
- ),
328
- );
329
- }
330
- };
331
- }
1
+ import { InjectConnection } from '@nestjs/mongoose';
2
+ import { Connection } from 'mongoose';
3
+ import dayjs from 'dayjs';
4
+ import schedule, { Job } from 'node-schedule';
5
+ import {
6
+ Inject,
7
+ Injectable,
8
+ InternalServerErrorException,
9
+ } from '@nestjs/common';
10
+ import {
11
+ BaseGameEvent,
12
+ GameMaster,
13
+ GamePlayer,
14
+ GameTableFinishedEvent,
15
+ GameTournamentCancelledEvent,
16
+ GameTournamentFinishedEvent,
17
+ GameTournamentPlayerJoinedTheTournamentEvent,
18
+ GameTournamentPlayerLeavedTheTournamentEvent,
19
+ GameTournamentStartedEvent,
20
+ GameTournamentWaitedEvent,
21
+ LocalService,
22
+ ManyTablesTournamentRoom,
23
+ ManyTablesTournamentRoomConfig,
24
+ NoStartStrategy,
25
+ RoomUpdateStateEvent,
26
+ TournamentMaster,
27
+ } from 'jp.ms.common.engine';
28
+ import {
29
+ GameResultRepository,
30
+ PurchaseRepository,
31
+ ManyTablesTournamentRoomDocument,
32
+ ManyTablesTournamentRoomsRepository,
33
+ UsersRepository,
34
+ } from 'jp.db.schemas';
35
+
36
+ import {
37
+ saveGameTablesResult,
38
+ saveTournamentResult,
39
+ } from '../../utils/game-table-result';
40
+ import { JpLoggerService } from '../logger';
41
+ import { getHours, getMinutes } from '../../utils/date';
42
+ import { ManyTablesTournamentCreateDto } from '../../dto/common/many-tables-tournament-create.dto';
43
+ import { ManyTablesTournamentUpdateDto } from '../../dto/common/many-tables-tournament-update.dto';
44
+ import {
45
+ EventsBusMainTablesSubscribeService,
46
+ EventsBusManyTablesTournamentSubscribeService,
47
+ } from '../event-bus';
48
+
49
+ import { MANY_TABLES_TOURNAMENT_ROOMS_MANAGER_OPTIONS } from './many-tables-tournament-rooms-manager.constants';
50
+ import { ManyTablesTournamentRoomsFactoryOptions } from './many-tables-tournament-rooms-manager.interfaces';
51
+
52
+ @Injectable()
53
+ export class ManyTablesTournamentRoomsManagerService {
54
+ private readonly rooms: Map<string, ManyTablesTournamentRoom>;
55
+ private createDailyTournamentJob: Job | null;
56
+
57
+ constructor(
58
+ private readonly tournamentRepository: ManyTablesTournamentRoomsRepository,
59
+ private readonly usersRepository: UsersRepository,
60
+ private readonly gameResultRepository: GameResultRepository,
61
+ private readonly purchaseRepository: PurchaseRepository,
62
+ private readonly eventsBusMainTablesSubscribeService: EventsBusMainTablesSubscribeService,
63
+ private readonly eventsBusManyTablesTournamentSubscribeService: EventsBusManyTablesTournamentSubscribeService,
64
+ @Inject(MANY_TABLES_TOURNAMENT_ROOMS_MANAGER_OPTIONS)
65
+ private readonly options: ManyTablesTournamentRoomsFactoryOptions,
66
+ @InjectConnection() private readonly connection: Connection,
67
+ @Inject() private readonly logger: JpLoggerService,
68
+ ) {
69
+ this.rooms = new Map<string, ManyTablesTournamentRoom>();
70
+ this.createDailyTournamentJob = null;
71
+ }
72
+
73
+ get gameType() {
74
+ return this.options.gameType;
75
+ }
76
+
77
+ getRoomById(roomId: string): ManyTablesTournamentRoom | undefined {
78
+ return this.rooms.get(roomId);
79
+ }
80
+
81
+ getRoomByTableId(tableId: string): ManyTablesTournamentRoom | undefined {
82
+ const { roomId } = GameMaster.parseTableId(tableId);
83
+
84
+ return this.getRoomById(roomId);
85
+ }
86
+
87
+ getRooms(): Array<ManyTablesTournamentRoom> {
88
+ return Array.from(this.rooms.values());
89
+ }
90
+
91
+ getTables(): Array<GameMaster> {
92
+ return this.getRooms().reduce((result, currentValue) => {
93
+ return [...result, ...currentValue.getMasters()];
94
+ }, [] as Array<GameMaster>);
95
+ }
96
+
97
+ addRoom(room: ManyTablesTournamentRoom) {
98
+ this.rooms.set(room.getId(), room);
99
+ }
100
+
101
+ async hydrateTournamentsFromDB() {
102
+ const templates = await this.tournamentRepository.findActualTournaments(
103
+ this.gameType,
104
+ );
105
+ templates.forEach((item) => {
106
+ this.addRoom(
107
+ this.options.createTournamentRoom(
108
+ this.manyTablesTournamentDocumentToTournamentRoom(item),
109
+ ),
110
+ );
111
+ });
112
+ }
113
+
114
+ async runDailyTournamentJob() {
115
+ if (
116
+ this.options.dailyTournamentScheduleTaskTime &&
117
+ this.options.dailyTournamentTime
118
+ ) {
119
+ await this.createDailyTournament(this.options.dailyTournamentTime);
120
+
121
+ this.createDailyTournamentJob = schedule.scheduleJob(
122
+ this.options.dailyTournamentScheduleTaskTime,
123
+ () => this.createDailyTournament(this.options.dailyTournamentTime),
124
+ );
125
+ }
126
+ }
127
+
128
+ async createTournament(createTournamentDto: ManyTablesTournamentCreateDto) {
129
+ const newTournament =
130
+ await this.tournamentRepository.createTournament(createTournamentDto);
131
+
132
+ this.addRoom(
133
+ this.options.createTournamentRoom(
134
+ this.manyTablesTournamentDocumentToTournamentRoom(newTournament),
135
+ ),
136
+ );
137
+ }
138
+
139
+ async updateTournament(
140
+ tournamentId: string,
141
+ updateTournamentDto: ManyTablesTournamentUpdateDto,
142
+ ) {
143
+ const updatedTournament = await this.tournamentRepository.updateTournament(
144
+ tournamentId,
145
+ updateTournamentDto,
146
+ );
147
+
148
+ this.getRoomById(tournamentId)
149
+ ?.getRoomMaster<TournamentMaster>()
150
+ .cancelTournament();
151
+
152
+ this.addRoom(
153
+ this.options.createTournamentRoom(
154
+ this.manyTablesTournamentDocumentToTournamentRoom(updatedTournament),
155
+ ),
156
+ );
157
+ }
158
+
159
+ async removeTournament(tournamentId: string) {
160
+ await this.tournamentRepository.removeTournament(tournamentId);
161
+ }
162
+
163
+ async buyTicket(tournamentId: string, player: GamePlayer) {
164
+ const tournament = this.getRoomById(tournamentId);
165
+ const user = await this.usersRepository.findById(player.id);
166
+
167
+ if (!tournament || !user) {
168
+ throw new InternalServerErrorException();
169
+ }
170
+
171
+ const session = await this.connection.startSession();
172
+ session.startTransaction();
173
+
174
+ try {
175
+ player.decreaseBalance(tournament.getTicketPrice());
176
+ tournament.addParticipant(player);
177
+ void this.purchaseRepository.addManyTablesTournamentTicketPurchase(
178
+ player.id,
179
+ player.fullName,
180
+ tournamentId,
181
+ tournament.getTicketPrice(),
182
+ tournament.getGameType(),
183
+ );
184
+ void this.usersRepository.subtractFromBalance(
185
+ player.id,
186
+ tournament.getTicketPrice(),
187
+ );
188
+
189
+ await this.tournamentRepository.addPlayerToParticipants(tournamentId, {
190
+ playerId: player.id,
191
+ playerAvatarUrl: player.avatarUrl,
192
+ playerName: player.fullName,
193
+ });
194
+
195
+ await session.commitTransaction();
196
+ } catch (error) {
197
+ await session.abortTransaction();
198
+ throw error;
199
+ } finally {
200
+ await session.endSession();
201
+ }
202
+ }
203
+
204
+ private manyTablesTournamentDocumentToTournamentRoom(
205
+ tournamentDocument: ManyTablesTournamentRoomDocument,
206
+ ): ManyTablesTournamentRoomConfig {
207
+ return {
208
+ id: tournamentDocument.tournamentId,
209
+ gameType: tournamentDocument.gameType,
210
+ roomType: tournamentDocument.roomType,
211
+ rulesType: tournamentDocument.rulesType,
212
+ deckType: tournamentDocument.deckType,
213
+ tableSize: tournamentDocument.tableSize,
214
+ bet: tournamentDocument.bet,
215
+ ticketPrice: tournamentDocument.ticketPrice,
216
+ title: tournamentDocument.title,
217
+ subtitle: tournamentDocument.subtitle,
218
+ description: tournamentDocument.description,
219
+ enableForFastGame: false,
220
+ scheduleDate: tournamentDocument.scheduleDate,
221
+ turnTimeout: this.options.playersTurnTimeout,
222
+ restartTimeout: this.options.restartGameTimeout,
223
+ instantFinishMode: this.options.instantFinishMode,
224
+ minPlayersForMergeTables: this.options.minPlayersForMergeTables,
225
+ localeService: this.options.i18n as LocalService,
226
+ startStrategy: new NoStartStrategy(),
227
+ onRoomEvent: this.handleRoomEvent,
228
+ tournamentPrizeTable: this.options.tournamentPrizeTable,
229
+ tournamentInitialStatus: tournamentDocument.status,
230
+ tournamentWinners: tournamentDocument.winners,
231
+ maxParticipants: tournamentDocument.maxParticipants,
232
+ participants: tournamentDocument.participants,
233
+ };
234
+ }
235
+
236
+ private handleRoomEvent = (event: BaseGameEvent) => {
237
+ this.logger.log(event.toLog());
238
+
239
+ if (event instanceof GameTableFinishedEvent) {
240
+ void this.handleRoomTableGameFinished(event.master);
241
+ } else if (event instanceof GameTournamentStartedEvent) {
242
+ void this.handleTournamentRoomStarted(event.room.getRoomMaster());
243
+ } else if (event instanceof GameTournamentCancelledEvent) {
244
+ void this.handleTournamentRoomCancelled(event.room.getRoomMaster());
245
+ } else if (event instanceof GameTournamentFinishedEvent) {
246
+ void this.handleTournamentRoomFinished(event.room.getRoomMaster());
247
+ } else if (
248
+ event instanceof GameTournamentPlayerJoinedTheTournamentEvent ||
249
+ event instanceof GameTournamentPlayerLeavedTheTournamentEvent ||
250
+ event instanceof GameTournamentCancelledEvent ||
251
+ event instanceof GameTournamentWaitedEvent ||
252
+ event instanceof GameTournamentStartedEvent ||
253
+ event instanceof GameTournamentFinishedEvent
254
+ ) {
255
+ void this.handleRoomStatusUpdated(
256
+ new RoomUpdateStateEvent(event.gameType, event.roomId),
257
+ );
258
+ }
259
+ };
260
+
261
+ private handleRoomTableGameFinished = async (master: GameMaster) => {
262
+ await saveGameTablesResult(
263
+ master,
264
+ this.connection,
265
+ this.gameResultRepository,
266
+ this.usersRepository,
267
+ false,
268
+ );
269
+ };
270
+
271
+ private handleTournamentRoomStarted = async (master: TournamentMaster) => {
272
+ await this.tournamentRepository.startTournament(master.getTournamentId());
273
+ };
274
+
275
+ private handleTournamentRoomCancelled = async (master: TournamentMaster) => {
276
+ await this.tournamentRepository.cancelTournament(master.getTournamentId());
277
+ };
278
+
279
+ private handleTournamentRoomFinished = async (master: TournamentMaster) => {
280
+ await saveTournamentResult(
281
+ master,
282
+ this.connection,
283
+ this.tournamentRepository,
284
+ this.usersRepository,
285
+ );
286
+ };
287
+
288
+ private handleRoomStatusUpdated = (event: RoomUpdateStateEvent) => {
289
+ this.eventsBusMainTablesSubscribeService.pushNewRoomState(event);
290
+ this.eventsBusManyTablesTournamentSubscribeService.pushNewRoomState(event);
291
+ };
292
+
293
+ private createDailyTournament = async (dailyTournamentTime: string) => {
294
+ const hour = getHours(dailyTournamentTime);
295
+ const minutes = getMinutes(dailyTournamentTime);
296
+ const jobEveningDate = dayjs()
297
+ .set('hour', hour)
298
+ .set('minute', minutes)
299
+ .set('second', 0);
300
+ const addingDay = dayjs().isBefore(jobEveningDate) ? 0 : 1;
301
+
302
+ const startDate = dayjs().add(addingDay, 'day').startOf('day');
303
+ const endDate = dayjs().add(addingDay, 'day').endOf('day');
304
+
305
+ const tournamentDate = dayjs()
306
+ .add(addingDay, 'day')
307
+ .set('hour', hour)
308
+ .set('minute', minutes);
309
+
310
+ const waitedTournament =
311
+ await this.tournamentRepository.findWaitingTournamentByDate(
312
+ this.gameType,
313
+ startDate.toDate(),
314
+ endDate.toDate(),
315
+ );
316
+
317
+ if (!waitedTournament) {
318
+ const newTournament =
319
+ await this.tournamentRepository.scheduleTournamentFromMasterTemplate(
320
+ this.gameType,
321
+ tournamentDate.toDate(),
322
+ );
323
+
324
+ this.addRoom(
325
+ this.options.createTournamentRoom(
326
+ this.manyTablesTournamentDocumentToTournamentRoom(newTournament),
327
+ ),
328
+ );
329
+ }
330
+ };
331
+ }
@@ -1 +1 @@
1
- export { MenuModule } from './menu.module';
1
+ export { MenuModule } from './menu.module';