jp.ms.common.modules 1.0.1 → 1.0.2

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 (191) hide show
  1. package/dist/adapter/base-table-game-state-adapter.d.ts +34 -0
  2. package/dist/adapter/base-table-game-state-adapter.js +172 -0
  3. package/dist/adapter/base-table-game-state-adapter.js.map +1 -0
  4. package/dist/adapter/card-table-game-state-adapter.d.ts +12 -0
  5. package/dist/adapter/card-table-game-state-adapter.js +40 -0
  6. package/dist/adapter/card-table-game-state-adapter.js.map +1 -0
  7. package/dist/adapter/index.d.ts +1 -0
  8. package/dist/adapter/index.js +6 -0
  9. package/dist/adapter/index.js.map +1 -0
  10. package/dist/config/database.d.ts +1 -2
  11. package/dist/config/database.js +2 -3
  12. package/dist/config/database.js.map +1 -1
  13. package/dist/config/locale.d.ts +1 -1
  14. package/dist/config/locale.js +2 -3
  15. package/dist/config/locale.js.map +1 -1
  16. package/dist/dto/app-screen/app-screen-section-button.dto.d.ts +1 -0
  17. package/dist/dto/app-screen/app-screen-section-button.dto.js +11 -0
  18. package/dist/dto/app-screen/app-screen-section-button.dto.js.map +1 -1
  19. package/dist/dto/common/index.d.ts +1 -0
  20. package/dist/dto/common/index.js +6 -0
  21. package/dist/dto/common/index.js.map +1 -0
  22. package/dist/dto/common/player-check-state.dto.js.map +1 -0
  23. package/dist/dto/common/player-connected.dto.d.ts +9 -0
  24. package/dist/dto/common/player-connected.dto.js +78 -0
  25. package/dist/dto/common/player-connected.dto.js.map +1 -0
  26. package/dist/dto/index.d.ts +2 -1
  27. package/dist/dto/index.js +2 -1
  28. package/dist/dto/index.js.map +1 -1
  29. package/dist/dto/table-game/base/base-table-game-state.dto.d.ts +14 -0
  30. package/dist/dto/table-game/base/base-table-game-state.dto.js +109 -0
  31. package/dist/dto/table-game/base/base-table-game-state.dto.js.map +1 -0
  32. package/dist/dto/table-game/base/base-table-moves-panel.dto.d.ts +6 -0
  33. package/dist/dto/table-game/base/base-table-moves-panel.dto.js +39 -0
  34. package/dist/dto/table-game/base/base-table-moves-panel.dto.js.map +1 -0
  35. package/dist/dto/table-game/base/base-table-summary-item.dto.js.map +1 -0
  36. package/dist/dto/table-game/base/base-table-summary.dto.js.map +1 -0
  37. package/dist/dto/table-game/base/base-table-yours-action.dto.js.map +1 -0
  38. package/dist/dto/table-game/base/game-player.dto.d.ts +10 -0
  39. package/dist/dto/table-game/base/game-player.dto.js +96 -0
  40. package/dist/dto/table-game/base/game-player.dto.js.map +1 -0
  41. package/dist/dto/table-game/cards/card-pair-slot.dto.d.ts +9 -0
  42. package/dist/dto/table-game/cards/card-pair-slot.dto.js +67 -0
  43. package/dist/dto/table-game/cards/card-pair-slot.dto.js.map +1 -0
  44. package/dist/dto/table-game/cards/card-player.dto.d.ts +6 -0
  45. package/dist/dto/table-game/cards/card-player.dto.js +28 -0
  46. package/dist/dto/table-game/cards/card-player.dto.js.map +1 -0
  47. package/dist/dto/table-game/cards/card-table-game-state.dto.d.ts +16 -0
  48. package/dist/dto/table-game/cards/card-table-game-state.dto.js +68 -0
  49. package/dist/dto/table-game/cards/card-table-game-state.dto.js.map +1 -0
  50. package/dist/dto/table-game/cards/card.dto.d.ts +8 -0
  51. package/dist/dto/{base → table-game/cards}/card.dto.js +8 -0
  52. package/dist/dto/table-game/cards/card.dto.js.map +1 -0
  53. package/dist/dto/table-game/cards/cards-panel.dto.d.ts +9 -0
  54. package/dist/dto/table-game/cards/cards-panel.dto.js +59 -0
  55. package/dist/dto/table-game/cards/cards-panel.dto.js.map +1 -0
  56. package/dist/dto/table-game/index.d.ts +1 -0
  57. package/dist/dto/table-game/index.js +6 -0
  58. package/dist/dto/table-game/index.js.map +1 -0
  59. package/dist/index.d.ts +1 -0
  60. package/dist/index.js +1 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/modules/events/events.constants.d.ts +1 -0
  63. package/dist/modules/events/events.constants.js +5 -0
  64. package/dist/modules/events/events.constants.js.map +1 -0
  65. package/dist/modules/events/events.gateway.d.ts +6 -6
  66. package/dist/modules/events/events.gateway.js +42 -9
  67. package/dist/modules/events/events.gateway.js.map +1 -1
  68. package/dist/modules/events/events.interfaces.d.ts +13 -0
  69. package/dist/modules/events/events.interfaces.js +3 -0
  70. package/dist/modules/events/events.interfaces.js.map +1 -0
  71. package/dist/modules/events/events.module.d.ts +5 -0
  72. package/dist/modules/events/events.module.js +42 -0
  73. package/dist/modules/events/events.module.js.map +1 -0
  74. package/dist/modules/index.d.ts +6 -2
  75. package/dist/modules/index.js +11 -3
  76. package/dist/modules/index.js.map +1 -1
  77. package/dist/modules/players-manager/players-manager.module.js +1 -0
  78. package/dist/modules/players-manager/players-manager.module.js.map +1 -1
  79. package/dist/modules/rooms/rooms.constants.d.ts +1 -0
  80. package/dist/modules/rooms/rooms.constants.js +5 -0
  81. package/dist/modules/rooms/rooms.constants.js.map +1 -0
  82. package/dist/modules/rooms/rooms.controller.d.ts +15 -0
  83. package/dist/modules/rooms/rooms.controller.js +120 -0
  84. package/dist/modules/rooms/rooms.controller.js.map +1 -0
  85. package/dist/modules/rooms/rooms.interfaces.d.ts +15 -0
  86. package/dist/modules/rooms/rooms.interfaces.js +3 -0
  87. package/dist/modules/rooms/rooms.interfaces.js.map +1 -0
  88. package/dist/modules/rooms/rooms.module.d.ts +6 -0
  89. package/dist/modules/rooms/rooms.module.js +48 -0
  90. package/dist/modules/rooms/rooms.module.js.map +1 -0
  91. package/dist/modules/rooms/rooms.service.d.ts +19 -0
  92. package/dist/modules/rooms/rooms.service.js +112 -0
  93. package/dist/modules/rooms/rooms.service.js.map +1 -0
  94. package/dist/modules/simple-rooms-manager/simple-rooms-manager.constants.d.ts +1 -0
  95. package/dist/modules/simple-rooms-manager/simple-rooms-manager.constants.js +5 -0
  96. package/dist/modules/simple-rooms-manager/simple-rooms-manager.constants.js.map +1 -0
  97. package/dist/modules/simple-rooms-manager/simple-rooms-manager.interfaces.d.ts +17 -0
  98. package/dist/modules/simple-rooms-manager/simple-rooms-manager.interfaces.js +3 -0
  99. package/dist/modules/simple-rooms-manager/simple-rooms-manager.interfaces.js.map +1 -0
  100. package/dist/modules/simple-rooms-manager/simple-rooms-manager.module.d.ts +19 -0
  101. package/dist/modules/simple-rooms-manager/simple-rooms-manager.module.js +173 -0
  102. package/dist/modules/simple-rooms-manager/simple-rooms-manager.module.js.map +1 -0
  103. package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.d.ts +9 -0
  104. package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.js +39 -0
  105. package/dist/modules/simple-rooms-manager/simple-rooms-manager.service.js.map +1 -0
  106. package/dist/modules/support/dump.service.d.ts +4 -0
  107. package/dist/modules/support/dump.service.js +27 -0
  108. package/dist/modules/support/dump.service.js.map +1 -0
  109. package/dist/modules/support/metric.service.d.ts +12 -0
  110. package/dist/modules/support/metric.service.js +53 -0
  111. package/dist/modules/support/metric.service.js.map +1 -0
  112. package/dist/modules/support/support.constants.d.ts +1 -0
  113. package/dist/modules/support/support.constants.js +5 -0
  114. package/dist/modules/support/support.constants.js.map +1 -0
  115. package/dist/modules/support/support.controller.d.ts +15 -0
  116. package/dist/modules/support/support.controller.js +81 -0
  117. package/dist/modules/support/support.controller.js.map +1 -0
  118. package/dist/modules/support/support.interfaces.d.ts +6 -0
  119. package/dist/modules/support/support.interfaces.js +3 -0
  120. package/dist/modules/support/support.interfaces.js.map +1 -0
  121. package/dist/modules/support/support.module.d.ts +5 -0
  122. package/dist/modules/support/support.module.js +32 -0
  123. package/dist/modules/support/support.module.js.map +1 -0
  124. package/dist/modules/support/support.service.d.ts +8 -0
  125. package/dist/modules/support/support.service.js +32 -0
  126. package/dist/modules/support/support.service.js.map +1 -0
  127. package/dist/tsconfig.tsbuildinfo +1 -1
  128. package/package.json +11 -8
  129. package/src/adapter/base-table-game-state-adapter.ts +254 -0
  130. package/src/adapter/card-table-game-state-adapter.ts +54 -0
  131. package/src/adapter/index.ts +1 -0
  132. package/src/config/database.ts +2 -3
  133. package/src/config/locale.ts +2 -9
  134. package/src/dto/app-screen/app-screen-section-button.dto.ts +9 -0
  135. package/src/dto/common/index.ts +1 -0
  136. package/src/dto/common/player-connected.dto.ts +58 -0
  137. package/src/dto/index.ts +2 -1
  138. package/src/dto/table-game/base/base-table-game-state.dto.ts +79 -0
  139. package/src/dto/table-game/base/base-table-moves-panel.dto.ts +23 -0
  140. package/src/dto/table-game/base/game-player.dto.ts +69 -0
  141. package/src/dto/table-game/cards/card-pair-slot.dto.ts +45 -0
  142. package/src/dto/table-game/cards/card-player.dto.ts +15 -0
  143. package/src/dto/table-game/cards/card-table-game-state.dto.ts +50 -0
  144. package/src/dto/{base → table-game/cards}/card.dto.ts +10 -5
  145. package/src/dto/table-game/cards/cards-panel.dto.ts +40 -0
  146. package/src/dto/table-game/index.ts +2 -0
  147. package/src/index.ts +1 -0
  148. package/src/modules/events/events.constants.ts +1 -0
  149. package/src/modules/events/events.gateway.ts +58 -52
  150. package/src/modules/events/events.interfaces.ts +16 -0
  151. package/src/modules/events/events.module.ts +33 -0
  152. package/src/modules/index.ts +10 -2
  153. package/src/modules/players-manager/players-manager.module.ts +2 -1
  154. package/src/modules/rooms/rooms.constants.ts +1 -0
  155. package/src/modules/rooms/rooms.controller.ts +73 -0
  156. package/src/modules/rooms/rooms.interfaces.ts +17 -0
  157. package/src/modules/rooms/rooms.module.ts +36 -0
  158. package/src/modules/rooms/rooms.service.ts +150 -0
  159. package/src/modules/simple-rooms-manager/simple-rooms-manager.constants.ts +1 -0
  160. package/src/modules/simple-rooms-manager/simple-rooms-manager.interfaces.ts +19 -0
  161. package/src/modules/simple-rooms-manager/simple-rooms-manager.module.ts +171 -0
  162. package/src/modules/simple-rooms-manager/simple-rooms-manager.service.ts +29 -0
  163. package/src/modules/support/dump.service.ts +12 -0
  164. package/src/modules/support/metric.service.ts +41 -0
  165. package/src/modules/support/support.constants.ts +1 -0
  166. package/src/modules/support/support.controller.ts +47 -0
  167. package/src/modules/support/support.interfaces.ts +7 -0
  168. package/src/modules/support/support.module.ts +22 -0
  169. package/src/modules/support/support.service.ts +20 -0
  170. package/dist/dto/base/base-table-summary-item.dto.js.map +0 -1
  171. package/dist/dto/base/base-table-summary.dto.js.map +0 -1
  172. package/dist/dto/base/base-table-yours-action.dto.js.map +0 -1
  173. package/dist/dto/base/card.dto.d.ts +0 -7
  174. package/dist/dto/base/card.dto.js.map +0 -1
  175. package/dist/dto/base/index.d.ts +0 -5
  176. package/dist/dto/base/index.js +0 -14
  177. package/dist/dto/base/index.js.map +0 -1
  178. package/dist/dto/base/player-check-state.dto.js.map +0 -1
  179. package/src/dto/base/index.ts +0 -5
  180. /package/dist/dto/{base → common}/player-check-state.dto.d.ts +0 -0
  181. /package/dist/dto/{base → common}/player-check-state.dto.js +0 -0
  182. /package/dist/dto/{base → table-game/base}/base-table-summary-item.dto.d.ts +0 -0
  183. /package/dist/dto/{base → table-game/base}/base-table-summary-item.dto.js +0 -0
  184. /package/dist/dto/{base → table-game/base}/base-table-summary.dto.d.ts +0 -0
  185. /package/dist/dto/{base → table-game/base}/base-table-summary.dto.js +0 -0
  186. /package/dist/dto/{base → table-game/base}/base-table-yours-action.dto.d.ts +0 -0
  187. /package/dist/dto/{base → table-game/base}/base-table-yours-action.dto.js +0 -0
  188. /package/src/dto/{base → common}/player-check-state.dto.ts +0 -0
  189. /package/src/dto/{base → table-game/base}/base-table-summary-item.dto.ts +0 -0
  190. /package/src/dto/{base → table-game/base}/base-table-summary.dto.ts +0 -0
  191. /package/src/dto/{base → table-game/base}/base-table-yours-action.dto.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jp.ms.common.modules",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -10,16 +10,18 @@
