แž™แžพแž„แž€แŸ†แž–แžปแž„แžŸแžšแžŸแŸแžšแž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Dota 2014

แžŸแžฝแžŸแŸ’แžแžธแžขแŸ’แž“แž€แžšแžถแž›แŸ‹แž‚แŸ’แž“แžถแŸ”

แžšแžŠแžผแžœแž•แŸ’แž€แžถแžšแžธแž€แž“แŸแŸ‡แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž‚แž˜แŸ’แžšแŸ„แž„แž˜แžฝแž™แžŠแŸ‚แž›แž”แžปแžšแžŸแž”แžถแž“แžšแŸ€แž“แž–แžธแžšแž”แŸ€แž”แžŠแŸ†แžŽแžพแžšแž€แžถแžš Dota 2 server version 2014 แž แžพแž™แžแžถแž˜แž“แŸ„แŸ‡ แž›แŸแž„แž›แžพแžœแžถแŸ” แžแŸ’แž‰แžปแŸ†แž‡แžถแžขแŸ’แž“แž€แž‚แžถแŸ†แž‘แŸ’แžšแžŠแŸแž’แŸ†แž“แŸƒแž แŸ’แž‚แŸแž˜แž“แŸแŸ‡ แž แžพแž™แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แžขแžถแž…แžšแŸ†แž›แž„แžฑแž€แžถแžŸแž–แžทแžŸแŸแžŸแž“แŸแŸ‡ แžŠแžพแž˜แŸ’แž”แžธแž‡แŸ’แžšแž˜แžปแž‡แžแŸ’แž›แžฝแž“แžแŸ’แž‰แžปแŸ†แž€แŸ’แž“แžปแž„แžœแŸแž™แž€แžปแž˜แžถแžšแž—แžถแž–แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž‘แŸแŸ”

แžแŸ’แž‰แžปแŸ†แž…แžผแž›แž‡แŸ’แžšแŸ…แžŽแžถแžŸแŸ‹ แž แžพแž™แžœแžถแž”แžถแž“แž€แžพแžแžกแžพแž„แžŠแŸ‚แž›แžแŸ’แž‰แžปแŸ†แžŸแžšแžŸแŸแžš Discord bot แžŠแŸ‚แž›แž‘แž‘แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแž…แŸ†แž–แŸ„แŸ‡แž˜แžปแžแž„แžถแžšแžŸแŸ’แž‘แžพแžšแžแŸ‚แž‘แžถแŸ†แž„แžขแžŸแŸ‹แžŠแŸ‚แž›แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แžถแŸ†แž‘แŸ’แžšแž“แŸ…แž€แŸ’แž“แžปแž„แž€แŸ†แžŽแŸ‚แž…แžถแžŸแŸ‹แž“แŸƒแž แŸ’แž‚แŸแž˜ แž–แŸ„แž›แž‚แžบแž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แŸ”
แž˜แžปแž“แž–แŸแž›แž€แžถแžšแž…แŸ’แž“แŸƒแž”แŸ’แžšแžŒแžทแžแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž‡แžถแž˜แžฝแž™ bot แž€แž“แŸ’แž›แŸ‚แž„แž‘แž‘แžฝแž›แž—แŸ’แž‰แŸ€แžœแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžŠแŸ„แž™แžŠแŸƒแŸ” แž™แžพแž„แž”แŸ’แžšแž˜แžผแž›แž”แžถแž“ 10 แž”แŸ’แžšแžแžทแž€แž˜แŸ’แž˜แž…แŸ†แž–แŸ„แŸ‡แžŸแžถแžšแž˜แžฝแž™ แž แžพแž™แž”แŸ’แžšแž˜แžผแž›แž•แŸ’แžแžปแŸ†แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžŠแŸ„แž™แžŠแŸƒ แžฌแžšแŸ€แž”แž…แŸ†แž€แž“แŸ’แž›แŸ‚แž„แž‘แž‘แžฝแž›แž—แŸ’แž‰แŸ€แžœแž€แŸ’แž“แžปแž„แžŸแŸ’แžšแžปแž€แŸ”

แž™แžพแž„แž€แŸ†แž–แžปแž„แžŸแžšแžŸแŸแžšแž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Dota 2014

