рд╣рд╛рдореА Dota 2014 рдХреЛ рд▓рд╛рдЧрд┐ matchmaking рд▓реЗрдЦрд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ

рд╕рдмреИрд▓рд╛рдИ рдирдорд╕реНрдХрд╛рд░ред

рдпреЛ рд╡рд╕рдиреНрддрдорд╛ рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рднреЗрдЯреЗрдВ рдЬрд╕рдорд╛ рдХреЗрдЯрд╛рд╣рд░реВрд▓реЗ рдХрд╕рд░реА рдбреЛрдЯрд╛ 2 рд╕рд░реНрднрд░ рд╕рдВрд╕реНрдХрд░рдг 2014 рдЪрд▓рд╛рдЙрдиреЗ рд░, рддрджрдиреБрд╕рд╛рд░, рдпрд╕рдорд╛ рдЦреЗрд▓реНрдиреЗ рд╕рд┐рдХреЗред рдо рдпрд╕ рдЦреЗрд▓рдХреЛ рдареВрд▓реЛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реБрдБ, рд░ рдореИрд▓реЗ рдореЗрд░реЛ рдмрд╛рд▓реНрдпрдХрд╛рд▓рдорд╛ рдЖрдлреВрд▓рд╛рдИ рдбреБрдмрд╛рдЙрдиреЗ рдпреЛ рдЕрдиреМрдареЛ рдЕрд╡рд╕рд░рд▓рд╛рдИ рдкрд╛рд╕ рдЧрд░реНрди рд╕рдХрд┐рдиред

рдореИрд▓реЗ рдзреЗрд░реИ рдЧрд╣рд┐рд░реЛ рдвреБрдХреБрд░ рдЧрд░реЗрдВ, рд░ рдпрд╕реНрддреЛ рднрдпреЛ рдХрд┐ рдореИрд▓реЗ рдПрдХ Discord рдмреЛрдЯ рд▓реЗрдЦреЗрдВ рдЬреБрди рд▓рдЧрднрдЧ рд╕рдмреИ рдкреНрд░рдХрд╛рд░реНрдпрдХрд╛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ рдЬреБрди рдЦреЗрд▓рдХреЛ рдкреБрд░рд╛рдиреЛ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рд╕рдорд░реНрдерд┐рдд рдЫреИрди, рдЕрд░реНрдерд╛рддреН рдореНрдпрд╛рдЪрдореЗрдХрд┐рдВрдЧред
рдмреЛрдЯрдХреЛ рд╕рд╛рде рд╕рдмреИ рдЖрд╡рд┐рд╖реНрдХрд╛рд░рд╣рд░реВ рдЕрдШрд┐, рд▓рдмреА рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рд╣рд╛рдореАрд▓реЗ рд╕рдиреНрджреЗрд╢рдорд╛ 10 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдпреМрдВ рд░ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рд░реНрднрд░ рднреЗрд▓рд╛ рдЧрд░реНрдпреМрдВ, рд╡рд╛ рд╕реНрдерд╛рдиреАрдп рд▓рдмреА рд╣реЛрд╕реНрдЯ рдЧрд░реНрдпреМрдВред

рд╣рд╛рдореА Dota 2014 рдХреЛ рд▓рд╛рдЧрд┐ matchmaking рд▓реЗрдЦрд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ

рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рдХреЛ рд░реВрдкрдорд╛ рдореЗрд░реЛ рд╕реНрд╡рднрд╛рд╡рд▓реЗ рдпрддрд┐ рдзреЗрд░реИ рдореНрдпрд╛рдиреБрдЕрд▓ рдХрд╛рдордХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНрди рд╕рдХреЗрди, рд░ рд░рд╛рддрд╛рд░рд╛рдд рдореИрд▓реЗ рдмреЛрдЯрдХреЛ рд╕рдмреИрднрдиреНрджрд╛ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдХреЗрдЪ рдЧрд░реЗрдВ, рдЬрд╕рд▓реЗ 10 рд╡реНрдпрдХреНрддрд┐рд╣рд░реВ рд╣реБрдБрджрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╕рд░реНрднрд░ рдмрдврд╛рдпреЛред

рдореИрд▓реЗ рддреБрд░реБрдиреНрддреИ nodejs рдорд╛ рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ, рдХрд┐рдирдХрд┐ рдорд▓рд╛рдИ рдкрд╛рдЗрдерди рдорди рдкрд░реНрджреИрди, рд░ рдо рдпрд╕ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдмрдвреА рд╕рд╣рдЬ рдорд╣рд╕реБрд╕ рдЧрд░реНрдЫреБред

рдпреЛ рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рдЕрдиреБрднрд╡ рд╣реЛ 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
}

