ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ.
ΠΡΠΎΠΉ Π²Π΅ΡΠ½ΠΎΠΉ Ρ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ΅Π±ΡΡΠ° Π½Π°ΡΡΠΈΠ»ΠΈΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Dota 2 ΡΠ΅ΡΠ²Π΅Ρ Π²Π΅ΡΡΠΈΠΈ 2014 Π³ΠΎΠ΄Π° ΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈΠ³ΡΠ°ΡΡ Π½Π° Π½Π΅ΠΌ. Π― Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°Π½Π°Ρ ΡΡΠΎΠΉ ΠΈΠ³ΡΡ, ΠΈ Π½Π΅ ΡΠΌΠΎΠ³ ΠΏΡΠΎΠΉΡΠΈ ΠΌΠΈΠΌΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠΊΡΠ½ΡΡΡΡΡ Π² ΡΠ²ΠΎΠ΅ Π΄Π΅ΡΡΡΠ²ΠΎ.
ΠΠΊΡΠ½ΡΠ»ΡΡ Ρ ΠΎΡΠ΅Π½Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎ, ΠΈ ΡΠ°ΠΊ Π²ΡΡΠ»ΠΎ ΡΡΠΎ Ρ Π½Π°ΠΏΠΈΡΠ°Π» Discord Π±ΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π° Π²Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΡΠ°ΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΈΠ³ΡΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΠ°ΡΡΠΌΠ΅ΠΉΠΊΠΈΠ½Π³.
ΠΠΎ Π²ΡΠ΅Ρ
Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠΉ Ρ Π±ΠΎΡΠΎΠΌ Π»ΠΎΠ±Π±ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΎΡΡ Π²ΡΡΡΠ½ΡΡ. Π‘ΠΎΠ±ΠΈΡΠ°Π»ΠΈ 10 ΡΠ΅Π°ΠΊΡΠΈΠΉ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΡΡΠ½ΡΡ ΡΠΎΠ±ΠΈΡΠ°Π»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ, Π»ΠΈΠ±ΠΎ Ρ
ΠΎΡΡΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π»ΠΎΠ±Π±ΠΈ.
ΠΠΎΡ Π½Π°ΡΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° Π½Π΅ Π²ΡΠ΄Π΅ΡΠΆΠ°Π»Π° ΡΠ°ΠΊΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ, ΠΈ Π·Π° Π½ΠΎΡΡ Ρ Π½Π°Π±ΡΠΎΡΠ°Π» ΡΠ°ΠΌΡΡ ΠΏΡΠΎΡΡΡΡ Π²Π΅ΡΡΠΈΡ Π±ΠΎΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π»Π° ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π½Π°Π±ΠΈΡΠ°Π»ΠΎΡΡ 10 ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ.
ΠΠΈΡΠ°ΡΡ ΡΡ
ΠΎΠ΄Ρ ΡΠ΅ΡΠΈΠ» Π½Π° nodejs, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π»ΡΠ±Π»Ρ ΠΏΠΈΡΠΎΠ½, Π½Ρ ΠΈ ΠΊΠΎΠΌΡΠΎΡΡΠ½Π΅Π΅ ΡΠ΅Π±Ρ ΡΡΠ²ΡΡΠ²ΡΡ Π² ΡΡΠΎΠΉ ΡΡΠ΅Π΄Π΅.
ΠΡΠΎ ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΎΠΏΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π±ΠΎΡΠ° Π΄Π»Ρ Discord, Π½ΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π²ΡΠ΅ ΠΎΡΠ΅Π½Ρ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ. ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ npm ΠΌΠΎΠ΄ΡΠ»Ρ discord.js ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΠ±ΠΎΡΠΎΠΌ ΡΠ΅Π°ΠΊΡΠΈΠΉ ΠΈ Ρ.Π΄.
ΠΠΈΡΠΊΠ»Π΅ΠΉΠΌΠ΅Ρ: Π²ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π° ΡΠ²Π»ΡΡΡΡΡ Β«Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌΠΈΒ», ΡΠΎ Π΅ΡΡΡ ΠΏΡΠΎΡΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎ Π½ΠΎΡΠ°ΠΌ.
ΠΡΠ½ΠΎΠ²Π° ΠΌΠ°ΡΡΠΌΠ΅ΠΉΠΊΠΈΠ½Π³Π° β ΡΡΠΎ Β«ΠΎΡΠ΅ΡΠ΅Π΄ΡΒ», Π² ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΈΠ³ΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΎΡΡΡ ΠΈΠ³ΡΠ°ΡΡ, ΠΈ ΡΠ±ΠΈΡΠ°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ°ΡΡ ΠΎΡΠ΅Π»ΠΈ ΠΈΠ»ΠΈ Π½Π°ΡΠ»ΠΈ ΠΈΠ³ΡΡ.
Π’Π°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΡΡΠ½ΠΎΡΡΡ Β«ΠΈΠ³ΡΠΎΠΊΠ°Β». ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎ Π±ΡΠ» ΠΏΡΠΎΡΡΠΎ id ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Discord, Π½ΠΎ Π² ΠΏΠ»Π°Π½Π°Ρ Π»Π°ΡΠ½ΡΠ΅Ρ/ΠΏΠΎΠΈΡΠΊ ΠΈΠ³ΡΡ Ρ ΡΠ°ΠΉΡΠ°, Π½ΠΎ ΠΎΠ±ΠΎ Π²ΡΠ΅ΠΌ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ.
export enum Realm {
DISCORD,
EXTERNAL,
}
export default class QueuePlayer {
constructor(public readonly realm: Realm, public readonly id: string) {}
public is(qp: QueuePlayer): boolean {
return this.realm === qp.realm && this.id === qp.id;
}
static Discord(id: string) {
return new QueuePlayer(Realm.DISCORD, id);
}
static External(id: string) {
return new QueuePlayer(Realm.EXTERNAL, id);
}
}
Π Π²ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. Π’ΡΡ Π²ΠΌΠ΅ΡΡΠΎ Β«ΠΈΠ³ΡΠΎΠΊΠΎΠ²Β» ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ Π² Π²ΠΈΠ΄Π΅ Β«Π³ΡΡΠΏΠΏΡΒ». ΠΠ»Ρ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΠ³ΡΠΎΠΊΠ° Π³ΡΡΠΏΠΏΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π½Π΅Π³ΠΎ ΡΠ°ΠΌΠΎΠ³ΠΎ, Π° Π΄Π»Ρ ΠΈΠ³ΡΠΎΠΊΠΎΠ² Π² Π³ΡΡΠΏΠΏΠ΅, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈΠ· Π²ΡΠ΅Ρ ΠΈΠ³ΡΠΎΠΊΠΎΠ² Π³ΡΡΠΏΠΏΡ.
export default interface IQueue extends EventEmitter {
inQueue: QueuePlayer[]
put(uid: Party): boolean;
remove(uid: Party): boolean;
removeAll(ids: Party[]): void;
mode: MatchmakingMode
roomSize: number;
clear(): void
}
Π Π΅ΡΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ. ΠΠΎΠ΄Ρ ΠΎΠ΄ΠΈΠ»ΠΎ ΠΏΠΎΠ΄ ΠΊΠ΅ΠΉΡΡ β ΠΏΠΎ ΡΠΎΠ±ΡΡΠΈΡ Β«Π½Π°ΠΉΠ΄Π΅Π½Π° ΠΈΠ³ΡΠ° Π΄Π»Ρ 10 ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΒ» ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π² Π»ΠΈΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ°ΠΌ Π½ΡΠΆΠ½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΡ β Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ°ΡΠΊ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ, ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ Π»ΠΎΠ±Π±ΠΈ ΠΊ Π·Π°ΠΏΡΡΠΊΡ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
ΠΠ»Ρ IOC Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ InversifyJS. ΠΠΌΠ΅Ρ ΠΏΡΠΈΡΡΠ½ΡΠΉ ΠΎΠΏΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ. ΠΡΡΡΡΠΎ ΠΈ ΠΏΡΠΎΡΡΠΎ!
ΠΡΠ΅ΡΠ΅Π΄Π΅ΠΉ Ρ Π½Π°Ρ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ β Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌΠΈ 1Ρ 1, ΠΎΠ±ΡΡΠ½ΡΠΉ/ΡΠ΅ΠΉΡΠΈΠ½Π³ΠΎΠ²ΡΠΉ, ΠΈ ΠΏΠ°ΡΠ° ΠΊΠ°ΡΡΠΎΠΌΠΎΠΊ. ΠΠΎΡΡΠΎΠΌΡ Π΅ΡΡΡ singleton RoomService, ΠΊΠΎΡΠΎΡΡΠΉ Π»Π΅ΠΆΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΈ ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΠΈΠ³ΡΡ.
constructor(
@inject(GameServers) private gameServers: GameServers,
@inject(MatchStatsService) private stats: MatchStatsService,
@inject(PartyService) private partyService: PartyService
) {
super();
this.initQueue(MatchmakingMode.RANKED);
this.initQueue(MatchmakingMode.UNRANKED);
this.initQueue(MatchmakingMode.SOLOMID);
this.initQueue(MatchmakingMode.DIRETIDE);
this.initQueue(MatchmakingMode.GREEVILING);
this.partyService.addListener(
"party-update",
(event: PartyUpdatedEvent) => {
this.queues.forEach((q) => {
if (has(q.queue, (t) => t.is(event.party))) {
// if queue has this party, we re-add party
this.leaveQueue(event.qp, q.mode)
this.enterQueue(event.qp, q.mode)
}
});
}
);
this.partyService.addListener(
"party-removed",
(event: PartyUpdatedEvent) => {
this.queues.forEach((q) => {
if (has(q.queue, (t) => t.is(event.party))) {
// if queue has this party, we re-add party
q.remove(event.party)
}
});
}
);
}
(ΠΠ°ΠΏΡΠ° ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ)
ΠΠ΄Π΅ΡΡ Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅ΠΆΠΈΠΌΠΎΠ² ΠΈΠ³ΡΡ, Π° ΡΠ°ΠΊ ΠΆΠ΅ ΡΠ»ΡΡΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Β«Π³ΡΡΠΏΠΏΒ», ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ².
Π’Π°ΠΊ, Ρ ΠΌΠΎΠ»ΠΎΠ΄Π΅Ρ, Ρ Π²ΡΡΠ°Π²ΠΈΠ» ΠΊΡΡΠΊΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠΎΠΏΠΈΠΊΡ, Π° ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΡΠΆΠ΅ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΊ ΠΌΠ°ΡΡΠΌΠ΅ΠΉΠΊΠΈΠ½Π³Ρ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ΅ΠΉΡ:
1) ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΎΡΠ΅Ρ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ.
2) ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ ΠΏΠΎΠΈΡΠΊ, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Gateway=Discord, ΡΠΎ Π΅ΡΡΡ ΡΡΠ°Π²ΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅:
3) ΠΡΠΎΡ Π³Π΅ΠΉΡΠ²Π΅ΠΉ ΠΈΠ΄Π΅Ρ Π² RoomService, ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡ Β«ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ· Π΄ΠΈΡΠΊΠΎΡΠ΄Π° Ρ
ΠΎΡΠ΅Ρ Π²ΠΎΠΉΡΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΡΠ΅ΠΆΠΈΠΌ: Π½Π΅ΡΠ΅ΠΉΡΠΈΠ½Π³ΠΎΠ²Π°Ρ ΠΈΠ³ΡΠ°Β».
4) RoomService ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΡΠΎΡΡΠ±Ρ Π³Π΅ΠΉΡΠ²Π΅Ρ, ΠΈ ΠΏΠΈΡ Π°Π΅Ρ Π² Π½ΡΠΆΠ½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ(ΡΠΎΡΠ½Π΅Π΅, Π³ΡΡΠΏΠΏΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ).
5) ΠΡΠ΅ΡΠ΅Π΄Ρ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Ρ Π²Π°ΡΠ°Π΅Ρ Π»ΠΈ ΠΈΠ³ΡΠΎΠΊΠΎΠ² Π΄Π»Ρ ΠΈΠ³ΡΡ. ΠΡΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ β ΡΠΌΠΈΡΡΠΈΠΌ ΡΠΎΠ±ΡΡΠΈΠ΅:
private onRoomFound(players: Party[]) {
this.emit("room-found", {
players,
});
}
6) RoomService, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Ρ ΡΠ°Π΄ΠΎΡΡΡΡ ΡΠ»ΡΡΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π² ΡΡΠ΅ΠΏΠ΅ΡΠ½ΠΎΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ. ΠΠ° Π²Ρ ΠΎΠ΄ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ³ΡΠΎΠΊΠΎΠ², ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΈΠ· Π½ΠΈΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ Β«ΠΊΠΎΠΌΠ½Π°ΡΡΒ», ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, ΡΠΌΠΈΡΡΠΈΠΌ ΡΠΎΠ±ΡΡΠΈΠ΅:
queue.addListener("room-found", (event: RoomFoundEvent) => {
console.log(
`Room found mode: [${mode}]. Time to get free room for these guys`
);
const room = this.getFreeRoom(mode);
room.fill(event.players);
this.onRoomFormed(room);
});
7) ΠΠΎΡ ΠΌΡ ΠΈ Π΄ΠΎΠ±ΡΠ°Π»ΠΈΡΡ Π΄ΠΎ Β«Π²ΡΡΡΠ΅ΠΉΒ» ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ β ΠΊΠ»Π°ΡΡΠ° Bot. Π ΡΠ΅Π»ΠΎΠΌ ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠ²ΡΠ·ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π³Π΅ΠΉΡΠ²Π΅ΡΠΌΠΈ(ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠΌΠ΅ΡΠ½ΠΎ Π½Π° ΡΡΡΡΠΊΠΎΠΌ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ) ΠΈ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΌΠ°ΡΡΠΌΠ΅ΠΉΠΊΠΈΠ½Π³Π°. ΠΠΎΡ ΠΏΠΎΠ΄ΡΠ»ΡΡΠΈΠ²Π°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅, ΠΈ ΠΏΡΠΈΠΊΠ°Π·ΡΠ²Π°Π΅Ρ DiscordGateway ΠΎΡΠΎΡΠ»Π°ΡΡ Π²ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π½Π° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΡ.
8) ΠΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΠΎΡΠΊΠ»ΠΎΠ½ΠΈΠ» ΠΈΠ»ΠΈ Π½Π΅ ΠΏΡΠΈΠ½ΡΠ» ΠΈΠ³ΡΡ Π·Π° 3 ΠΌΠΈΠ½ΡΡΡ, ΡΠΎ ΠΌΡ ΠΠ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΈΡ
Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΡΠ΅Ρ
ΠΎΡΡΠ°Π»ΡΠ½ΡΡ
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈ ΠΆΠ΄Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΡΠ½ΠΎΠ²Π° Π½Π°Π±Π΅ΡΠ΅ΡΡΡ 10 ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ. ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΈΠ³ΡΠΎΠΊΠΈ ΠΏΡΠΈΠ½ΡΠ»ΠΈ ΠΈΠ³ΡΡ, ΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΡΠ°ΡΡΡ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°
Π£ Π½Π°Ρ ΠΈΠ³ΡΡ Ρ ΠΎΡΡΡΡΡΡ Π½Π° VDS c Windows server 2012. ΠΠ· ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ²ΠΎΠ΄ΠΎΠ²:
- ΠΠ° Π½Π΅Π³ΠΎ Π½Π΅Ρ Π΄ΠΎΠΊΠ΅ΡΠ°, ΡΡΠΎ ΡΠ΄Π°ΡΠΈΠ»ΠΎ ΠΌΠ΅Π½Ρ Π² ΡΠ°ΠΌΠΎΠ΅ ΡΠ΅ΡΠ΄ΡΠ΅
- ΠΡ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΌ Π½Π° Π°ΡΠ΅Π½Π΄Π΅
Π‘ΡΠΎΠΈΡ Π·Π°Π΄Π°ΡΠ°: Ρ VPS Π½Π° Π»ΠΈΠ½ΡΠΊΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° VDS. ΠΠ°ΠΏΠΈΡΠ°Π» ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π½Π° Flask. ΠΠ°, Π½Π΅ Π»ΡΠ±Π»Ρ ΠΏΠΈΡΠΎΠ½, Π½ΠΎ ΡΡΠΎ ΠΏΠΎΠ΄Π΅Π»Π°ΡΡ β Π½Π° Π½Π΅ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ Π±ΡΡΡΡΠ΅Π΅ ΠΈ ΠΏΡΠΎΡΠ΅.
ΠΠ½ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ 3 ΡΡΠ½ΠΊΡΠΈΠΈ:
- ΠΠ°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ β Π²ΡΠ±ΠΎΡ ΠΊΠ°ΡΡΡ, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΈΠ³ΡΠΎΠΊΠΎΠ² Π΄Π»Ρ ΡΡΠ°ΡΡΠ° ΠΈΠ³ΡΡ, ΠΈ Π½Π°Π±ΠΎΡ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². ΠΡΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Ρ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ Π±ΡΠ΄Ρ ΠΏΠΈΡΠ°ΡΡ β ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΠΈΡΡΠΎΡΠΈΡ Ρ Π»ΠΈΡΡΠ°ΠΌΠΈ ΠΊΠΎΡΠ΅ ΠΏΠΎ Π½ΠΎΡΠ°ΠΌ Π²ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠΊΡ ΡΠΎ ΡΠ»Π΅Π·Π°ΠΌΠΈ ΠΈ Π²ΡΡΠ²Π°Π½Π½ΡΠΌΠΈ Π²ΠΎΠ»ΠΎΡΠ°ΠΌΠΈ.
- ΠΡΡΠ°Π½ΠΎΠ²ΠΊΠ°/ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΡΠ΄Π°ΡΠ½ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΡΡΠ½ΡΡ.
Π’ΡΡ Π²ΡΠ΅ ΠΏΡΠΎΡΡΠΎ, ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π° Π΄Π°ΠΆΠ΅ Π½Π΅ΡΠΌΠ΅ΡΡΠ½Ρ. Π‘ΠΊΡΠΈΠΏΡ Π½Π° 100 ΡΡΡΠΎΡΠ΅ΠΊ
ΠΡΠ°ΠΊ, ΠΊΠΎΠ³Π΄Π° 10 ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΡΠΎΠ±ΡΠ°Π»ΠΈΡΡ Π²ΠΌΠ΅ΡΡΠ΅ ΠΈ ΠΏΡΠΈΠ½ΡΠ»ΠΈ ΠΈΠ³ΡΡ, Π·Π°ΠΏΡΡΠ΅Π½ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ Π²ΡΠ΅ ΠΆΠ°ΠΆΠ΄ΡΡ ΠΈΠ³ΡΠ°ΡΡ, Π² Π»ΠΈΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΈΠ³ΡΠ΅.
ΠΠΎ Π½Π°ΠΆΠ°ΡΠΈΡ ΡΡΡΠ»ΠΊΠΈ ΠΈΠ³ΡΠΎΠΊΠ° ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΈΡ ΠΊ ΠΈΠ³ΡΠΎΠ²ΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ, ΠΈ Π΄Π°Π»ΡΡΠ΅ ΡΠΆΠ΅ ΡΠ°ΠΌΠΎ Π²ΡΠ΅. Π§Π΅ΡΠ΅Π· ~25 ΠΌΠΈΠ½ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ Β«ΠΊΠΎΠΌΠ½Π°ΡΠ°Β» Ρ ΠΈΠ³ΡΠΎΠΊΠ°ΠΌΠΈ ΠΎΡΠΈΡΠ°Π΅ΡΡΡ.
ΠΠ°ΡΠ°Π½Π΅Π΅ ΠΈΠ·Π²ΠΈΠ½ΡΡΡΡ Π·Π° Π½Π΅ΡΠΊΠ»Π°Π΄Π½ΠΎΡΡΡ ΡΡΠ°ΡΡΠΈ, Π΄Π°Π²Π½ΠΎ Π½Π΅ ΠΏΠΈΡΠ°Π» ΡΡΠ΄Π°, Π΄Π° ΠΈ ΠΊΠΎΠ΄Π° ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π²Π°ΠΆΠ½ΡΠ΅ ΡΡΠ°ΡΡΠΊΠΈ. ΠΠ°ΠΏΡΠ°, ΠΊΠΎΡΠΎΡΠ΅.
ΠΡΠ»ΠΈ ΡΠ²ΠΈΠΆΡ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ ΠΊ ΡΠ΅ΠΌΠ΅, ΡΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ β Π² Π½Π΅ΠΉ Π±ΡΠ΄ΡΡ ΠΌΠΎΠΈ ΠΌΡΡΠ΅Π½ΠΈΡ Ρ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ Π΄Π»Ρ srcds(Source dedicated server), ΠΈ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ΠΉΡΠΈΠ½Π³Π° ΠΈ ΠΌΠΈΠ½ΠΈ-dotabuff, ΡΠ°ΠΉΡ ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ ΠΈΠ³Ρ.
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ»ΠΎΠΊ:
ΠΠ°Ρ ΡΠ°ΠΉΡ(ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°, ΡΠ°Π±Π»ΠΈΡΠ° Π»ΠΈΠ΄Π΅ΡΠΎΠ², Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ Π»Π΅Π½Π΄ΠΎΡ ΠΈ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°) Discord ΡΠ΅ΡΠ²Π΅Ρ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com