# メッセージ

## メッセージ

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    |


---

# 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://docs.gamechat.me/basics/game-chat-v3/game-chat-ri-ben-yu/v3nowo/messji.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.
