Skip to content

Commit e6fdb95

Browse files
committed
Info controller and gamemode mapping
1 parent efe6f70 commit e6fdb95

17 files changed

+342
-186
lines changed

src/@test/values.ts

+22-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1-
import { EventBus } from "@nestjs/cqrs";
2-
import Mock = jest.Mock;
3-
import { inspect } from "util";
1+
import { EventBus } from '@nestjs/cqrs';
2+
import { inspect } from 'util';
43
import { PlayerId } from 'gateway/shared-types/player-id';
4+
import { MatchmakingMode } from 'gateway/shared-types/matchmaking-mode';
5+
import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
6+
import { getRepositoryToken } from '@nestjs/typeorm';
7+
import { MatchmakingModeMappingEntity } from 'gameserver/model/matchmaking-mode-mapping.entity';
8+
import { Repository } from 'typeorm';
9+
import { NestApplicationContext } from '@nestjs/core/nest-application-context';
10+
import Mock = jest.Mock;
511

612
export const randomUser = () => {
7-
return user(`[U:1:${Math.round(Math.random() * 1000000)}]`);
13+
return user(`${Math.round(Math.random() * 1000000)}`);
814
};
915

10-
export const user1 = new PlayerId("[U:1:1062901073]");
11-
export const user2 = new PlayerId("[U:1:116514945]");
16+
export const user1 = new PlayerId("1062901073");
17+
export const user2 = new PlayerId("116514945");
1218

1319
export const user = (id: string) => new PlayerId(id);
1420

@@ -20,4 +26,13 @@ export function printCalls(bus: EventBus) {
2026

2127
export function arrayOf(size: number){
2228
return new Array(size).fill(null)
23-
}
29+
}
30+
31+
export function createGameMode(app: NestApplicationContext, lobby: MatchmakingMode, mode: Dota_GameMode, enabled: boolean): Promise<MatchmakingModeMappingEntity> {
32+
const rep: Repository<MatchmakingModeMappingEntity> = app.get(getRepositoryToken(MatchmakingModeMappingEntity))
33+
return rep.save({
34+
lobbyType: lobby,
35+
dotaGameMode: mode,
36+
enabled
37+
})
38+
}

src/app.module.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Entities, prodDbConfig } from 'util/typeorm-config';
1010
import { QueryController } from 'query.controller';
1111
import { Mapper } from 'rest/mapper';
1212
import { PlayerController } from 'rest/player.controller';
13-
import { InfoController } from 'rest/info.controller';
13+
import { InfoController } from 'rest/info/info.controller';
1414
import { PlayerService } from 'rest/service/player.service';
1515
import { ScheduleModule } from '@nestjs/schedule';
1616
import { MetaController } from 'rest/meta/meta.controller';
@@ -24,6 +24,8 @@ import { CrimeController } from 'rest/crime.controller';
2424
import { MatchMapper } from 'rest/match/match.mapper';
2525
import { MatchController } from 'rest/match/match.controller';
2626
import { MetaMapper } from 'rest/meta/meta.mapper';
27+
import { InfoMapper } from 'rest/info/info.mapper';
28+
import { InfoService } from 'rest/info/info.service';
2729

2830