แž’แž˜แŸ’แž˜แž‡แžถแžแžทแžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž€แŸ’แž“แžปแž„แž“แžถแž˜แž‡แžถแžขแŸ’แž“แž€แžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž˜แžทแž“แžขแžถแž…แž‘แž”แŸ‹แž‘แž›แŸ‹แž“แžนแž„แž€แžถแžšแž„แžถแžšแžŠแŸ„แž™แžŠแŸƒแž…แŸ’แžšแžพแž“แž“แŸ„แŸ‡แž‘แŸ แž แžพแž™แž–แŸแž‰แž˜แžฝแž™แž™แž”แŸ‹แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž‚แžผแžŸแžœแžถแžŸแž“แžผแžœแž€แŸ†แžŽแŸ‚แžŸแžถแž˜แž‰แŸ’แž‰แž”แŸ†แž•แžปแžแžšแž”แžŸแŸ‹ bot แžŠแŸ‚แž›แžŠแŸ†แžกแžพแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸ…แž–แŸแž›แž˜แžถแž“แž˜แž“แžปแžŸแŸ’แžŸ 10 แž“แžถแž€แŸ‹แŸ”

แžแŸ’แž‰แžปแŸ†แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแžŸแžšแžŸแŸแžšแž€แŸ’แž“แžปแž„ nodej แž—แŸ’แž›แžถแž˜แŸ— แž–แŸ’แžšแŸ„แŸ‡แžแŸ’แž‰แžปแŸ†แž–แžทแžแž‡แžถแž˜แžทแž“แž…แžผแž›แž…แžทแžแŸ’แž Python แž แžพแž™แžแŸ’แž‰แžปแŸ†แž˜แžถแž“แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžŸแŸ’แžšแžฝแž›แž‡แžถแž„แž“แŸ…แž€แŸ’แž“แžปแž„แž”แžšแžทแž™แžถแž€แžถแžŸแž“แŸแŸ‡แŸ”

แž“แŸแŸ‡แž‡แžถแž”แž‘แž–แžทแžŸแŸ„แž’แž“แŸแžŠแŸ†แž”แžผแž„แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแžšแžŸแŸแžš bot แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Discord แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžœแžถแž”แŸ’แžšแŸ‚แž‘แŸ…แž‡แžถแžŸแžถแž˜แž‰แŸ’แž‰แžŽแžถแžŸแŸ‹แŸ” แž˜แŸ‰แžผแžŒแžปแž› npm แž•แŸ’แž›แžผแžœแž€แžถแžš discord.js แž•แŸ’แžแž›แŸ‹แž“แžผแžœแž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แž„แžถแž™แžŸแŸ’แžšแžฝแž›แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แžŸแžถแžš แž€แžถแžšแž”แŸ’แžšแž˜แžผแž›แž”แŸ’แžšแžแžทแž€แž˜แŸ’แž˜แŸ”แž›แŸ”

แž€แžถแžšแž”แžŠแžทแžŸแŸแž’แŸ– แžงแž‘แžถแž แžšแžŽแŸแž€แžผแžŠแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž‚แžบ "แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“" แž˜แžถแž“แž“แŸแž™แžแžถแž–แžฝแž€แž‚แŸแž”แžถแž“แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž€แžถแžšแžŸแžšแžŸแŸแžšแžกแžพแž„แžœแžทแž‰แž‡แžถแž…แŸ’แžšแžพแž“แžŠแž„แž“แŸ…แž–แŸแž›แž™แž”แŸ‹แŸ”

แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž“แŸƒแž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แž‚แžบแž‡แžถ "แž‡แžฝแžš" แžŠแŸ‚แž›แžขแŸ’แž“แž€แž›แŸแž„แžŠแŸ‚แž›แž…แž„แŸ‹แž›แŸแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแžถแž€แŸ‹แž…แžผแž› แž“แžทแž„แžŠแž€แž…แŸแž‰แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แž–แžฝแž€แž‚แŸแž˜แžทแž“แž…แž„แŸ‹ แžฌแžŸแŸ’แžœแŸ‚แž„แžšแž€แž แŸ’แž‚แŸแž˜แŸ”

แž“แŸแŸ‡แž‚แžบแž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แž›แžนแž˜แžŸแžถแžšแž“แŸƒ "แžขแŸ’แž“แž€แž›แŸแž„" แž˜แžพแž›แž‘แŸ…แŸ” แžŠแŸ†แž”แžผแž„แžœแžถแž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚แž‡แžถแž›แŸแžแžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„ 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 แŸ” แžแŸ’แž‰แžปแŸ†แž˜แžถแž“แž”แž‘แž–แžทแžŸแŸ„แž’แž“แŸแžšแžธแž€แžšแžถแž™แž€แŸ’แž“แžปแž„แž€แžถแžšแž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แž”แžŽแŸ’แžŽแžถแž›แŸแž™แž“แŸแŸ‡แŸ” แž›แžฟแž“แž“แžทแž„แž„แžถแž™แžŸแŸ’แžšแžฝแž›!

