jp.ms.common.modules 1.0.0 → 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
@@ -0,0 +1,15 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsArray, IsBoolean, IsNumber, IsString, ValidateNested } from 'class-validator';
3
+ import { ICardPlayerState } from 'jp.common.models';
4
+ import { ApiProperty } from '@nestjs/swagger';
5
+
6
+ import { CardDto } from './card.dto';
7
+ import { GamePlayerDto } from '../base/game-player.dto';
8
+
9
+ export class CardPlayerDto extends GamePlayerDto implements ICardPlayerState {
10
+ @IsArray()
11
+ @ValidateNested({ each: true })
12
+ @Type(() => CardDto)
13
+ @Expose()
14
+ cards: Array<CardDto>;
15
+ }
@@ -0,0 +1,50 @@
1
+ import { Expose, plainToInstance, Type } from 'class-transformer';
2
+ import { IsArray, ValidateNested } from 'class-validator';
3
+ import { ICardTableGameState } from 'jp.common.models';
4
+
5
+ import { CardTableGameStateAdapter } from '../../../adapter';
6
+
7
+ import { CardPlayerDto } from './card-player.dto';
8
+ import { CardPairSlotDto } from './card-pair-slot.dto';
9
+ import { CardDto } from './card.dto';
10
+ import { CardsPanelDto } from './cards-panel.dto';
11
+ import { BaseTableGameStateDto } from '../base/base-table-game-state.dto';
12
+
13
+ export class CardTableGameStateDto extends BaseTableGameStateDto implements ICardTableGameState {
14
+ @IsArray()
15
+ @ValidateNested({ each: true })
16
+ @Type(() => CardPlayerDto)
17
+ @Expose()
18
+ players: Array<CardPlayerDto>;
19
+
20
+ @IsArray()
21
+ @ValidateNested({ each: true })
22
+ @Type(() => CardDto)
23
+ @Expose()
24
+ gameCards: Array<CardDto>;
25
+
26
+ @IsArray()
27
+ @ValidateNested({ each: true })
28
+ @Type(() => CardPairSlotDto)
29
+ @Expose()
30
+ gameCardsPair: Array<CardPairSlotDto>;
31
+
32
+ @ValidateNested()
33
+ @Type(() => CardDto)
34
+ @Expose()
35
+ baseCard?: CardDto;
36
+
37
+ @ValidateNested()
38
+ @Type(() => CardsPanelDto)
39
+ @Expose()
40
+ cardsPanel: CardsPanelDto;
41
+
42
+ constructor(entity: ICardTableGameState) {
43
+ super();
44
+ return plainToInstance(CardTableGameStateDto, entity, { excludeExtraneousValues: true })
45
+ }
46
+
47
+ static fromAdapter (adapter: CardTableGameStateAdapter) {
48
+ return new CardTableGameStateDto(adapter.getState());
49
+ }
50
+ }
@@ -1,10 +1,9 @@
1
1
  import { ApiProperty } from '@nestjs/swagger';
2
- import { Expose } from 'class-transformer';
3
- import { IsString, IsNumber, IsBoolean } from 'class-validator';
2
+ import { Expose, Type } from 'class-transformer';
3
+ import { IsString, IsNumber, IsBoolean, IsArray, ValidateNested } from 'class-validator';
4
+ import { ICardState } from 'jp.common.models';
4
5
 
