# チャンネル

## チャンネル <a href="#undefined" id="undefined"></a>

Game Chatでチャンネルは、ユーザーがグループでコミュニケーションできる仮想空間です。チャンネルを通じてユーザーは特定のトピックや目的に合わせて情報を共有し、チームワークを強化してコミュニケーションを組織化できます。チャンネルは業務効率を高め、特定のグループ内のコミュニケーションを一元化して管理できる便利なツールです。以下は Game Chatのチャンネル機能の詳細な説明です。

### チャンネルの主な機能 <a href="#undefined" id="undefined"></a>

1. **グループコミュニケーション** : チャンネルを作成し、特定のグループのメンバーとコミュニケーションできます。この機能は、プロジェクトチーム、部署、クラブなど様々な形のグループに適しています。
2. **メッセージとファイル共有** : チャンネル内では、テキストメッセージ、画像、動画、文書など様々な形式のファイルを簡単に共有できます。
3. **リアルタイム更新** : チャンネル内のすべてのアクティビティはリアルタイムで更新され、すべての参加者が最新の情報に触れることができます。
4. **管理者制御** : チャンネルの作成者または管理者は、チャンネルの設定を変更したりユーザーを追加/削除する権限があります。
5. **通話とビデオ会議機能** : 一部のチャンネルでは音声通話やビデオ会議をサポートし、メンバー間の会話をより効果的に行うことができます。
6. **通知設定** : ユーザーはチャンネルごとに通知を設定して、重要なメッセージを見逃さないようにすることができます。
7. **検索機能** : チャンネル内の会話やファイルを簡単に検索できるので、必要な情報を素早く見つけることができます。

### チャンネル管理 <a href="#undefined" id="undefined"></a>

* **チャンネル作成** : ユーザーは目的に合ったチャンネルを新たに作成でき、チャンネル名、説明、メンバーなどの情報を設定できます。
* **チャンネル招待** : チャンネルの管理者は、他のユーザーをチャンネルに招待できます。招待されたユーザーは、招待を承諾または拒否できます。
* **メンバー管理** : 管理者はチャンネルメンバーの権限を設定したり、メンバーをチャンネルから削除できます。

### セキュリティ <a href="#undefined" id="undefined"></a>

* **データセキュリティ** : チャンネル内のすべてのデータは暗号化されて送信され、サーバに安全に保存されます。
* **個人情報保護** : チャンネル内で共有される情報は、チャンネルメンバー間でのみアクセス可能で、外部に流出しないように保護されます。

Game Chatのチャンネル機能を活用することで、組織内または個人的なコミュニケーションを円滑にし、情報を効果的に管理できます。このような特性は、特に大規模な組織や様々なプロジェクトを管理する際に非常に役立ちます。

### チャンネル作成 <a href="#undefined" id="undefined"></a>

すべての会話はチャンネルを作成する必要があり、チャンネル内に参加することで正常にチャットできます。以下で、チャンネルを作成して登録する方法をご案内します。

```csharp
await nc.createChannel(new NBaseSDK.Channel
{
    name = "New Channel",
    type =[TYPE],    // PUBLIC or PRIVATE
    customField = [CustomField]
});
```

| ID            | Type    | Description                          | Required |
| ------------- | ------- | ------------------------------------ | -------- |
| NAME          | string  | チャンネル名                               | O        |
| TYPE          | string  | チャンネルの種類(PUBLIC or PRIVATE)          | O        |
| UniqueID      | string  | 固有 ID                                | X        |
| push          | boolean | プッシュ通知の有無                            | X        |
| linkUrl       | string  | リンクの有無                               | X        |
| imageUrl      | string  | リンクの有無                               | X        |
| integrationId | string  | 連携機能(翻訳、ボイスなど)                       | X        |
| disabled      | string  | チャンネルの使用有無                           | X        |
| members       | array   | PRIVATEの場合、参加できる ID                  | X        |
| CustomField   | string  | ユーザー定義フィールド、JSON Stringで入力すると様々に活用可能 | X        |

> 参考
>
> * セキュリティのためにクライアントからチャンネルを作成するより、サーバからチャンネルを作成することをお勧めします。