рдореИрд▓реЗ рдкреНрд░рд╕рдВрдЧ рдЖрджрд╛рдирдкреНрд░рджрд╛рди рдЧрд░реНрди рдШрдЯрдирд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред рдпреЛ рдХреЗрд╕рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд рдерд┐рдпреЛ - рдШрдЯрдирд╛рдорд╛ "резреж рд╡реНрдпрдХреНрддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдЦреЗрд▓ рдлреЗрд▓рд╛ рдкрд░реНрдпреЛ", рддрдкрд╛рдЗрдБ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд╕рдиреНрджреЗрд╢ рдирд┐рдЬреА рд╕рдиреНрджреЗрд╢рд╣рд░реВрдорд╛ рдкрдард╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд░ рдЖрдзрд╛рд░рднреВрдд рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдкреВрд░рд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ - рддрддреНрдкрд░рддрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдХрд╛рд░реНрдп рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд▓рдмреА рддрдпрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдкреНрд░рдХреНрд╖реЗрдкрдгрдХреЛ рд▓рд╛рдЧрд┐, рд░ рдпрд╕реНрддреИред

IOC рдХреЛ рд▓рд╛рдЧрд┐ рдо InversifyJS рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред рдпрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ рдХрд╛рдо рдЧрд░реНрджрд╛ рдореЗрд░реЛ рд╕реБрдЦрдж рдЕрдиреБрднрд╡ рдЫред рдЫрд┐рдЯреЛ рд░ рд╕рдЬрд┐рд▓реЛ!

рд╣рд╛рдореАрд╕рдБрдЧ рд╣рд╛рдореНрд░реЛ рд╕рд░реНрднрд░рдорд╛ рдзреЗрд░реИ рд▓рд╛рдорд╣рд░реВ рдЫрдиреН - рд╣рд╛рдореАрд▓реЗ 1x1, рд╕рд╛рдорд╛рдиреНрдп/рдореВрд▓реНрдпрд╛рдЩреНрдХрди, рд░ рдХреЗрд╣реА рдЕрдиреБрдХреВрд▓рди рдореЛрдбрд╣рд░реВ рдердкреЗрдХрд╛ рдЫреМрдВред рддреНрдпрд╕рдХрд╛рд░рдг, рддреНрдпрд╣рд╛рдБ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд░реВрдо рд╕рд░реНрднрд┐рд╕ рдЫ рдЬреБрди рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░ рдЦреЗрд▓ рдЦреЛрдЬреА рдмреАрдЪрдорд╛ рдЫред

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) рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЦреЗрд▓реНрди рдЪрд╛рд╣рдиреНрдЫред

реи) рдЦреЛрдЬ рд╕реБрд░реБ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдЙрд╕рд▓реЗ Gateway=Discord рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫ, рдЕрд░реНрдерд╛рддреН рд╕рдиреНрджреЗрд╢рдорд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░рд╛рдЦреНрдЫ:

рд╣рд╛рдореА Dota 2014 рдХреЛ рд▓рд╛рдЧрд┐ matchmaking рд▓реЗрдЦрд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ

3) рдпреЛ рдЧреЗрдЯрд╡реЗ RoomService рдорд╛ рдЬрд╛рдиреНрдЫ рд░ рднрдиреНрдЫ "рдбрд┐рд╕реНрдХреЙрд░реНрдбрдмрд╛рдЯ рдПрдХ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд╛рдордорд╛ рдкреНрд░рд╡реЗрд╢ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫ, рдореЛрдб: рдЕрдирд░реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдЦреЗрд▓ред"

4) RoomService рд▓реЗ рдЧреЗрдЯрд╡реЗрдХреЛ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдЫ рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ (рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣) рд▓рд╛рдИ рдЗрдЪреНрдЫрд┐рдд рд▓рд╛рдордорд╛ рдзрдХреЗрд▓реНрдЫред

5) рдЦреЗрд▓реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЦреЗрд▓рд╛рдбреАрд╣рд░реВ рдЫрдиреН рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрдЯрдХ рд▓рд╛рдо рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫред рдпрджрд┐ рд╕рдореНрднрд╡ рдЫ рднрдиреЗ, рдШрдЯрдирд╛ рдЙрддреНрд╕рд░реНрдЬрди рдЧрд░реНрдиреБрд╣реЛрд╕реН:

private onRoomFound(players: Party[]) {
    this.emit("room-found", {
      players,
    });
  }