แž™แžพแž„แž˜แžถแž“แž‡แžฝแžšแž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžšแž”แžŸแŸ‹แž™แžพแž„ - แž™แžพแž„แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜ 1x1, แž’แž˜แŸ’แž˜แžแžถ/แžœแžถแž™แžแž˜แŸ’แž›แŸƒ แž“แžทแž„แžšแž”แŸ€แž”แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แž–แžธแžšแž”แžธแŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แž แžพแž™ แž˜แžถแž“ 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 แž–แŸ„แž›แž‚แžบแžŠแžถแž€แŸ‹แž”แŸ’แžšแžแžทแž€แž˜แŸ’แž˜แž‘แŸ…แž“แžนแž„แžŸแžถแžšแŸ–

แž™แžพแž„แž€แŸ†แž–แžปแž„แžŸแžšแžŸแŸแžšแž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Dota 2014

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. แž‡แžถแž‘แžผแž‘แŸ… แž‚แžถแžแŸ‹แž‘แžถแž€แŸ‹แž‘แž„แž“แžนแž„แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แžšแžœแžถแž„แž…แŸ’แžšแž€แž•แŸ’แž›แžผแžœ (แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แžขแžถแž…แž™แž›แŸ‹แžแžถแžแžพแžœแžถแž˜แžพแž›แž‘แŸ…แž‚แžฝแžšแžฑแŸ’แž™แžขแžŸแŸ‹แžŸแŸ†แžŽแžพแž…แž‡แžถแž—แžถแžŸแžถแžšแžปแžŸแŸ’แžŸแžธแž‘แŸ) แž“แžทแž„แžแž€แŸ’แž€แžœแžทแž‡แŸ’แž‡แžถแžขแžถแž‡แžธแžœแž€แž˜แŸ’แž˜แž“แŸƒแž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แŸ” bot แžŸแŸ’แžแžถแž”แŸ‹แžฎแž–แŸ’แžšแžนแžแŸ’แžแžทแž€แžถแžšแžŽแŸแž“แŸแŸ‡ แž แžพแž™แž”แž‰แŸ’แž‡แžถแžฑแŸ’แž™ DiscordGateway แž•แŸ’แž‰แžพแž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แž€แžถแžšแžแŸ’แžšแŸ€แž˜แžแŸ’แž›แžฝแž“แž‘แŸ…แž€แžถแž“แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž‘แžถแŸ†แž„แžขแžŸแŸ‹แŸ”

แž™แžพแž„แž€แŸ†แž–แžปแž„แžŸแžšแžŸแŸแžšแž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Dota 2014

แŸจ) แž”แŸ’แžšแžŸแžทแž“แž”แžพแž“แžšแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แž”แžŠแžทแžŸแŸแž’ แžฌแž˜แžทแž“แž‘แž‘แžฝแž›แž™แž€แž แŸ’แž‚แŸแž˜แž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž› 8 แž“แžถแž‘แžธ แž“แŸ„แŸ‡แž™แžพแž„แž˜แžทแž“แž”แž‰แŸ’แž‡แžผแž“แž–แžฝแž€แž‚แŸแž‘แŸ…แž‡แžฝแžšแž“แŸ„แŸ‡แž‘แŸแŸ” แž™แžพแž„โ€‹แžแŸ’แžšแžกแž”แŸ‹โ€‹แžขแŸ’แž“แž€โ€‹แž•แŸ’แžŸแŸแž„โ€‹แž‘แŸ…โ€‹แž‡แžฝแžšโ€‹แžœแžทแž‰ แž แžพแž™โ€‹แžšแž„แŸ‹แž…แžถแŸ†โ€‹แžšแž แžผแžโ€‹แžŠแž›แŸ‹โ€‹แž˜แžถแž“โ€‹แž˜แž“แžปแžŸแŸ’แžŸโ€‹แŸกแŸ โ€‹แž“แžถแž€แŸ‹โ€‹แž‘แŸ€แžโ€‹แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž›แŸแž„แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž”แžถแž“แž‘แž‘แžฝแž›แž™แž€แž แŸ’แž‚แŸแž˜แž“แŸ„แŸ‡ แž•แŸ’แž“แŸ‚แž€แž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž“แžนแž„แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แŸ”

แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž–แžทแžŸแŸแžŸ

