jp.ms.common.modules 1.0.39 → 1.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/dto/app-table/bids-panel-item.dto.d.ts +6 -0
  2. package/dist/dto/app-table/bids-panel-item.dto.js +52 -0
  3. package/dist/dto/app-table/bids-panel-item.dto.js.map +1 -0
  4. package/dist/dto/app-table/bids-panel.dto.d.ts +7 -0
  5. package/dist/dto/app-table/bids-panel.dto.js +50 -0
  6. package/dist/dto/app-table/bids-panel.dto.js.map +1 -0
  7. package/dist/dto/app-table/index.d.ts +2 -0
  8. package/dist/dto/app-table/index.js +5 -1
  9. package/dist/dto/app-table/index.js.map +1 -1
  10. package/dist/dto/games/poker/poker-table.dto.d.ts +2 -1
  11. package/dist/dto/games/poker/poker-table.dto.js +6 -0
  12. package/dist/dto/games/poker/poker-table.dto.js.map +1 -1
  13. package/dist/modules/base-achievements/base-achievements.module.js +3 -3
  14. package/dist/modules/base-achievements/base-achievements.module.js.map +1 -1
  15. package/dist/modules/main/main.service.js +1 -1
  16. package/dist/modules/menu/menu-screen.view.js +1 -1
  17. package/dist/modules/menu/menu-screen.view.js.map +1 -1
  18. package/dist/modules/menu/menu.service.js +1 -1
  19. package/dist/modules/menu/menu.service.js.map +1 -1
  20. package/dist/modules/one-table-tournament/one-table-tournament-status-screen.view.js.map +1 -1
  21. package/dist/tsconfig.tsbuildinfo +1 -1
  22. package/dist/views/table-summary.view.d.ts +6 -5
  23. package/dist/views/table-summary.view.js +3 -0
  24. package/dist/views/table-summary.view.js.map +1 -1
  25. package/package.json +57 -57
  26. package/src/dto/app-screen/app-screen-app-bar.dto.ts +36 -36
  27. package/src/dto/app-screen/app-screen-dialog.dto.ts +64 -64
  28. package/src/dto/app-screen/app-screen-field-list-item.dto.ts +42 -42
  29. package/src/dto/app-screen/app-screen-field.dto.ts +59 -59
  30. package/src/dto/app-screen/app-screen-section-button.dto.ts +60 -60
  31. package/src/dto/app-screen/app-screen-section-buttons.dto.ts +14 -14
  32. package/src/dto/app-screen/app-screen-section-image.dto.ts +33 -33
  33. package/src/dto/app-screen/app-screen-section-list-item.dto.ts +105 -105
  34. package/src/dto/app-screen/app-screen-section-req.dto.ts +33 -33
  35. package/src/dto/app-screen/app-screen-section.dto.ts +76 -76
  36. package/src/dto/app-screen/app-screen.dto.ts +50 -50
  37. package/src/dto/app-screen/base-app-screen.dto.ts +16 -16
  38. package/src/dto/app-screen/index.ts +10 -10
  39. package/src/dto/app-table/bids-panel-item.dto.ts +33 -0
  40. package/src/dto/app-table/bids-panel.dto.ts +32 -0
  41. package/src/dto/app-table/card.dto.ts +54 -54
  42. package/src/dto/app-table/cards-deck.dto.ts +22 -22
  43. package/src/dto/app-table/cards-pair-slots-item.dto.ts +45 -45
  44. package/src/dto/app-table/cards-pair-slots.dto.ts +13 -13
  45. package/src/dto/app-table/cards-panel.dto.ts +48 -48
  46. package/src/dto/app-table/cards-player.dto.ts +14 -14
  47. package/src/dto/app-table/cards-slots-item.dto.ts +40 -40
  48. package/src/dto/app-table/cards-slots.dto.ts +13 -13
  49. package/src/dto/app-table/index.ts +15 -13
  50. package/src/dto/app-table/moves-panel-button.dto.ts +24 -24
  51. package/src/dto/app-table/moves-panel.dto.ts +23 -23
  52. package/src/dto/app-table/player.dto.ts +69 -69
  53. package/src/dto/app-table/summary-item.dto.ts +51 -51
  54. package/src/dto/app-table/summary.dto.ts +13 -13
  55. package/src/dto/common/find-free-table.dto.ts +3 -3
  56. package/src/dto/common/index.ts +2 -2
  57. package/src/dto/common/join-tournament.dto.ts +33 -33
  58. package/src/dto/common/log.dto.ts +9 -9
  59. package/src/dto/common/many-tables-tournament-create.dto.ts +125 -125
  60. package/src/dto/common/many-tables-tournament-update.dto.ts +3 -3
  61. package/src/dto/common/player-check-state.dto.ts +33 -33
  62. package/src/dto/common/player-connected.dto.ts +58 -58
  63. package/src/dto/games/fool/fool-player.dto.ts +3 -3
  64. package/src/dto/games/fool/fool-table.dto.ts +81 -81
  65. package/src/dto/games/index.ts +2 -2
  66. package/src/dto/games/poker/poker-player.dto.ts +3 -3
  67. package/src/dto/games/poker/poker-table.dto.ts +81 -76
  68. package/src/dto/index.ts +4 -4
  69. package/src/exception/error-code.enum.ts +4 -4
  70. package/src/exception/global-exception-filter.ts +53 -53
  71. package/src/exception/http-exception-wth-snackbar.ts +27 -27
  72. package/src/exception/index.ts +4 -4
  73. package/src/exception/not-enough-money-for-purchase.exception.ts +14 -14
  74. package/src/exception/not-found-free-room-for-fast-game.exception.ts +14 -14
  75. package/src/index.ts +4 -4
  76. package/src/modules/anti-freeze-system/anti-freeze-system.constants.ts +1 -1
  77. package/src/modules/anti-freeze-system/anti-freeze-system.interfaces.ts +20 -18
  78. package/src/modules/anti-freeze-system/anti-freeze-system.module.ts +55 -55
  79. package/src/modules/anti-freeze-system/anti-freeze-system.service.ts +105 -105
  80. package/src/modules/anti-freeze-system/index.ts +1 -1
  81. package/src/modules/base-achievements/base-achievements.module.ts +322 -322
  82. package/src/modules/base-achievements/index.ts +1 -1
  83. package/src/modules/event-bus/events-bus.app.subscribe.service.ts +20 -20
  84. package/src/modules/event-bus/events-bus.main-tables.subscribe.service.ts +34 -34
  85. package/src/modules/event-bus/events-bus.many-tables-tournament.subscribe.service.ts +6 -6
  86. package/src/modules/event-bus/events-bus.module.ts +23 -23
  87. package/src/modules/event-bus/events-bus.one-table-tournament.subscribe.service.ts +6 -6
  88. package/src/modules/event-bus/events-bus.tournament.subscribe.service.ts +18 -18
  89. package/src/modules/event-bus/index.ts +5 -5
  90. package/src/modules/events/events.constants.ts +1 -1
  91. package/src/modules/events/events.gateway.ts +70 -70
  92. package/src/modules/events/events.interfaces.ts +17 -17
  93. package/src/modules/events/events.module.ts +32 -32
  94. package/src/modules/events/index.ts +1 -1
  95. package/src/modules/index.ts +27 -27
  96. package/src/modules/logger/index.ts +2 -2
  97. package/src/modules/logger/jp-logger.module.ts +10 -10
  98. package/src/modules/logger/jp-logger.service.ts +38 -38
  99. package/src/modules/main/index.ts +1 -1
  100. package/src/modules/main/main-tables-list-screen.view.ts +275 -275
  101. package/src/modules/main/main.constants.ts +1 -1
  102. package/src/modules/main/main.controller.ts +72 -72
  103. package/src/modules/main/main.interfaces.ts +17 -17
  104. package/src/modules/main/main.module.ts +73 -73
  105. package/src/modules/main/main.service.ts +183 -183
  106. package/src/modules/many-tables-tournament/index.ts +1 -1
  107. package/src/modules/many-tables-tournament/many-tables-tournament-status-screen.view.ts +143 -143
  108. package/src/modules/many-tables-tournament/many-tables-tournament-tables-list-screen.view.ts +63 -63
  109. package/src/modules/many-tables-tournament/many-tables-tournament.constants.ts +3 -3
  110. package/src/modules/many-tables-tournament/many-tables-tournament.controller.ts +151 -151
  111. package/src/modules/many-tables-tournament/many-tables-tournament.interfaces.ts +20 -18
  112. package/src/modules/many-tables-tournament/many-tables-tournament.module.ts +80 -80
  113. package/src/modules/many-tables-tournament/many-tables-tournament.service.ts +208 -208
  114. package/src/modules/many-tables-tournament-rooms-manager/index.ts +2 -2
  115. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.constants.ts +3 -3
  116. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.interfaces.ts +37 -35
  117. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.module.ts +84 -84
  118. package/src/modules/many-tables-tournament-rooms-manager/many-tables-tournament-rooms-manager.service.ts +331 -331
  119. package/src/modules/menu/index.ts +1 -1
  120. package/src/modules/menu/menu-screen.view.ts +71 -71
  121. package/src/modules/menu/menu.constants.ts +1 -1
  122. package/src/modules/menu/menu.controller.ts +16 -16
  123. package/src/modules/menu/menu.interfaces.ts +17 -17
  124. package/src/modules/menu/menu.module.ts +39 -39
  125. package/src/modules/menu/menu.service.ts +39 -35
  126. package/src/modules/one-table-tournament/index.ts +1 -1
  127. package/src/modules/one-table-tournament/one-table-tournament-status-screen.view.ts +166 -166
  128. package/src/modules/one-table-tournament/one-table-tournament.constants.ts +3 -3
  129. package/src/modules/one-table-tournament/one-table-tournament.controller.ts +104 -104
  130. package/src/modules/one-table-tournament/one-table-tournament.interfaces.ts +20 -18
  131. package/src/modules/one-table-tournament/one-table-tournament.module.ts +76 -76
  132. package/src/modules/one-table-tournament/one-table-tournament.service.ts +146 -146
  133. package/src/modules/one-table-tournament-rooms-manager/index.ts +2 -2
  134. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.constants.ts +3 -3
  135. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.interfaces.ts +31 -29
  136. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.module.ts +66 -66
  137. package/src/modules/one-table-tournament-rooms-manager/one-table-tournament-rooms-manager.service.ts +220 -220
  138. package/src/modules/players-manager/index.ts +2 -2
  139. package/src/modules/players-manager/players-manager.module.ts +9 -9
  140. package/src/modules/players-manager/players-manager.service.ts +27 -27
  141. package/src/modules/simple-rooms/index.ts +1 -1
  142. package/src/modules/simple-rooms/simple-rooms.constants.ts +1 -1
  143. package/src/modules/simple-rooms/simple-rooms.controller.ts +63 -63
  144. package/src/modules/simple-rooms/simple-rooms.interfaces.ts +20 -18
  145. package/src/modules/simple-rooms/simple-rooms.module.ts +39 -39
  146. package/src/modules/simple-rooms/simple-rooms.service.ts +95 -95
  147. package/src/modules/simple-rooms-manager/index.ts +2 -2
  148. package/src/modules/simple-rooms-manager/simple-rooms-manager.constants.ts +3 -3
  149. package/src/modules/simple-rooms-manager/simple-rooms-manager.interfaces.ts +26 -24
  150. package/src/modules/simple-rooms-manager/simple-rooms-manager.module.ts +60 -60
  151. package/src/modules/simple-rooms-manager/simple-rooms-manager.service.ts +190 -190
  152. package/src/modules/support/dump.service.ts +11 -11
  153. package/src/modules/support/index.ts +1 -1
  154. package/src/modules/support/metric.service.ts +41 -41
  155. package/src/modules/support/support.constants.ts +1 -1
  156. package/src/modules/support/support.controller.ts +79 -79
  157. package/src/modules/support/support.interfaces.ts +16 -16
  158. package/src/modules/support/support.module.ts +35 -35
  159. package/src/modules/support/support.service.ts +27 -27
  160. package/src/utils/date.ts +7 -7
  161. package/src/utils/game-table-result.ts +129 -129
  162. package/src/views/index.ts +5 -5
  163. package/src/views/many-tables-tournament-conifrm-exit-dialog.view.ts +37 -37
  164. package/src/views/one-table-tournament-conifrm-exit-dialog.view.ts +37 -37
  165. package/src/views/simple-room-conifrm-exit-dialog.view.ts +37 -37
  166. package/src/views/table-summary.view.ts +104 -100
  167. 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
+ }