6) рдХреЛрдард╛ рд╕реЗрд╡рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдпрд╕ рдШрдЯрдирд╛рдХреЛ рдЪрд┐рдиреНрддрд┐рдд рдкреНрд░рддреНрдпрд╛рд╢рд╛рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдордорд╛ рдЦреБрд╕реАрд╕рд╛рде рд╕реБрдирд┐рд░рд╣реЗрдХреЛ рдЫред рд╣рд╛рдореА рдЗрдирдкреБрдЯрдХреЛ рд░реВрдкрдорд╛ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрдХреЛ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ, рддрд┐рдиреАрд╣рд░реВрдмрд╛рдЯ рднрд░реНрдЪреБрдЕрд▓ "рдХреЛрдард╛" рдмрдирд╛рдЙрдБрдЫреМрдВ, рд░, рдЕрд╡рд╢реНрдп рдкрдирд┐, рдПрдЙрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬрд╛рд░реА рдЧрд░реНрдЫреМрдВ:

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 рд▓рд╛рдИ рдЖрджреЗрд╢ рджрд┐рдиреНрдЫред

рд╣рд╛рдореА Dota 2014 рдХреЛ рд▓рд╛рдЧрд┐ matchmaking рд▓реЗрдЦрд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ

8) рдпрджрд┐ рдХрд╕реИрд▓реЗ 3 рдорд┐рдиреЗрдЯ рднрд┐рддреНрд░ рдЦреЗрд▓ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджрдЫ рд╡рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджреИрди рднрдиреЗ, рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд▓рд╛рдордорд╛ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрджреИрдиреМрдВред рд╣рд╛рдореА рдЕрд░реВ рд╕рдмреИрд▓рд╛рдИ рд▓рд╛рдордорд╛ рдлрд░реНрдХрд╛рдЙрдБрдЫреМрдВ рд░ рдлреЗрд░рд┐ 10 рдЬрдирд╛ рдирд╣реБрдБрджрд╛рд╕рдореНрдо рдкрд░реНрдЦрдиреНрдЫреМрдВред рдпрджрд┐ рд╕рдмреИ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрд▓реЗ рдЦреЗрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реЗрдХрд╛ рдЫрдиреН рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рд░реЛрдЪрдХ рднрд╛рдЧ рд╕реБрд░реБ рд╣реБрдиреНрдЫред

рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрднрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

рд╣рд╛рдореНрд░рд╛ рдЦреЗрд▓рд╣рд░реВ рд╡рд┐рдиреНрдбреЛрдЬ рд╕рд░реНрднрд░ 2012 рд╕рдБрдЧ VDS рдорд╛ рд╣реЛрд╕реНрдЯ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред рдпрд╕рдмрд╛рдЯ рд╣рд╛рдореА рдзреЗрд░реИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реНрди рд╕рдХреНрдЫреМрдВ:

  1. рдпрд╕рдорд╛ рдХреБрдиреИ рдбрдХрд░ рдЫреИрди, рдЬрд╕рд▓реЗ рдореЗрд░реЛ рд╣реГрджрдпрдорд╛ рдареЛрдХреНрдпреЛ
  2. рд╣рд╛рдореА рднрд╛рдбрд╛рдорд╛ рдмрдЪрдд рдЧрд░реНрдЫреМрдВ

рдХрд╛рд░реНрдп рднрдиреЗрдХреЛ рд▓рд┐рдирдХреНрд╕рдорд╛ VPS рдмрд╛рдЯ VDS рдорд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓рд╛рдЙрдиреБ рд╣реЛред рдореИрд▓реЗ рдлреНрд▓рд╛рд╕реНрдХрдорд╛ рд╕рд╛рдзрд╛рд░рдг рд╕рд░реНрднрд░ рд▓реЗрдЦреЗрдВред рд╣реЛ, рдорд▓рд╛рдИ рдкрд╛рдЗрдерди рдорди рдкрд░реНрджреИрди, рддрд░ рддрдкрд╛рдИ рдХреЗ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ? рдпреЛ рд╕рд░реНрднрд░рдорд╛ рд▓реЗрдЦреНрди рдЫрд┐рдЯреЛ рд░ рд╕рдЬрд┐рд▓реЛ рдЫред

рдпрд╕рд▓реЗ 3 рдХрд╛рд░реНрдп рдЧрд░реНрджрдЫ:

  1. рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд╕рд╛рде рд╕рд░реНрднрд░ рд╕реБрд░реБ рдЧрд░реНрджреИ - рдирдХреНрд╕рд╛ рдЪрдпрди рдЧрд░реНрджреИ, рдЦреЗрд▓ рд╕реБрд░реБ рдЧрд░реНрди рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛, рд░ рдкреНрд▓рдЧрдЗрдирд╣рд░реВрдХреЛ рд╕реЗрдЯред рдо рдЕрдм рдкреНрд▓рдЧрдЗрдирд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓реЗрдЦреНрдиреЗ рдЫреИрди - рддреНрдпреЛ рд░рд╛рддрдорд╛ рдЖрдБрд╕реБ рд░ рдЪреНрдпрд╛рддрд┐рдПрдХреЛ рдХрдкрд╛рд▓рдХреЛ рд╕рд╛рдердорд╛ рд▓рд┐рдЯрд░ рдХрдлреАрдХреЛ рд╕рд╛рде рдПрдХ рдлрд░рдХ рдХрдерд╛ рд╣реЛред
  2. рдЕрд╕рдлрд▓ рдЬрдбрд╛рдирдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╕рд░реНрднрд░рд▓рд╛рдИ рд░реЛрдХреНрди/рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрджреИ, рдЬреБрди рд╣рд╛рдореАрд▓реЗ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдорд╛рддреНрд░ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред

