Skip to content

Commit 2a41cda

Browse files
committed
10 m ban for not loading
new matchmaking mode: lobby pass map into launch server
1 parent 5632ab9 commit 2a41cda

8 files changed

+86
-39
lines changed

src/@test/values.ts

+16-7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { getRepositoryToken } from '@nestjs/typeorm';
77
import { MatchmakingModeMappingEntity } from 'gameserver/model/matchmaking-mode-mapping.entity';
88
import { Repository } from 'typeorm';
99
import { NestApplicationContext } from '@nestjs/core/nest-application-context';
10+
import { Dota_Map } from 'gateway/shared-types/dota-map';
1011
import Mock = jest.Mock;
1112

1213
export const randomUser = () => {
@@ -23,16 +24,24 @@ export function printCalls(bus: EventBus) {
2324
console.log(inspect(p.mock.calls));
2425
}
2526

26-
27-
export function arrayOf(size: number){
28-
return new Array(size).fill(null)
27+
export function arrayOf(size: number) {
28+
return new Array(size).fill(null);
2929
}
3030

31-
export function createGameMode(app: NestApplicationContext, lobby: MatchmakingMode, mode: Dota_GameMode, enabled: boolean): Promise<MatchmakingModeMappingEntity> {
32-
const rep: Repository<MatchmakingModeMappingEntity> = app.get(getRepositoryToken(MatchmakingModeMappingEntity))
31+
export function createGameMode(
32+
app: NestApplicationContext,
33+
lobby: MatchmakingMode,
34+
mode: Dota_GameMode,
35+
map: Dota_Map,
36+
enabled: boolean,
37+
): Promise<MatchmakingModeMappingEntity> {
38+
const rep: Repository<MatchmakingModeMappingEntity> = app.get(
39+
getRepositoryToken(MatchmakingModeMappingEntity),
40+
);
3341
return rep.save({
3442
lobbyType: lobby,
3543
dotaGameMode: mode,
36-
enabled
37-
})
44+
dotaMap: map,
45+
enabled,
46+
} satisfies MatchmakingModeMappingEntity);
3847
}

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

+43-23
Original file line numberDiff line numberDiff line change
@@ -30,48 +30,67 @@ import { MatchEntity } from 'gameserver/model/match.entity';
3030
import { MatchmakingMode } from 'gateway/shared-types/matchmaking-mode';
3131
import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
3232
import { MatchmakingModeMappingEntity } from 'gameserver/model/matchmaking-mode-mapping.entity';
33+
import { Dota_Map } from 'gateway/shared-types/dota-map';
3334

3435
@CommandHandler(FindGameServerCommand)
3536
export class FindGameServerHandler
36-
implements ICommandHandler<FindGameServerCommand> {
37+
implements ICommandHandler<FindGameServerCommand>
38+
{
3739
private readonly logger = new Logger(FindGameServerHandler.name);
3840

39-
private pendingGamesPool: Subject<FindGameServerCommand> = new Subject<
40-
FindGameServerCommand
41-
>();
41+
private pendingGamesPool: Subject<FindGameServerCommand> =
42+
new Subject<FindGameServerCommand>();
4243

4344
constructor(
4445
private readonly gsSessionRepository: GameServerSessionRepository,
4546
@InjectRepository(GameServerSessionEntity)
46-
private readonly gameServerSessionModelRepository: Repository<
47-
GameServerSessionEntity
48-
>,
47+
private readonly gameServerSessionModelRepository: Repository<GameServerSessionEntity>,
4948
private readonly ebus: EventBus,
5049
@InjectRepository(MatchEntity)
5150
private readonly matchEntityRepository: Repository<MatchEntity>,
5251
private readonly qbus: QueryBus,
53-
@Inject('QueryCore') private readonly redisEventQueue: ClientProxy,
52+
@Inject("QueryCore") private readonly redisEventQueue: ClientProxy,
5453
@InjectRepository(MatchmakingModeMappingEntity)
5554
private readonly matchmakingModeMappingEntityRepository: Repository<MatchmakingModeMappingEntity>,
5655
) {
5756
this.pendingGamesPool
58-
.pipe(asyncMap(cmd => this.findServer(cmd), 1))
57+
.pipe(asyncMap((cmd) => this.findServer(cmd), 1))
5958
.subscribe();
6059
}
6160

6261
async execute(command: FindGameServerCommand) {
6362
this.pendingGamesPool.next(command);
6463
}
6564

66-
private async getGameModeForMatchMode(mode: MatchmakingMode): Promise<Dota_GameMode> {
65+
private async getMapForMatchMode(mode: MatchmakingMode): Promise<Dota_Map> {
6766
const mapping = await this.matchmakingModeMappingEntityRepository.findOne({
6867
where: {
69-
lobbyType: mode
70-
}
68+
lobbyType: mode,
69+
},
70+
});
71+
72+
if (!mapping) {
73+
this.logger.error(
74+
`No mapping found for lobby type ${mode}! Returning all pick`,
75+
);
76+
return Dota_Map.DOTA;
77+
}
78+
return mapping.dotaMap;
79+
}
80+
81+
private async getGameModeForMatchMode(
82+
mode: MatchmakingMode,
83+
): Promise<Dota_GameMode> {
84+
const mapping = await this.matchmakingModeMappingEntityRepository.findOne({
85+
where: {
86+
lobbyType: mode,
87+
},
7188
});
7289

73-
if(!mapping){
74-
this.logger.error(`No mapping found for lobby type ${mode}! Returning all pick`);
90+
if (!mapping) {
91+
this.logger.error(
92+
`No mapping found for lobby type ${mode}! Returning all pick`,
93+
);
7594
return Dota_GameMode.ALLPICK;
7695
}
7796
return mapping.dotaGameMode;
@@ -81,7 +100,7 @@ export class FindGameServerHandler
81100
const players: FullMatchPlayer[] = [];
82101

83102
// TODO: i dont like it and want to move username resolving into operator
84-
const resolves = matchInfo.players.map(async t => {
103+
const resolves = matchInfo.players.map(async (t) => {
85104
const res = await this.qbus.execute<
86105
GetUserInfoQuery,
87106
GetUserInfoQueryResult
@@ -95,6 +114,7 @@ export class FindGameServerHandler
95114

96115
return new GSMatchInfo(
97116
matchInfo.mode,
117+
await this.getMapForMatchMode(matchInfo.mode),
98118
await this.getGameModeForMatchMode(matchInfo.mode),
99119
matchInfo.roomId,
100120
players,
@@ -110,7 +130,7 @@ export class FindGameServerHandler
110130

111131
const gsInfo = await this.extendMatchInfo(command.matchInfo);
112132

113-
console.log('FindServer called, pool', freeServerPool);
133+
console.log("FindServer called, pool", freeServerPool);
114134

115135
const m = new MatchEntity();
116136
m.server = MatchEntity.NOT_DECIDED_SERVER;
@@ -126,18 +146,18 @@ export class FindGameServerHandler
126146
let i = 0;
127147
let foundServer: GameServerEntity | undefined;
128148

129-
console.log('Free pool:', freeServerPool.length);
149+
console.log("Free pool:", freeServerPool.length);
130150
while (i < freeServerPool.length) {
131151
const candidate = freeServerPool[i];
132152
const stackUrl = candidate.url;
133153
try {
134154
const cmd = new LaunchGameServerCommand(candidate.url, m.id, gsInfo);
135155
console.log(JSON.stringify(cmd, null, 2));
136156
const req = await this.redisEventQueue
137-
.send<LaunchGameServerResponse, LaunchGameServerCommand>(
138-
LaunchGameServerCommand.name,
139-
cmd,
140-
)
157+
.send<
158+
LaunchGameServerResponse,
159+
LaunchGameServerCommand
160+
>(LaunchGameServerCommand.name, cmd)
141161
.pipe(timeout(15000))
142162
.toPromise();
143163

@@ -152,7 +172,7 @@ export class FindGameServerHandler
152172
// i guess we skip? just try next server
153173
}
154174
} catch (e) {
155-
console.log('Sadkek?', e);
175+
console.log("Sadkek?", e);
156176
console.error(e.stack);
157177
// timeout means server is DEAD
158178
this.ebus.publish(new ServerNotRespondingEvent(stackUrl));
@@ -163,7 +183,7 @@ export class FindGameServerHandler
163183
i++;
164184
}
165185

166-
console.log('So: ', inspect(foundServer));
186+
console.log("So: ", inspect(foundServer));
167187

168188
if (foundServer) {
169189
m.server = foundServer.url;
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import { Column, Entity, PrimaryColumn } from 'typeorm';
22
import { MatchmakingMode } from 'gateway/shared-types/matchmaking-mode';
33
import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
4+
import { Dota_Map } from 'gateway/shared-types/dota-map';
45

5-
@Entity('matchmaking_mode_mapping_entity')
6+
@Entity("matchmaking_mode_mapping_entity")
67
export class MatchmakingModeMappingEntity {
7-
88
@PrimaryColumn({ name: "lobby_type" })
9-
public lobbyType: MatchmakingMode
10-
9+
public lobbyType: MatchmakingMode;
1110

12-
@Column({ name: "enabled"})
11+
@Column({ name: "enabled" })
1312
public enabled: boolean;
1413

1514
@Column({ name: "dota_game_mode" })
16-
public dotaGameMode: Dota_GameMode
15+
public dotaGameMode: Dota_GameMode;
16+
17+
@Column({ name: "dota_map", default: Dota_Map.DOTA })
18+
public dotaMap: Dota_Map;
1719
}

src/rest/dto/info.dto.ts

+7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Dota2Version } from 'gateway/shared-types/dota2version';
22
import { MatchmakingMode } from 'gateway/shared-types/matchmaking-mode';
33
import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
44
import { ApiProperty } from '@nestjs/swagger';
5+
import { Dota_Map } from 'gateway/shared-types/dota-map';
56

67
export class GameServerDto {
78
url: string;
@@ -30,11 +31,17 @@ export class MatchmakingModeInfoDto {
3031
@ApiProperty({ enum: Dota_GameMode, enumName: "Dota_GameMode" })
3132
game_mode: Dota_GameMode;
3233

34+
@ApiProperty({ enum: Dota_Map, enumName: "Dota_Map" })
35+
dota_map: Dota_Map;
36+
3337
enabled: boolean;
3438
}
3539

3640
export class UpdateGamemodeDto {
3741
enabled: boolean;
3842
@ApiProperty({ enum: Dota_GameMode, enumName: "Dota_GameMode" })
3943
game_mode: Dota_GameMode;
44+
45+
@ApiProperty({ enum: Dota_Map, enumName: "Dota_Map" })
46+
dota_map: Dota_Map;
4047
}

src/rest/info/info-controller.spec.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
1515
import { GameServerEntity } from 'gameserver/model/game-server.entity';
1616
import { UpdateGamemodeDto } from 'rest/dto/info.dto';
1717
import { Repository } from 'typeorm';
18+
import { Dota_Map } from 'gateway/shared-types/dota-map';
1819

1920
describe("InfoController", () => {
2021
jest.setTimeout(60000);
@@ -79,6 +80,7 @@ describe("InfoController", () => {
7980
app,
8081
MatchmakingMode.UNRANKED,
8182
Dota_GameMode.GREEVILING,
83+
Dota_Map.DOTA_WINTER,
8284
true,
8385
);
8486

@@ -89,19 +91,21 @@ describe("InfoController", () => {
8991
});
9092
});
9193

92-
describe("/PATCH /gamemode/:mode", () => {
94+
describe("/PUT /gamemode/:mode", () => {
9395
it(`should update gamemode`, async () => {
9496
const mode = await createGameMode(
9597
app,
9698
MatchmakingMode.UNRANKED,
9799
Dota_GameMode.GREEVILING,
100+
Dota_Map.DOTA_AUTUMN,
98101
true,
99102
);
100103

101104
await request(app.getHttpServer())
102105
.put(`/info/gamemode/${mode.lobbyType}`)
103106
.send({
104107
game_mode: Dota_GameMode.RANKED_AP,
108+
dota_map: Dota_Map.DOTA681,
105109
enabled: false,
106110
} satisfies UpdateGamemodeDto)
107111
.expect(200);
@@ -117,7 +121,8 @@ describe("InfoController", () => {
117121
lobbyType: MatchmakingMode.UNRANKED,
118122
enabled: false,
119123
dotaGameMode: Dota_GameMode.RANKED_AP,
120-
});
124+
dotaMap: Dota_Map.DOTA681,
125+
} satisfies MatchmakingModeMappingEntity);
121126
});
122127
});
123128
});

src/rest/info/info.controller.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export class InfoController {
5151
@Param("mode", ParseIntPipe) mode: MatchmakingMode,
5252
@Body() dto: UpdateGamemodeDto,
5353
) {
54-
await this.infoService.updateGamemode(mode, dto.game_mode, dto.enabled);
54+
await this.infoService.updateGamemode(mode, dto.game_mode, dto.dota_map, dto.enabled);
5555
}
5656

5757
@Get("current_online")

src/rest/info/info.mapper.ts

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export class InfoMapper {
3434
): MatchmakingModeInfoDto => ({
3535
lobby_type: it.lobbyType,
3636
game_mode: it.dotaGameMode,
37+
dota_map: it.dotaMap,
3738
enabled: it.enabled,
3839
});
3940
}

src/rest/info/info.service.ts

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { InjectRepository } from '@nestjs/typeorm';
44
import { Repository } from 'typeorm';
55
import { MatchmakingMode } from 'gateway/shared-types/matchmaking-mode';
66
import { Dota_GameMode } from 'gateway/shared-types/dota-game-mode';
7+
import { Dota_Map } from 'gateway/shared-types/dota-map';
78

89
@Injectable()
910
export class InfoService {
@@ -15,12 +16,14 @@ export class InfoService {
1516
public async updateGamemode(
1617
mode: MatchmakingMode,
1718
game_mode: Dota_GameMode,
19+
dota_map: Dota_Map,
1820
enabled: boolean,
1921
) {
2022
await this.matchmakingModeMappingEntityRepository.upsert(
2123
{
2224
lobbyType: mode,
2325
dotaGameMode: game_mode,
26+
dotaMap: dota_map,
2427
enabled,
2528
},
2629
["lobbyType"],

0 commit comments

Comments
 (0)