10
10
  "@nestjs/common": "11.1.0",
11
11
  "@nestjs/config": "4.0.2",
12
12
  "@nestjs/core": "11.1.0",
13
- "@nestjs/mongoose": "11.0.3",
13
+ "@nestjs/mongoose": "11.0.4",
14
14
  "@nestjs/websockets": "11.1.9",
15
- "jp.common.models": "file:../jp.common.models",
16
- "jp.db.schemas": "1.0.37",
17
- "jp.ms.common.engine": "file:../jp.ms.common.engine",
18
- "mongoose": "8.14.1",
15
+ "jp.common.models": "1.0.7",
16
+ "jp.common.utils": "1.0.2",
17
+ "jp.db.schemas": "2.0.1",
18
+ "jp.ms.common.engine": "2.0.0",
19
+ "mongoose": "9.1.5",
19
20
  "nestjs-i18n": "10.5.1",
20
21
  "reflect-metadata": "0.2.2",
21
22
  "rxjs": "7.8.2",
22
- "socket.io": "4.8.1"
23
+ "socket.io": "4.8.1",
24
+ "prom-client": "^15.1.0"
23
25
  },
24
26
  "devDependencies": {
25
27
  "@nestjs/swagger": "11.2.3",
@@ -27,7 +29,8 @@
27
29
  "class-transformer": "0.5.1",
28
30
  "class-validator": "0.14.3",
29
31
  "rimraf": "6.0.1",
30
- "typescript": "5.8.3"
32
+ "typescript": "5.8.3",
33
+ "@types/express": "^5.0.6"
31
34
  },
