jp.ms.common.modules 1.0.41 → 1.0.42
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/modules/anti-freeze-system/anti-freeze-system.module.d.ts +3 -1
- package/dist/modules/anti-freeze-system/anti-freeze-system.module.js +8 -4
- package/dist/modules/anti-freeze-system/anti-freeze-system.module.js.map +1 -1
- package/dist/modules/anti-freeze-system/anti-freeze-system.service.d.ts +6 -2
- package/dist/modules/anti-freeze-system/anti-freeze-system.service.js +37 -10
- package/dist/modules/anti-freeze-system/anti-freeze-system.service.js.map +1 -1
- package/dist/modules/base-achievements/base-achievements.module.js +2 -2
- package/dist/modules/base-achievements/base-achievements.module.js.map +1 -1
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.constants.d.ts +1 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.constants.js +5 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.constants.js.map +1 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.interfaces.d.ts +13 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.interfaces.js +3 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.interfaces.js.map +1 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.module.d.ts +15 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.module.js +77 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.module.js.map +1 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.service.d.ts +19 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.service.js +83 -0
- package/dist/modules/confirmation-message-manager/confirmation-message-manager.service.js.map +1 -0
- package/dist/modules/event-bus/events-bus.module.js +3 -0
- package/dist/modules/event-bus/events-bus.module.js.map +1 -1
- package/dist/modules/event-bus/events-bus.player-ws-message.subscribe.service.d.ts +10 -0
- package/dist/modules/event-bus/events-bus.player-ws-message.subscribe.service.js +26 -0
- package/dist/modules/event-bus/events-bus.player-ws-message.subscribe.service.js.map +1 -0
- package/dist/modules/event-bus/index.d.ts +1 -0
- package/dist/modules/event-bus/index.js +3 -1
- package/dist/modules/event-bus/index.js.map +1 -1
- package/dist/modules/events/events.gateway.d.ts +6 -1
- package/dist/modules/events/events.gateway.js +15 -3
- package/dist/modules/events/events.gateway.js.map +1 -1
- package/dist/modules/index.d.ts +1 -0
- package/dist/modules/index.js +3 -1
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/main/main.module.js +1 -1
- package/dist/modules/main/main.module.js.map +1 -1
- package/dist/modules/many-tables-tournament/many-tables-tournament.module.js +1 -1
- package/dist/modules/many-tables-tournament/many-tables-tournament.module.js.map +1 -1
- package/dist/modules/one-table-tournament/one-table-tournament.module.js +1 -1
- package/dist/modules/one-table-tournament/one-table-tournament.module.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 -33
- package/src/dto/app-table/bids-panel.dto.ts +32 -32
- 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 -15
- 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 -81
- 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 +59 -55
- package/src/modules/anti-freeze-system/anti-freeze-system.service.ts +136 -105
- package/src/modules/anti-freeze-system/index.ts +1 -1
- package/src/modules/base-achievements/base-achievements.module.ts +324 -322
- package/src/modules/base-achievements/index.ts +1 -1
- package/src/modules/confirmation-message-manager/confirmation-message-manager.constants.ts +3 -0
- package/src/modules/confirmation-message-manager/confirmation-message-manager.interfaces.ts +20 -0
- package/src/modules/confirmation-message-manager/confirmation-message-manager.module.ts +77 -0
- package/src/modules/confirmation-message-manager/confirmation-message-manager.service.ts +91 -0
- 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 +26 -23
- package/src/modules/event-bus/events-bus.one-table-tournament.subscribe.service.ts +6 -6
- package/src/modules/event-bus/events-bus.player-ws-message.subscribe.service.ts +30 -0
- package/src/modules/event-bus/events-bus.tournament.subscribe.service.ts +18 -18
- package/src/modules/event-bus/index.ts +6 -5
- package/src/modules/events/events.constants.ts +1 -1
- package/src/modules/events/events.gateway.ts +82 -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 +28 -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 +81 -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 -39
- 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 +80 -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
|
@@ -1,190 +1,190 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
-
import { InjectConnection } from '@nestjs/mongoose';
|
|
3
|
-
import { Connection } from 'mongoose';
|
|
4
|
-
import {
|
|
5
|
-
BaseGameEvent,
|
|
6
|
-
GameMaster,
|
|
7
|
-
MinPlayersStartStrategy,
|
|
8
|
-
SimpleRoom,
|
|
9
|
-
GameRoomConfig,
|
|
10
|
-
RoomUpdateStateEvent,
|
|
11
|
-
UserWonTheGameAppEvent,
|
|
12
|
-
GameTableFinishedEvent,
|
|
13
|
-
GamePlayerEnteredTheTableEvent,
|
|
14
|
-
GamePlayerExitedTheTableEvent,
|
|
15
|
-
LocalService,
|
|
16
|
-
} from 'jp.ms.common.engine';
|
|
17
|
-
import {
|
|
18
|
-
GameResultRepository,
|
|
19
|
-
SimpleRoomDocument,
|
|
20
|
-
SimpleRoomsRepository,
|
|
21
|
-
UsersRepository,
|
|
22
|
-
} from 'jp.db.schemas';
|
|
23
|
-
|
|
24
|
-
import { JpLoggerService } from '../logger/jp-logger.service';
|
|
25
|
-
import { saveGameTablesResult } from '../../utils/game-table-result';
|
|
26
|
-
import { EventsBusMainTablesSubscribeService } from '../event-bus/events-bus.main-tables.subscribe.service';
|
|
27
|
-
import { EventsBusAppSubscribeService } from '../event-bus/events-bus.app.subscribe.service';
|
|
28
|
-
|
|
29
|
-
import { SIMPLE_ROOMS_MANAGER_OPTIONS } from './simple-rooms-manager.constants';
|
|
30
|
-
import { SimpleRoomsFactoryOptions } from './simple-rooms-manager.interfaces';
|
|
31
|
-
|
|
32
|
-
@Injectable()
|
|
33
|
-
export class SimpleRoomsManagerService {
|
|
34
|
-
private readonly rooms: Map<string, SimpleRoom>;
|
|
35
|
-
|
|
36
|
-
constructor(
|
|
37
|
-
private readonly roomsRepository: SimpleRoomsRepository,
|
|
38
|
-
private readonly usersRepository: UsersRepository,
|
|
39
|
-
private readonly gameResultRepository: GameResultRepository,
|
|
40
|
-
private readonly eventsBusMainTablesSubscribeService: EventsBusMainTablesSubscribeService,
|
|
41
|
-
private readonly eventsBusAppSubscribeService: EventsBusAppSubscribeService,
|
|
42
|
-
@Inject(SIMPLE_ROOMS_MANAGER_OPTIONS)
|
|
43
|
-
private readonly options: SimpleRoomsFactoryOptions,
|
|
44
|
-
@InjectConnection() private readonly connection: Connection,
|
|
45
|
-
@Inject() private readonly logger: JpLoggerService,
|
|
46
|
-
) {
|
|
47
|
-
this.rooms = new Map<string, SimpleRoom>();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
get gameType() {
|
|
51
|
-
return this.options.gameType;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
getRoomById(roomId: string): SimpleRoom | undefined {
|
|
55
|
-
return this.rooms.get(roomId);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
getRoomByTableId(tableId: string): SimpleRoom | undefined {
|
|
59
|
-
const { roomId } = GameMaster.parseTableId(tableId);
|
|
60
|
-
|
|
61
|
-
return this.getRoomById(roomId);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
getRooms(): Array<SimpleRoom> {
|
|
65
|
-
return Array.from(this.rooms.values());
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
getTables(): Array<GameMaster> {
|
|
69
|
-
return this.getRooms().reduce((result, currentValue) => {
|
|
70
|
-
return [...result, ...currentValue.getMasters()];
|
|
71
|
-
}, [] as Array<GameMaster>);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
addRoom(room: SimpleRoom) {
|
|
75
|
-
this.rooms.set(room.getId(), room);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async hydrateRoomsFromDB() {
|
|
79
|
-
const templates = await this.roomsRepository.findRooms(this.gameType);
|
|
80
|
-
|
|
81
|
-
templates.forEach((item) => {
|
|
82
|
-
const newRoom = this.options.createRoom(
|
|
83
|
-
this.simpleRoomDocumentToRoom(item),
|
|
84
|
-
);
|
|
85
|
-
this.addRoom(newRoom);
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/*
|
|
90
|
-
1. Сначала ищем стол в котором один игрок
|
|
91
|
-
2. Далее ищем стол за которым есть игроки и свободные места
|
|
92
|
-
3. Отправляем на стол для быстрой игры если там есть места
|
|
93
|
-
4. Наконец создаем стол для быстрой игры и отправляем туда
|
|
94
|
-
*/
|
|
95
|
-
getFreeFastGameRoom(): GameMaster | undefined {
|
|
96
|
-
if (this.getRooms().some((item) => item.isTechBreak())) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const tables = this.getTables();
|
|
101
|
-
|
|
102
|
-
let freeTable = tables.find(
|
|
103
|
-
(master) =>
|
|
104
|
-
master.getTable().remainOnePlayer() &&
|
|
105
|
-
master.getTable().getPlayers()[0].hasOpenConnection(),
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
if (!freeTable) {
|
|
109
|
-
freeTable = tables.find(
|
|
110
|
-
(master) =>
|
|
111
|
-
master.getTable().hasMinPlayers() &&
|
|
112
|
-
!master.getTable().isFullWithQueue(),
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (!freeTable) {
|
|
117
|
-
freeTable = tables
|
|
118
|
-
.filter((item) => item.getRoom().getEnableForFastGame())
|
|
119
|
-
.find((master) => !master.getTable().isFullWithQueue());
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (!freeTable) {
|
|
123
|
-
const fastGameRoom = this.getRooms().find((item) =>
|
|
124
|
-
item.getEnableForFastGame(),
|
|
125
|
-
);
|
|
126
|
-
if (fastGameRoom) {
|
|
127
|
-
freeTable = fastGameRoom.addMaster();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return freeTable;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
private simpleRoomDocumentToRoom(room: SimpleRoomDocument): GameRoomConfig {
|
|
135
|
-
return {
|
|
136
|
-
id: room.roomId,
|
|
137
|
-
gameType: room.gameType,
|
|
138
|
-
roomType: room.roomType,
|
|
139
|
-
rulesType: room.rulesType,
|
|
140
|
-
deckType: room.deckType,
|
|
141
|
-
tableSize: room.tableSize,
|
|
142
|
-
bet: room.bet,
|
|
143
|
-
ticketPrice: room.ticketPrice / 2,
|
|
144
|
-
title: room.title,
|
|
145
|
-
subtitle: room.subtitle,
|
|
146
|
-
description: room.description,
|
|
147
|
-
enableForFastGame: room.enableForFastGame,
|
|
148
|
-
turnTimeout: this.options.playersTurnTimeout,
|
|
149
|
-
restartTimeout: this.options.restartGameTimeout,
|
|
150
|
-
instantFinishMode: this.options.instantFinishMode,
|
|
151
|
-
localeService: this.options.i18n as LocalService,
|
|
152
|
-
startStrategy: new MinPlayersStartStrategy(),
|
|
153
|
-
onRoomEvent: this.handleRoomEvent,
|
|
154
|
-
} as GameRoomConfig;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
private handleRoomEvent = (event: BaseGameEvent) => {
|
|
158
|
-
this.logger.log(event.toLog());
|
|
159
|
-
|
|
160
|
-
if (event instanceof GameTableFinishedEvent) {
|
|
161
|
-
void this.handleRoomTableGameFinished(event.master);
|
|
162
|
-
} else if (
|
|
163
|
-
event instanceof GamePlayerEnteredTheTableEvent ||
|
|
164
|
-
event instanceof GamePlayerExitedTheTableEvent
|
|
165
|
-
) {
|
|
166
|
-
this.handleRoomStatusUpdated(
|
|
167
|
-
new RoomUpdateStateEvent(event.gameType, event.roomId),
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
private handleRoomTableGameFinished = async (master: GameMaster) => {
|
|
173
|
-
await saveGameTablesResult(
|
|
174
|
-
master,
|
|
175
|
-
this.connection,
|
|
176
|
-
this.gameResultRepository,
|
|
177
|
-
this.usersRepository,
|
|
178
|
-
true,
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
// TODO: записать разные события для достижений
|
|
182
|
-
this.eventsBusAppSubscribeService.pushNewEvent(
|
|
183
|
-
new UserWonTheGameAppEvent(this.gameType, '123'),
|
|
184
|
-
);
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
private handleRoomStatusUpdated = (event: RoomUpdateStateEvent) => {
|
|
188
|
-
this.eventsBusMainTablesSubscribeService.pushNewRoomState(event);
|
|
189
|
-
};
|
|
190
|
-
}
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { InjectConnection } from '@nestjs/mongoose';
|
|
3
|
+
import { Connection } from 'mongoose';
|
|
4
|
+
import {
|
|
5
|
+
BaseGameEvent,
|
|
6
|
+
GameMaster,
|
|
7
|
+
MinPlayersStartStrategy,
|
|
8
|
+
SimpleRoom,
|
|
9
|
+
GameRoomConfig,
|
|
10
|
+
RoomUpdateStateEvent,
|
|
11
|
+
UserWonTheGameAppEvent,
|
|
12
|
+
GameTableFinishedEvent,
|
|
13
|
+
GamePlayerEnteredTheTableEvent,
|
|
14
|
+
GamePlayerExitedTheTableEvent,
|
|
15
|
+
LocalService,
|
|
16
|
+
} from 'jp.ms.common.engine';
|
|
17
|
+
import {
|
|
18
|
+
GameResultRepository,
|
|
19
|
+
SimpleRoomDocument,
|
|
20
|
+
SimpleRoomsRepository,
|
|
21
|
+
UsersRepository,
|
|
22
|
+
} from 'jp.db.schemas';
|
|
23
|
+
|
|
24
|
+
import { JpLoggerService } from '../logger/jp-logger.service';
|
|
25
|
+
import { saveGameTablesResult } from '../../utils/game-table-result';
|
|
26
|
+
import { EventsBusMainTablesSubscribeService } from '../event-bus/events-bus.main-tables.subscribe.service';
|
|
27
|
+
import { EventsBusAppSubscribeService } from '../event-bus/events-bus.app.subscribe.service';
|
|
28
|
+
|
|
29
|
+
import { SIMPLE_ROOMS_MANAGER_OPTIONS } from './simple-rooms-manager.constants';
|
|
30
|
+
import { SimpleRoomsFactoryOptions } from './simple-rooms-manager.interfaces';
|
|
31
|
+
|
|
32
|
+
@Injectable()
|
|
33
|
+
export class SimpleRoomsManagerService {
|
|
34
|
+
private readonly rooms: Map<string, SimpleRoom>;
|
|
35
|
+
|
|
36
|
+
constructor(
|
|
37
|
+
private readonly roomsRepository: SimpleRoomsRepository,
|
|
38
|
+
private readonly usersRepository: UsersRepository,
|
|
39
|
+
private readonly gameResultRepository: GameResultRepository,
|
|
40
|
+
private readonly eventsBusMainTablesSubscribeService: EventsBusMainTablesSubscribeService,
|
|
41
|
+
private readonly eventsBusAppSubscribeService: EventsBusAppSubscribeService,
|
|
42
|
+
@Inject(SIMPLE_ROOMS_MANAGER_OPTIONS)
|
|
43
|
+
private readonly options: SimpleRoomsFactoryOptions,
|
|
44
|
+
@InjectConnection() private readonly connection: Connection,
|
|
45
|
+
@Inject() private readonly logger: JpLoggerService,
|
|
46
|
+
) {
|
|
47
|
+
this.rooms = new Map<string, SimpleRoom>();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
get gameType() {
|
|
51
|
+
return this.options.gameType;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
getRoomById(roomId: string): SimpleRoom | undefined {
|
|
55
|
+
return this.rooms.get(roomId);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
getRoomByTableId(tableId: string): SimpleRoom | undefined {
|
|
59
|
+
const { roomId } = GameMaster.parseTableId(tableId);
|
|
60
|
+
|
|
61
|
+
return this.getRoomById(roomId);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
getRooms(): Array<SimpleRoom> {
|
|
65
|
+
return Array.from(this.rooms.values());
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
getTables(): Array<GameMaster> {
|
|
69
|
+
return this.getRooms().reduce((result, currentValue) => {
|
|
70
|
+
return [...result, ...currentValue.getMasters()];
|
|
71
|
+
}, [] as Array<GameMaster>);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
addRoom(room: SimpleRoom) {
|
|
75
|
+
this.rooms.set(room.getId(), room);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async hydrateRoomsFromDB() {
|
|
79
|
+
const templates = await this.roomsRepository.findRooms(this.gameType);
|
|
80
|
+
|
|
81
|
+
templates.forEach((item) => {
|
|
82
|
+
const newRoom = this.options.createRoom(
|
|
83
|
+
this.simpleRoomDocumentToRoom(item),
|
|
84
|
+
);
|
|
85
|
+
this.addRoom(newRoom);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/*
|
|
90
|
+
1. Сначала ищем стол в котором один игрок
|
|
91
|
+
2. Далее ищем стол за которым есть игроки и свободные места
|
|
92
|
+
3. Отправляем на стол для быстрой игры если там есть места
|
|
93
|
+
4. Наконец создаем стол для быстрой игры и отправляем туда
|
|
94
|
+
*/
|
|
95
|
+
getFreeFastGameRoom(): GameMaster | undefined {
|
|
96
|
+
if (this.getRooms().some((item) => item.isTechBreak())) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const tables = this.getTables();
|
|
101
|
+
|
|
102
|
+
let freeTable = tables.find(
|
|
103
|
+
(master) =>
|
|
104
|
+
master.getTable().remainOnePlayer() &&
|
|
105
|
+
master.getTable().getPlayers()[0].hasOpenConnection(),
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
if (!freeTable) {
|
|
109
|
+
freeTable = tables.find(
|
|
110
|
+
(master) =>
|
|
111
|
+
master.getTable().hasMinPlayers() &&
|
|
112
|
+
!master.getTable().isFullWithQueue(),
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (!freeTable) {
|
|
117
|
+
freeTable = tables
|
|
118
|
+
.filter((item) => item.getRoom().getEnableForFastGame())
|
|
119
|
+
.find((master) => !master.getTable().isFullWithQueue());
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (!freeTable) {
|
|
123
|
+
const fastGameRoom = this.getRooms().find((item) =>
|
|
124
|
+
item.getEnableForFastGame(),
|
|
125
|
+
);
|
|
126
|
+
if (fastGameRoom) {
|
|
127
|
+
freeTable = fastGameRoom.addMaster();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return freeTable;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private simpleRoomDocumentToRoom(room: SimpleRoomDocument): GameRoomConfig {
|
|
135
|
+
return {
|
|
136
|
+
id: room.roomId,
|
|
137
|
+
gameType: room.gameType,
|
|
138
|
+
roomType: room.roomType,
|
|
139
|
+
rulesType: room.rulesType,
|
|
140
|
+
deckType: room.deckType,
|
|
141
|
+
tableSize: room.tableSize,
|
|
142
|
+
bet: room.bet,
|
|
143
|
+
ticketPrice: room.ticketPrice / 2,
|
|
144
|
+
title: room.title,
|
|
145
|
+
subtitle: room.subtitle,
|
|
146
|
+
description: room.description,
|
|
147
|
+
enableForFastGame: room.enableForFastGame,
|
|
148
|
+
turnTimeout: this.options.playersTurnTimeout,
|
|
149
|
+
restartTimeout: this.options.restartGameTimeout,
|
|
150
|
+
instantFinishMode: this.options.instantFinishMode,
|
|
151
|
+
localeService: this.options.i18n as LocalService,
|
|
152
|
+
startStrategy: new MinPlayersStartStrategy(),
|
|
153
|
+
onRoomEvent: this.handleRoomEvent,
|
|
154
|
+
} as GameRoomConfig;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private handleRoomEvent = (event: BaseGameEvent) => {
|
|
158
|
+
this.logger.log(event.toLog());
|
|
159
|
+
|
|
160
|
+
if (event instanceof GameTableFinishedEvent) {
|
|
161
|
+
void this.handleRoomTableGameFinished(event.master);
|
|
162
|
+
} else if (
|
|
163
|
+
event instanceof GamePlayerEnteredTheTableEvent ||
|
|
164
|
+
event instanceof GamePlayerExitedTheTableEvent
|
|
165
|
+
) {
|
|
166
|
+
this.handleRoomStatusUpdated(
|
|
167
|
+
new RoomUpdateStateEvent(event.gameType, event.roomId),
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
private handleRoomTableGameFinished = async (master: GameMaster) => {
|
|
173
|
+
await saveGameTablesResult(
|
|
174
|
+
master,
|
|
175
|
+
this.connection,
|
|
176
|
+
this.gameResultRepository,
|
|
177
|
+
this.usersRepository,
|
|
178
|
+
true,
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
// TODO: записать разные события для достижений
|
|
182
|
+
this.eventsBusAppSubscribeService.pushNewEvent(
|
|
183
|
+
new UserWonTheGameAppEvent(this.gameType, '123'),
|
|
184
|
+
);
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
private handleRoomStatusUpdated = (event: RoomUpdateStateEvent) => {
|
|
188
|
+
this.eventsBusMainTablesSubscribeService.pushNewRoomState(event);
|
|
189
|
+
};
|
|
190
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import v8 from 'v8';
|
|
3
|
-
|
|
4
|
-
@Injectable()
|
|
5
|
-
export class DumpService {
|
|
6
|
-
constructor() {}
|
|
7
|
-
|
|
8
|
-
getDump(): NodeJS.ReadableStream {
|
|
9
|
-
return v8.getHeapSnapshot();
|
|
10
|
-
}
|
|
11
|
-
}
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import v8 from 'v8';
|
|
3
|
+
|
|
4
|
+
@Injectable()
|
|
5
|
+
export class DumpService {
|
|
6
|
+
constructor() {}
|
|
7
|
+
|
|
8
|
+
getDump(): NodeJS.ReadableStream {
|
|
9
|
+
return v8.getHeapSnapshot();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SupportModule } from './support.module';
|
|
1
|
+
export { SupportModule } from './support.module';
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
-
import * as client from 'prom-client';
|
|
3
|
-
import { Gauge, register, Registry } from 'prom-client';
|
|
4
|
-
|
|
5
|
-
import { PlayersManagerService } from '../players-manager/players-manager.service';
|
|
6
|
-
|
|
7
|
-
import { SUPPORT_OPTIONS } from './support.constants';
|
|
8
|
-
import { SupportFactoryOptions } from './support.interfaces';
|
|
9
|
-
|
|
10
|
-
@Injectable()
|
|
11
|
-
export class MetricService {
|
|
12
|
-
private readonly register: Registry;
|
|
13
|
-
private readonly activeUsersGauge: Gauge;
|
|
14
|
-
private readonly playingTablesGauge: Gauge;
|
|
15
|
-
|
|
16
|
-
constructor(
|
|
17
|
-
@Inject(SUPPORT_OPTIONS) private options: SupportFactoryOptions,
|
|
18
|
-
private readonly playersManager: PlayersManagerService,
|
|
19
|
-
) {
|
|
20
|
-
this.register = new client.Registry();
|
|
21
|
-
register.setDefaultLabels({ app: this.options.prometheusNameApp });
|
|
22
|
-
client.collectDefaultMetrics({ register });
|
|
23
|
-
|
|
24
|
-
this.activeUsersGauge = new client.Gauge({
|
|
25
|
-
name: 'jptserveractiveusers',
|
|
26
|
-
help: 'Amount of active users',
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
this.playingTablesGauge = new client.Gauge({
|
|
30
|
-
name: 'jptserverplayingtables',
|
|
31
|
-
help: 'Amount of playing tables',
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
getMetrics(): Registry {
|
|
36
|
-
this.activeUsersGauge.set(this.playersManager.getPlayers().length);
|
|
37
|
-
// this.playingTablesGauge.set(this.playersManager.getPlayingTables(''))
|
|
38
|
-
|
|
39
|
-
return register;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import * as client from 'prom-client';
|
|
3
|
+
import { Gauge, register, Registry } from 'prom-client';
|
|
4
|
+
|
|
5
|
+
import { PlayersManagerService } from '../players-manager/players-manager.service';
|
|
6
|
+
|
|
7
|
+
import { SUPPORT_OPTIONS } from './support.constants';
|
|
8
|
+
import { SupportFactoryOptions } from './support.interfaces';
|
|
9
|
+
|
|
10
|
+
@Injectable()
|
|
11
|
+
export class MetricService {
|
|
12
|
+
private readonly register: Registry;
|
|
13
|
+
private readonly activeUsersGauge: Gauge;
|
|
14
|
+
private readonly playingTablesGauge: Gauge;
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
@Inject(SUPPORT_OPTIONS) private options: SupportFactoryOptions,
|
|
18
|
+
private readonly playersManager: PlayersManagerService,
|
|
19
|
+
) {
|
|
20
|
+
this.register = new client.Registry();
|
|
21
|
+
register.setDefaultLabels({ app: this.options.prometheusNameApp });
|
|
22
|
+
client.collectDefaultMetrics({ register });
|
|
23
|
+
|
|
24
|
+
this.activeUsersGauge = new client.Gauge({
|
|
25
|
+
name: 'jptserveractiveusers',
|
|
26
|
+
help: 'Amount of active users',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
this.playingTablesGauge = new client.Gauge({
|
|
30
|
+
name: 'jptserverplayingtables',
|
|
31
|
+
help: 'Amount of playing tables',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
getMetrics(): Registry {
|
|
36
|
+
this.activeUsersGauge.set(this.playersManager.getPlayers().length);
|
|
37
|
+
// this.playingTablesGauge.set(this.playersManager.getPlayingTables(''))
|
|
38
|
+
|
|
39
|
+
return register;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SUPPORT_OPTIONS = Symbol('SUPPORT_OPTIONS');
|
|
1
|
+
export const SUPPORT_OPTIONS = Symbol('SUPPORT_OPTIONS');
|
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Body,
|
|
3
|
-
Controller,
|
|
4
|
-
Get,
|
|
5
|
-
Headers,
|
|
6
|
-
HttpCode,
|
|
7
|
-
HttpStatus,
|
|
8
|
-
Inject,
|
|
9
|
-
Post,
|
|
10
|
-
Res,
|
|
11
|
-
} from '@nestjs/common';
|
|
12
|
-
import type { Response } from 'express';
|
|
13
|
-
import { IAppHeaders } from 'jp.common.models';
|
|
14
|
-
|
|
15
|
-
import { PlayerConnectedDto } from '../../dto/common/player-connected.dto';
|
|
16
|
-
import { JpLoggerService } from '../logger/jp-logger.service';
|
|
17
|
-
import { LogsDto } from '../../dto/common/log.dto';
|
|
18
|
-
|
|
19
|
-
import { SupportService } from './support.service';
|
|
20
|
-
import { MetricService } from './metric.service';
|
|
21
|
-
import { DumpService } from './dump.service';
|
|
22
|
-
|
|
23
|
-
@Controller('support')
|
|
24
|
-
export class SupportController {
|
|
25
|
-
constructor(
|
|
26
|
-
private readonly supportService: SupportService,
|
|
27
|
-
private readonly metricService: MetricService,
|
|
28
|
-
private readonly dumpService: DumpService,
|
|
29
|
-
@Inject() private readonly logger: JpLoggerService,
|
|
30
|
-
) {}
|
|
31
|
-
|
|
32
|
-
@Get('users')
|
|
33
|
-
getUsers(): Array<PlayerConnectedDto> {
|
|
34
|
-
return this.supportService.getUsers();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
@Get('dump')
|
|
38
|
-
getDump(@Res() response: Response): void {
|
|
39
|
-
const dump = this.dumpService.getDump();
|
|
40
|
-
|
|
41
|
-
response.set({
|
|
42
|
-
'Content-Type': 'application/octet-stream',
|
|
43
|
-
'Content-Disposition': 'attachment; filename=${Date.now()}.heapsnapshot',
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
dump.pipe(response);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
@Get('metrics')
|
|
50
|
-
async getMetrics(@Res() response: Response) {
|
|
51
|
-
const register = this.metricService.getMetrics();
|
|
52
|
-
response.set({ 'Content-Type': register.contentType });
|
|
53
|
-
|
|
54
|
-
response.send(await register.metrics());
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
@Post('log')
|
|
58
|
-
@HttpCode(HttpStatus.OK)
|
|
59
|
-
addLog(@Headers() headers: IAppHeaders, @Body() body: LogsDto) {
|
|
60
|
-
body.logs.forEach((item) => {
|
|
61
|
-
this.logger.log({
|
|
62
|
-
client_auth_token: headers.client_auth_token,
|
|
63
|
-
client_game: headers.client_game,
|
|
64
|
-
client_channel: headers.client_channel,
|
|
65
|
-
client_language: headers.client_language,
|
|
66
|
-
client_version: headers.client_version,
|
|
67
|
-
description: item.message,
|
|
68
|
-
stackTrace: item.stackTrace,
|
|
69
|
-
level: item.level,
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@Post('techBreakOn')
|
|
75
|
-
@HttpCode(HttpStatus.OK)
|
|
76
|
-
techBreakOn(): boolean {
|
|
77
|
-
return this.supportService.techBreakOn();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
Body,
|
|
3
|
+
Controller,
|
|
4
|
+
Get,
|
|
5
|
+
Headers,
|
|
6
|
+
HttpCode,
|
|
7
|
+
HttpStatus,
|
|
8
|
+
Inject,
|
|
9
|
+
Post,
|
|
10
|
+
Res,
|
|
11
|
+
} from '@nestjs/common';
|
|
12
|
+
import type { Response } from 'express';
|
|
13
|
+
import { IAppHeaders } from 'jp.common.models';
|
|
14
|
+
|
|
15
|
+
import { PlayerConnectedDto } from '../../dto/common/player-connected.dto';
|
|
16
|
+
import { JpLoggerService } from '../logger/jp-logger.service';
|
|
17
|
+
import { LogsDto } from '../../dto/common/log.dto';
|
|
18
|
+
|
|
19
|
+
import { SupportService } from './support.service';
|
|
20
|
+
import { MetricService } from './metric.service';
|
|
21
|
+
import { DumpService } from './dump.service';
|
|
22
|
+
|
|
23
|
+
@Controller('support')
|
|
24
|
+
export class SupportController {
|
|
25
|
+
constructor(
|
|
26
|
+
private readonly supportService: SupportService,
|
|
27
|
+
private readonly metricService: MetricService,
|
|
28
|
+
private readonly dumpService: DumpService,
|
|
29
|
+
@Inject() private readonly logger: JpLoggerService,
|
|
30
|
+
) {}
|
|
31
|
+
|
|
32
|
+
@Get('users')
|
|
33
|
+
getUsers(): Array<PlayerConnectedDto> {
|
|
34
|
+
return this.supportService.getUsers();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@Get('dump')
|
|
38
|
+
getDump(@Res() response: Response): void {
|
|
39
|
+
const dump = this.dumpService.getDump();
|
|
40
|
+
|
|
41
|
+
response.set({
|
|
42
|
+
'Content-Type': 'application/octet-stream',
|
|
43
|
+
'Content-Disposition': 'attachment; filename=${Date.now()}.heapsnapshot',
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
dump.pipe(response);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@Get('metrics')
|
|
50
|
+
async getMetrics(@Res() response: Response) {
|
|
51
|
+
const register = this.metricService.getMetrics();
|
|
52
|
+
response.set({ 'Content-Type': register.contentType });
|
|
53
|
+
|
|
54
|
+
response.send(await register.metrics());
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@Post('log')
|
|
58
|
+
@HttpCode(HttpStatus.OK)
|
|
59
|
+
addLog(@Headers() headers: IAppHeaders, @Body() body: LogsDto) {
|
|
60
|
+
body.logs.forEach((item) => {
|
|
61
|
+
this.logger.log({
|
|
62
|
+
client_auth_token: headers.client_auth_token,
|
|
63
|
+
client_game: headers.client_game,
|
|
64
|
+
client_channel: headers.client_channel,
|
|
65
|
+
client_language: headers.client_language,
|
|
66
|
+
client_version: headers.client_version,
|
|
67
|
+
description: item.message,
|
|
68
|
+
stackTrace: item.stackTrace,
|
|
69
|
+
level: item.level,
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@Post('techBreakOn')
|
|
75
|
+
@HttpCode(HttpStatus.OK)
|
|
76
|
+
techBreakOn(): boolean {
|
|
77
|
+
return this.supportService.techBreakOn();
|
|
78
|
+
}
|
|
79
|
+
}
|