# メッセージ

## メッセージ

Game Chatが提供するメッセージ機能は、ユーザー間の効果的なコミュニケーションをサポートする様々なサービスを含みます。このプラットフォームは、個人的な会話だけでなくグループでの会話にも適しており、メッセージの送受信を簡単かつ迅速に行うことができます。以下は Game Chatの主なメッセージ機能とその特徴です。

### 1. 即時メッセージング <a href="#id-1" id="id-1"></a>

* **リアルタイムコミュニケーション** : ユーザーはリアルタイムでメッセージを送受信でき、コミュニケーションの遅延を最小限に抑えます。
* **マルチデバイス対応** : ユーザーはスマートフォン、タブレット、PCなど様々なデバイスでメッセージを送受信できます。

### 2. グループチャット <a href="#id-2" id="id-2"></a>

* **複数の参加者** : ユーザーは複数の人が参加するグループチャットを作成して情報を共有し、チーム内のコミュニケーションを容易にすることができます。
* **チャンネル管理** : 管理者はグループチャットを介してメンバーを追加したり削除し、グループの設定を調整できます。

### 3. ファイル共有 <a href="#id-3" id="id-3"></a>

* **様々なファイル形式をサポート** : テキスト、画像、動画、文書など様々な形式のファイルをチャットで簡単に共有できます。
* **安全なファイル保存** : Game Chatはお客様所有の Object Storage内にファイルを保存管理するため、外部への情報流出を防ぎます。

### 4. メッセージ検索 <a href="#id-4" id="id-4"></a>

* **キーワード検索** : チャット内で特定のキーワードを使って過去の会話内容を検索できます。
* **高度なフィルタオプション** : 日付、参加者、ファイルタイプなど様々なフィルタを適用して、目的のメッセージを素早く検索できます。

### 5. 通知とその調整 <a href="#id-5" id="id-5"></a>

* **プッシュ通知** : 新しいメッセージや重要なアップデートがあるときにユーザーに通知を送信し、情報の漏れを防ぎます。
* **通知設定** : ユーザーは通知の種類と頻度を調整でき、希望する方法で情報を受け取ることができます。

### 6. セキュリティと個人情報保護 <a href="#id-6" id="id-6"></a>

* **データ暗号化** : すべてのメッセージは送信と保存の過程で暗号化され、外部からのデータ漏洩を防止します。
* **個人情報保護** : ユーザーの個人情報や会話内容は厳重に保護され、ユーザーの同意なしに第三者に開示されることはありません。

Game Chatのメッセージ機能はユーザーのコミュニケーションを円滑かつ効率的にし、仕事や日常生活において重要な役割を果たします。これらの機能によりユーザーはより簡単にコミュニケーションできるようになり、チームワークの強化に大きく貢献します。

## メッセージ送信 <a href="#undefined" id="undefined"></a>

チャンネルを作成して登録したら、以下のように呼び出して新しいメッセージを送信します。

```csharp
const message = 'Hello !!!';
await nc.sendMessage(
        channelId: CHANNEL_ID,
        type:"text",
        content: message
);


// メッセージにコメントを送る場合
await nc.sendMessage(
        channelId: CHANNEL_ID,
        type:"text",
        content: message,
        parentMessageId: [MESSAGE_ID]
        );

// メッセージに自動翻訳をする場合
await nc.sendMessage(
        channelId: CHANNEL_ID,
        type:"text",
        content: message,
        translate: true
        );

// 新規メッセージから下記のように parent_messageに親メッセージの内容を補強して送ります。
{
    "id": "message_id",
    "text": "Message",
    "parent_message_id": "first_message_id",
    "parent_message": {
        "id": "message_id",
        "text": "message_name",
        "sender" : {
            "id" : "Sender",
             "name" : "Sender Nickname",
             "profile" : "profile url"
        }
    }
}
```

> 参考
>
> messageは JSON形式で送信/受信すると、様々なユーザー定義の値を使用できます。

