# 频道

## 频道

在 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]
});
```


---

# 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-zhong-wen/kai-shi-shi-yong-v3/pin-dao.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.