แž แŸ’แž‚แŸแž˜แžšแž”แžŸแŸ‹แž™แžพแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž แŸ„แŸ‡แž“แŸ…แž›แžพ VDS แž‡แžถแž˜แžฝแž™แž“แžนแž„ Windows server 2012แŸ” แž–แžธแž“แŸแŸ‡แž™แžพแž„แžขแžถแž…แž‘แžถแž‰แž€แžถแžšแžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“แž‡แžถแž…แŸ’แžšแžพแž“แŸ–

  1. แž‚แŸ’แž˜แžถแž“โ€‹แžขแŸ’แž“แž€โ€‹แž…แžโ€‹แž“แŸ…โ€‹แž›แžพโ€‹แžœแžถโ€‹แžŠแŸ‚แž›โ€‹แžœแžถแž™โ€‹แžแŸ’แž‰แžปแŸ†โ€‹แž€แŸ’แž“แžปแž„โ€‹แž…แžทแžแŸ’แž
  2. แž™แžพแž„แžŸแž“แŸ’แžŸแŸ†แž›แžพแž€แžถแžšแž‡แžฝแž›

แž—แžถแžšแž€แžทแž…แŸ’แž…แž‚แžบแžŠแžพแž˜แŸ’แž”แžธแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸ…แž›แžพ VDS แž–แžธ VPS แž“แŸ…แž›แžพแž›แžธแž“แžปแž…แŸ” แžแŸ’แž‰แžปแŸ†แž”แžถแž“แžŸแžšแžŸแŸแžšแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžŸแžถแž˜แž‰แŸ’แž‰แž˜แžฝแž™แž“แŸ…แž€แŸ’แž“แžปแž„ Flask แŸ” แž”แžถแž‘/แž…แžถแžŸ แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แž…แžผแž›แž…แžทแžแŸ’แž Python แž‘แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžแžพแžขแŸ’แž“แž€แžขแžถแž…แž’แŸ’แžœแžพแžขแŸ’แžœแžธแž”แžถแž“? แžœแžถแž›แžฟแž“ แž“แžทแž„แž„แžถแž™แžŸแŸ’แžšแžฝแž›แž‡แžถแž„แž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแžšแžŸแŸแžšแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž“แŸแŸ‡แž“แŸ…แž›แžพแžœแžถแŸ”

แžœแžถแžขแž“แžปแžœแžแŸ’แžแž˜แžปแžแž„แžถแžš แŸฃแŸ–

  1. แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ - แž€แžถแžšแž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž•แŸ‚แž“แž‘แžธ แž…แŸ†แž“แžฝแž“แžขแŸ’แž“แž€แž›แŸแž„แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž แŸ’แž‚แŸแž˜ แž“แžทแž„แžŸแŸ†แžŽแžปแŸ†แž“แŸƒแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แŸ†แž“แžฝแž™แŸ” แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž˜แžทแž“แžŸแžšแžŸแŸแžšแžขแŸ†แž–แžธแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แŸ†แž“แžฝแž™แž‘แŸแžฅแžกแžผแžœแž“แŸแŸ‡ - แž“แŸ„แŸ‡แž‡แžถแžšแžฟแž„แžแžปแžŸแž‚แŸ’แž“แžถแž‡แžถแž˜แžฝแž™แž€แžถแž แŸ’แžœแŸแž˜แžฝแž™แž›แžธแžแŸ’แžšแž“แŸ…แž–แŸแž›แž™แž”แŸ‹ แž›แžถแž™แžกแŸ†แžŠแŸ„แž™แž‘แžนแž€แž—แŸ’แž“แŸ‚แž€ แž“แžทแž„แžŸแž€แŸ‹แžšแž แŸ‚แž€แŸ”
  2. แž€แžถแžšแž”แž‰แŸ’แžˆแž”แŸ‹/แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžกแžพแž„แžœแžทแž‰ แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž˜แžทแž“แž‡แŸ„แž‚แž‡แŸแž™ แžŠแŸ‚แž›แž™แžพแž„แžขแžถแž…แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แžŠแŸ„แž™แžŠแŸƒแžแŸ‚แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แŸ”

แžขแŸ’แžœแžธแž‚แŸ’แžšแž”แŸ‹แž™แŸ‰แžถแž„แž‚แžบแžŸแžถแž˜แž‰แŸ’แž‰แž“แŸ…แž‘แžธแž“แŸแŸ‡ แžงแž‘แžถแž แžšแžŽแŸแž€แžผแžŠแž€แŸแž˜แžทแž“แžŸแž˜แžšแž˜แŸ’แž™แžŠแŸ‚แžšแŸ” 100 แžขแž€แŸ’แžŸแžšแž€แžถแžแŸ‹

