# directmessage\_simple

## directmessage\_simple サンプル

### 概要

DirectMessage モジュールを使用して 2 人のユーザーがメッセージを送受信するサンプルです。 DirectMessage モジュールの特徴については[こちらのページ](/diarkis-modules/dm.md)を参照してください。

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

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

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

### サンプルの引数

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

`directmessage_simple.exe serverAddr UID clientKey`

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

#### 起動例：

`directmessage_simple.exe 192.168.1.123:7000 1111 AAAA`

### 起動方法

本サンプルは 2 クライアントが既定の UID で接続する前提での実装となっています。起動時は "1111", "2222" の UID でサンプルを起動してください。起動後、"1111" は "2222" からの DirectMessage を受け取ってメッセージのやり取りを開始するため、"1111" を起動後に "2222" を起動してください。

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

#### DirectMessage を使用する全体的な流れ

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

   ```
   diarkis = Diarkis::DiarkisAllocShared<DiarkisInterfaceDirectMessageSimple>(uid);
   ...
   // Diarkis Module の DirectMessage をセットアップ
   // DiarkisInterface 内で管理されている DirectMessage モジュールを初期化します。
   // DirectMessage モジュールのインスタンスを確保して、通信に使用する TCP/UDP モジュールと関連付けます。
   // 以降、DirectMessage モジュールのポインタを DiarkisInterface から取得して DirectMessage の機能にアクセスします。
   diarkis->SetupDirectMessage();
   ```
3. メッセージの送信\
   DirectMessage モジュールは Diarkis サーバに接続されていれば送受信することができます。本サンプルではセットアップ処理完了後にすぐにメッセージの送受信処理を行っています。

   ```
   std::shared_ptr<DirectMessageSimple> dm = diarkis->GetDirectMessage();
   ...
   // UID を指定してメッセージを送信
   dm->Send(targetUid, payload.data(), payload.size());
   ```
4. メッセージの受信\
   メッセージを受信すると `DiarkisDirectMessageBase::OnMessage`が発火します。\
   コールバックでの処理をカスタマイズする方法については後述します。
5. 切断処理

   ```
   // 指定したユーザーとの接続を切断します。
   // 切断する際に任意のデータを切断先のユーザーに送信することができます。
   dm->Disconnect(targetUid, payload.data(), payload.size());
   ```
6. 終了処理\
   詳細については [Diarkis モジュール利用の全体的な流れ](https://help.diarkis.io/diarkis-client/samples/cpp/pages/r3yF3oFZnxAPw2prL13v#diarkis-モジュール利用の全体的な流れ) を参照してください。

#### DirectMessage のイベント処理カスタマイズ

DirectMessage 関連の処理をカスタマイズする方法については [Diarkis Module のカスタマイズ](/diarkis-client/diarkis-module/how-to-customize-module.md) を参照してください。 サンプルでは以下のクラスでカスタム処理を実装しています。

メッセージ受信時の処理

```
/*
 * DirectMessage 関連の処理をアプリ側でカスタマイズするための実装。
 * DirectMessage 関連のデータを受信した際に On... 系のコールバックが発火するため、アプリが処理したい内容を実装します。
 * 本サンプルでは取得したメッセージをコンソールへ表示しています。
 */
class DirectMessageSimple : public DiarkisDirectMessageBase
{
    ...
    /**
     * @~japanese
     * @brief 他のリモートユーザーから　DirectMessage が送られてきた際に呼ばれるコールバックイベントを取得する。
     * @details DirectMessage Message の通知 ( サーバからのPush ) が送られた際に呼ばれる。
     * @~
     */
    void OnMessage(const DiarkisDirectMessageEventArgs& e) override
    {
        Diarkis::StdString str((const char*)e.GetPayload().data(), e.GetPayload().size());
        DiarkisUtils::Print("DirectMessageSimple::OnMessage called - %s", str.c_str());
        DiarkisDirectMessageBase::OnMessage(e);
        anyMessageReceived_ = true;
    }
    ...

```

カスタマイズしたクラスを `DiarkisInterfaceBase` で使用するには、 `DiarkisInterfaceBase` を継承してカスタマイズした `DirectMessageSimple` クラスのインスタンスを作成するようにしてください。

```
/*
 * DirectInterface が内部で管理する各機能のモジュールをアプリ固有のものに置き換えるために DiarkisInterfaceBase を継承したクラスを実装します。
 */
class DiarkisInterfaceDirectMessageSimple : public DiarkisInterfaceBase
{
public:
    ...
    void SetupDirectMessage(void)
    {
        if (udpBase_ != nullptr && udpBase_->Get() != nullptr)
        {
            // You can use the customized DirectMessage class by instantiating it here.
            // アプリ側でカスタマイズしたクラスを作成します。
            if (dmBase_ == nullptr)
                dmBase_ = Diarkis::DiarkisAllocShared<DirectMessageSimple>();
            // Initialize DirectMessage instance and register callback functions.
            // DirectMessage クラスを初期化してコールバックイベントを登録
            dmBase_->SetupUdp(udpBase_->Get(), this->GetLoggerFactory());
        }
        ...

```


---

# 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/directmessage-simple.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.