2931
export function qCache<T, B>() {
@@ -73,6 +75,8 @@ export function qCache<T, B>() {
7375
PlayerService,
7476
MatchMapper,
7577
MetaMapper,
78+
InfoMapper,
79+
InfoService,
7680
Mapper,
7781
...GameServerDomain,
7882
outerQuery(GetUserInfoQuery, 'QueryCore', qCache())

src/app.service.ts

+6-8
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,21 @@ import { DiscoveryRequestedEvent } from 'gateway/events/discovery-requested.even
66
import { MatchStartedEvent } from 'gateway/events/match-started.event';
77
import { MatchCancelledEvent } from 'gateway/events/match-cancelled.event';
88
import { MatchFinishedEvent } from 'gateway/events/match-finished.event';
9-
import { Cron, CronExpression } from '@nestjs/schedule';
10-
import { GameServerRepository } from 'gameserver/repository/game-server.repository';
9+
import { Cron } from '@nestjs/schedule';
1110
import { ServerActualizationRequestedEvent } from 'gateway/events/gs/server-actualization-requested.event';
1211
import { KillServerRequestedEvent } from 'gateway/events/gs/kill-server-requested.event';
1312
import { BanSystemEvent } from 'gateway/events/gs/ban-system.event';
14-
import { LiveMatchUpdateEvent } from 'gateway/events/gs/live-match-update.event';
15-
import { MoreThan, Repository } from 'typeorm';
16-
import { construct } from 'gateway/util/construct';
13+
import { Repository } from 'typeorm';
1714
import { InjectRepository } from '@nestjs/typeorm';
1815
import { ReplayEntity } from 'gameserver/model/replay.entity';
16+
import { GameServerEntity } from 'gameserver/model/game-server.entity';
1917

2018
@Injectable()
2119
export class AppService {
2220
constructor(
2321
private readonly ebus: EventBus,
24-
private readonly gsRepository: GameServerRepository,
22+
@InjectRepository(GameServerEntity)
23+
private readonly gameServerEntityRepository: Repository<GameServerEntity>,
2524
@InjectRepository(ReplayEntity)
2625
private readonly replayEntityRepository: Repository<ReplayEntity>,
2726
@Inject('QueryCore') private readonly redisEventQueue: ClientProxy,
@@ -31,8 +30,7 @@ export class AppService {
3130
@Cron('*/30 * * * * *')
3231
async actualizeServers() {
3332
// for all servers
34-
// todo uncomment
35-
const all = await this.gsRepository.all();
33+
const all = await this.gameServerEntityRepository.find();
3634

3735
await Promise.all(
3836
all.map(async gs => {

src/gameserver/command/FindGameServer/find-game-server.handler.ts

+15-27
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { CommandHandler, EventBus, ICommandHandler, QueryBus } from '@nestjs/cqrs';
22
import { Inject, Logger } from '@nestjs/common';
33
import { FindGameServerCommand } from 'gameserver/command/FindGameServer/find-game-server.command';
4-
import { GameServerRepository } from 'gameserver/repository/game-server.repository';
54
import { GameSessionCreatedEvent } from 'gateway/events/game-session-created.event';
65
import { GameServerSessionRepository } from 'gameserver/repository/game-server-session.repository';
76
import { GameServerSessionEntity } from 'gameserver/model/game-server-session.entity';
@@ -30,6 +29,7 @@ import { GetUserInfoQueryResult } from 'gateway/queries/GetUserInfo/get-user-inf
3029
import { MatchEntity } from 'gameserver/model/match.entity';
3130
import { MatchmakingMode } from 'gateway/shared-types/matchmaking-mode';
3231
import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
32+
import { MatchmakingModeMappingEntity } from 'gameserver/model/matchmaking-mode-mapping.entity';
3333

3434
@CommandHandler(FindGameServerCommand)
3535
export class FindGameServerHandler
@@ -41,7 +41,6 @@ export class FindGameServerHandler
4141
>();
4242

4343
constructor(
44-
private readonly gsRepository: GameServerRepository,
4544
private readonly gsSessionRepository: GameServerSessionRepository,
4645
@InjectRepository(GameServerSessionEntity)
4746
private readonly gameServerSessionModelRepository: Repository<
@@ -52,6 +51,8 @@ export class FindGameServerHandler
5251
private readonly matchEntityRepository: Repository<MatchEntity>,
5352
private readonly qbus: QueryBus,
5453
@Inject('QueryCore') private readonly redisEventQueue: ClientProxy,
54+
@InjectRepository(MatchmakingModeMappingEntity)
55+
private readonly matchmakingModeMappingEntityRepository: Repository<MatchmakingModeMappingEntity>,
5556
) {
5657
this.pendingGamesPool
5758
.pipe(asyncMap(cmd => this.findServer(cmd), 1))
@@ -62,31 +63,18 @@ export class FindGameServerHandler
6263
this.pendingGamesPool.next(command);
6364
}
6465

65-
private getGameModeForMatchMode(mode: MatchmakingMode): Dota_GameMode {
66-
switch (mode) {
67-
case MatchmakingMode.RANKED:
68-
return Dota_GameMode.RANKED_AP;
69-
case MatchmakingMode.UNRANKED:
70-
return Dota_GameMode.RANKED_AP;
71-
case MatchmakingMode.SOLOMID:
72-
return Dota_GameMode.SOLOMID;
73-
case MatchmakingMode.DIRETIDE:
74-
return Dota_GameMode.DIRETIDE;
75-
case MatchmakingMode.GREEVILING:
76-
return Dota_GameMode.GREEVILING;
77-
case MatchmakingMode.ABILITY_DRAFT:
78-
return Dota_GameMode.ABILITY_DRAFT;
79-
case MatchmakingMode.TOURNAMENT:
80-
return Dota_GameMode.CAPTAINS_MODE;
81-
case MatchmakingMode.BOTS:
82-
return Dota_GameMode.ALLPICK;
83-
case MatchmakingMode.HIGHROOM:
84-
return Dota_GameMode.RANKED_AP;
85-
case MatchmakingMode.TOURNAMENT_SOLOMID:
86-
return Dota_GameMode.SOLOMID;
87-
case MatchmakingMode.CAPTAINS_MODE:
88-
return Dota_GameMode.CAPTAINS_MODE;
66+
private async getGameModeForMatchMode(mode: MatchmakingMode): Promise<Dota_GameMode> {
67+
const mapping = await this.matchmakingModeMappingEntityRepository.findOne({
68+
where: {
69+
lobbyType: mode
70+
}
71+
});
72+
73+
if(!mapping){
74+
this.logger.error(`No mapping found for lobby type ${mode}! Returning all pick`);
75+
return Dota_GameMode.ALLPICK;
8976
}
77+
return mapping.dotaGameMode;
9078
}
9179

9280
private async extendMatchInfo(matchInfo: MatchInfo): Promise<GSMatchInfo> {
@@ -107,7 +95,7 @@ export class FindGameServerHandler
10795

10896
return new GSMatchInfo(
10997
matchInfo.mode,
110-
this.getGameModeForMatchMode(matchInfo.mode),
98+
await this.getGameModeForMatchMode(matchInfo.mode),
11199
matchInfo.roomId,
112100
players,
113101
matchInfo.version,

src/gameserver/event-handler/game-server-discovered.event.ts

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { EventsHandler, IEventHandler } from '@nestjs/cqrs';
22
import { GameServerDiscoveredEvent } from 'gateway/events/game-server-discovered.event';
3-
import { GameServerRepository } from 'gameserver/repository/game-server.repository';
43
import { GameServerEntity } from 'gameserver/model/game-server.entity';
54
import { InjectRepository } from '@nestjs/typeorm';
65
import { Repository } from 'typeorm';
@@ -9,7 +8,6 @@ import { Repository } from 'typeorm';
98
export class GameServerDiscoveredHandler
109
implements IEventHandler<GameServerDiscoveredEvent> {
1110
constructor(
12-
private readonly gsRepo: GameServerRepository,
1311
@InjectRepository(GameServerEntity)
1412
private readonly gameServerModelRepository: Repository<GameServerEntity>,
1513
) {}

src/gameserver/index.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { GameServerRepository } from 'gameserver/repository/game-server.repository';
21
import { GameserverSaga } from 'gameserver/saga/gameserver.saga';
32
import { FindGameServerHandler } from 'gameserver/command/FindGameServer/find-game-server.handler';
43
import { GameServerSessionRepository } from 'gameserver/repository/game-server-session.repository';
@@ -68,7 +67,7 @@ const EventHandlers = [
6867
];
6968

7069
const QueryHandlers = [GetPlayerInfoHandler, GetSessionByUserHandler, GetReportsAvailableHandler];
71-
const Repositories = [GameServerRepository, GameServerSessionRepository];
70+
const Repositories = [GameServerSessionRepository];
7271
const Services = [GameServerService, AchievementService];
7372
const Sagas = [GameserverSaga];
7473

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Column, Entity, PrimaryColumn } from 'typeorm';
2+
import { MatchmakingMode } from 'gateway/shared-types/matchmaking-mode';
3+
import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
4+
5+
@Entity('matchmaking_mode_mapping_entity')
6+
export class MatchmakingModeMappingEntity {
7+
8+
@PrimaryColumn({ name: "lobby_type" })
9+
public lobbyType: MatchmakingMode
10+
11+
12+
@Column({ name: "enabled"})
13+
public enabled: boolean;
14+
15+
@Column({ name: "dota_game_mode" })
16+
public dotaGameMode: Dota_GameMode
17+
}

src/gameserver/repository/game-server-session.repository.ts

-15
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Injectable } from '@nestjs/common';
22
import { Dota2Version } from 'gateway/shared-types/dota2version';
33
import { GameServerSessionEntity } from 'gameserver/model/game-server-session.entity';
4-
import { GameServerRepository } from 'gameserver/repository/game-server.repository';
54
import { PlayerId } from 'gateway/shared-types/player-id';
65
//
76
import { Repository } from 'typeorm';
@@ -17,7 +16,6 @@ export class GameServerSessionRepository {
1716
>,
1817
@InjectRepository(GameServerEntity)
1918
private readonly gameServerModelRepository: Repository<GameServerEntity>,
20-
private readonly gameServerRepository: GameServerRepository,
2119
) {}
2220

2321
async getAllFree(version: Dota2Version): Promise<GameServerEntity[]> {
@@ -29,19 +27,6 @@ export class GameServerSessionRepository {
2927
having count(gssm) = 0`);
3028
}
3129

32-
async findFree(version: Dota2Version) {
33-
const compatible = await this.gameServerRepository.find(version);
34-
for (let i = 0; i < compatible.length; i++) {
35-
const isBusy = await this.gameServerSessionModelRepository.findOne({
36-
where: { url: compatible[i].url,}
37-
});
38-
if (!isBusy) {
39-
return compatible[i];
40-
}
41-
}
42-
return false;
43-
}
44-
4530
public async findWith(
4631
playerId: PlayerId,
4732
): Promise<GameServerSessionEntity | undefined> {

src/gameserver/repository/game-server.repository.ts

-25
This file was deleted.

src/rest/dto/info.dto.ts

+20-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import { Dota2Version } from 'gateway/shared-types/dota2version';
2-
import { MatchInfo } from 'gateway/events/room-ready.event';
32
import { MatchmakingMode } from 'gateway/shared-types/matchmaking-mode';
4-
import { PlayerId } from 'gateway/shared-types/player-id';
3+
import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
4+
import { ApiProperty } from '@nestjs/swagger';
55

66
export class GameServerDto {
77
url: string;
88
version: Dota2Version;
99
}
1010

11-
1211
export class MatchInfoDto {
1312
public readonly mode: MatchmakingMode;
1413
public readonly roomId: string;
@@ -21,5 +20,21 @@ export class MatchInfoDto {
2120
export class GameSessionDto {
2221
url: string;
2322
matchId: number;
24-
info: MatchInfoDto
25-
}
23+
info: MatchInfoDto;
24+
}
25+
26+
export class MatchmakingModeInfoDto {
27+
@ApiProperty({ enum: MatchmakingMode, enumName: "MatchmakingMode" })
28+
lobby_type: MatchmakingMode;
29+
30+
@ApiProperty({ enum: Dota_GameMode, enumName: "Dota_GameMode" })
31+
game_mode: Dota_GameMode;
32+
33+
enabled: boolean;
34+
}
35+
36+
export class UpdateGamemodeDto {
37+
enabled: boolean;
38+
@ApiProperty({ enum: Dota_GameMode, enumName: "Dota_GameMode" })
39+
game_mode: Dota_GameMode;
40+
}

src/rest/info.controller.ts

-50
This file was deleted.

0 commit comments

Comments
 (0)