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