```csharp
Hashtable messageArray = new Hashtable
{
    { "channel_id", "channelId" },
    { "state", 1 },
    { "desc" , "Desc" }
};
// メッセージをプレーンテキストに変換します。
const jsonString = JsonConvert.SerializeObject(messageArray);
// 受信したメッセージを Arrayに変換します。
Hashtable hashtable = JsonConvert.DeserializeObject<Hashtable>(jsonString);
```

<table><thead><tr><th width="161">ID</th><th width="103">Type</th><th>Description</th></tr></thead><tbody><tr><td>CHANNEL_ID</td><td>string</td><td>チャンネル ID</td></tr><tr><td>type</td><td>string</td><td>送信するメッセージの種類(text、image)</td></tr><tr><td>MESSAGE</td><td>string</td><td>送信メッセージのテキスト、JSON Stringを活用すると、様々な用途で使用可能</td></tr><tr><td>MENTIONS</td><td>array</td><td>メンションするユーザー ID</td></tr></tbody></table>

* Express Messageを使用する: 高速でメッセージを送信するための関数です。時間がかかる可能性のある部分をすべてスキップし、従来より10倍速くメッセージを送信できます。一般 sendMessageとの違いは、次の通りです。

<table><thead><tr><th width="208">Function</th><th width="201">Description</th><th width="132">フィルタリング</th><th width="105">ブロック</th><th>翻訳</th></tr></thead><tbody><tr><td>sendMessage</td><td>一般メッセージの送信</td><td>O</td><td>O</td><td>O</td></tr><tr><td>sendExpressMessage</td><td>クイックメッセージの送信</td><td>X</td><td>X</td><td>X</td></tr></tbody></table>

ゲーム内でリアルタイム PvPを制作したり、高速の Broadcastingが必要なすべてのサービスに利用できます。

## ファイルアップロード <a href="#undefined" id="undefined"></a>

* 特定チャンネルにファイルを送信できます。
* ダッシュボード > 設定 > セキュリティ > 許可されたファイルタイプのみアップロードできます。

```csharp
await nc.sendFile([CHANNEL_ID],file);
```

<table><thead><tr><th width="218">ID</th><th width="176">Type</th><th>Description</th></tr></thead><tbody><tr><td>CHANNEL_ID</td><td>string</td><td>チャンネル ID</td></tr><tr><td>file</td><td>string</td><td>ファイル情報</td></tr></tbody></table>

> 参考
>
> * オブジェクトストレージが有効になっている必要があります。
> * [Object Storage](https://www.ncloud.com/product/storage/objectStorage)サービスと連携すると使用できます。
> * アップロード時にダッシュボードの **プロジェクト設定 > セキュリティ設定** でアップロードタイプと容量などを設定します。
> * サポートファイルタイプ: 画像、動画、文書、圧縮などの一般的なタイプをすべてサポートし、追加でサポートが必要な拡張子は、お問い合わせからご連絡いただければ、セキュリティ検討後に追加いたします。
> * ファイルリンクを利用する場合、Endpointアドレスは <https://apps.ncloudchat.naverncp.comです。\\>
>   例) <https://apps.ncloudchat.naverncp.com/archive/\\[archiveId>]

## メッセージ情報 <a href="#undefined" id="undefined"></a>

* Message Data Class

<table><thead><tr><th width="211">ID</th><th width="182">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>string</td><td>ID(unique)</td></tr><tr><td>message_id</td><td>string</td><td>メッセージ ID</td></tr><tr><td>sort_id</td><td>string</td><td>メッセージソートのための ID</td></tr><tr><td>message_type</td><td>string</td><td>メッセージ種類</td></tr><tr><td>sender.id</td><td>string</td><td>送信者 ID</td></tr><tr><td>sender.name</td><td>string</td><td>送信者の名前</td></tr><tr><td>sender.profile</td><td>string</td><td>送信者のプロファイル画像</td></tr><tr><td>metions</td><td>string</td><td>メンションされたリスト</td></tr><tr><td>metions_everyone</td><td>string</td><td>全体メンションの有無</td></tr><tr><td>content</td><td>string</td><td>メッセージ</td></tr><tr><td>created_at</td><td>string</td><td>作成日</td></tr><tr><td>sended_at</td><td>string</td><td>送信日</td></tr></tbody></table>

