jp.ms.common.modules 1.0.54 → 1.0.55

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 (38) hide show
  1. package/dist/modules/main/main-tables-list-screen.view.js +5 -2
  2. package/dist/modules/main/main-tables-list-screen.view.js.map +1 -1
  3. package/dist/modules/many-tables-tournament/many-tables-tournament.controller.d.ts +2 -2
  4. package/dist/modules/many-tables-tournament/many-tables-tournament.controller.js +2 -3
  5. package/dist/modules/many-tables-tournament/many-tables-tournament.controller.js.map +1 -1
  6. package/dist/modules/many-tables-tournament/many-tables-tournament.module.js +4 -0
  7. package/dist/modules/many-tables-tournament/many-tables-tournament.module.js.map +1 -1
  8. package/dist/modules/many-tables-tournament/many-tables-tournament.service.d.ts +5 -4
  9. package/dist/modules/many-tables-tournament/many-tables-tournament.service.js +21 -6
  10. package/dist/modules/many-tables-tournament/many-tables-tournament.service.js.map +1 -1
  11. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.d.ts +2 -0
  12. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.js +3 -0
  13. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.js.map +1 -1
  14. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.d.ts +5 -0
  15. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.js +38 -3
  16. package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.js.map +1 -1
  17. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.d.ts +2 -0
  18. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.d.ts +3 -2
  19. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.js +15 -2
  20. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.js.map +1 -1
  21. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.d.ts +10 -2
  22. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.js +53 -7
  23. package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.js.map +1 -1
  24. package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.js +1 -1
  25. package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.js.map +1 -1
  26. package/dist/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +3 -3
  28. package/src/modules/main/main-tables-list-screen.view.ts +9 -2
  29. package/src/modules/many-tables-tournament/many-tables-tournament.controller.ts +2 -2
  30. package/src/modules/many-tables-tournament/many-tables-tournament.module.ts +7 -0
  31. package/src/modules/many-tables-tournament/many-tables-tournament.service.ts +38 -7
  32. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.ts +2 -0
  33. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.ts +3 -0
  34. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.ts +60 -3
  35. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.ts +2 -0
  36. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.ts +24 -2
  37. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.ts +69 -1
  38. package/src/modules/simple-rooms-manager/simple-rooms-manager.service.ts +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jp.ms.common.modules",
3
- "version": "1.0.54",
3
+ "version": "1.0.55",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,8 +15,8 @@
15
15
  "dayjs": "1.11.18",
16
16
  "jp.common.models": "1.1.61",
17
17
  "jp.common.utils": "1.0.9",
18
- "jp.db.schemas": "2.2.17",
19
- "jp.ms.common.engine": "3.0.33",
18
+ "jp.db.schemas": "2.2.25",
19
+ "jp.ms.common.engine": "3.0.34",
20
20
  "mongoose": "9.1.5",
21
21
  "nestjs-i18n": "10.5.1",
22
22
  "node-schedule": "2.1.1",
@@ -123,7 +123,11 @@ export class MainTablesListScreenView extends UniversalScreenView {
123
123
  this.getOneTableTournamentIcon(room),
124
124
  true,
125
125
  true,
126
- AppScreenRouter.getOneTableTournamentStatusPath(room.getId()),
126
+ room.getRoomMaster<TournamentMaster>().isInProgress()
127
+ ? AppScreenRouter.getOneTableTournamentTablePath(
128
+ room.getFirstMaster()?.getTable().getId() ?? '',
129
+ )
130
+ : AppScreenRouter.getOneTableTournamentStatusPath(room.getId()),
127
131
  ),
128
132
  );
129
133
  }
@@ -251,7 +255,10 @@ export class MainTablesListScreenView extends UniversalScreenView {
251
255
  }
252
256
 