### チャンネル登録 <a href="#undefined" id="undefined"></a>

ご希望のチャンネルに登録(ルームに参加)します。登録を解除するまで、参加しているチャンネルに再アクセス時にも自動的に参加します。

```csharp
Hashtable option = new Hashtable
{
    { "language", "ja" }    //自動翻訳時に必要なオプション以外にも様々なオプションを追加できます。
};
await nc.subscribe([CHANNEL_ID], option);
```

### チャンネル登録解除 <a href="#undefined" id="undefined"></a>

当該チャンネルへの登録を解除します。当該チェンネルからメッセージを受信できません。

```csharp
await nc.unsubscribe([CHANNEL_ID]);
```

### 参加者リスト <a href="#undefined" id="undefined"></a>

(特定チャンネルに対し)参加者リストを取得できます。

```csharp
Hashtable filter = new Hashtable
{
    { "channel_id", channelId }
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};
var subscriptions = await nc.getSubscriptions(filter, sort, option);
foreach (var subscription in subscriptions.edges)
{
    string id = subscription.node.id.ToString();
    Console.WriteLine("[CloudChatSample] id={0}", id);
}
```

* Parameters

<table><thead><tr><th width="119">ID</th><th width="90">Type</th><th>Description</th></tr></thead><tbody><tr><td>filter</td><td>object</td><td>クエリをフィルタ。すべてのフィールドに対して検索可能</td></tr><tr><td>sort</td><td>object</td><td>ソートしたいフィールドのフィルタの定義(昇順「1」、降順「-1」)</td></tr><tr><td>option</td><td>object</td><td>オプションが存在する場合、以下を参照</td></tr></tbody></table>

* Options

<table><thead><tr><th width="174">ID</th><th width="189">Type</th><th>Description</th></tr></thead><tbody><tr><td>offset</td><td>number</td><td>開始 offset</td></tr><tr><td>per_page</td><td>number</td><td>リターン数(最大100個)</td></tr></tbody></table>

#### **応用編**

特定チャンネルに対しオンラインアクセスステータスの訪問者リストのみ取得するには、filterに onlineを trueで追加します。

```csharp
Hashtable filter = new Hashtable
{
    { "channel_id", [CHANNEL_ID] },
    { "online" , true}
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};

var subscriptions = await nc.getSubscriptions(filter, sort, option);
```

#### **チャンネル登録**

* Subscription Data Class

<table><thead><tr><th width="221">ID</th><th width="139">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>string</td><td>ユニーク ID</td></tr><tr><td>channel_id</td><td>string</td><td>チャンネル ID</td></tr><tr><td>user_id</td><td>string</td><td>ユーザーの固有 ID</td></tr><tr><td>created_at</td><td>string</td><td>作成日</td></tr><tr><td>online</td><td>boolean</td><td>オンライン状態の有無</td></tr><tr><td>push</td><td>boolean</td><td>プッシュ参加の有無</td></tr><tr><td>language</td><td>string</td><td>アクセス言語</td></tr><tr><td>channel</td><td>string</td><td>チャンネル情報</td></tr><tr><td>mark.user_id</td><td>string</td><td>最後にメッセージを送信したユーザー</td></tr><tr><td>mark.message_id</td><td>string</td><td>最後のメッセージ ID</td></tr><tr><td>mark.sort_id</td><td>string</td><td>最後のメッセージソート ID</td></tr><tr><td>mark.unread</td><td>string</td><td>最後のメッセージ以降に、未読のメッセージ数</td></tr></tbody></table>

### チャンネル情報 <a href="#undefined" id="undefined"></a>

* Channel Data Class

