jp.ms.common.modules 1.0.53 → 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.
- package/dist/dto/app-table/bids-panel-item.dto.d.ts +2 -1
- package/dist/dto/app-table/bids-panel-item.dto.js +12 -1
- package/dist/dto/app-table/bids-panel-item.dto.js.map +1 -1
- package/dist/modules/main/main-tables-list-screen.view.js +5 -2
- package/dist/modules/main/main-tables-list-screen.view.js.map +1 -1
- package/dist/modules/many-tables-tournament/many-tables-tournament.controller.d.ts +2 -2
- package/dist/modules/many-tables-tournament/many-tables-tournament.controller.js +2 -3
- package/dist/modules/many-tables-tournament/many-tables-tournament.controller.js.map +1 -1
- package/dist/modules/many-tables-tournament/many-tables-tournament.module.js +4 -0
- package/dist/modules/many-tables-tournament/many-tables-tournament.module.js.map +1 -1
- package/dist/modules/many-tables-tournament/many-tables-tournament.service.d.ts +5 -4
- package/dist/modules/many-tables-tournament/many-tables-tournament.service.js +21 -6
- package/dist/modules/many-tables-tournament/many-tables-tournament.service.js.map +1 -1
- package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.d.ts +2 -0
- package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.js +3 -0
- package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.js.map +1 -1
- package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.d.ts +5 -0
- package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.js +38 -3
- package/dist/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.js.map +1 -1
- package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.d.ts +2 -0
- package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.d.ts +3 -2
- package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.js +15 -2
- package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.js.map +1 -1
- package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.d.ts +10 -2
- package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.js +53 -7
- package/dist/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.js.map +1 -1
- package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.js +1 -1
- package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/dto/app-table/bids-panel-item.dto.ts +10 -1
- package/src/modules/main/main-tables-list-screen.view.ts +9 -2
- package/src/modules/many-tables-tournament/many-tables-tournament.controller.ts +2 -2
- package/src/modules/many-tables-tournament/many-tables-tournament.module.ts +7 -0
- package/src/modules/many-tables-tournament/many-tables-tournament.service.ts +38 -7
- package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.ts +2 -0
- package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.ts +3 -0
- package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.ts +60 -3
- package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.ts +2 -0
- package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.ts +24 -2
- package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.ts +69 -1
- 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.
|
|
3
|
+
"version": "1.0.55",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"@nestjs/mongoose": "11.0.4",
|
|
14
14
|
"@nestjs/websockets": "11.1.9",
|
|
15
15
|
"dayjs": "1.11.18",
|
|
16
|
-
"jp.common.models": "1.1.
|
|
16
|
+
"jp.common.models": "1.1.61",
|
|
17
17
|
"jp.common.utils": "1.0.9",
|
|
18
|
-
"jp.db.schemas": "2.2.
|
|
19
|
-
"jp.ms.common.engine": "3.0.
|
|
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",
|
|
@@ -13,6 +13,15 @@ export class BidsPanelItemDto implements IAppTableBidsPanelItem {
|
|
|
13
13
|
@IsString()
|
|
14
14
|
key: string;
|
|
15
15
|
|
|
16
|
+
@ApiProperty({
|
|
17
|
+
description: 'value',
|
|
18
|
+
required: true,
|
|
19
|
+
type: Number,
|
|
20
|
+
})
|
|
21
|
+
@Expose()
|
|
22
|
+
@IsString()
|
|
23
|
+
value: number;
|
|
24
|
+
|
|
16
25
|
@ApiProperty({
|
|
17
26
|
description: 'value',
|
|
18
27
|
required: true,
|
|
@@ -20,7 +29,7 @@ export class BidsPanelItemDto implements IAppTableBidsPanelItem {
|
|
|
20
29
|
})
|
|
21
30
|
@Expose()
|
|
22
31
|
@IsString()
|
|
23
|
-
|
|
32
|
+
textValue: string;
|
|
24
33
|
|
|
25
34
|
@ApiProperty({
|
|
26
35
|
description: 'Title',
|
|
@@ -123,7 +123,11 @@ export class MainTablesListScreenView extends UniversalScreenView {
|
|
|
123
123
|
this.getOneTableTournamentIcon(room),
|
|
124
124
|
true,
|
|
125
125
|
true,
|
|
126
|
-
|
|
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 (
|
|
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(
|
|
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
|
|
|
@@ -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
|
package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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
|
}
|
package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
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,
|
|
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),
|