แžŠแžผแž…แŸ’แž“แŸแŸ‡ แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แž˜แž“แžปแžŸแŸ’แžŸ 10 แž“แžถแž€แŸ‹แž”แžถแž“แž‡แžฝแž”แž‡แžปแŸ†แž‚แŸ’แž“แžถ แž“แžทแž„แž‘แž‘แžฝแž›แž™แž€แž แŸ’แž‚แŸแž˜ แž“แŸ„แŸ‡แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžแŸ’แžšแžผแžœแž”แžถแž“แž”แžพแž€แžŠแŸ†แžŽแžพแžšแž€แžถแžš แž แžพแž™แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แž“แžถแž…แž„แŸ‹แž›แŸแž„ แžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แžŠแžพแž˜แŸ’แž”แžธแž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แž แŸ’แž‚แŸแž˜แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‰แžพแž‡แžถแžŸแžถแžšแžฏแž€แž‡แž“แŸ”

แž™แžพแž„แž€แŸ†แž–แžปแž„แžŸแžšแžŸแŸแžšแž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Dota 2014

แžŠแŸ„แž™แž…แžปแž…แž›แžพแžแŸ†แžŽ แžขแŸ’แž“แž€แž›แŸแž„แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž แŸ’แž‚แŸแž˜ แž แžพแž™แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž“แŸ„แŸ‡แž‡แžถแžœแžถแŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธ ~ 25 แž“แžถแž‘แžธ "แž”แž“แŸ’แž‘แž”แŸ‹" แž“แžทแž˜แŸ’แž˜แžทแžแž‡แžถแž˜แžฝแž™แžขแŸ’แž“แž€แž›แŸแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแž˜แŸ’แžขแžถแžแŸ”

แžแŸ’แž‰แžปแŸ†แžŸแžผแž˜แžขแž—แŸแž™แž‘แŸ„แžŸแž‘แžปแž€แž‡แžถแž˜แžปแž“แž…แŸ†แž–แŸ„แŸ‡แž—แžถแž–แž†แŸ’แž‚แžถแŸ†แž†แŸ’แž‚แž„แž“แŸƒแžขแžแŸ’แžแž”แž‘ แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แž”แžถแž“แžŸแžšแžŸแŸแžšแž“แŸ…แž‘แžธแž“แŸแŸ‡แž™แžผแžšแž‘แŸ แž แžพแž™แžœแžถแž˜แžถแž“แž€แžผแžŠแž…แŸ’แžšแžพแž“แž–แŸแž€แžŠแžพแž˜แŸ’แž”แžธแžšแŸ†แž›แŸแž…แž•แŸ’แž“แŸ‚แž€แžŸแŸ†แžแžถแž“แŸ‹แŸ—แŸ” แž‚แžปแž™แž‘แžถแžœ, แž“แžทแž™แžถแž™แžฑแŸ’แž™แžแŸ’แž›แžธแŸ”

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžแŸ’แž‰แžปแŸ†แžƒแžพแž‰แž…แŸ†แžŽแžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž›แžพแž”แŸ’แžšแž’แžถแž“แž”แž‘แž“แŸแŸ‡ แž“แžนแž„แž˜แžถแž“แž•แŸ’แž“แŸ‚แž€แž‘แžธแž–แžธแžš - แžœแžถแž“แžนแž„แž˜แžถแž“แž€แžถแžšแžŠแžถแž€แŸ‹แž‘แžŽแŸ’แžŒแž€แž˜แŸ’แž˜แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แŸ†แž“แžฝแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹ srcds (Source dedicated server) แž แžพแž™แž”แŸ’แžšแž แŸ‚แž›แž‡แžถแž”แŸ’แžšแž–แŸแž“แŸ’แž’แžœแžถแž™แžแž˜แŸ’แž›แŸƒ แž“แžทแž„ mini-dotabuff แžŠแŸ‚แž›แž‡แžถแž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แžŸแŸ’แžแžทแžแžทแž แŸ’แž‚แŸแž˜แŸ”

แžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž˜แžฝแž™แž…แŸ†แž“แžฝแž“แŸ–

  1. แž‚แŸแž แž‘แŸ†แž–แŸแžšแžšแž”แžŸแŸ‹แž™แžพแž„ (แžŸแŸ’แžแžทแžแžท แžแžถแžšแžถแž„แž–แžทแž“แŸ’แž‘แžป แž‘แŸ†แž–แŸแžšแž…แžปแŸ‡แž…แžแžแžผแž… แž“แžทแž„แž€แžถแžšแž‘แžถแž‰แž™แž€แžขแžแžทแžแžทแž‡แž“)
  2. แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž˜แžทแž“แž…แžปแŸ‡แžŸแž˜แŸ’แžšแžปแž„

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