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.
- package/dist/dto/app-table/bids-panel-item.dto.d.ts +6 -0
- package/dist/dto/app-table/bids-panel-item.dto.js +52 -0
- package/dist/dto/app-table/bids-panel-item.dto.js.map +1 -0
- package/dist/dto/app-table/bids-panel.dto.d.ts +7 -0
- package/dist/dto/app-table/bids-panel.dto.js +50 -0
- package/dist/dto/app-table/bids-panel.dto.js.map +1 -0
- package/dist/dto/app-table/index.d.ts +2 -0
- package/dist/dto/app-table/index.js +5 -1
- package/dist/dto/app-table/index.js.map +1 -1
- package/dist/dto/games/poker/poker-table.dto.d.ts +2 -1
- package/dist/dto/games/poker/poker-table.dto.js +6 -0
- package/dist/dto/games/poker/poker-table.dto.js.map +1 -1
- package/dist/modules/base-achievements/base-achievements.module.js +3 -3
- package/dist/modules/base-achievements/base-achievements.module.js.map +1 -1
- package/dist/modules/main/main.service.js +1 -1
- package/dist/modules/menu/menu-screen.view.js +1 -1
- package/dist/modules/menu/menu-screen.view.js.map +1 -1
- package/dist/modules/menu/menu.service.js +1 -1
- package/dist/modules/menu/menu.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +57 -57
- package/src/dto/app-screen/app-screen-app-bar.dto.ts +36 -36
- package/src/dto/app-screen/app-screen-dialog.dto.ts +64 -64
- package/src/dto/app-screen/app-screen-field-list-item.dto.ts +42 -42
- package/src/dto/app-screen/app-screen-field.dto.ts +59 -59
- package/src/dto/app-screen/app-screen-section-button.dto.ts +60 -60
- package/src/dto/app-screen/app-screen-section-buttons.dto.ts +14 -14
- package/src/dto/app-screen/app-screen-section-image.dto.ts +33 -33
- package/src/dto/app-screen/app-screen-section-list-item.dto.ts +105 -105
- package/src/dto/app-screen/app-screen-section-req.dto.ts +33 -33
- package/src/dto/app-screen/app-screen-section.dto.ts +76 -76
- package/src/dto/app-screen/app-screen.dto.ts +50 -50
- package/src/dto/app-screen/base-app-screen.dto.ts +16 -16
- package/src/dto/app-screen/index.ts +10 -10
- package/src/dto/app-table/bids-panel-item.dto.ts +33 -0
- package/src/dto/app-table/bids-panel.dto.ts +32 -0
- package/src/dto/app-table/card.dto.ts +54 -54
- package/src/dto/app-table/cards-deck.dto.ts +22 -22
- package/src/dto/app-table/cards-pair-slots-item.dto.ts +45 -45
- package/src/dto/app-table/cards-pair-slots.dto.ts +13 -13
- package/src/dto/app-table/cards-panel.dto.ts +48 -48
- package/src/dto/app-table/cards-player.dto.ts +14 -14
- package/src/dto/app-table/cards-slots-item.dto.ts +40 -40
- package/src/dto/app-table/cards-slots.dto.ts +13 -13
- package/src/dto/app-table/index.ts +15 -13
- package/src/dto/app-table/moves-panel-button.dto.ts +24 -24
- package/src/dto/app-table/moves-panel.dto.ts +23 -23
- package/src/dto/app-table/player.dto.ts +69 -69
- package/src/dto/app-table/summary-item.dto.ts +51 -51
- package/src/dto/app-table/summary.dto.ts +13 -13
- package/src/dto/common/find-free-table.dto.ts +3 -3
- package/src/dto/common/index.ts +2 -2
- package/src/dto/common/join-tournament.dto.ts +33 -33
- package/src/dto/common/log.dto.ts +9 -9
- package/src/dto/common/many-tables-tournament-create.dto.ts +125 -125
- package/src/dto/common/many-tables-tournament-update.dto.ts +3 -3
- package/src/dto/common/player-check-state.dto.ts +33 -33
- package/src/dto/common/player-connected.dto.ts +58 -58
- package/src/dto/games/fool/fool-player.dto.ts +3 -3
- package/src/dto/games/fool/fool-table.dto.ts +81 -81
- package/src/dto/games/index.ts +2 -2
- package/src/dto/games/poker/poker-player.dto.ts +3 -3
- package/src/dto/games/poker/poker-table.dto.ts +81 -76
- package/src/dto/index.ts +4 -4
- package/src/exception/error-code.enum.ts +4 -4
- package/src/exception/global-exception-filter.ts +53 -53
- package/src/exception/http-exception-wth-snackbar.ts +27 -27
- package/src/exception/index.ts +4 -4
- package/src/exception/not-enough-money-for-purchase.exception.ts +14 -14
- package/src/exception/not-found-free-room-for-fast-game.exception.ts +14 -14
- package/src/index.ts +4 -4
- package/src/modules/anti-freeze-system/anti-freeze-system.constants.ts +1 -1
- package/src/modules/anti-freeze-system/anti-freeze-system.interfaces.ts +20 -20
- package/src/modules/anti-freeze-system/anti-freeze-system.module.ts +55 -55
- package/src/modules/anti-freeze-system/anti-freeze-system.service.ts +105 -105
- package/src/modules/anti-freeze-system/index.ts +1 -1
- package/src/modules/base-achievements/base-achievements.module.ts +322 -322
- package/src/modules/base-achievements/index.ts +1 -1
- package/src/modules/event-bus/events-bus.app.subscribe.service.ts +20 -20
- package/src/modules/event-bus/events-bus.main-tables.subscribe.service.ts +34 -34
- package/src/modules/event-bus/events-bus.many-tables-tournament.subscribe.service.ts +6 -6
- package/src/modules/event-bus/events-bus.module.ts +23 -23
- package/src/modules/event-bus/events-bus.one-table-tournament.subscribe.service.ts +6 -6
- package/src/modules/event-bus/events-bus.tournament.subscribe.service.ts +18 -18
- package/src/modules/event-bus/index.ts +5 -5
- package/src/modules/events/events.constants.ts +1 -1
- package/src/modules/events/events.gateway.ts +70 -70
- package/src/modules/events/events.interfaces.ts +17 -17
- package/src/modules/events/events.module.ts +32 -32
- package/src/modules/events/index.ts +1 -1
- package/src/modules/index.ts +27 -27
- package/src/modules/logger/index.ts +2 -2
- package/src/modules/logger/jp-logger.module.ts +10 -10
- package/src/modules/logger/jp-logger.service.ts +38 -38
- package/src/modules/main/index.ts +1 -1
- package/src/modules/main/main-tables-list-screen.view.ts +275 -275
- package/src/modules/main/main.constants.ts +1 -1
- package/src/modules/main/main.controller.ts +72 -72
- package/src/modules/main/main.interfaces.ts +17 -17
- package/src/modules/main/main.module.ts +73 -73
- package/src/modules/main/main.service.ts +183 -183
- package/src/modules/many-tables-tournament/index.ts +1 -1
- package/src/modules/many-tables-tournament/many-tables-tournament-status-screen.view.ts +143 -143
- package/src/modules/many-tables-tournament/many-tables-tournament-tables-list-screen.view.ts +63 -63
- package/src/modules/many-tables-tournament/many-tables-tournament.constants.ts +3 -3
- package/src/modules/many-tables-tournament/many-tables-tournament.controller.ts +151 -151
- package/src/modules/many-tables-tournament/many-tables-tournament.interfaces.ts +20 -20
- package/src/modules/many-tables-tournament/many-tables-tournament.module.ts +80 -80
- package/src/modules/many-tables-tournament/many-tables-tournament.service.ts +208 -208
- package/src/modules/many-tables-tournament-rooms-manager/index.ts +2 -2
- package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.constants.ts +3 -3
- package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.ts +37 -37
- package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.ts +84 -84
- package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.ts +331 -331
- package/src/modules/menu/index.ts +1 -1
- package/src/modules/menu/menu-screen.view.ts +71 -71
- package/src/modules/menu/menu.constants.ts +1 -1
- package/src/modules/menu/menu.controller.ts +16 -16
- package/src/modules/menu/menu.interfaces.ts +17 -17
- package/src/modules/menu/menu.module.ts +39 -39
- package/src/modules/menu/menu.service.ts +39 -35
- package/src/modules/one-table-tournament/index.ts +1 -1
- package/src/modules/one-table-tournament/one-table-tournament-status-screen.view.ts +166 -166
- package/src/modules/one-table-tournament/one-table-tournament.constants.ts +3 -3
- package/src/modules/one-table-tournament/one-table-tournament.controller.ts +104 -104
- package/src/modules/one-table-tournament/one-table-tournament.interfaces.ts +20 -20
- package/src/modules/one-table-tournament/one-table-tournament.module.ts +76 -76
- package/src/modules/one-table-tournament/one-table-tournament.service.ts +146 -146
- package/src/modules/one-table-tournament-rooms-manager/index.ts +2 -2
- package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.constants.ts +3 -3
- package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.ts +31 -31
- package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.ts +66 -66
- package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.ts +220 -220
- package/src/modules/players-manager/index.ts +2 -2
- package/src/modules/players-manager/players-manager.module.ts +9 -9
- package/src/modules/players-manager/players-manager.service.ts +27 -27
- package/src/modules/simple-rooms/index.ts +1 -1
- package/src/modules/simple-rooms/simple-rooms.constants.ts +1 -1
- package/src/modules/simple-rooms/simple-rooms.controller.ts +63 -63
- package/src/modules/simple-rooms/simple-rooms.interfaces.ts +20 -20
- package/src/modules/simple-rooms/simple-rooms.module.ts +39 -39
- package/src/modules/simple-rooms/simple-rooms.service.ts +95 -95
- package/src/modules/simple-rooms-manager/index.ts +2 -2
- package/src/modules/simple-rooms-manager/simple-rooms-manager.constants.ts +3 -3
- package/src/modules/simple-rooms-manager/simple-rooms-manager.interfaces.ts +26 -26
- package/src/modules/simple-rooms-manager/simple-rooms-manager.module.ts +60 -60
- package/src/modules/simple-rooms-manager/simple-rooms-manager.service.ts +190 -190
- package/src/modules/support/dump.service.ts +11 -11
- package/src/modules/support/index.ts +1 -1
- package/src/modules/support/metric.service.ts +41 -41
- package/src/modules/support/support.constants.ts +1 -1
- package/src/modules/support/support.controller.ts +79 -79
- package/src/modules/support/support.interfaces.ts +16 -16
- package/src/modules/support/support.module.ts +35 -35
- package/src/modules/support/support.service.ts +27 -27
- package/src/utils/date.ts +7 -7
- package/src/utils/game-table-result.ts +129 -129
- package/src/views/index.ts +5 -5
- package/src/views/many-tables-tournament-conifrm-exit-dialog.view.ts +37 -37
- package/src/views/one-table-tournament-conifrm-exit-dialog.view.ts +37 -37
- package/src/views/simple-room-conifrm-exit-dialog.view.ts +37 -37
- package/src/views/table-summary.view.ts +104 -104
- package/src/views/tournament-buy-ticket-dialog.view.ts +34 -34
package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.ts
CHANGED
|
@@ -1,220 +1,220 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
-
import {
|
|
3
|
-
BaseGameEvent,
|
|
4
|
-
GameMaster,
|
|
5
|
-
GameTableFinishedEvent,
|
|
6
|
-
GameTournamentCancelledEvent,
|
|
7
|
-
GameTournamentFinishedEvent,
|
|
8
|
-
GameTournamentPlayerJoinedTheTournamentEvent,
|
|
9
|
-
GameTournamentPlayerLeavedTheTournamentEvent,
|
|
10
|
-
GameTournamentStartedEvent,
|
|
11
|
-
GameTournamentWaitedEvent,
|
|
12
|
-
LocalService,
|
|
13
|
-
NoStartStrategy,
|
|
14
|
-
OneTableTournamentRoom,
|
|
15
|
-
RoomUpdateStateEvent,
|
|
16
|
-
TournamentMaster,
|
|
17
|
-
TournamentRoomConfig,
|
|
18
|
-
} from 'jp.ms.common.engine';
|
|
19
|
-
import {
|
|
20
|
-
GameResultRepository,
|
|
21
|
-
OneTableTournamentRoomDocument,
|
|
22
|
-
OneTableTournamentRoomsRepository,
|
|
23
|
-
UsersRepository,
|
|
24
|
-
} from 'jp.db.schemas';
|
|
25
|
-
import { InjectConnection } from '@nestjs/mongoose';
|
|
26
|
-
import { Connection } from 'mongoose';
|
|
27
|
-
|
|
28
|
-
import { JpLoggerService } from '../logger/jp-logger.service';
|
|
29
|
-
import {
|
|
30
|
-
saveGameTablesResult,
|
|
31
|
-
saveTournamentResult,
|
|
32
|
-
} from '../../utils/game-table-result';
|
|
33
|
-
import {
|
|
34
|
-
EventsBusMainTablesSubscribeService,
|
|
35
|
-
EventsBusOneTableTournamentSubscribeService,
|
|
36
|
-
} from '../event-bus';
|
|
37
|
-
|
|
38
|
-
import { ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS } from './one-table-tournament-rooms-manager.constants';
|
|
39
|
-
import { OneTableTournamentRoomsFactoryOptions } from './one-table-tournament-rooms-manager.interfaces';
|
|
40
|
-
|
|
41
|
-
@Injectable()
|
|
42
|
-
export class OneTableTournamentRoomsManagerService {
|
|
43
|
-
private readonly rooms: Map<string, OneTableTournamentRoom>;
|
|
44
|
-
|
|
45
|
-
constructor(
|
|
46
|
-
private readonly tournamentRepository: OneTableTournamentRoomsRepository,
|
|
47
|
-
private readonly usersRepository: UsersRepository,
|
|
48
|
-
private readonly gameResultRepository: GameResultRepository,
|
|
49
|
-
private readonly eventsBusMainTablesSubscribeService: EventsBusMainTablesSubscribeService,
|
|
50
|
-
private readonly eventsBusOneTableTournamentSubscribeService: EventsBusOneTableTournamentSubscribeService,
|
|
51
|
-
@Inject(ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS)
|
|
52
|
-
private readonly options: OneTableTournamentRoomsFactoryOptions,
|
|
53
|
-
@InjectConnection() private readonly connection: Connection,
|
|
54
|
-
@Inject() private readonly logger: JpLoggerService,
|
|
55
|
-
) {
|
|
56
|
-
this.rooms = new Map<string, OneTableTournamentRoom>();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
get gameType() {
|
|
60
|
-
return this.options.gameType;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
getRoomById(roomId: string): OneTableTournamentRoom | undefined {
|
|
64
|
-
return this.rooms.get(roomId);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
getRoomByTableId(tableId: string): OneTableTournamentRoom | undefined {
|
|
68
|
-
const { roomId } = GameMaster.parseTableId(tableId);
|
|
69
|
-
|
|
70
|
-
return this.getRoomById(roomId);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
getRooms(): Array<OneTableTournamentRoom> {
|
|
74
|
-
return Array.from(this.rooms.values());
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
getTables(): Array<GameMaster> {
|
|
78
|
-
return this.getRooms().reduce((result, currentValue) => {
|
|
79
|
-
return [...result, ...currentValue.getMasters()];
|
|
80
|
-
}, [] as Array<GameMaster>);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
addRoom(room: OneTableTournamentRoom) {
|
|
84
|
-
this.rooms.set(room.getId(), room);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
async createMasterTournament() {
|
|
88
|
-
const waitingTournament =
|
|
89
|
-
await this.tournamentRepository.findWaitingTournament(this.gameType);
|
|
90
|
-
if (!waitingTournament) {
|
|
91
|
-
await this.tournamentRepository.createTournamentFromMasterTemplate(
|
|
92
|
-
this.gameType,
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async hydrateTournamentsFromDB() {
|
|
98
|
-
const templates = await this.tournamentRepository.findActualTournaments(
|
|
99
|
-
this.gameType,
|
|
100
|
-
);
|
|
101
|
-
templates.forEach((item) => {
|
|
102
|
-
this.addRoom(
|
|
103
|
-
this.options.createTournamentRoom(
|
|
104
|
-
this.oneTableTournamentDocumentToTournamentRoom(item),
|
|
105
|
-
),
|
|
106
|
-
);
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
private oneTableTournamentDocumentToTournamentRoom(
|
|
111
|
-
tournamentDocument: OneTableTournamentRoomDocument,
|
|
112
|
-
): TournamentRoomConfig {
|
|
113
|
-
return {
|
|
114
|
-
id: tournamentDocument.tournamentId,
|
|
115
|
-
gameType: tournamentDocument.gameType,
|
|
116
|
-
roomType: tournamentDocument.roomType,
|
|
117
|
-
rulesType: tournamentDocument.rulesType,
|
|
118
|
-
deckType: tournamentDocument.deckType,
|
|
119
|
-
tableSize: tournamentDocument.tableSize,
|
|
120
|
-
bet: tournamentDocument.bet,
|
|
121
|
-
ticketPrice: tournamentDocument.ticketPrice,
|
|
122
|
-
title: tournamentDocument.title,
|
|
123
|
-
subtitle: tournamentDocument.subtitle,
|
|
124
|
-
description: tournamentDocument.description,
|
|
125
|
-
enableForFastGame: false,
|
|
126
|
-
turnTimeout: this.options.playersTurnTimeout,
|
|
127
|
-
restartTimeout: this.options.restartGameTimeout,
|
|
128
|
-
instantFinishMode: this.options.instantFinishMode,
|
|
129
|
-
localeService: this.options.i18n as LocalService,
|
|
130
|
-
startStrategy: new NoStartStrategy(),
|
|
131
|
-
onRoomEvent: this.handleRoomEvent,
|
|
132
|
-
tournamentPrizeTable: this.options.tournamentPrizeTable,
|
|
133
|
-
tournamentInitialStatus: tournamentDocument.status,
|
|
134
|
-
tournamentWinners: tournamentDocument.winners,
|
|
135
|
-
maxParticipants: tournamentDocument.maxParticipants,
|
|
136
|
-
participants: tournamentDocument.participants,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
private handleRoomEvent = (event: BaseGameEvent) => {
|
|
141
|
-
this.logger.log(event.toLog());
|
|
142
|
-
|
|
143
|
-
if (event instanceof GameTableFinishedEvent) {
|
|
144
|
-
void this.handleRoomTableGameFinished(event.master);
|
|
145
|
-
} else if (event instanceof GameTournamentStartedEvent) {
|
|
146
|
-
void this.handleTournamentRoomStarted(event.room.getRoomMaster());
|
|
147
|
-
} else if (event instanceof GameTournamentCancelledEvent) {
|
|
148
|
-
void this.handleTournamentRoomCancelled(event.room.getRoomMaster());
|
|
149
|
-
} else if (event instanceof GameTournamentFinishedEvent) {
|
|
150
|
-
void this.handleTournamentRoomFinished(event.room.getRoomMaster());
|
|
151
|
-
} else if (
|
|
152
|
-
event instanceof GameTournamentPlayerJoinedTheTournamentEvent ||
|
|
153
|
-
event instanceof GameTournamentPlayerLeavedTheTournamentEvent ||
|
|
154
|
-
event instanceof GameTournamentCancelledEvent ||
|
|
155
|
-
event instanceof GameTournamentWaitedEvent ||
|
|
156
|
-
event instanceof GameTournamentStartedEvent ||
|
|
157
|
-
event instanceof GameTournamentFinishedEvent
|
|
158
|
-
) {
|
|
159
|
-
void this.handleRoomStatusUpdated(
|
|
160
|
-
new RoomUpdateStateEvent(event.gameType, event.roomId),
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
private handleRoomTableGameFinished = async (master: GameMaster) => {
|
|
166
|
-
await saveGameTablesResult(
|
|
167
|
-
master,
|
|
168
|
-
this.connection,
|
|
169
|
-
this.gameResultRepository,
|
|
170
|
-
this.usersRepository,
|
|
171
|
-
false,
|
|
172
|
-
);
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
private handleTournamentRoomStarted = async (master: TournamentMaster) => {
|
|
176
|
-
const session = await this.connection.startSession();
|
|
177
|
-
session.startTransaction();
|
|
178
|
-
|
|
179
|
-
try {
|
|
180
|
-
await this.tournamentRepository.startTournament(
|
|
181
|
-
master.getTournamentId(),
|
|
182
|
-
master.getRoom().getParticipants(),
|
|
183
|
-
);
|
|
184
|
-
const newTournament =
|
|
185
|
-
await this.tournamentRepository.createTournamentFromMasterTemplate(
|
|
186
|
-
master.getRoom().getGameType(),
|
|
187
|
-
);
|
|
188
|
-
this.addRoom(
|
|
189
|
-
this.options.createTournamentRoom(
|
|
190
|
-
this.oneTableTournamentDocumentToTournamentRoom(newTournament),
|
|
191
|
-
),
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
await session.commitTransaction();
|
|
195
|
-
} catch (error) {
|
|
196
|
-
await session.abortTransaction();
|
|
197
|
-
throw error;
|
|
198
|
-
} finally {
|
|
199
|
-
await session.endSession();
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
private handleTournamentRoomCancelled = async (master: TournamentMaster) => {
|
|
204
|
-
await this.tournamentRepository.cancelTournament(master.getTournamentId());
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
private handleTournamentRoomFinished = async (master: TournamentMaster) => {
|
|
208
|
-
await saveTournamentResult(
|
|
209
|
-
master,
|
|
210
|
-
this.connection,
|
|
211
|
-
this.tournamentRepository,
|
|
212
|
-
this.usersRepository,
|
|
213
|
-
);
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
private handleRoomStatusUpdated = (event: RoomUpdateStateEvent) => {
|
|
217
|
-
this.eventsBusMainTablesSubscribeService.pushNewRoomState(event);
|
|
218
|
-
this.eventsBusOneTableTournamentSubscribeService.pushNewRoomState(event);
|
|
219
|
-
};
|
|
220
|
-
}
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import {
|
|
3
|
+
BaseGameEvent,
|
|
4
|
+
GameMaster,
|
|
5
|
+
GameTableFinishedEvent,
|
|
6
|
+
GameTournamentCancelledEvent,
|
|
7
|
+
GameTournamentFinishedEvent,
|
|
8
|
+
GameTournamentPlayerJoinedTheTournamentEvent,
|
|
9
|
+
GameTournamentPlayerLeavedTheTournamentEvent,
|
|
10
|
+
GameTournamentStartedEvent,
|
|
11
|
+
GameTournamentWaitedEvent,
|
|
12
|
+
LocalService,
|
|
13
|
+
NoStartStrategy,
|
|
14
|
+
OneTableTournamentRoom,
|
|
15
|
+
RoomUpdateStateEvent,
|
|
16
|
+
TournamentMaster,
|
|
17
|
+
TournamentRoomConfig,
|
|
18
|
+
} from 'jp.ms.common.engine';
|
|
19
|
+
import {
|
|
20
|
+
GameResultRepository,
|
|
21
|
+
OneTableTournamentRoomDocument,
|
|
22
|
+
OneTableTournamentRoomsRepository,
|
|
23
|
+
UsersRepository,
|
|
24
|
+
} from 'jp.db.schemas';
|
|
25
|
+
import { InjectConnection } from '@nestjs/mongoose';
|
|
26
|
+
import { Connection } from 'mongoose';
|
|
27
|
+
|
|
28
|
+
import { JpLoggerService } from '../logger/jp-logger.service';
|
|
29
|
+
import {
|
|
30
|
+
saveGameTablesResult,
|
|
31
|
+
saveTournamentResult,
|
|
32
|
+
} from '../../utils/game-table-result';
|
|
33
|
+
import {
|
|
34
|
+
EventsBusMainTablesSubscribeService,
|
|
35
|
+
EventsBusOneTableTournamentSubscribeService,
|
|
36
|
+
} from '../event-bus';
|
|
37
|
+
|
|
38
|
+
import { ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS } from './one-table-tournament-rooms-manager.constants';
|
|
39
|
+
import { OneTableTournamentRoomsFactoryOptions } from './one-table-tournament-rooms-manager.interfaces';
|
|
40
|
+
|
|
41
|
+
@Injectable()
|
|
42
|
+
export class OneTableTournamentRoomsManagerService {
|
|
43
|
+
private readonly rooms: Map<string, OneTableTournamentRoom>;
|
|
44
|
+
|
|
45
|
+
constructor(
|
|
46
|
+
private readonly tournamentRepository: OneTableTournamentRoomsRepository,
|
|
47
|
+
private readonly usersRepository: UsersRepository,
|
|
48
|
+
private readonly gameResultRepository: GameResultRepository,
|
|
49
|
+
private readonly eventsBusMainTablesSubscribeService: EventsBusMainTablesSubscribeService,
|
|
50
|
+
private readonly eventsBusOneTableTournamentSubscribeService: EventsBusOneTableTournamentSubscribeService,
|
|
51
|
+
@Inject(ONE_TABLE_TOURNAMENT_ROOMS_MANAGER_OPTIONS)
|
|
52
|
+
private readonly options: OneTableTournamentRoomsFactoryOptions,
|
|
53
|
+
@InjectConnection() private readonly connection: Connection,
|
|
54
|
+
@Inject() private readonly logger: JpLoggerService,
|
|
55
|
+
) {
|
|
56
|
+
this.rooms = new Map<string, OneTableTournamentRoom>();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
get gameType() {
|
|
60
|
+
return this.options.gameType;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getRoomById(roomId: string): OneTableTournamentRoom | undefined {
|
|
64
|
+
return this.rooms.get(roomId);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
getRoomByTableId(tableId: string): OneTableTournamentRoom | undefined {
|
|
68
|
+
const { roomId } = GameMaster.parseTableId(tableId);
|
|
69
|
+
|
|
70
|
+
return this.getRoomById(roomId);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
getRooms(): Array<OneTableTournamentRoom> {
|
|
74
|
+
return Array.from(this.rooms.values());
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
getTables(): Array<GameMaster> {
|
|
78
|
+
return this.getRooms().reduce((result, currentValue) => {
|
|
79
|
+
return [...result, ...currentValue.getMasters()];
|
|
80
|
+
}, [] as Array<GameMaster>);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
addRoom(room: OneTableTournamentRoom) {
|
|
84
|
+
this.rooms.set(room.getId(), room);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async createMasterTournament() {
|
|
88
|
+
const waitingTournament =
|
|
89
|
+
await this.tournamentRepository.findWaitingTournament(this.gameType);
|
|
90
|
+
if (!waitingTournament) {
|
|
91
|
+
await this.tournamentRepository.createTournamentFromMasterTemplate(
|
|
92
|
+
this.gameType,
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async hydrateTournamentsFromDB() {
|
|
98
|
+
const templates = await this.tournamentRepository.findActualTournaments(
|
|
99
|
+
this.gameType,
|
|
100
|
+
);
|
|
101
|
+
templates.forEach((item) => {
|
|
102
|
+
this.addRoom(
|
|
103
|
+
this.options.createTournamentRoom(
|
|
104
|
+
this.oneTableTournamentDocumentToTournamentRoom(item),
|
|
105
|
+
),
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private oneTableTournamentDocumentToTournamentRoom(
|
|
111
|
+
tournamentDocument: OneTableTournamentRoomDocument,
|
|
112
|
+
): TournamentRoomConfig {
|
|
113
|
+
return {
|
|
114
|
+
id: tournamentDocument.tournamentId,
|
|
115
|
+
gameType: tournamentDocument.gameType,
|
|
116
|
+
roomType: tournamentDocument.roomType,
|
|
117
|
+
rulesType: tournamentDocument.rulesType,
|
|
118
|
+
deckType: tournamentDocument.deckType,
|
|
119
|
+
tableSize: tournamentDocument.tableSize,
|
|
120
|
+
bet: tournamentDocument.bet,
|
|
121
|
+
ticketPrice: tournamentDocument.ticketPrice,
|
|
122
|
+
title: tournamentDocument.title,
|
|
123
|
+
subtitle: tournamentDocument.subtitle,
|
|
124
|
+
description: tournamentDocument.description,
|
|
125
|
+
enableForFastGame: false,
|
|
126
|
+
turnTimeout: this.options.playersTurnTimeout,
|
|
127
|
+
restartTimeout: this.options.restartGameTimeout,
|
|
128
|
+
instantFinishMode: this.options.instantFinishMode,
|
|
129
|
+
localeService: this.options.i18n as LocalService,
|
|
130
|
+
startStrategy: new NoStartStrategy(),
|
|
131
|
+
onRoomEvent: this.handleRoomEvent,
|
|
132
|
+
tournamentPrizeTable: this.options.tournamentPrizeTable,
|
|
133
|
+
tournamentInitialStatus: tournamentDocument.status,
|
|
134
|
+
tournamentWinners: tournamentDocument.winners,
|
|
135
|
+
maxParticipants: tournamentDocument.maxParticipants,
|
|
136
|
+
participants: tournamentDocument.participants,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private handleRoomEvent = (event: BaseGameEvent) => {
|
|
141
|
+
this.logger.log(event.toLog());
|
|
142
|
+
|
|
143
|
+
if (event instanceof GameTableFinishedEvent) {
|
|
144
|
+
void this.handleRoomTableGameFinished(event.master);
|
|
145
|
+
} else if (event instanceof GameTournamentStartedEvent) {
|
|
146
|
+
void this.handleTournamentRoomStarted(event.room.getRoomMaster());
|
|
147
|
+
} else if (event instanceof GameTournamentCancelledEvent) {
|
|
148
|
+
void this.handleTournamentRoomCancelled(event.room.getRoomMaster());
|
|
149
|
+
} else if (event instanceof GameTournamentFinishedEvent) {
|
|
150
|
+
void this.handleTournamentRoomFinished(event.room.getRoomMaster());
|
|
151
|
+
} else if (
|
|
152
|
+
event instanceof GameTournamentPlayerJoinedTheTournamentEvent ||
|
|
153
|
+
event instanceof GameTournamentPlayerLeavedTheTournamentEvent ||
|
|
154
|
+
event instanceof GameTournamentCancelledEvent ||
|
|
155
|
+
event instanceof GameTournamentWaitedEvent ||
|
|
156
|
+
event instanceof GameTournamentStartedEvent ||
|
|
157
|
+
event instanceof GameTournamentFinishedEvent
|
|
158
|
+
) {
|
|
159
|
+
void this.handleRoomStatusUpdated(
|
|
160
|
+
new RoomUpdateStateEvent(event.gameType, event.roomId),
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
private handleRoomTableGameFinished = async (master: GameMaster) => {
|
|
166
|
+
await saveGameTablesResult(
|
|
167
|
+
master,
|
|
168
|
+
this.connection,
|
|
169
|
+
this.gameResultRepository,
|
|
170
|
+
this.usersRepository,
|
|
171
|
+
false,
|
|
172
|
+
);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
private handleTournamentRoomStarted = async (master: TournamentMaster) => {
|
|
176
|
+
const session = await this.connection.startSession();
|
|
177
|
+
session.startTransaction();
|
|
178
|
+
|
|
179
|
+
try {
|
|
180
|
+
await this.tournamentRepository.startTournament(
|
|
181
|
+
master.getTournamentId(),
|
|
182
|
+
master.getRoom().getParticipants(),
|
|
183
|
+
);
|
|
184
|
+
const newTournament =
|
|
185
|
+
await this.tournamentRepository.createTournamentFromMasterTemplate(
|
|
186
|
+
master.getRoom().getGameType(),
|
|
187
|
+
);
|
|
188
|
+
this.addRoom(
|
|
189
|
+
this.options.createTournamentRoom(
|
|
190
|
+
this.oneTableTournamentDocumentToTournamentRoom(newTournament),
|
|
191
|
+
),
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
await session.commitTransaction();
|
|
195
|
+
} catch (error) {
|
|
196
|
+
await session.abortTransaction();
|
|
197
|
+
throw error;
|
|
198
|
+
} finally {
|
|
199
|
+
await session.endSession();
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
private handleTournamentRoomCancelled = async (master: TournamentMaster) => {
|
|
204
|
+
await this.tournamentRepository.cancelTournament(master.getTournamentId());
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
private handleTournamentRoomFinished = async (master: TournamentMaster) => {
|
|
208
|
+
await saveTournamentResult(
|
|
209
|
+
master,
|
|
210
|
+
this.connection,
|
|
211
|
+
this.tournamentRepository,
|
|
212
|
+
this.usersRepository,
|
|
213
|
+
);
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
private handleRoomStatusUpdated = (event: RoomUpdateStateEvent) => {
|
|
217
|
+
this.eventsBusMainTablesSubscribeService.pushNewRoomState(event);
|
|
218
|
+
this.eventsBusOneTableTournamentSubscribeService.pushNewRoomState(event);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { PlayersManagerModule } from './players-manager.module';
|
|
2
|
-
export { PlayersManagerService } from './players-manager.service';
|
|
1
|
+
export { PlayersManagerModule } from './players-manager.module';
|
|
2
|
+
export { PlayersManagerService } from './players-manager.service';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Global, Module } from '@nestjs/common';
|
|
2
|
-
import { PlayersManagerService } from './players-manager.service';
|
|
3
|
-
|
|
4
|
-
@Global()
|
|
5
|
-
@Module({
|
|
6
|
-
providers: [PlayersManagerService],
|
|
7
|
-
exports: [PlayersManagerService],
|
|
8
|
-
})
|
|
9
|
-
export class PlayersManagerModule {}
|
|
1
|
+
import { Global, Module } from '@nestjs/common';
|
|
2
|
+
import { PlayersManagerService } from './players-manager.service';
|
|
3
|
+
|
|
4
|
+
@Global()
|
|
5
|
+
@Module({
|
|
6
|
+
providers: [PlayersManagerService],
|
|
7
|
+
exports: [PlayersManagerService],
|
|
8
|
+
})
|
|
9
|
+
export class PlayersManagerModule {}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { GamePlayer } from 'jp.ms.common.engine';
|
|
3
|
-
|
|
4
|
-
@Injectable()
|
|
5
|
-
export class PlayersManagerService {
|
|
6
|
-
private readonly players: Map<string, GamePlayer>;
|
|
7
|
-
|
|
8
|
-
constructor() {
|
|
9
|
-
this.players = new Map<string, GamePlayer>();
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
getPlayerById(playerId: string): GamePlayer | undefined {
|
|
13
|
-
return this.players.get(playerId);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
getPlayers(): Array<GamePlayer> {
|
|
17
|
-
return Array.from(this.players.values());
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
addPlayer(player: GamePlayer): void {
|
|
21
|
-
this.players.set(player.id, player);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
removePlayer(playerId: string): void {
|
|
25
|
-
this.players.delete(playerId);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { GamePlayer } from 'jp.ms.common.engine';
|
|
3
|
+
|
|
4
|
+
@Injectable()
|
|
5
|
+
export class PlayersManagerService {
|
|
6
|
+
private readonly players: Map<string, GamePlayer>;
|
|
7
|
+
|
|
8
|
+
constructor() {
|
|
9
|
+
this.players = new Map<string, GamePlayer>();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
getPlayerById(playerId: string): GamePlayer | undefined {
|
|
13
|
+
return this.players.get(playerId);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getPlayers(): Array<GamePlayer> {
|
|
17
|
+
return Array.from(this.players.values());
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
addPlayer(player: GamePlayer): void {
|
|
21
|
+
this.players.set(player.id, player);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
removePlayer(playerId: string): void {
|
|
25
|
+
this.players.delete(playerId);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SimpleRoomsModule } from './simple-rooms.module';
|
|
1
|
+
export { SimpleRoomsModule } from './simple-rooms.module';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SIMPLE_ROOMS_OPTIONS = Symbol('SIMPLE_ROOMS_OPTIONS');
|
|
1
|
+
export const SIMPLE_ROOMS_OPTIONS = Symbol('SIMPLE_ROOMS_OPTIONS');
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Body,
|
|
3
|
-
Controller,
|
|
4
|
-
Param,
|
|
5
|
-
Post,
|
|
6
|
-
Headers,
|
|
7
|
-
HttpStatus,
|
|
8
|
-
HttpCode,
|
|
9
|
-
} from '@nestjs/common';
|
|
10
|
-
import { IAppHeaders, IBaseMoveData, IAppTableState } from 'jp.common.models';
|
|
11
|
-
|
|
12
|
-
import { SimpleRoomsService } from './simple-rooms.service';
|
|
13
|
-
|
|
14
|
-
@Controller('simple-rooms')
|
|
15
|
-
export class SimpleRoomsController {
|
|
16
|
-
constructor(private readonly roomsService: SimpleRoomsService) {}
|
|
17
|
-
@Post('table/watch/:tableId')
|
|
18
|
-
@HttpCode(HttpStatus.OK)
|
|
19
|
-
watchTheTable(
|
|
20
|
-
@Param('tableId') tableId: string,
|
|
21
|
-
@Headers() headers: IAppHeaders,
|
|
22
|
-
): IAppTableState {
|
|
23
|
-
return this.roomsService.watchTheTable(tableId, headers.client_auth_token);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@Post('table/enter/:tableId')
|
|
27
|
-
@HttpCode(HttpStatus.OK)
|
|
28
|
-
enterTheTable(
|
|
29
|
-
@Param('tableId') tableId: string,
|
|
30
|
-
@Headers() headers: IAppHeaders,
|
|
31
|
-
): IAppTableState {
|
|
32
|
-
return this.roomsService.enterTheTable(tableId, headers.client_auth_token);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@Post('table/exit/:tableId')
|
|
36
|
-
@HttpCode(HttpStatus.OK)
|
|
37
|
-
exitTheTable(
|
|
38
|
-
@Param('tableId') tableId: string,
|
|
39
|
-
@Headers() headers: IAppHeaders,
|
|
40
|
-
): IAppTableState {
|
|
41
|
-
return this.roomsService.exitTheTable(tableId, headers.client_auth_token);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
@Post('table/move/:tableId')
|
|
45
|
-
@HttpCode(HttpStatus.OK)
|
|
46
|
-
moveOnTheTable(
|
|
47
|
-
@Param('tableId') tableId: string,
|
|
48
|
-
@Body() baseMoveData: IBaseMoveData,
|
|
49
|
-
@Headers() headers: IAppHeaders,
|
|
50
|
-
): IAppTableState {
|
|
51
|
-
return this.roomsService.moveOnTheTable(
|
|
52
|
-
tableId,
|
|
53
|
-
headers.client_auth_token,
|
|
54
|
-
baseMoveData,
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
@Post('table/restart/:tableId')
|
|
59
|
-
@HttpCode(HttpStatus.OK)
|
|
60
|
-
restartTable(@Param('tableId') tableId: string): boolean {
|
|
61
|
-
return this.roomsService.restartTable(tableId);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
Body,
|
|
3
|
+
Controller,
|
|
4
|
+
Param,
|
|
5
|
+
Post,
|
|
6
|
+
Headers,
|
|
7
|
+
HttpStatus,
|
|
8
|
+
HttpCode,
|
|
9
|
+
} from '@nestjs/common';
|
|
10
|
+
import { IAppHeaders, IBaseMoveData, IAppTableState } from 'jp.common.models';
|
|
11
|
+
|
|
12
|
+
import { SimpleRoomsService } from './simple-rooms.service';
|
|
13
|
+
|
|
14
|
+
@Controller('simple-rooms')
|
|
15
|
+
export class SimpleRoomsController {
|
|
16
|
+
constructor(private readonly roomsService: SimpleRoomsService) {}
|
|
17
|
+
@Post('table/watch/:tableId')
|
|
18
|
+
@HttpCode(HttpStatus.OK)
|
|
19
|
+
watchTheTable(
|
|
20
|
+
@Param('tableId') tableId: string,
|
|
21
|
+
@Headers() headers: IAppHeaders,
|
|
22
|
+
): IAppTableState {
|
|
23
|
+
return this.roomsService.watchTheTable(tableId, headers.client_auth_token);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@Post('table/enter/:tableId')
|
|
27
|
+
@HttpCode(HttpStatus.OK)
|
|
28
|
+
enterTheTable(
|
|
29
|
+
@Param('tableId') tableId: string,
|
|
30
|
+
@Headers() headers: IAppHeaders,
|
|
31
|
+
): IAppTableState {
|
|
32
|
+
return this.roomsService.enterTheTable(tableId, headers.client_auth_token);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@Post('table/exit/:tableId')
|
|
36
|
+
@HttpCode(HttpStatus.OK)
|
|
37
|
+
exitTheTable(
|
|
38
|
+
@Param('tableId') tableId: string,
|
|
39
|
+
@Headers() headers: IAppHeaders,
|
|
40
|
+
): IAppTableState {
|
|
41
|
+
return this.roomsService.exitTheTable(tableId, headers.client_auth_token);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@Post('table/move/:tableId')
|
|
45
|
+
@HttpCode(HttpStatus.OK)
|
|
46
|
+
moveOnTheTable(
|
|
47
|
+
@Param('tableId') tableId: string,
|
|
48
|
+
@Body() baseMoveData: IBaseMoveData,
|
|
49
|
+
@Headers() headers: IAppHeaders,
|
|
50
|
+
): IAppTableState {
|
|
51
|
+
return this.roomsService.moveOnTheTable(
|
|
52
|
+
tableId,
|
|
53
|
+
headers.client_auth_token,
|
|
54
|
+
baseMoveData,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@Post('table/restart/:tableId')
|
|
59
|
+
@HttpCode(HttpStatus.OK)
|
|
60
|
+
restartTable(@Param('tableId') tableId: string): boolean {
|
|
61
|
+
return this.roomsService.restartTable(tableId);
|
|
62
|
+
}
|
|
63
|
+
}
|