ืฉืืื ืืืืื.
ืืืืื ืืื ื ืชืงืืชื ืืคืจืืืงื ืฉืื ืืืืจ'ื ืืืื ืืื ืืืจืืฅ ืืช ืฉืจืช ืืืืื 2 ืืจืกืช 2014 ืืืืชืื, ืืฉืืง ืื. ืื ื ืืขืจืืฅ ืืืื ืฉื ืืืฉืืง ืืื, ืืื ืืืืืชื ืืืืชืจ ืขื ืืืืืื ืืช ืืืืืืืืช ืืื ืืฉืงืืข ืืืืืืชื.
ืฆืืืชื ืขืืืง ืืืื, ืืื ืงืจื ืฉืืชืืชื ืืื ืฉื Discord ืฉืืืจืื ืืืขื ืขื ืื ืืคืื ืงืฆืืื ืืืืช ืฉืืื ื ื ืชืืืช ืืืจืกื ืืืฉื ื ืฉื ืืืฉืืง, ืืืืืจ ืฉืืืืืื.
ืืคื ื ืื ืืืืืืฉืื ืขื ืืืื, ืืืืื ื ืืฆืจ ืืืืคื ืืื ื. ืืกืคื ื 10 ืชืืืืืช ืืืืืขื ืืืจืืืื ื ืฉืจืช ืืืืคื ืืื ื, ืื ืืืจืื ื ืืืื ืืงืืื.
ืืืืข ืฉืื ืืืชืื ืช ืื ืขืื ืืื ืื ืืจืื ืขืืืื ืืื ืืช, ืืืื ืืืื ืฉืจืืืชื ืืช ืืืจืกื ืืคืฉืืื ืืืืชืจ ืฉื ืืืื, ืฉืืขืื ืืช ืืฉืจืช ืืืืืืืืช ืืฉืืื 10 ืื ืฉืื.
ืืืืืชื ืืื ืืืชืื ื-nodejs, ืื ืื ื ืื ืืืฉ ืืืื ืืช Python, ืืื ื ืืจืืืฉ ืืืชืจ ื ืื ืืกืืืื ืืื.
ืื ืืืชื ืกืืช ืืจืืฉืื ื ืฉืื ืืืชืืืช ืืื ืืืืกืงืืจื, ืืื ืืชืืจืจ ืฉืื ืืืื ืคืฉืื. ืืืืื npm ืืจืฉืื discord.js ืืกืคืง ืืืฉืง ื ืื ืืขืืืื ืขื ืืืืขืืช, ืืืกืืฃ ืชืืืืืช ืืื'.
ืืชื ืืืชืืจ: ืื ืืืืืืืช ืืงืื ืื "ืขืืื ืืืช", ืืืืืจ ืื ืขืืจื ืืกืคืจ ืืืืจืฆืืืช ืฉื ืฉืืชืื ืืืืื.
ืืืกืืก ืืฉืืืืืื ืืื "ืชืืจ" ืฉืื ืฉืืงื ืื ืฉืจืืฆืื ืืฉืืง ืืืื ืกืื ืืืืจืืงืื ืืฉืื ืื ืจืืฆืื ืื ืืืฆืืื ืืฉืืง.
ืื ื ืจืืืช ืืืืืช ืฉื "ืฉืืงื". ืืชืืืื ืื ืืื ืจืง โโืืืื ืืฉืชืืฉ ืืืืกืงืืจื, ืืื ืืฉ ืชืืื ืืืช ืืืฉืืง/ืืืคืฉ ืืฉืืงืื ืืืืชืจ, ืืื ืงืืื ืื.
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. ืืฉ ืื ืืืืื ื ืขืืื ืืขืืืื ืขื ืืกืคืจืืื ืืื. ืืืืจ ืืงื!
ืืฉ ืื ื ืืกืคืจ ืชืืจืื ืืฉืจืช ืฉืื ื - ืืืกืคื ื 1x1, ืจืืื/ืืืืจื, ืืืื ืืฆืืื ืืืชืืืื ืืืฉืืช. ืืื, ืงืืื RoomService Singleton ืฉื ืืฆื ืืื ืืืฉืชืืฉ ืืืืคืืฉ ืืืฉืืง.
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 ืืืืืจ "ืืฉืชืืฉ ื-discord ืจืืฆื ืืืืื ืก ืืชืืจ, ืืฆื: ืืฉืืง ืื ืืืืจื."
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) ืื ืืืขื ื ืืกืืืืช "ืืืืืื ืืืืชืจ" - ืืืืชื ืืื. ืืืื, ืืื ืขืืกืง ืืืืืืจ ืืื ืฉืขืจืื (ืื ื ืื ืืฆืืื ืืืืื ืืื ืื ื ืจืื ืืฆืืืง ืืจืืกืืช) ืืืื ืืืืืืื ืืขืกืงื ืฉื ืฉืืืืืื. ืืืื ืฉืืืข ืืช ืืืืจืืข ืืืืจื ื-DiscordGateway ืืฉืืื ืืืืงืช ืืืื ืืช ืืื ืืืฉืชืืฉืื.
8) ืื ืืืฉืื ืืืื ืื ืื ืืงืื ืืช ืืืฉืืง ืชืื 3 ืืงืืช, ืื ืื ืื ื ืื ืืืืืจืื ืืืชื ืืชืืจ. ืื ืื ื ืืืืืจืื ืืช ืื ืืฉืืจ ืืชืืจ ืืืืืื ืขื ืฉืืืื ืฉืื 10 ืื ืฉืื. ืื ืื ืืฉืืงื ืื ืงืืืื ืืช ืืืฉืืง, ืื ืืืืง ืืืขื ืืื ืืชืืื.
ืชืฆืืจืช ืฉืจืช ืืืขืืื
ืืืฉืืงืื ืฉืื ื ืืชืืจืืื ื-VDS ืขื Windows server 2012. ืืืื ื ืืื ืืืกืืง ืืกืคืจ ืืกืงื ืืช:
- ืืื ืื ืืืงืจ, ืื ืฉืคืืข ืื ืืื
- ืื ืื ื ืืืกืืื ืืฉืืจ ืืืจื
ืืืฉืืื ืืื ืืืคืขืื ืชืืืื ืขื VDS ื-VPS ืขื ืืื ืืงืก. ืืชืืชื ืฉืจืช ืคืฉืื ื-Flask. ืื, ืื ื ืื ืืืื ืืช Python, ืืื ืื ืืชื ืืืื ืืขืฉืืช? ืื ืืืืจ ืืืชืจ ืืงื ืืืชืจ ืืืชืื ืืช ืืฉืจืช ืืื ืขืืื.
ืืื ืืืฆืข 3 ืคืื ืงืฆืืืช:
- ืืคืขืืช ืฉืจืช ืขื ืงืื ืคืืืืจืฆืื - ืืืืจืช ืืคื, ืืกืคืจ ืืฉืืงื ืื ืืืคืขืืช ืืืฉืืง ืืขืจืืช ืชืืกืคืื. ืื ื ืื ืืืชืื ืขืืฉืื ืขื ืชืืกืคืื - ืื ืืืจ ืกืืคืืจ ืืืจ ืขื ืืืืจืื ืฉื ืงืคื ืืืืื ืืืืืื ืืืืขืืช ืืฉืืขืจ ืงืจืืข.
- ืขืฆืืจื/ืืคืขืื ืืืืฉ ืฉื ืืฉืจืช ืืืงืจื ืฉื ืืืืืจืื ืื ืืืฆืืืื, ืฉื ืืื ืืืคื ืืื ืจืง ืืืืคื ืืื ื.
ืืื ืคืฉืื ืืื, ืืืืืืืช ืงืื ืืคืืื ืื ืืชืืืืืช. ืชืกืจืื ืื 100 ืฉืืจืืช
ืื ืืฉ-10 ืื ืฉืื ืืชืืกืคื ืืงืืืื ืืช ืืืฉืืง, ืืฉืจืช ืืืฉืง ืืืืื ืืื ืืืืืื ืืฉืืง, ื ืฉืื ืงืืฉืืจ ืืืืืืจ ืืืฉืืง ืืืืืขืืช ืคืจืืืืช.
ืืืืืฆื ืขื ืืงืืฉืืจ, ืืฉืืงื ืืชืืืจ ืืฉืจืช ืืืฉืืง, ืืื ืืื. ืืืืจ ~ 25 ืืงืืช, "ืืืืจ" ืืืืืจืืืืื ืขื ืืฉืืงื ืื ื ืืงื.
ืื ื ืืชื ืฆื ืืจืืฉ ืขื ืืกืจืืื ืฉื ืืืืืจ, ืื ืืชืืชื ืืื ืืจืื ืืื, ืืืฉ ืืืชืจ ืืื ืงืื ืืื ืืืืืืฉ ืงืืขืื ืืฉืืืื. ื ืืืืก, ืืงืืฆืืจ.
ืื ืื ื ืจืืื ืขื ืืื ืื ืืฉื, ืืืื ืืืง ืฉื ื - ืืื ืืืื ืืช ืืืกืืจืื ืฉืื ืขื ืชืืกืคืื ื-srcds (ืฉืจืช ืืืขืืื ืืงืืจ), ืืื ืจืื ืื ืืขืจืืช ืืืจืื ื-mini-dotabuff, ืืชืจ ืขื ืกืืืืกืืืงืืช ืืฉืืง.
ืืื ืงืืฉืืจืื:
ืืืชืจ ืฉืื ื (ืกืืืืกืืืงื, Leaderboard, ืืฃ ื ืืืชื ืงืื ืืืืจืืช ืืงืื) ืฉืจืช ืืืกืงืืจื
ืืงืืจ: www.habr.com