# matchmaker\_ticket

## matchmaker\_ticket サンプル

### 概要

MatchMaker モジュールのチケット機能を使用して 2 人のユーザーをマッチングさせ、マッチしたユーザー同士でメッセージをやり取りするサンプルです。 MatchMaker モジュールの特徴については[こちらのページ](/diarkis-modules/matchmaker.md)を参照してください。

### ローカル環境でサーバーを起動する

サンプルで使用するサーバーを起動するためのチュートリアルを実施して、ローカル環境で Diarkis サーバーを起動します。

[1. Diarkis サーバーをローカル環境で起動する](/getting-started/tutorial/setup-local-server.md)

### サンプルの引数

サンプルの起動時には以下の３つのパラメータを指定してください。

`matchmaker_ticket.exe serverAddr UID clientKey`

| 引数         | 説明                            |
| ---------- | ----------------------------- |
| serverAddr | Diarkis サーバのエンドポイントを指定してください  |
| UID        | 接続するユーザーの ID を任意の文字列で指定してください |
| clientKey  | クライアントキーを任意の文字列で指定してください      |

#### 起動例：

`matchmaker_ticket.exe 192.168.1.123:7000 1111 AAAA`

### 起動方法

本サンプルは起動すると自動的にチケットを発行してマッチング待機状態になります。 サンプルプログラムを 2 つ起動することで、マッチングが成立しメッセージのやり取りに進みます。

### サンプルコード説明

#### MatckMaker のチケットを使用する全体的な流れ

1. Diarkis ランタイムおよび Diarkis Module を初期化し、Diarkis サーバーへ接続\
   詳細については [Diarkis モジュール利用の全体的な流れ](https://help.diarkis.io/diarkis-client/samples/cpp/pages/r3yF3oFZnxAPw2prL13v#diarkis-モジュール利用の全体的な流れ) を参照してください。
2. セットアップ\
   MatchMaker モジュールを初期化します。

   ```
   diarkis = Diarkis::DiarkisAllocShared<DiarkisInterface>(uid);
   ...
   // Diarkis Module の MatchMaker のセットアップ
   diarkis->SetupMatchMaker();
   ```
3. チケットの発行 `DiarkisMatchMaker::SendIssueTicket` でチケットを発行します。

   ```
   // サーバにMatchMaker IssueTicket を送信
   diarkis->GetMatchMakerBase()->SendIssueTicket(0);
   ```
4. マッチング完了待機\
   `DiarkisMatchMaker::IsTicketComplete` でチケットがマッチしたかどうかを判定することができます。また、`DiarkisMatchMaker::SendTicketCancel` を使用してマッチ完了前にキャンセルをリクエストすることも可能です。

   ```
   bool bCancel = false;
   int wait_cnt = 0;
   // DiarkisRoomBase::OnIssueTicketを待つ
   while (diarkis->GetMatchMakerBase()->IsTicketComplete() == false) {
       std::this_thread::sleep_for(std::chrono::milliseconds(100));
       wait_cnt++;
       if (wait_cnt > 100)
       {
           diarkis->GetMatchMakerBase()->SendTicketCancel(0);
           bCancel = true;
           break;
           }
       }
   ...
   ```
5. メッセージの送信\
   マッチング完了後、マッチしたユーザーに対してメッセージを送信します。`DiarkisMatchMaker::SendTicketBroadcast` を使用するとマッチしたチケットを発行したユーザー全員にメッセージを送信することができます。

   ```
   std::string str = "Goodbye";
   std::vector<uint8_t> message(str.begin(), str.end());
   ...
   diarkis->GetMatchMakerBase()->SendTicketBroadcast(0, message);
   ...
   ```
6. 切断処理\
   `DiarkisMatchMaker::SendTicketLeave` を使用してマッチしたチケットから抜けることができます。

   ```
   diarkis->GetMatchMakerBase()->SendTicketLeave(0);
   ```
7. 終了処理\
   詳細については [Diarkis モジュール利用の全体的な流れ](https://help.diarkis.io/diarkis-client/samples/cpp/pages/r3yF3oFZnxAPw2prL13v#diarkis-モジュール利用の全体的な流れ) を参照してください。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.diarkis.io/diarkis-client/samples/cpp/matchmaker-ticket.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