<table><thead><tr><th width="190">ID</th><th width="118">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>string</td><td>チャンネル ID(unique)</td></tr><tr><td>project_id</td><td>string</td><td>プロジェクト ID</td></tr><tr><td>unique_id</td><td>string</td><td>開発会社で設定できるチャンネル ID(unique)</td></tr><tr><td>name</td><td>string</td><td>チャンネル名</td></tr><tr><td>user_id</td><td>string</td><td>(チャンネルを作成した)ユーザー ID</td></tr><tr><td>unique_id</td><td>string</td><td>チャンネルの固有 ID</td></tr><tr><td>default_lang</td><td>string</td><td>基本言語</td></tr><tr><td>lang</td><td>string</td><td>現在接続中のユーザーの言語</td></tr><tr><td>members</td><td>string</td><td>Privateの場合、参加したユーザーリスト</td></tr><tr><td>last_message</td><td>array</td><td>最後のメッセージ情報[MessageType]を参照</td></tr><tr><td>push</td><td>boolean</td><td>プッシュメッセージのサポート有無(Privateチャンネルの場合)</td></tr><tr><td>state</td><td>boolean</td><td>チャンネルステータス</td></tr><tr><td>customField</td><td>string</td><td>ユーザー定義データ</td></tr><tr><td>created_at</td><td>string</td><td>作成日</td></tr><tr><td>updated_at</td><td>string</td><td>更新日</td></tr></tbody></table>

#### **チャンネルデータを取得する**

プロジェクトのチャンネルデータをリスト形式で取得するには、以下のコードを使用します。

```csharp
Hashtable filter = new Hashtable
{
    { "state", true }
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};
var channels = await nc.getChannels(filter,sort,option);
foreach (var channel in channels.edges)
{
    string id = channel.node.id.ToString();
    Console.WriteLine("[CloudChatSample] id={0}", id);
}
```

* Parameters

<table><thead><tr><th width="106">ID</th><th width="106">Type</th><th width="439">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>

* Options

<table><thead><tr><th width="221">ID</th><th width="213">Type</th><th>Description</th></tr></thead><tbody><tr><td>offset</td><td>number</td><td>開始 offset</td></tr><tr><td>per_page</td><td>number</td><td>リターン数(最大100個)</td></tr></tbody></table>

### 個別チャンネル <a href="#undefined" id="undefined"></a>

* 個別チャンネルに関する情報を取得できます。

```csharp
Channel channel = await nc.getChannel(id);
```

### チャンネル内にユーザーを招待 <a href="#undefined" id="undefined"></a>

PRIVATEチャンネルの場合、参加を希望するユーザーを招待します。

```csharp
await nc.addUsers(newChannelId, new string[] { "ID", "ID" });
```

### チャンネル内でユーザーを削除 <a href="#undefined" id="undefined"></a>

PRIVATEチャンネルの場合、参加しているユーザーを削除します。

```csharp
await nc.removeUsers(channelId, new string[] { "ID", "ID" });
```

### チャンネル内でユーザーをブロック <a href="#undefined" id="undefined"></a>

チャンネル内でユーザーをブロックします。チャンネルを作成した権限を持つユーザーや、全体管理者のみ使用できます。

```csharp
Hashtable option = new Hashtable
{
    { "timeout", [終了時間(秒)] },
    { "reason", [ブロック理由] }
};
await nc.banUser(channelId, userId, options);
```

* Options Data Class

<table><thead><tr><th width="204">ID</th><th width="189">Type</th><th>Description</th></tr></thead><tbody><tr><td>timeout</td><td>string</td><td>ブロック時間(seconds)</td></tr><tr><td>reason</td><td>string</td><td>ブロック理由</td></tr></tbody></table>

### チャンネル内でユーザーブロックを解除 <a href="#undefined" id="undefined"></a>

チャンネル内でブロックしたユーザーのブロックを解除します。チャンネルを作成した権限を持つユーザーや、全体管理者のみ使用できます。

```csharp
await nc.unbanUser(channelId, userId);
```

### チャンネル削除 <a href="#undefined" id="undefined"></a>

当該チャンネルを削除します(1つまたは複数同時に削除できます)。

```csharp
Channel channel = await nc.deleteChannel([CHANNEL_ID]);
```

### チャンネル変更 <a href="#undefined" id="undefined"></a>

チャンネル情報を更新します。

```csharp
Channel channel = await nc.updateChannel([CHANNEL_ID],new NBaseSDK.Channel
{
    name = "Update Channel",
    type =[TYPE],    // PUBLIC or PRIVATE
    customField = [CustomField]
});
```