253
257
  private getManyTablesTournamenButtons(tournament: ManyTablesTournamentRoom) {
254
- if (tournament.isParticipant(this.playerId)) {
258
+ if (
259
+ tournament.isParticipant(this.playerId) ||
260
+ tournament.getRoomMaster<TournamentMaster>().isInProgress()
261
+ ) {
255
262
  return new PrimaryButtonButtonsComponent(
256
263
  new TextButtonComponent(
257
264
  this.localeService.t(
@@ -104,7 +104,7 @@ export class ManyTablesTournamentController {
104
104
  joinTournament(
105
105
  @Param('tournamentId') tournamentId: string,
106
106
  @Headers() headers: IAppHeaders,
107
- ): JoinTournamentDto {
107
+ ): Promise<JoinTournamentDto> {
108
108
  return this.tournamentService.joinTournament(
109
109
  tournamentId,
110
110
  headers.client_auth_token,
@@ -116,7 +116,7 @@ export class ManyTablesTournamentController {
116
116
  leaveTournament(
117
117
  @Param('tournamentId') tournamentId: string,
118
118
  @Headers() headers: IAppHeaders,
119
- ): void {
119
+ ): Promise<void> {
120
120
  return this.tournamentService.leaveTournament(
121
121
  tournamentId,
122
122
  headers.client_auth_token,
@@ -4,6 +4,9 @@ import {
4
4
  ManyTablesTournamentRoom,
5
5
  ManyTablesTournamentRoomSchema,
6
6
  ManyTablesTournamentRoomsRepository,
7
+ Purchase,
8
+ PurchaseRepository,
9
+ PurchaseSchema,
7
10
  User,
8
11
  UserSchema,
9
12
  UsersRepository,
@@ -31,12 +34,16 @@ import { ManyTablesTournamentModuleOptions } from './many-tables-tournament.inte
31
34
  },
32
35
  ]),
33
36
  MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
37
+ MongooseModule.forFeature([
38
+ { name: Purchase.name, schema: PurchaseSchema },
39
+ ]),
34
40
  ],
35
41
  controllers: [ManyTablesTournamentController],
36
42
  providers: [
37
43
  ManyTablesTournamentService,
38
44
  ManyTablesTournamentRoomsRepository,
39
45
  UsersRepository,
46
+ PurchaseRepository,
40
47
  ],
41
48
  })
42
49
  export class ManyTablesTournamentModule {
@@ -13,7 +13,7 @@ import {
13
13
  ManyTablesTournamentMaster,
14
14
  TournamentMaster,
15
15
  } from 'jp.ms.common.engine';
16
- import { UsersRepository } from 'jp.db.schemas';
16
+ import { PurchaseRepository, UsersRepository } from 'jp.db.schemas';
17
17
 
18
18
  import { BaseAppScreenDto } from '../../dto';
19
19
  import { ManyTablesTournamentRoomsManagerService } from '../many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service';
@@ -39,6 +39,7 @@ export class ManyTablesTournamentService {
39
39
  @Inject(MANY_TABLES_TOURNAMENT_OPTIONS)
40
40
  private readonly options: ManyTablesTournamentFactoryOptions,
41
41
  private readonly usersRepository: UsersRepository,
42
+ private readonly purchaseRepository: PurchaseRepository,
42
43
  ) {}
43
44
 
44
45
  getStatusScreen(
@@ -139,26 +140,32 @@ export class ManyTablesTournamentService {
139
140
  throw new InternalServerErrorException();
140
141
  }
141
142
 
142
- joinTournament(
143
+ async joinTournament(
143
144
  tournamentId: string,
144
145
  clientAuthToken: string,
145
- ): JoinTournamentDto {
146
+ ): Promise<JoinTournamentDto> {
146
147
  const player = this.playersManager.getPlayerById(clientAuthToken);
147
148
  const tournament =
148
149
  this.manyTablesRoomsManagerService.getRoomByTableId(tournamentId);
150
+ const ticket = await this.purchaseRepository.getManyTablesTournamentTicket(
151
+ tournamentId,
152
+ player?.id ?? '',
153
+ );
149
154
 
150
155
  if (player && tournament) {
151
- tournament.handleJoinTournament(player);
152
-
153
156
  if (tournament.getRoomMaster<TournamentMaster>().isInProgress()) {
154
157
  if (player.isPlayer() || player.isTableQueuer()) {
158
+ tournament.handleJoinTournament(player);
159
+
155
160
  return JoinTournamentDto.fromEntities(
156
161
  AppScreenRouter.getManyTablesTournamentTablePath(
157
162
  player.tableId ?? '',
158
163
  ),
159
164
  player.id,
160
165
  );
161
- } else if (tournament.isParticipant(player.id)) {
166
+ } else if (tournament.isParticipant(player.id) && ticket?.amount) {
167
+ player.stack = ticket.amount;
168
+
162
169
  tournament
163
170
  .getRoomMaster<ManyTablesTournamentMaster>()
164
171
  .onTournamentProcessAlonePlayer(tournament.getRoomMaster(), player);
@@ -175,6 +182,13 @@ export class ManyTablesTournamentService {
175
182
  player.id,
176
183
  );
177
184
  }
185
+ } else if (tournament.getRoomMaster<TournamentMaster>().isWaiting()) {
186
+ tournament.handleJoinTournament(player);
187
+
188
+ return JoinTournamentDto.fromEntities(
189
+ AppScreenRouter.getManyTablesTournamentStatusPath(tournament.getId()),
190
+ player.id,
191
+ );
178
192
  } else {
179
193
  return JoinTournamentDto.fromEntities(
180
194
  AppScreenRouter.getManyTablesTournamentStatusPath(tournament.getId()),
@@ -186,7 +200,10 @@ export class ManyTablesTournamentService {
186
200
  throw new InternalServerErrorException();
187
201
  }
188
202
 
189
- leaveTournament(tournamentId: string, clientAuthToken: string): void {
203
+ async leaveTournament(
204
+ tournamentId: string,
205
+ clientAuthToken: string,
206
+ ): Promise<void> {
190
207
  const player = this.playersManager.getPlayerById(clientAuthToken);
191
208
  const tournament =
192
209
  this.manyTablesRoomsManagerService.getRoomByTableId(tournamentId);
@@ -195,6 +212,20 @@ export class ManyTablesTournamentService {
195
212
  throw new InternalServerErrorException();
196
213
  }
197
214
 
215
+ if (tournament.isParticipant(player.id) && player.isPlayer()) {
216
+ const ticket =
217
+ await this.purchaseRepository.getManyTablesTournamentTicket(
218
+ tournament.getId(),
219
+ player.id,
220
+ );
221
+
222
+ if (ticket) {
223
+ await this.purchaseRepository.cancelManyTablesTournamentTicket(
224
+ ticket.purchaseId,
225
+ );
226
+ }
227
+ }
228
+
198
229
  tournament.handleLeaveTournament(player);
199
230
  }
200
231
 
@@ -35,4 +35,6 @@ export interface ManyTablesTournamentRoomsFactoryOptions {
35
35
  dailyTournamentTime: string;
36
36
  minPlayersForMergeTables: number;
37
37
  levelUpBonus: number;
38
+ purgeRoomsEnabled: boolean;
39
+ purgeRoomsTime: string;
38
40
  }
@@ -91,6 +91,9 @@ export class ManyTablesTournamentRoomsManagerModule {
91
91
  if (this.options.dailyTournamentScheduleJobEnabled) {
92
92
  await this.managerService.runDailyTournamentJob();
93
93
  }
94
+ if (this.options.purgeRoomsEnabled) {
95
+ this.managerService.runPurgeRoomsJob();
96
+ }
94
97
  await this.managerService.hydrateTournamentsFromDB();
95
98
  }
96
99
  }
@@ -55,6 +55,7 @@ import { ManyTablesTournamentRoomsFactoryOptions } from './many-tables-tournamen
55
55
  export class ManyTablesTournamentRoomsManagerService extends TournamentRoomsManagerService {
56
56
  private readonly rooms: Map<string, ManyTablesTournamentRoom>;
57
57
  private createDailyTournamentJob: Job | null;
58
+ private purgeRoomsJob: Job;
58
59
 
59
60
  constructor(
60
61
  private readonly tournamentRepository: ManyTablesTournamentRoomsRepository,
@@ -84,6 +85,10 @@ export class ManyTablesTournamentRoomsManagerService extends TournamentRoomsMana
84
85
  return this.rooms.get(roomId);
85
86
  }
86
87
 
88
+ removeRoom(roomId: string) {
89
+ this.rooms.delete(roomId);
90
+ }
91
+
87
92
  getRoomByTableId(tableId: string): ManyTablesTournamentRoom | undefined {
88
93
  const { roomId } = GameMaster.parseTableId(tableId);
89
94
 
@@ -131,6 +136,31 @@ export class ManyTablesTournamentRoomsManagerService extends TournamentRoomsMana
131
136
  }
132
137
  }
133
138
 
139
+ runPurgeRoomsJob() {
140
+ const purgeRoomsTime = this.options.purgeRoomsTime;
141
+
142
+ if (purgeRoomsTime) {
143
+ this.logger.log(
144
+ `${ManyTablesTournamentRoomsManagerService.name}: runPurgeRoomsJob`,
145
+ );
146
+
147
+ this.purgeRoomsJob = schedule.scheduleJob(purgeRoomsTime, () =>
148
+ this.purgeRooms(),
149
+ );
150
+ }
151
+ }
152
+
153
+ purgeRooms() {
154
+ for (const room of this.getRooms()) {
155
+ if (!room.isActual()) {
156
+ this.removeRoom(room.getId());
157
+ this.logger.log(
158
+ `${ManyTablesTournamentRoomsManagerService.name}: removeRoom: ${room.getId()}`,
159
+ );
160
+ }
161
+ }
162
+ }
163
+
134
164
  async createTournament(createTournamentDto: ManyTablesTournamentCreateDto) {
135
165
  const newTournament =
136
166
  await this.tournamentRepository.createTournament(createTournamentDto);
@@ -237,6 +267,7 @@ export class ManyTablesTournamentRoomsManagerService extends TournamentRoomsMana
237
267
  tournamentWinners: tournamentDocument.winners,
238
268
  maxParticipants: tournamentDocument.maxParticipants,
239
269
  participants: tournamentDocument.participants,
270
+ finishDate: tournamentDocument.finishDate,
240
271
  };
241
272
  }
242
273
 
@@ -284,7 +315,13 @@ export class ManyTablesTournamentRoomsManagerService extends TournamentRoomsMana
284
315
  this.handleRoomStatusUpdated(event as GameTournamentFinishedEvent);
285
316
  break;
286
317
  }
287
- case GamePlayerKickedOutTheTableEvent.name:
318
+ case GamePlayerKickedOutTheTableEvent.name: {
319
+ void this.handleGamePlayerKickedOutTheTable(
320
+ event as GamePlayerKickedOutTheTableEvent,
321
+ );
322
+ this.handleRoomStatusUpdated(event as GamePlayerKickedOutTheTableEvent);
323
+ break;
324
+ }
288
325
  case GameTournamentPlayerJoinedTheTournamentEvent.name:
289
326
  case GameTournamentPlayerLeavedTheTournamentEvent.name:
290
327
  case GameTournamentWaitedEvent.name: {
@@ -292,8 +329,7 @@ export class ManyTablesTournamentRoomsManagerService extends TournamentRoomsMana
292
329
  event as
293
330
  | GameTournamentPlayerJoinedTheTournamentEvent
294
331
  | GameTournamentPlayerLeavedTheTournamentEvent
295
- | GameTournamentCancelledEvent
296
- | GamePlayerKickedOutTheTableEvent,
332
+ | GameTournamentCancelledEvent,
297
333
  );
298
334
  break;
299
335
  }
@@ -327,6 +363,27 @@ export class ManyTablesTournamentRoomsManagerService extends TournamentRoomsMana
327
363
  );
328
364
  };
329
365
 
366
+ private handleGamePlayerKickedOutTheTable = async (
367
+ event: GamePlayerKickedOutTheTableEvent,
368
+ ) => {
369
+ const tournament = this.getRoomById(event.roomId);
370
+ if (tournament?.isParticipant(event.playerId)) {
371
+ const ticket =
372
+ await this.purchaseRepository.getManyTablesTournamentTicket(
373
+ event.roomId,
374
+ event.playerId,
375
+ );
376
+
377
+ if (ticket) {
378
+ await this.purchaseRepository.cancelManyTablesTournamentTicket(
379
+ ticket.purchaseId,
380
+ );
381
+ }
382
+
383
+ tournament.handleLeaveTournament(event.player);
384
+ }
385
+ };
386
+
330
387
  private handleRoomStatusUpdated = (
331
388
  event:
332
389
  | GameTournamentPlayerJoinedTheTournamentEvent
@@ -29,4 +29,6 @@ export interface OneTableTournamentRoomsFactoryOptions {
29
29
  instantFinishMode: boolean;
30
30
  tournamentPrizeTable: IPrizeTableData;
31
31
  levelUpBonus: number;
32
+ purgeRoomsEnabled: boolean;
33
+ purgeRoomsTime: string;
32
34
  }
@@ -1,4 +1,10 @@
1
- import { DynamicModule, Global, Module, Provider } from '@nestjs/common';
1
+ import {
2
+ DynamicModule,
3
+ Global,
4
+ Inject,
5
+ Module,
6
+ Provider,
7
+ } from '@nestjs/common';
2
8
  import { MongooseModule } from '@nestjs/mongoose';
3
9
  import {
4
10
  OneTableTournamentRoom,
@@ -16,10 +22,16 @@ import {
16
22
  ActivityLog,
17
23
  ActivityLogRepository,
18
24
  ActivityLogSchema,
25
+ Purchase,
26
+ PurchaseRepository,
27
+ PurchaseSchema,
19
28
  } from 'jp.db.schemas';
20
29
 
21
30
  import { OneTableTournamentRoomsManagerService } from './one-table-tournament-rooms-manager.service';
22
- import { OneTableTournamentRoomsManagerOptions } from './one-table-tournament-rooms-manager.interfaces';
31
+ import {
32
+ OneTableTournamentRoomsFactoryOptions,
33
+ OneTableTournamentRoomsManagerOptions,
34
+ } from './one-table-tournament-rooms-manager.interfaces';
23
35
  import { ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS } from './one-table-tournament-rooms-manager.constants';
24
36
 
25
37
  @Global()
@@ -39,6 +51,9 @@ import { ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS } from './one-table-tourname
39
51
  MongooseModule.forFeature([
40
52
  { name: ActivityLog.name, schema: ActivityLogSchema },
41
53
  ]),
54
+ MongooseModule.forFeature([
55
+ { name: Purchase.name, schema: PurchaseSchema },
56
+ ]),
42
57
  ],
43
58
  providers: [
44
59
  OneTableTournamentRoomsRepository,
@@ -47,12 +62,15 @@ import { ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS } from './one-table-tourname
47
62
  GameResultRepository,
48
63
  RatingRepository,
49
64
  ActivityLogRepository,
65
+ PurchaseRepository,
50
66
  ],
51
67
  exports: [OneTableTournamentRoomsManagerService],
52
68
  })
53
69
  export class OneTableTournamentRoomsManagerModule {
54
70
  constructor(
55
71
  private readonly managerService: OneTableTournamentRoomsManagerService,
72
+ @Inject(ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS)
73
+ private readonly options: OneTableTournamentRoomsFactoryOptions,
56
74
  ) {}
57
75
 
58
76
  static forRootAsync(
@@ -74,5 +92,9 @@ export class OneTableTournamentRoomsManagerModule {
74
92
  async onModuleInit() {
75
93
  await this.managerService.createMasterTournament();
76
94
  await this.managerService.hydrateTournamentsFromDB();
95
+
96
+ if (this.options.purgeRoomsEnabled) {
97
+ this.managerService.runPurgeRoomsJob();
98
+ }
77
99
  }
78
100
  }
@@ -1,4 +1,8 @@
1
- import { Inject, Injectable } from '@nestjs/common';
1
+ import {
2
+ Inject,
3
+ Injectable,
4
+ InternalServerErrorException,
5
+ } from '@nestjs/common';
2
6
  import {
3
7
  BaseGameEvent,
4
8
  GameMaster,
@@ -23,11 +27,13 @@ import {
23
27
  GameResultRepository,
24
28
  OneTableTournamentRoomDocument,
25
29
  OneTableTournamentRoomsRepository,
30
+ PurchaseRepository,
26
31
  RatingRepository,
27
32
  UsersRepository,
28
33
  } from 'jp.db.schemas';
29
34
  import { InjectConnection } from '@nestjs/mongoose';
30
35
  import { Connection } from 'mongoose';
36
+ import schedule, { Job } from 'node-schedule';
31
37
 
32
38
  import { JpLoggerService } from '../logger/jp-logger.service';
33
39
  import {
@@ -36,6 +42,7 @@ import {
36
42
  EventsBusOneTableTournamentSubscribeService,
37
43
  } from '../event-bus';
38
44
  import { TournamentRoomsManagerService } from '../../common/tournament-rooms-manager.service';
45
+ import { PlayersManagerService } from '../players-manager';
39
46
 
40
47
  import { ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS } from './one-table-tournament-rooms-manager.constants';
41
48
  import { OneTableTournamentRoomsFactoryOptions } from './one-table-tournament-rooms-manager.interfaces';
@@ -43,6 +50,7 @@ import { OneTableTournamentRoomsFactoryOptions } from './one-table-tournament-ro
43
50
  @Injectable()
44
51
  export class OneTableTournamentRoomsManagerService extends TournamentRoomsManagerService {
45
52
  private readonly rooms: Map<string, OneTableTournamentRoom>;
53
+ private purgeRoomsJob: Job;
46
54
 
47
55
  constructor(
48
56
  private readonly tournamentRepository: OneTableTournamentRoomsRepository,
@@ -50,6 +58,7 @@ export class OneTableTournamentRoomsManagerService extends TournamentRoomsManage
50
58
  private readonly gameResultRepository: GameResultRepository,
51
59
  private readonly ratingRepository: RatingRepository,
52
60
  private readonly activityLogRepository: ActivityLogRepository,
61
+ private readonly purchaseRepository: PurchaseRepository,
53
62
  private readonly eventsBusMainTablesSubscribeService: EventsBusMainTablesSubscribeService,
54
63
  private readonly eventsBusOneTableTournamentSubscribeService: EventsBusOneTableTournamentSubscribeService,
55
64
  private readonly eventsBusAppSubscribeService: EventsBusAppSubscribeService,
@@ -57,6 +66,7 @@ export class OneTableTournamentRoomsManagerService extends TournamentRoomsManage
57
66
  private readonly options: OneTableTournamentRoomsFactoryOptions,
58
67
  @InjectConnection() private readonly connection: Connection,
59
68
  @Inject() private readonly logger: JpLoggerService,
69
+ private readonly playersManager: PlayersManagerService,
60
70
  ) {
61
71
  super();
62
72
  this.rooms = new Map<string, OneTableTournamentRoom>();
@@ -90,6 +100,10 @@ export class OneTableTournamentRoomsManagerService extends TournamentRoomsManage
90
100
  this.rooms.set(room.getId(), room);
91
101
  }
92
102
 
103
+ removeRoom(roomId: string) {
104
+ this.rooms.delete(roomId);
105
+ }
106
+
93
107
  async createMasterTournament() {
94
108
  const waitingTournament =
95
109
  await this.tournamentRepository.findWaitingTournament(this.gameType);
@@ -113,6 +127,31 @@ export class OneTableTournamentRoomsManagerService extends TournamentRoomsManage
113
127
  });
114
128
  }
115
129
 
130
+ runPurgeRoomsJob() {
131
+ const purgeRoomsTime = this.options.purgeRoomsTime;
132
+
133
+ if (purgeRoomsTime) {
134
+ this.logger.log(
135
+ `${OneTableTournamentRoomsManagerService.name}: runPurgeRoomsJob`,
136
+ );
137
+
138
+ this.purgeRoomsJob = schedule.scheduleJob(purgeRoomsTime, () =>
139
+ this.purgeRooms(),
140
+ );
141
+ }
142
+ }
143
+
144
+ purgeRooms() {
145
+ for (const room of this.getRooms()) {
146
+ if (!room.isActual()) {
147
+ this.removeRoom(room.getId());
148
+ this.logger.log(
149
+ `${OneTableTournamentRoomsManagerService.name}: removeRoom: ${room.getId()}`,
150
+ );
151
+ }
152
+ }
153
+ }
154
+
116
155
  private oneTableTournamentDocumentToTournamentRoom(
117
156
  tournamentDocument: OneTableTournamentRoomDocument,
118
157
  ): TournamentRoomConfig {
@@ -141,6 +180,7 @@ export class OneTableTournamentRoomsManagerService extends TournamentRoomsManage
141
180
  tournamentWinners: tournamentDocument.winners,
142
181
  maxParticipants: tournamentDocument.maxParticipants,
143
182
  participants: tournamentDocument.participants,
183
+ finishDate: tournamentDocument.finishDate,
144
184
  };
145
185
  }
146
186
 
@@ -212,6 +252,10 @@ export class OneTableTournamentRoomsManagerService extends TournamentRoomsManage
212
252
  const master = event.room.getRoomMaster<TournamentMaster>();
213
253
 
214
254
  try {
255
+ for (const participant of master.getRoom().getParticipants()) {
256
+ await this.buyTicket(master.getTournamentId(), participant.playerId);
257
+ }
258
+
215
259
  await this.tournamentRepository.startTournament(
216
260
  master.getTournamentId(),
217
261
  master.getRoom().getParticipants(),
@@ -272,4 +316,28 @@ export class OneTableTournamentRoomsManagerService extends TournamentRoomsManage
272
316
  updateEvent,
273
317
  );
274
318
  };
319
+
320
+ private async buyTicket(tournamentId: string, playerId: string) {
321
+ const tournament = this.getRoomById(tournamentId);
322
+ const user = await this.usersRepository.findById(playerId);
323
+ const player = this.playersManager.getPlayerById(playerId);
324
+
325
+ if (!tournament || !user || !player) {
326
+ throw new InternalServerErrorException();
327
+ }
328
+
329
+ player.decreaseBalance(tournament.getTicketPrice());
330
+
331
+ void this.purchaseRepository.addOneTableTournamentTicketPurchase(
332
+ player.id,
333
+ player.fullName,
334
+ tournamentId,
335
+ tournament.getTicketPrice(),
336
+ tournament.getGameType(),
337
+ );
338
+ void this.usersRepository.subtractFromBalance(
339
+ player.id,
340
+ tournament.getTicketPrice(),
341
+ );
342
+ }
275
343
  }
@@ -216,7 +216,7 @@ export class SimpleRoomsManagerService extends RoomsManagerService {
216
216
  await this.gameResultRepository.createGameResult(
217
217
  this.getGameTableResults(master),
218
218
  );
219
- const userGameResults = this.getUserGameResults(master, false);
219
+ const userGameResults = this.getUserGameResults(master, true);
220
220
  await this.usersRepository.saveGameResult(userGameResults);
221
221
  await this.ratingRepository.addBulkPlayerRating(
222
222
  this.getUserRatings(master),