32
35
  "scripts": {
33
36
  "build": "rimraf dist && tsc",
@@ -0,0 +1,254 @@
1
+ import {
2
+ IBaseTableGameStateExtraButtons,
3
+ IBaseTableGameStatePlayer,
4
+ IBaseTableGameStateSummary,
5
+ IBaseTableGameState,
6
+ IBaseTableGameStateMovesPanel,
7
+ IBaseTableGameStateYoursActionItem,
8
+ BaseTableGameStateYoursAction,
9
+ BaseTablePlayerActionsEnum,
10
+ BaseTableGameStateExtraButtons,
11
+ BaseTableGameStatePlayer,
12
+ BaseTableGameStateSummary,
13
+ BaseTableGameSummaryItem,
14
+ BaseTableGameStateMovesPanel,
15
+ } from 'jp.common.models';
16
+ import { GameMaster, GamePlayer } from 'jp.ms.common.engine';
17
+ import { formatChips, getPropsFromObject } from 'jp.common.utils';
18
+
19
+ export abstract class BaseTableGameStateAdapter {
20
+ private readonly _master: GameMaster;
21
+ private readonly _currentPlayer: GamePlayer;
22
+
23
+ constructor (master: GameMaster, currentPlayer: GamePlayer) {
24
+ this._master = master;
25
+ this._currentPlayer = currentPlayer;
26
+ }
27
+
28
+ getMaster<T extends GameMaster> () {
29
+ return this._master as T;
30
+ }
31
+
32
+ getCurrentPlayer<T extends GamePlayer> () {
33
+ return this._currentPlayer as T;
34
+ }
35
+
36
+ get lang (): string {
37
+ return this._currentPlayer.language.replace('language__', '');
38
+ }
39
+
40
+ t (key: string, options: object) {
41
+ const fullCommonKey = `common.${key}`;
42
+ const fullSpecificKey = `${this._master.getRoom().getGameType().replace('JUST_', '').toLowerCase()}.${key}`;
43
+
44
+ let resource = this._master.getRoom().getLocaleService().t(fullSpecificKey, { ...options, defaultValue: '' });
45
+ if (!resource) {
46
+ resource = this._master.getRoom().getLocaleService().t(fullCommonKey, { ...options, defaultValue: '' });
47
+ }
48
+
49
+ return resource || key;
50
+ }
51
+
52
+ getRoomId (): string {
53
+ return this._master.getRoom().getId();
54
+ }
55
+
56
+ getTableId (): string {
57
+ return this._master.getTable().getId();
58
+ }
59
+
60
+ getGameId (): string {
61
+ return this._master.getGameRound()?.getId() ?? '';
62
+ }
63
+
64
+ getTableSize (): number {
65
+ return this._master.getTable().getTableSize();
66
+ }
67
+
68
+ getPlayerTurnTimerRemain (): number | undefined {
69
+ return this._master.getPlayerTurnTimerRemain();
70
+ }
71
+
72
+ getRestartTimerRemain (): number | undefined {
73
+ return this._master.getRestartTimerRemain();
74
+ }
75
+
76
+ getYoursMessage (): string {
77
+ if (this._currentPlayer.isRoomQueuer()) {
78
+ if (this._master.getTable().isFull()) {
79
+ return this.t(`room.screen.info.message.title.WAITING_FREE_SEAT`, { lang: this.lang });
80
+ } else {
81
+ return this.t(`room.screen.info.message.title.WAITING_NEXT_GAME`, { lang: this.lang });
82
+ }
83
+ }
84
+
85
+ return '';
86
+ }
87
+
88
+ getPlayerComment (player: GamePlayer): string {
89
+ if (this._master.isInProgress()) {
90
+ if (this._master.isActivePlayer(player.id)) {
91
+ return this.getPlayerCommentInProgressActive(player);
92
+ } else {
93
+ return this.getPlayerCommentInProgressNotActive(player);
94
+ }
95
+ } else if (this._master.isFinish()) {
96
+ return this.getPlayerCommentFinish(player)
97
+ }
98
+
99
+ return ''
100
+ }
101
+
102
+ getPlayerCommentInProgressActive (player: GamePlayer): string {
103
+ return this.t('room.screen.player.turn.timeout', { lang: this.lang });
104
+ }
105
+
106
+ getPlayerCommentInProgressNotActive (player: GamePlayer): string {
107
+ return this.t(
108
+ `room.screen.last.action.title.${player.getLastMove()?.action}`,
109
+ { lang: this.lang, args: getPropsFromObject(player.getLastMove() ?? {}) },
110
+ );
111
+ }
112
+
113
+ getPlayerCommentFinish (player: GamePlayer): string {
114
+ const profit = formatChips(player.profit, this.lang, true);
115
+
116
+ return player.isWinner ? `+${profit}` : profit;
117
+ }
118
+
119
+ getPlayer (item: GamePlayer): IBaseTableGameStatePlayer {
120
+ return new BaseTableGameStatePlayer({
121
+ id: item.id,
122
+ fullName: item.fullName,
123
+ avatarUrl: item.avatarUrl,
124
+ stack: formatChips(item.stack, this.lang, true),
125
+ seatNumber: item.seatNumber,
126
+ active: item.isWinner || item.isActivePlayer(),
127
+ comment: this.getPlayerComment(item),
128
+ });
129
+ }
130
+
131
+ getPlayers (): Array<IBaseTableGameStatePlayer> {
132
+ return this._master.getTable().getPlayers<GamePlayer>().map((item) => this.getPlayer(item));
133
+ }
134
+
135
+ getPlayerActions (): Array<IBaseTableGameStateYoursActionItem> {
136
+ return this._master.getPossibleMoves(this._currentPlayer)
137
+ .map((action) => new BaseTableGameStateYoursAction(
138
+ action,
139
+ this.t(`room.screen.action.button.title.${action}`, { lang: this.lang }),
140
+ ));
141
+ }
142
+
143
+ getMovesPanelIsOpen (): boolean {
144
+ return true;
145
+ }
146
+
147
+ getMovesPanel (): IBaseTableGameStateMovesPanel {
148
+ return new BaseTableGameStateMovesPanel(this.getMovesPanelIsOpen(), this.getPlayerActions());
149
+ }
150
+
151
+ getExtraButtons (): IBaseTableGameStateExtraButtons | undefined {
152
+ const chat = this._master.hasPossibleMove(this._currentPlayer, BaseTablePlayerActionsEnum.ACTION_CHAT);
153
+ const react = this._master.hasPossibleMove(this._currentPlayer, BaseTablePlayerActionsEnum.ACTION_REACT);
154
+
155
+ return new BaseTableGameStateExtraButtons(
156
+ chat ?
157
+ new BaseTableGameStateYoursAction(
158
+ BaseTablePlayerActionsEnum.ACTION_CHAT,
159
+ this.t(`room.screen.action.button.title.${chat}`, { lang: this.lang }),
160
+ )
161
+ : undefined,
162
+ react ?
163
+ new BaseTableGameStateYoursAction(
164
+ BaseTablePlayerActionsEnum.ACTION_REACT,
165
+ this.t(`room.screen.action.button.title.${react}`, { lang: this.lang }),
166
+ )
167
+ : undefined,
168
+ );
169
+ }
170
+
171
+ getSummary (): IBaseTableGameStateSummary {
172
+ if (this._master.isInProgress()) {
173
+ return this.getSummaryPlaying();
174
+ } else if (this._master.isTechBreak()) {
175
+ return this.getSummaryTechBreak();
176
+ } else if (this._master.isWaiting()) {
177
+ return this.getSummaryWaiting();
178
+ } else if (this._master.isFinish()) {
179
+ return this.getSummaryEnd();
180
+ }
181
+
182
+ return new BaseTableGameStateSummary();
183
+ }
184
+
185
+ getSummaryTechBreak () {
186
+ const summary = new BaseTableGameStateSummary();
187
+
188
+ summary.list.push(BaseTableGameSummaryItem.newBodyMdItem(
189
+ 'tech-break',
190
+ this.t('room.screen.tech.break.message', { lang: this.lang }),
191
+ ));
192
+
193
+ return summary;
194
+ }
195
+
196
+ getSummaryPlaying () {
197
+ const summary = new BaseTableGameStateSummary();
198
+
199
+ summary.list.push(BaseTableGameSummaryItem.newTitleMdItem(
200
+ 'pot',
201
+ this.t('room.screen.summary.pot', {
202
+ lang: this.lang,
203
+ args: { POT: formatChips(this.getMaster()?.getGameRound()?.getPot() ?? 0, this.lang, true) },
204
+ },
205
+ ),
206
+ ));
207
+
208
+ return summary;
209
+ }
210
+
211
+ getSummaryWaiting () {
212
+ const summary = new BaseTableGameStateSummary();
213
+
214
+ summary.list.push(BaseTableGameSummaryItem.newBodyMdItem(
215
+ 'waiting',
216
+ this.t('room.screen.waiting.for.the.players', { lang: this.lang }),
217
+ ));
218
+
219
+ return summary;
220
+ }
221
+
222
+ getSummaryEnd () {
223
+ const summary = new BaseTableGameStateSummary();
224
+
225
+ summary.list.push(BaseTableGameSummaryItem.newBodySmItem(
226
+ 'WINNER',
227
+ this.t('room.screen.summary.winner', { lang: this.lang }),
228
+ this._master.getGameResultHelper()?.getWinnersName() ?? '',
229
+ ));
230
+
231
+ summary.list.push(BaseTableGameSummaryItem.newBodySmItem(
232
+ 'NEW_GAME',
233
+ this.t('room.screen.summary.new.game', { lang: this.lang }),
234
+ this.t('room.screen.summary.new.game.value', { lang: this.lang }),
235
+ ));
236
+
237
+ return summary;
238
+ }
239
+
240
+ getState (): IBaseTableGameState {
241
+ return {
242
+ roomId: this.getRoomId(),
243
+ tableId: this.getTableId(),
244
+ gameId: this.getGameId(),
245
+ tableSize: this.getTableSize(),
246
+ checkPlayersTurnTimerRemain: this.getPlayerTurnTimerRemain(),
247
+ restartTimerRemain: this.getRestartTimerRemain(),
248
+ yoursMessage: this.getYoursMessage(),
249
+ summary: this.getSummary(),
250
+ movesPanel: this.getMovesPanel(),
251
+ extraButtons: this.getExtraButtons(),
252
+ }
253
+ }
254
+ }
@@ -0,0 +1,54 @@
1
+ import {
2
+ ICardTableGameState,
3
+ ICardPlayerState,
4
+ CardsPanelState,
5
+ ICardsPanelState,
6
+ } from 'jp.common.models';
7
+ import { CardsGameMaster, CardsPlayer } from 'jp.ms.common.engine';
8
+
9
+ import { BaseTableGameStateAdapter } from './base-table-game-state-adapter';
10
+
11
+ export abstract class CardTableGameStateAdapter extends BaseTableGameStateAdapter {
12
+ override getPlayer (item: CardsPlayer): ICardPlayerState {
13
+ return {
14
+ ...super.getPlayer(item),
15
+ cards: item.getCards(),
16
+ };
17
+ }
18
+
19
+ override getPlayers (): Array<ICardPlayerState> {
20
+ return this.getMaster<CardsGameMaster>().getTable().getPlayers<CardsPlayer>().map((item) => this.getPlayer(item));
21
+ }
22
+
23
+ getPlayerCards () {
24
+ return this.getCurrentPlayer<CardsPlayer>().getCards();
25
+ }
26
+
27
+ getCardsPanelIsOpen (): boolean {
28
+ return false;
29
+ }
30
+
31
+ getCardsPanelBackdropVisible (): boolean {
32
+ return false;
33
+ }
34
+
35
+ getCardsPanel (): ICardsPanelState {
36
+ return new CardsPanelState(
37
+ this.getCardsPanelIsOpen(),
38
+ this.getPlayerActions(),
39
+ this.getPlayerCards(),
40
+ this.getCardsPanelBackdropVisible(),
41
+ );
42
+ }
43
+
44
+ getState (): ICardTableGameState {
45
+ return {
46
+ ...super.getState(),
47
+ players: this.getPlayers(),
48
+ baseCard: this.getMaster<CardsGameMaster>().getGameBaseCard(),
49
+ gameCards: this.getMaster<CardsGameMaster>().getGameCards(),
50
+ gameCardsPair: this.getMaster<CardsGameMaster>().getGameCardPairSlots().getSlots(),
51
+ cardsPanel: this.getCardsPanel(),
52
+ };
53
+ }
54
+ }
@@ -0,0 +1 @@
1
+ export { CardTableGameStateAdapter } from './card-table-game-state-adapter';
@@ -1,12 +1,11 @@
1
1
  import { ConfigModule, ConfigService } from '@nestjs/config';
2
2
  import { MongooseModuleAsyncOptions } from '@nestjs/mongoose';
3
3
 
4
- export function getDatabaseConfig (module: ConfigModule, service: object): MongooseModuleAsyncOptions {
4
+ export function getDatabaseConfig (configService: object): MongooseModuleAsyncOptions {
5
5
  return {
6
- imports: [module],
7
6
  useFactory: async (configService: ConfigService) => ({
8
7
  uri: configService.get<string>('MONGODB_URI'),
9
8
  }),
10
- inject: [service],
9
+ inject: [configService],
11
10
  } as MongooseModuleAsyncOptions;
12
11
  }
@@ -2,15 +2,8 @@ import { join } from 'path';
2
2
  import { AcceptLanguageResolver, HeaderResolver, I18nAsyncOptions, QueryResolver } from 'nestjs-i18n';
3
3
  import { ConfigService } from '@nestjs/config';
4
4
 
5
- interface LocaleParams {
6
- module: object,
7
- service: object,
8
- dirname: string,
9
- }
10
-
11
- export function getLocaleConfig (module: object, service: object, dirname: string) {
5
+ export function getLocaleConfig (configService: object, dirname: string) {
12
6
  return {
13
- imports: [module],
14
7
  useFactory: async (configService: ConfigService) => {
15
8
  return ({
16
9
  fallbackLanguage: 'en',
@@ -25,6 +18,6 @@ export function getLocaleConfig (module: object, service: object, dirname: strin
25
18
  AcceptLanguageResolver,
26
19
  { use: HeaderResolver, options: ['x-lang'] },
27
20
  ],
28
- inject: [service],
21
+ inject: [configService],
29
22
  } as I18nAsyncOptions;
30
23
  }
@@ -40,6 +40,15 @@ export class AppScreenSectionButtonDto implements IAppScreenSectionButton {
40
40
  @IsString()
41
41
  url?: string;
42
42
 
43
+ @ApiProperty({
44
+ description: 'icon',
45
+ required: false,
46
+ type: String,
47
+ })
48
+ @Expose()
49
+ @IsString()
50
+ icon?: string;
51
+
43
52
  @ApiProperty({
44
53
  description: 'title',
45
54
  required: true,
@@ -0,0 +1 @@
1
+ export { PlayerCheckStateDto } from './player-check-state.dto';
@@ -0,0 +1,58 @@
1
+ import { ApiProperty } from '@nestjs/swagger';
2
+ import { Expose } from 'class-transformer';
3
+ import { IsArray, IsString, ValidateNested } from 'class-validator';
4
+ import { GamePlayer } from 'jp.ms.common.engine';
5
+
6
+ export class PlayerConnectedDto {
7
+ @ApiProperty({
8
+ description: 'Идентификатор пользователя',
9
+ required: true,
10
+ type: String,
11
+ })
12
+ @Expose()
13
+ @IsString()
14
+ id: string;
15
+
16
+ @ApiProperty({
17
+ description: 'Имя',
18
+ required: true,
19
+ type: String,
20
+ })
21
+ @Expose()
22
+ @IsString()
23
+ fullName: string;
24
+
25
+ @ApiProperty({
26
+ description: 'Дата последнего сообщения',
27
+ required: true,
28
+ type: String,
29
+ })
30
+ @Expose()
31
+ @IsString()
32
+ lastWSMessageDate: Date | null;
33
+
34
+ @ApiProperty({
35
+ description: 'Дата последнего сообщения',
36
+ required: true,
37
+ type: String,
38
+ })
39
+ @Expose()
40
+ @IsString()
41
+ isPlayer: boolean;
42
+
43
+ @IsArray()
44
+ @ValidateNested({ each: true })
45
+ @Expose()
46
+ connections: Array<string>;
47
+
48
+ static fromEntities(player: GamePlayer): PlayerConnectedDto {
49
+ const dto = new PlayerConnectedDto();
50
+ dto.id = player.id;
51
+ dto.fullName = player.fullName;
52
+ // dto.lastWSMessageDate = player.lastWSMessageDate;
53
+ dto.isPlayer = player.isPlayer();
54
+ dto.connections = player.connections.getAllConnectionsKeys();
55
+
56
+ return dto;
57
+ }
58
+ }
package/src/dto/index.ts CHANGED
@@ -1,2 +1,3 @@
1
- export * from './base'
1
+ export * from './table-game'
2
2
  export * from './app-screen'
3
+ export * from './common'
@@ -0,0 +1,79 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsNumber, IsString, ValidateNested } from 'class-validator';
3
+ import { IBaseTableGameState } from 'jp.common.models';
4
+ import { ApiProperty } from '@nestjs/swagger';
5
+
6
+ import { BaseTableSummaryDto } from './base-table-summary.dto';
7
+ import { BaseTableMovesPanelDto } from './base-table-moves-panel.dto';
8
+
9
+ export class BaseTableGameStateDto implements IBaseTableGameState {
10
+ @ApiProperty({
11
+ description: 'Room ID',
12
+ required: true,
13
+ type: String,
14
+ })
15
+ @Expose()
16
+ @IsString()
17
+ roomId: string;
18
+
19
+ @ApiProperty({
20
+ description: 'Table ID',
21
+ required: true,
22
+ type: String,
23
+ })
24
+ @Expose()
25
+ @IsString()
26
+ tableId: string;
27
+
28
+ @ApiProperty({
29
+ description: 'Game ID',
30
+ required: true,
31
+ type: String,
32
+ })
33
+ @Expose()
34
+ @IsString()
35
+ gameId: string;
36
+
37
+ @ApiProperty({
38
+ description: 'Table Size',
39
+ type: Number,
40
+ })
41
+ @IsNumber()
42
+ @Expose()
43
+ tableSize: number;
44
+
45
+ @ApiProperty({
46
+ description: 'Your message',
47
+ required: true,
48
+ type: String,
49
+ })
50
+ @Expose()
51
+ @IsString()
52
+ yoursMessage: string;
53
+
54
+ @ValidateNested()
55
+ @Type(() => BaseTableSummaryDto)
56
+ @Expose()
57
+ summary: BaseTableSummaryDto;
58
+
59
+ @ApiProperty({
60
+ description: 'Player Turn Timer Remain',
61
+ type: Number,
62
+ })
63
+ @IsNumber()
64
+ @Expose()
65
+ checkPlayersTurnTimerRemain?: number;
66
+
67
+ @ApiProperty({
68
+ description: 'Restart Timer Remain',
69
+ type: Number,
70
+ })
71
+ @IsNumber()
72
+ @Expose()
73
+ restartTimerRemain?: number;
74
+
75
+ @ValidateNested()
76
+ @Type(() => BaseTableMovesPanelDto)
77
+ @Expose()
78
+ movesPanel: BaseTableMovesPanelDto;
79
+ }
@@ -0,0 +1,23 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsArray, IsBoolean, ValidateNested } from 'class-validator';
3
+ import { IBaseTableGameStateMovesPanel } from 'jp.common.models';
4
+ import { ApiProperty } from '@nestjs/swagger';
5
+
6
+ import { BaseTableYoursActionDto } from './base-table-yours-action.dto';
7
+
8
+ export class BaseTableMovesPanelDto implements IBaseTableGameStateMovesPanel {
9
+ @ApiProperty({
10
+ description: 'isOpen',
11
+ required: true,
12
+ type: Boolean,
13
+ })
14
+ @Expose()
15
+ @IsBoolean()
16
+ isOpen: boolean;
17
+
18
+ @IsArray()
19
+ @ValidateNested({ each: true })
20
+ @Type(() => BaseTableYoursActionDto)
21
+ @Expose()
22
+ moves: Array<BaseTableYoursActionDto>;
23
+ }
@@ -0,0 +1,69 @@
1
+ import { ApiProperty } from '@nestjs/swagger';
2
+ import { Expose } from 'class-transformer';
3
+ import { IsString, IsNumber, IsBoolean } from 'class-validator';
4
+ import { IBaseTableGameStatePlayer } from 'jp.common.models';
5
+
6
+ export class GamePlayerDto implements IBaseTableGameStatePlayer {
7
+ @ApiProperty({
8
+ description: 'user ID',
9
+ required: true,
10
+ type: String,
11
+ })
12
+ @Expose()
13
+ @IsString()
14
+ id: string;
15
+
16
+ @ApiProperty({
17
+ description: 'full name',
18
+ required: true,
19
+ type: String,
20
+ })
21
+ @Expose()
22
+ @IsString()
23
+ fullName: string;
24
+
25
+ @ApiProperty({
26
+ description: 'avatar url',
27
+ required: true,
28
+ type: String,
29
+ })
30
+ @Expose()
31
+ @IsString()
32
+ avatarUrl: string;
33
+
34
+ @ApiProperty({
35
+ description: 'stack',
36
+ required: true,
37
+ type: Number,
38
+ })
39
+ @Expose()
40
+ @IsNumber()
41
+ stack: string;
42
+
43
+ @ApiProperty({
44
+ description: 'seat number',
45
+ required: true,
46
+ type: Number,
47
+ })
48
+ @Expose()
49
+ @IsNumber()
50
+ seatNumber: number;
51
+
52
+ @ApiProperty({
53
+ description: 'active',
54
+ required: true,
55
+ type: Boolean,
56
+ })
57
+ @Expose()
58
+ @IsBoolean()
59
+ active: boolean;
60
+
61
+ @ApiProperty({
62
+ description: 'comment',
63
+ required: true,
64
+ type: String,
65
+ })
66
+ @Expose()
67
+ @IsString()
68
+ comment: string;
69
+ }
@@ -0,0 +1,45 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsBoolean, IsNumber, ValidateNested } from 'class-validator';
3
+ import { ICardPairSlotState } from 'jp.common.models';
4
+ import { ApiProperty } from '@nestjs/swagger';
5
+
6
+ import { CardDto } from './card.dto';
7
+
8
+ export class CardPairSlotDto implements ICardPairSlotState {
9
+ @ApiProperty({
10
+ description: 'id',
11
+ required: true,
12
+ type: Number,
13
+ })
14
+ @Expose()
15
+ @IsNumber()
16
+ id: number;
17
+
18
+ @ValidateNested()
19
+ @Type(() => CardDto)
20
+ @Expose()
21
+ top: CardDto | null;
22
+
23
+ @ValidateNested()
24
+ @Type(() => CardDto)
25
+ @Expose()
26
+ bottom: CardDto | null;
27
+
28
+ @ApiProperty({
29
+ description: 'activated',
30
+ required: true,
31
+ type: Boolean,
32
+ })
33
+ @Expose()
34
+ @IsBoolean()
35
+ activated: boolean;
36
+
37
+ @ApiProperty({
38
+ description: 'activated',
39
+ required: true,
40
+ type: Boolean,
41
+ })
42
+ @Expose()
43
+ @IsBoolean()
44
+ disabled: boolean;
45
+ }