рдпрд╣рд╛рдБ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд░рд▓ рдЫ, рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкрдирд┐ рдЙрдкрдпреБрдХреНрдд рдЫреИрдирдиреНред 100 рд▓рд╛рдЗрди рд▓рд┐рдкрд┐

рддреНрдпрд╕реЛрднрдП, рдЬрдм 10 рдЬрдирд╛рд▓реЗ рдПрдХрд╕рд╛рде рдЦреЗрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реЗ, рд╕рд░реНрднрд░ рд╕реБрд░реБ рднрдпреЛ рд░ рд╕рдмреИ рдЦреЗрд▓реНрди рдЙрддреНрд╕реБрдХ рдерд┐рдП, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдиреНрджреЗрд╢рд╣рд░реВрдорд╛ рдЦреЗрд▓рдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди рд▓рд┐рдЩреНрдХ рдкрдард╛рдЗрдпреЛред

рд╣рд╛рдореА Dota 2014 рдХреЛ рд▓рд╛рдЧрд┐ matchmaking рд▓реЗрдЦрд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ

рд▓рд┐рдЩреНрдХрдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реЗрд░, рдЦреЗрд▓рд╛рдбреА рдЦреЗрд▓ рд╕рд░реНрднрд░рдорд╛ рдЬрдбрд╛рди рд╣реБрдиреНрдЫ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рд╣реЛред ~25 рдорд┐рдиреЗрдЯ рдкрдЫрд┐, рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрд╕рдБрдЧрдХреЛ рднрд░реНрдЪреБрдЕрд▓ "рдХреЛрдард╛" рдЦрд╛рд▓реА рд╣реБрдиреНрдЫред

рд▓реЗрдЦрдХреЛ рдЕрдкреНрдареНрдпрд╛рд░реЛрдкрдирдХреЛ рд▓рд╛рдЧрд┐ рдо рдЕрдЧреНрд░рд┐рдо рдорд╛рдлреА рдЪрд╛рд╣рдиреНрдЫреБ, рдореИрд▓реЗ рдпрд╣рд╛рдБ рд▓рд╛рдореЛ рд╕рдордпрджреЗрдЦрд┐ рд▓реЗрдЦреЗрдХреЛ рдЫреИрди, рд░ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЦрдгреНрдбрд╣рд░реВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реНрди рдзреЗрд░реИ рдХреЛрдб рдЫред рдиреВрдбрд▓реНрд╕, рдЫреЛрдЯрдХрд░реАрдорд╛ред

рдпрджрд┐ рдореИрд▓реЗ рд╢реАрд░реНрд╖рдХрдорд╛ рд░реБрдЪрд┐ рджреЗрдЦреЗ рднрдиреЗ, рддреНрдпрд╣рд╛рдБ рджреЛрд╕реНрд░реЛ рднрд╛рдЧ рд╣реБрдиреЗрдЫ - рдпрд╕рд▓реЗ srcds (рд╕реНрд░реЛрдд рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрднрд░) рдХреЛ рд▓рд╛рдЧреА рдкреНрд▓рдЧрдЗрдирд╣рд░реВ рд╕рд╣рд┐рдд рдореЗрд░реЛ рдкреАрдбрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рд░, рд╕рдореНрднрд╡рддрдГ, рдПрдХ рдореВрд▓реНрдпрд╛рдЩреНрдХрди рдкреНрд░рдгрд╛рд▓реА рд░ рдорд┐рдиреА-рдбреЛрдЯрд╛рдмрдл, рдЦреЗрд▓ рддрдереНрдпрд╛рдЩреНрдХрд╣рд░реВ рднрдПрдХреЛ рд╕рд╛рдЗрдЯред

рдХреЗрд╣рд┐ рд▓рд┐рдЩреНрдХрд╣рд░реВ:

  1. рд╣рд╛рдореНрд░реЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ (рдЕрдВрдХ, рд▓рд┐рдбрд░рдмреЛрд░реНрдб, рд╕рд╛рдиреЛ рд▓реНрдпрд╛рдиреНрдбрд┐рдЩ рдкреГрд╖реНрда рд░ рдЧреНрд░рд╛рд╣рдХ рдбрд╛рдЙрдирд▓реЛрдб)
  2. рд╡рд┐рд╡рд╛рдж рд╕рд░реНрднрд░

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди