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