موږ د Dota 2014 لپاره میچ میکینګ لیکو

ټولو ته سلام.

پدې پسرلي کې زه د یوې پروژې سره مخ شوم په کوم کې چې هلکانو زده کړل چې څنګه د ډوټا 2 سرور نسخه 2014 چلوي او په وینا یې ، پدې کې لوبې وکړئ. زه د دې لوبې لوی مینه وال یم، او ما نشو کولی دا ځانګړی فرصت له لاسه ورکړم چې خپل ځان په ماشومتوب کې ډوب کړم.

ما په ژوره توګه کبوت وکړ، او داسې پیښ شوي چې ما د Discord بوټ لیکلی چې د نږدې ټولو فعالیتونو لپاره مسؤل دی چې د لوبې په زاړه نسخه کې نه ملاتړ کیږي، د بیلګې په توګه میچ میکینګ.
د بوټو سره د ټولو نوښتونو دمخه، لابی په لاسي ډول جوړ شوی و. موږ یو پیغام ته 10 عکس العملونه راټول کړل او په لاسي ډول یې یو سرور راټول کړ، یا د محلي لابی کوربه شو.

موږ د Dota 2014 لپاره میچ میکینګ لیکو

زما طبیعت د یو پروګرامر په توګه نشي کولی د دومره لاسي کار سره مقاومت وکړي، او د شپې په اوږدو کې ما د بوټ ترټولو ساده نسخه جوړه کړه، کوم چې په اتوماتيک ډول سرور پورته کړ کله چې 10 کسان وو.

ما سمدلاسه پریکړه وکړه چې په نوډج کې ولیکم ، ځکه چې زه واقعیا پایتون نه خوښوم ، او زه پدې چاپیریال کې ډیر راحته احساس کوم.

دا زما لومړۍ تجربه ده چې د ډیسکارډ لپاره د بوټ لیکلو لپاره ، مګر دا خورا ساده وګرځید. د رسمي npm ماډل discord.js د پیغامونو سره کار کولو، د عکس العملونو راټولولو، او داسې نورو لپاره یو مناسب انٹرفیس چمتو کوي.

اعلامیه: د کوډ ټولې بیلګې "اوسني" دي، پدې معنی چې دوی د شپې د بیا لیکلو ډیری تکرارونو څخه تیر شوي.

د میچ جوړونې اساس یو "قطار" دی په کوم کې چې هغه لوبغاړي چې لوبې کول غواړي په هغه کې ځای په ځای کیږي او لرې کیږي کله چې دوی نه غواړي لوبه ومومي یا یې ومومي.

دا هغه څه دي چې د "لوبغاړي" جوهر ورته ښکاري. په پیل کې دا په ډیسکارډ کې یوازې د کارونکي ID و ، مګر د سایټ څخه د لوبو پیل کولو / لټون کولو پلانونه شتون لري ، مګر لومړی شیان لومړی.

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، نورمال / درجه بندي، او یو څو دودیز حالتونه اضافه کړي دي. له همدې امله ، دلته یو واحد خونه خدمت شتون لري چې د کارونکي او د لوبې لټون ترمینځ پروت دی.

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) د کوټې خدمت د ګیټ وے غوښتنه مني او کارونکي (په دقیق ډول د کارونکي ګروپ) مطلوب کتار ته اړوي.

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) نو موږ "لوړ" واک ته ورسیدو - ټولګي Bot. په عموم کې ، هغه د ګیټس ویز ترمینځ اړیکې سره معامله کوي (زه نه پوهیږم چې دا په روسیه کې څومره مسخره ښکاري) او د میچ جوړونې سوداګرۍ منطق. بوټ پیښه اوري او د DiscordGateway امر کوي چې ټولو کاروونکو ته د چمتووالي چک واستوي.

موږ د Dota 2014 لپاره میچ میکینګ لیکو

8) که څوک په 3 دقیقو کې لوبه رد کړي یا یې ونه مني، نو موږ یې په کتار کې نه راګرځوو. موږ نور ټول کتار ته راستانه شو او انتظار کوو تر څو چې 10 کسان بیا شتون ولري. که ټولو لوبغاړو لوبه ومنله، نو په زړه پورې برخه پیل کیږي.

د وقف شوي سرور ترتیب

زموږ لوبې په VDS کې د وینډوز سرور 2012 سره کوربه شوي. له دې څخه موږ ډیری پایلې اخلو:

  1. په دې کې هیڅ ډاکر نشته چې زما په زړه کې راښکته شي
  2. موږ په کرایه کې سپما کوو

دنده دا ده چې په لینکس کې د VPS څخه په VDS کې پروسه پرمخ بوځي. ما په فلاسک کې یو ساده سرور لیکلی. هو، زه Python نه خوښوم، مګر تاسو څه کولی شئ؟ د دې سرور لیکل ګړندي او اسانه دي.

دا 3 دندې ترسره کوي:

  1. د ترتیب سره د سرور پیل کول - د نقشې غوره کول، د لوبې پیل کولو لپاره د لوبغاړو شمیر، او د پلگ انونو سیټ. زه به اوس د پلگ انونو په اړه ونه لیکم - دا د شپې د لیټرو کافي سره د اوښکو او مات شوي ویښتو سره مخلوط یو بل کیسه ده.
  2. د ناکامو اړیکو په صورت کې د سرور ودرول / بیا پیل کول، کوم چې موږ یوازې په لاسي ډول اداره کولی شو.

دلته هرڅه ساده دي، د کوډ مثالونه هم مناسب ندي. 100 کرښه سکریپټ

نو، کله چې 10 کسان سره یوځای شول او لوبه یې ومنله، سرور پیل شو او هرڅوک د لوبې کولو لیواله و، د لوبې سره د نښلولو لینک په شخصي پیغامونو کې واستول شو.

موږ د Dota 2014 لپاره میچ میکینګ لیکو

په لینک کلیک کولو سره، لوبغاړی د لوبې سرور سره وصل کیږي، او بیا دا دی. د ~ 25 دقیقو وروسته ، د لوبغاړو سره مجازی "کوټه" پاکه شوې.

زه د مقالې د ګډوډۍ لپاره دمخه بخښنه غواړم، ما دلته د اوږدې مودې لپاره نه دی لیکلی، او د مهمو برخو د روښانه کولو لپاره ډیر کوډ شتون لري. نوډل، په لنډه توګه.

که زه په موضوع کې علاقه وګورم ، نو دویمه برخه به وي - دا به زما عذاب د srcds (سرچینې وقف شوي سرور) لپاره پلگ انونو سره ولري ، او شاید د درجه بندي سیسټم او مینی ډیټابف ، د لوبې احصایې سره سایټ.

ځینې ​​لینکونه:

  1. زموږ ویب پاڼه (احصایه، لیډربورډ، کوچنۍ لینډینګ پاڼه او د پیرودونکي ډاونلوډ)
  2. د ګډوډ سرور

سرچینه: www.habr.com

Add a comment