### 個別メッセージ情報 <a href="#undefined" id="undefined"></a>

個別メッセージに関する情報を取得できます。

```csharp
NBaseSDK.Message message = await nc.getMessage([CHANNEL_ID], [MESSAGE_ID]);
```

### 全体メッセージ情報 <a href="#undefined" id="undefined"></a>

全体メッセージ情報を取得できます。

* MessageData data class

| ID         | Type    | Description  |
| ---------- | ------- | ------------ |
| totalCount | Int     | メッセージの総数     |
| messages   | Message | メッセージのデータリスト |

```csharp
Hashtable filter = new Hashtable
{
    { "channel_id", [CHANNEL_ID] }
};
Hashtable sort = new Hashtable
{
    { "sort_id", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};
var messages = await nc.getMessages(filter, sort, option);
if (messages != null)
    {
            foreach (var message in messages.edges)
        {
            string id = message.Node.message_id.ToString();
            Console.WriteLine("[CloudChatSample] id={0}", id);
        }
    }
```

* Parameters

<table><thead><tr><th width="120">ID</th><th width="108">Type</th><th width="403">Description</th><th>Required</th></tr></thead><tbody><tr><td>filter</td><td>object</td><td>クエリをフィルタ。すべてのフィールドに対して検索可能</td><td>O</td></tr><tr><td>sort</td><td>object</td><td>ソートしたいフィールドのフィルタの定義</td><td>X</td></tr><tr><td>option</td><td>object</td><td>オプションが存在する場合、以下を参照</td><td>X</td></tr></tbody></table>

* Filter

| ID             | Type    | Description  |
| -------------- | ------- | ------------ |
| message\_id    | String  | メッセージ ID     |
| channel\_id    | String  | チャンネル ID     |
| sort\_id       | String  | ソート ID       |
| message\_type  | String  | メッセージタイプ     |
| embedProviders | String  | エンベッドのプロバイダ  |
| isExpress      | Boolean | クイックメッセージの有無 |
| bytes          | Int     | メッセージのバイトサイズ |
| content        | String  | メッセージの内容     |
| sended\_at     | String  | メッセージの送信時間   |
| created\_at    | String  | メッセージの作成時間   |

* Sort

| ID          | Type   | Description       |
| ----------- | ------ | ----------------- |
| created\_at | number | 作成日(昇順「1」、降順「-1」) |

* Options

| ID        | Type   | Description   |
| --------- | ------ | ------------- |
| offset    | number | 開始 offset     |
| per\_page | number | リターン数(最大100個) |

## 未読メッセージ <a href="#undefined" id="undefined"></a>

未読メッセージ数をリターンします。最初に markReadから最後に読んだメッセージ情報を転送します。

```csharp
nc.markRead([CHANNEL_ID], new NBaseSDK.MarkInput
{
    user_id = USER_ID,
    message_id = MESSAGE_ID,
    sort_id = SORT_ID
});
// マークした以降の未読メッセージの総数をリターンします。
var unread = nc.unreadCount([CHANNEL_ID]);
```

<table><thead><tr><th width="230">ID</th><th width="210">Type</th><th>Description</th></tr></thead><tbody><tr><td>USER_ID</td><td>string</td><td>メッセージに含まれた user_idを入力</td></tr><tr><td>MESSAGE_ID</td><td>string</td><td>メッセージに含まれた message_idを入力</td></tr><tr><td>SORT_ID</td><td>string</td><td>メッセージに含まれた sort_idを入力</td></tr></tbody></table>

## メッセージ削除 <a href="#undefined" id="undefined"></a>

当該チャンネル内に自分が送ったメッセージを削除できます。

```csharp
await nc.deleteMessage([CHANNEL_ID], [MESSAGE_ID]);
```

* Parameters

| ID          | Type   | Description |
| ----------- | ------ | ----------- |
| CHANNEL\_ID | string | チャンネル ID    |
| MESSAGE\_ID | string | メッセージ ID    |
