# 频道

## 频道

在 Game Chat 中，频道是用户可以以小组形式进行交流的虚拟空间。通过频道，用户可以根据特定主题或目的共享信息、增强团队合作以及组织沟通。频道是提高工作效率、集中管理特定小组内沟通的有用工具。以下是 Game Chat 频道功能的详细说明。

### 频道的主要功能

1. **小组沟通**：您可以创建频道与特定小组的成员进行交流。这适用于项目团队、部门、俱乐部等各种形式的小组。
2. **消息和文件共享**：在频道内，您可以轻松共享文本消息、图片、视频、文档等多种形式的文件。
3. **实时更新**：频道内的所有活动实时更新，确保所有参与者都能获取最新信息。
4. **管理员控制**：频道的创建者或管理员拥有更改频道设置、添加/删除用户的权限。
5. **通话和视频会议功能**：某些频道支持语音通话或视频会议，使成员之间的对话更加高效。
6. **通知设置**：用户可以为每个频道设置通知，以确保不会错过重要消息。
7. **搜索功能**：可以轻松搜索频道内的对话或文件，快速找到所需的信息。

### 频道管理

* **创建频道**：用户可以创建新的频道以满足特定目的，并设置频道名称、描述、成员等信息。
* **频道邀请**：频道的管理员可以邀请其他用户加入频道。被邀请的用户可以接受或拒绝邀请。
* **成员管理**：管理员可以设置频道成员的权限或从频道中移除成员。

### 安全

* **数据安全**：频道内的所有数据都经过加密传输，并安全地存储在服务器上。
* **隐私保护**：频道内共享的信息仅在频道成员之间可访问，并受到保护，防止外部泄露。

利用 Game Chat 的频道功能，您可以顺畅地进行组织内或个人之间的沟通，并有效地管理信息。这些特性在管理大型组织或各种项目时尤其有用。

### 频道创建

所有对话都需要创建频道并加入频道才能正常进行聊天。以下是创建和订阅频道的方法指南。

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

<table><thead><tr><th width="175">ID</th><th width="128">Type</th><th width="350">Description</th><th>Required</th></tr></thead><tbody><tr><td>NAME</td><td>string</td><td>频道名称</td><td>O</td></tr><tr><td>TYPE</td><td>string</td><td>频道类型 ( PUBLIC or PRIVATE )</td><td>O</td></tr><tr><td>UniqueID</td><td>string</td><td>唯一 ID</td><td>X</td></tr><tr><td>push</td><td>boolean</td><td>推送通知是否启用</td><td>X</td></tr><tr><td>linkUrl</td><td>string</td><td>链接是否启用</td><td>X</td></tr><tr><td>imageUrl</td><td>string</td><td>链接是否启用</td><td>X</td></tr><tr><td>integrationId</td><td>string</td><td>集成功能（翻译、语音等）</td><td>X</td></tr><tr><td>disabled</td><td>string</td><td>频道使用状态</td><td>X</td></tr><tr><td>members</td><td>array</td><td>如果是 PRIVATE，允许参与的 ID</td><td>X</td></tr><tr><td>CustomField</td><td>string</td><td>自定义字段：可以以 JSON 字符串形式添加，灵活使用各种功能</td><td>X</td></tr></tbody></table>

> 参考
>
> 为了安全考虑，建议通过服务器而不是客户端创建频道。

### 频道订阅

加入您感兴趣的频道（参与房间）。一旦加入的频道，在取消订阅之前，即使重新连接，也会自动参与其中。

```csharp
Hashtable option = new Hashtable
{
    { "language", "en" }    // 自动翻译时，除了所需的选项外，还可以添加各种其他选项。
};
await nc.subscribe([CHANNEL_ID], option);
```

### 取消频道订阅

取消对该频道的订阅。您将不再收到该频道的消息。

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

### 参与者列表

（对于特定频道）可以获取参与者列表。

```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="147">ID</th><th width="125">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="152">ID</th><th width="124">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>

### 应用示例

如果仅需获取特定频道中在线的用户列表，请在过滤器中将 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="215">ID</th><th width="153">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>string</td><td>唯一标识符</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="243">ID</th><th width="148">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>如果是 Private，参与用户列表</td></tr><tr><td>last_message</td><td>array</td><td>最后消息信息 [MessageType] 参考</td></tr><tr><td>push</td><td>boolean</td><td>推送消息支持状态（对于私有频道）</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="123">ID</th><th width="90">Type</th><th width="393">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="170">ID</th><th width="167">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>

### 单个频道

可以获取单个频道的信息。

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

### 频道内用户邀请

对于 PRIVATE 频道，邀请想要加入的用户。

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

### 频道内用户删除

对于 PRIVATE 频道，删除已参与的用户。

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

### 频道内用户封禁

在频道内封禁用户。仅具备频道创建权限的用户或全体管理员可以使用此功能。

```csharp
Hashtable option = new Hashtable
{
    { "timeout", [封禁时间（秒）] },
    { "reason", [封禁原因] }
};
await nc.banUser(channelId, userId, options);
```

* Options Data Class

<table><thead><tr><th width="195">ID</th><th width="186">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>

### 解除频道内用户封禁

解除对频道内被封禁用户的封禁。只有具备频道创建权限的用户或全体管理员可以使用此功能。

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

### 删除频道

删除指定的频道（可以删除一个或多个频道）。

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

### 修改频道

更新频道信息。

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