5
- import { IBaseTableGameStateCard } from 'jp.common.models';
6
-
7
- export class CardDto implements IBaseTableGameStateCard {
6
+ export class CardDto implements ICardState {
8
7
  @ApiProperty({
9
8
  description: 'card ID',
10
9
  required: true,
@@ -40,4 +39,10 @@ export class CardDto implements IBaseTableGameStateCard {
40
39
  @Expose()
41
40
  @IsBoolean()
42
41
  isDisable: boolean;
42
+
43
+ @IsArray()
44
+ @ValidateNested({ each: true })
45
+ @Type(() => Number)
46
+ @Expose()
47
+ targets: Array<number>;
43
48
  }
@@ -0,0 +1,40 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsArray, IsBoolean, ValidateNested } from 'class-validator';
3
+ import { ICardsPanelState } from 'jp.common.models';
4
+ import { ApiProperty } from '@nestjs/swagger';
5
+
6
+ import { BaseTableYoursActionDto } from '../base/base-table-yours-action.dto';
7
+
8
+ import { CardDto } from './card.dto';
9
+
10
+ export class CardsPanelDto implements ICardsPanelState {
11
+ @ApiProperty({
12
+ description: 'isOpen',
13
+ required: true,
14
+ type: Boolean,
15
+ })
16
+ @Expose()
17
+ @IsBoolean()
18
+ isOpen: boolean;
19
+
20
+ @ApiProperty({
21
+ description: 'backdropVisible',
22
+ required: true,
23
+ type: Boolean,
24
+ })
25
+ @Expose()
26
+ @IsBoolean()
27
+ backdropVisible: boolean;
28
+
29
+ @IsArray()
30
+ @ValidateNested({ each: true })
31
+ @Type(() => BaseTableYoursActionDto)
32
+ @Expose()
33
+ moves: Array<BaseTableYoursActionDto>;
34
+
35
+ @IsArray()
36
+ @ValidateNested({ each: true })
37
+ @Type(() => CardDto)
38
+ @Expose()
39
+ cards: Array<CardDto>;
40
+ }
@@ -0,0 +1,2 @@
1
+ export { CardTableGameStateDto } from './cards/card-table-game-state.dto';
2
+
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './dto';
2
2
  export * from './modules';
3
3
  export * from './config';
4
+ export * from './adapter';
@@ -0,0 +1 @@
1
+ export const EVENTS_OPTIONS = Symbol('EVENTS_OPTIONS');
@@ -1,62 +1,68 @@
1
1
  import {
2
- WebSocketServer,
3
- OnGatewayConnection,
4
- OnGatewayDisconnect,
2
+ WebSocketServer,
3
+ OnGatewayConnection,
4
+ OnGatewayDisconnect,
5
+ WebSocketGateway,
5
6
  } from '@nestjs/websockets';
6
7
  import { Server, Socket } from 'socket.io';
7
8
  import { UsersRepository } from 'jp.db.schemas';
8
- import { GamePlayer } from 'jp.ms.common.engine';
9
+ import { Inject, Injectable } from '@nestjs/common';
9
10
 
10
11
  import { PlayersManagerService } from '../players-manager/players-manager.service';
11
12
 
12
- export abstract class BaseEventsGateway implements OnGatewayConnection<Socket>, OnGatewayDisconnect<Socket> {
13
- @WebSocketServer()
14
- server: Server;
15
-
16
- private playersManager: PlayersManagerService;
17
- private readonly usersRepository: UsersRepository;
18
-
19
- protected constructor (
20
- playersManager: PlayersManagerService,
21
- usersRepository: UsersRepository,
22
- ) {
23
- this.playersManager = playersManager;
24
- this.usersRepository = usersRepository;
25
- }
26
-
27
- abstract createPlayer (
28
- userId: string,
29
- fullName: string,
30
- avatarUrl: string,
31
- balance: number,
32
- experience: number,
33
- level: number,
34
- ): GamePlayer;
35
-
36
- async handleConnection (client: Socket) {
37
- const playerId = client.handshake.auth.token as string | undefined;
38
-
39
- const player = this.playersManager.getPlayerById(playerId ?? '');
40
- if (player) {
41
- player.connections.addConnection(client);
42
- } else {
43
- const user = await this.usersRepository.findById(playerId ?? '');
44
- if (user) {
45
- const player = this.createPlayer(
46
- user.userId,
47
- user.fullName,
48
- user.avatarUrl,
49
- user.balance,
50
- user.experience,
51
- user.level,
52
- );
53
- this.playersManager.addPlayer(player);
54
- player.connections.addConnection(client);
55
- }
13
+ import { EVENTS_OPTIONS } from './events.constants';
14
+ import { EventsFactoryOptions, EventsModuleOptions } from './events.interfaces';
15
+
16
+ @WebSocketGateway({ cors: { origin: '*' } })
17
+ export class EventsGateway implements OnGatewayConnection<Socket>, OnGatewayDisconnect<Socket> {
18
+ @WebSocketServer()
19
+ server: Server;
20
+
21
+ constructor (
22
+ private readonly playersManager: PlayersManagerService,
23
+ private readonly usersRepository: UsersRepository,
24
+ @Inject(EVENTS_OPTIONS) private readonly options: EventsFactoryOptions,
25
+ ) {
26
+ }
27
+
28
+ async handleConnection (client: Socket) {
29
+ const playerId = client.handshake.auth.token as string | undefined;
30
+
31
+ const player = this.playersManager.getPlayerById(playerId ?? '');
32
+ if (player) {
33
+ player.connections.addConnection(client);
34
+ } else {
35
+ const user = await this.usersRepository.findById(playerId ?? '');
36
+ if (user) {
37
+ const player = this.options.createPlayer({
38
+ id: user.userId,
39
+ fullName: user.fullName,
40
+ avatarUrl: user.avatarUrl,
41
+ balance: user.balance,
42
+ experience: user.experience,
43
+ level: user.level,
44
+ language: user.language,
45
+ });
46
+ this.playersManager.addPlayer(player);
47
+ player.connections.addConnection(client);
48
+ }
49
+ }
56
50
  }
57
- }
58
51
 
59
- handleDisconnect (client: Socket): void {
60
- const c = client;
61
- }
52
+ handleDisconnect (client: Socket): void {
53
+ const playerId = client.handshake.auth.token as string | undefined;
54
+ const connectedPlayer = this.playersManager.getPlayerById(playerId ?? '');
55
+
56
+ if (connectedPlayer) {
57
+ connectedPlayer.disconnect();
58
+
59
+ if (!connectedPlayer.isPlayer() &&
60
+ !connectedPlayer.isTableQueuer() &&
61
+ !connectedPlayer.isRoomQueuer() &&
62
+ !connectedPlayer.hasOpenConnection()
63
+ ) {
64
+ this.playersManager.removePlayer(playerId ?? '');
65
+ }
66
+ }
67
+ }
62
68
  }
@@ -0,0 +1,16 @@
1
+ import { GamePlayer, IGamePlayerConfig } from 'jp.ms.common.engine';
2
+ import { ModuleMetadata } from '@nestjs/common';
3
+ import { Type } from '@nestjs/common/interfaces/type.interface';
4
+ import { DynamicModule } from '@nestjs/common/interfaces/modules/dynamic-module.interface';
5
+ import { ForwardReference } from '@nestjs/common/interfaces/modules/forward-reference.interface';
6
+
7
+
8
+ export interface EventsModuleOptions extends Pick<ModuleMetadata, 'imports'> {
9
+ imports?: Array<Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
10
+ inject?: any[];
11
+ useFactory?: (...args: any[]) => Promise<any> | any;
12
+ }
13
+
14
+ export interface EventsFactoryOptions {
15
+ createPlayer: (config: IGamePlayerConfig) => GamePlayer;
16
+ }
@@ -0,0 +1,33 @@
1
+ import { DynamicModule, Module, Provider } from '@nestjs/common';
2
+ import { MongooseModule } from '@nestjs/mongoose';
3
+ import { User, UserSchema, UsersRepository } from 'jp.db.schemas';
4
+
5
+ import { PlayersManagerModule } from '../players-manager/players-manager.module';
6
+
7
+ import { EventsGateway } from './events.gateway';
8
+ import { EventsModuleOptions } from './events.interfaces';
9
+ import { EVENTS_OPTIONS } from './events.constants';
10
+
11
+
12
+ @Module({
13
+ imports: [
14
+ MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
15
+ PlayersManagerModule,
16
+ ],
17
+ providers: [UsersRepository, EventsGateway],
18
+ })
19
+ export class EventsModule {
20
+ static forRootAsync(options: EventsModuleOptions): DynamicModule {
21
+ return {
22
+ module: EventsModule,
23
+ imports: options.imports ?? [],
24
+ providers: [
25
+ {
26
+ provide: EVENTS_OPTIONS,
27
+ useFactory: options.useFactory,
28
+ inject: options.inject || [],
29
+ } as Provider,
30
+ ],
31
+ };
32
+ }
33
+ }
@@ -1,15 +1,23 @@
1
1
  import { PlayersManagerModule } from './players-manager/players-manager.module';
2
2
  import { PlayersManagerService } from './players-manager/players-manager.service';
3
- import { BaseEventsGateway } from './events/events.gateway';
4
3
  import { MenuModule } from './menu/menu.module';
5
4
  import { MenuService } from './menu/menu.service';
6
5
  import { MenuController } from './menu/menu.controller';
6
+ import { EventsModule } from './events/events.module';
7
+ import { SimpleRoomsManagerModule } from './simple-rooms-manager/simple-rooms-manager.module';
8
+ import { SimpleRoomsManagerService } from './simple-rooms-manager/simple-rooms-manager.service';
9
+ import { RoomsModule } from './rooms/rooms.module';
10
+ import { SupportModule } from './support/support.module';
7
11
 
8
12
  export {
9
13
  PlayersManagerModule,
10
14
  PlayersManagerService,
11
- BaseEventsGateway,
12
15
  MenuModule,
13
16
  MenuService,
14
17
  MenuController,
18
+ EventsModule,
19
+ SimpleRoomsManagerModule,
20
+ SimpleRoomsManagerService,
21
+ RoomsModule,
22
+ SupportModule,
15
23
  }
@@ -1,7 +1,8 @@
1
- import { Module } from '@nestjs/common';
1
+ import { Global, Module } from '@nestjs/common';
2
2
  import { PlayersManagerService } from './players-manager.service';
3
3
 
4
4
 
5
+ @Global()
5
6
  @Module({
6
7
  providers: [PlayersManagerService],
7
8
  exports: [PlayersManagerService]
@@ -0,0 +1 @@
1
+ export const ROOMS_OPTIONS = Symbol('ROOMS_OPTIONS');
@@ -0,0 +1,73 @@
1
+ import { Body, Controller, Get, Param, Post, Headers, HttpStatus, HttpCode } from '@nestjs/common';
2
+ import { IAppHeaders, IBaseAppScreen, IBaseMoveData, IBaseTableGameState } from 'jp.common.models';
3
+
4
+ import { PlayerCheckStateDto } from '../../dto';
5
+
6
+ import { RoomsService } from './rooms.service';
7
+
8
+ @Controller('rooms')
9
+ export class RoomsController {
10
+ constructor (
11
+ private readonly roomsService: RoomsService,
12
+ ) {
13
+ }
14
+
15
+ @Get('player/check/state')
16
+ checkState (@Headers() headers: IAppHeaders): PlayerCheckStateDto {
17
+ return this.roomsService.playerCheckState(headers.client_auth_token);
18
+ }
19
+
20
+ @Get('tables')
21
+ getScreen (@Headers() headers: IAppHeaders): Promise<IBaseAppScreen> {
22
+ return this.roomsService.getScreen(headers.client_language);
23
+ }
24
+
25
+ @Post('table/watch/:tableId')
26
+ @HttpCode(HttpStatus.OK)
27
+ watchTheTable (
28
+ @Param('tableId') tableId: string,
29
+ @Headers() headers: IAppHeaders,
30
+ ): IBaseTableGameState {
31
+ return this.roomsService.watchTheTable(tableId, headers.client_auth_token);
32
+ }
33
+
34
+ @Post('table/enter/:tableId')
35
+ @HttpCode(HttpStatus.OK)
36
+ enterTheTable (
37
+ @Param('tableId') tableId: string,
38
+ @Headers() headers: IAppHeaders,
39
+ ): IBaseTableGameState {
40
+ return this.roomsService.enterTheTable(tableId, headers.client_auth_token);
41
+ }
42
+
43
+ @Post('table/exit/:tableId')
44
+ @HttpCode(HttpStatus.OK)
45
+ exitTheTable (
46
+ @Param('tableId') tableId: string,
47
+ @Headers() headers: IAppHeaders,
48
+ ): IBaseTableGameState {
49
+ return this.roomsService.exitTheTable(tableId, headers.client_auth_token);
50
+ }
51
+
52
+ @Post('table/move/:tableId')
53
+ @HttpCode(HttpStatus.OK)
54
+ moveOnTheTable (
55
+ @Param('tableId') tableId: string,
56
+ @Body() baseMoveData: IBaseMoveData,
57
+ @Headers() headers: IAppHeaders,
58
+ ): IBaseTableGameState {
59
+ return this.roomsService.moveOnTheTable(tableId, headers.client_auth_token, baseMoveData);
60
+ }
61
+
62
+ @Post('table/restart/:tableId')
63
+ @HttpCode(HttpStatus.OK)
64
+ restartTable (@Param('tableId') tableId: string): boolean {
65
+ return this.roomsService.restartTable(tableId);
66
+ }
67
+
68
+ @Post('techBreakOn')
69
+ @HttpCode(HttpStatus.OK)
70
+ techBreakOn (): boolean {
71
+ return this.roomsService.techBreakOn();
72
+ }
73
+ }
@@ -0,0 +1,17 @@
1
+ import { ModuleMetadata } from '@nestjs/common';
2
+ import { I18nService } from 'nestjs-i18n';
3
+ import { Type } from '@nestjs/common/interfaces/type.interface';
4
+ import { DynamicModule } from '@nestjs/common/interfaces/modules/dynamic-module.interface';
5
+ import { ForwardReference } from '@nestjs/common/interfaces/modules/forward-reference.interface';
6
+ import { IBaseTableGameState } from 'jp.common.models';
7
+
8
+ export interface RoomsModuleOptions extends Pick<ModuleMetadata, 'imports'> {
9
+ imports?: Array<Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
10
+ inject?: any[];
11
+ useFactory?: (...args: any[]) => Promise<any> | any;
12
+ }
13
+
14
+ export interface RoomsFactoryOptions {
15
+ i18n: I18nService
16
+ createTableDto: (data: object) => IBaseTableGameState
17
+ }
@@ -0,0 +1,36 @@
1
+ import { DynamicModule, Module, Provider } from '@nestjs/common';
2
+ import { MongooseModule } from '@nestjs/mongoose';
3
+ import { Room, RoomSchema, RoomsRepository } from 'jp.db.schemas';
4
+
5
+ import { RoomsController } from './rooms.controller';
6
+ import { RoomsService } from './rooms.service';
7
+ import { ROOMS_OPTIONS } from './rooms.constants';
8
+ import { RoomsModuleOptions } from './rooms.interfaces';
9
+
10
+ @Module({
11
+ imports: [
12
+ MongooseModule.forFeature([{ name: Room.name, schema: RoomSchema }]),
13
+ ],
14
+ controllers: [RoomsController],
15
+ providers: [RoomsService, RoomsRepository],
16
+ })
17
+ export class RoomsModule {
18
+ constructor () {
19
+
20
+ }
21
+
22
+ static forRootAsync (options: RoomsModuleOptions): DynamicModule {
23
+ return {
24
+ module: RoomsModule,
25
+ imports: options.imports ?? [],
26
+ providers: [
27
+ {
28
+ provide: ROOMS_OPTIONS,
29
+ useFactory: options.useFactory,
30
+ inject: options.inject || [],
31
+ } as Provider,
32
+ ],
33
+ };
34
+ }
35
+ }
36
+
@@ -0,0 +1,150 @@
1
+ import { Inject, Injectable, InternalServerErrorException } from '@nestjs/common';
2
+ import {
3
+ AppScreen,
4
+ AppScreenAppBar,
5
+ AppScreenIdEnum,
6
+ AppScreenRoutesEnum,
7
+ AppScreenSection,
8
+ AppScreenSectionButton,
9
+ AppScreenSectionImage,
10
+ AppScreenSectionListItem,
11
+ BaseAppScreen, IBaseMoveData,
12
+ IBaseTableGameState,
13
+ router,
14
+ } from 'jp.common.models';
15
+ import { replacePattern } from 'jp.common.utils';
16
+
17
+ import { BaseAppScreenDto, PlayerCheckStateDto } from '../../dto';
18
+ import { SimpleRoomsManagerService } from '../simple-rooms-manager/simple-rooms-manager.service';
19
+ import { PlayersManagerService } from '../players-manager/players-manager.service';
20
+
21
+ import { RoomsFactoryOptions } from './rooms.interfaces';
22
+ import { ROOMS_OPTIONS } from './rooms.constants';
23
+
24
+ @Injectable()
25
+ export class RoomsService {
26
+ constructor (
27
+ private readonly simpleRoomsManager: SimpleRoomsManagerService,
28
+ private readonly playersManager: PlayersManagerService,
29
+ @Inject(ROOMS_OPTIONS) private readonly options: RoomsFactoryOptions,
30
+ ) {
31
+ }
32
+
33
+ playerCheckState (clientAuthToken: string): PlayerCheckStateDto {
34
+ const player = this.playersManager.getPlayerById(clientAuthToken);
35
+ if (player && player.isPlayer() && player.tableId) {
36
+ return PlayerCheckStateDto.fromEntities(router.getRoomPath(player.tableId), player.id);
37
+ }
38
+
39
+ return PlayerCheckStateDto.fromEntities(AppScreenRoutesEnum.MENU);
40
+ }
41
+
42
+ async getScreen (lang: string): Promise<BaseAppScreenDto> {
43
+ const screen =
44
+ AppScreen.CreateStandardScreen(AppScreenIdEnum.ROOMS)
45
+ .addAppBar(
46
+ AppScreenAppBar.CreateStandardAppBar(
47
+ this.options.i18n.t('common.rooms.screen.title', { lang }),
48
+ AppScreenSectionButton.CreateArrowBackButton(this.options.i18n.t('common.button.back', { lang })),
49
+ ),
50
+ )
51
+ .addSection(
52
+ AppScreenSection.CreateCardListSection(
53
+ 'id1',
54
+ this.simpleRoomsManager.getRooms().reduce<Array<AppScreenSectionListItem>>((result, room) => {
55
+ const list =
56
+ room.getTables().map((table) => AppScreenSectionListItem.CreateCardListItemMini(
57
+ table.getId(),
58
+ replacePattern(table.getTitle(lang), { NUMBER: table.getNumber().toString() }),
59
+ replacePattern(table.getSubtitle(lang), {
60
+ HALF_BET: table.getHalfBet().toString(),
61
+ BET: table.getBet().toString()
62
+ }),
63
+ AppScreenSectionImage.CreateUrlImage(`${table.getPlayers().length}/${table.getTableSize()}`),
64
+ true,
65
+ router.getRoomPath(table.getId()),
66
+ ));
67
+
68
+ return [...result, ...list];
69
+ }, []),
70
+ ),
71
+ );
72
+
73
+ return new BaseAppScreenDto(new BaseAppScreen(screen));
74
+ }
75
+
76
+ watchTheTable (tableId: string, clientAuthToken: string): IBaseTableGameState {
77
+ const player = this.playersManager.getPlayerById(clientAuthToken);
78
+ const room = this.simpleRoomsManager.getRoomByTableId(tableId);
79
+ const master = room?.getMasterById(tableId);
80
+
81
+ if (player && room && master) {
82
+ room.handleWatchTheTable(player, tableId);
83
+
84
+ return master.createGameStateDto(player);
85
+ }
86
+
87
+ throw new InternalServerErrorException();
88
+ }
89
+
90
+ enterTheTable (tableId: string, clientAuthToken: string): IBaseTableGameState {
91
+ const player = this.playersManager.getPlayerById(clientAuthToken);
92
+ const room = this.simpleRoomsManager.getRoomByTableId(tableId);
93
+ const master = room?.getMasterById(tableId);
94
+
95
+ if (player && room && master) {
96
+ room.handleEnterTheTable(player, tableId);
97
+
98
+ return master.createGameStateDto(player);
99
+ }
100
+
101
+ throw new InternalServerErrorException();
102
+ }
103
+
104
+ exitTheTable (tableId: string, clientAuthToken: string): IBaseTableGameState {
105
+ const player = this.playersManager.getPlayerById(clientAuthToken);
106
+ const room = this.simpleRoomsManager.getRoomByTableId(tableId);
107
+ const master = room?.getMasterById(tableId);
108
+
109
+ if (player && room && master) {
110
+ room.handleExitTheTable(player, tableId);
111
+
112
+ return master.createGameStateDto(player);
113
+ }
114
+
115
+ throw new InternalServerErrorException();
116
+ }
117
+
118
+ moveOnTheTable (tableId: string, clientAuthToken: string, moveDto: IBaseMoveData): IBaseTableGameState {
119
+ const player = this.playersManager.getPlayerById(clientAuthToken);
120
+ const room = this.simpleRoomsManager.getRoomByTableId(tableId);
121
+ const master = room?.getMasterById(tableId);
122
+
123
+ if (player && room && master) {
124
+ room.handleMoveOnTheTable(player, tableId, moveDto);
125
+
126
+ return master.createGameStateDto(player);
127
+ }
128
+
129
+ throw new InternalServerErrorException();
130
+ }
131
+
132
+ restartTable (tableId: string): boolean {
133
+ const room = this.simpleRoomsManager.getRoomByTableId(tableId);
134
+ const master = room?.getMasterById(tableId);
135
+
136
+ if (room && master) {
137
+ room.handleRestartTable(tableId);
138
+
139
+ return true;
140
+ }
141
+
142
+ throw new InternalServerErrorException();
143
+ }
144
+
145
+ techBreakOn (): boolean {
146
+ this.simpleRoomsManager.getRooms().forEach((item) => item.handleTechBreakOn());
147
+
148
+ return true;
149
+ }
150
+ }
@@ -0,0 +1 @@
1
+ export const SIMPLE_ROOMS_MANAGER_OPTIONS = Symbol('SIMPLE_ROOMS_MANAGER_OPTIONS');
@@ -0,0 +1,19 @@
1
+ import { ModuleMetadata } from '@nestjs/common';
2
+ import { I18nService } from 'nestjs-i18n';
3
+ import { Type } from '@nestjs/common/interfaces/type.interface';
4
+ import { DynamicModule } from '@nestjs/common/interfaces/modules/dynamic-module.interface';
5
+ import { ForwardReference } from '@nestjs/common/interfaces/modules/forward-reference.interface';
6
+ import { GameRoomConfig, SimpleRoom } from 'jp.ms.common.engine';
7
+ import { ConfigService } from '@nestjs/config';
8
+
9
+ export interface SimpleRoomsManagerOptions extends Pick<ModuleMetadata, 'imports'> {
10
+ imports?: Array<Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
11
+ inject?: any[];
12
+ useFactory?: (...args: any[]) => Promise<any> | any;
13
+ }
14
+
15
+ export interface SimpleRoomsFactoryOptions {
16
+ i18n: I18nService;
17
+ configService: ConfigService;
18
+ createRoom (room: GameRoomConfig): SimpleRoom;
19
+ }