# 频道成员 QGMember

> For the complete documentation index, see [llms.txt](https://simbot.forte.love/v4/llms.txt).

频道成员，即 `Member`，存在于频道服务器(`Guild`)中。

## API中的频道成员

在API模块中存在一些用来获取 `Member` 的API。

比如你可以通过 `GetMemberApi` 获取 `SimpleMember` 类型结果的成员信息、 `DeleteMemberApi` 删除(踢出)一个成员等。

> **Tip:**
> 详细的API列表请参考 [API定义列表](component-qq-guild-api-list.html) 或 [API文档](https://docs.simbot.forte.love)。

## Stdlib模块中的频道成员

> **Warning:**
> 标准库模块可能会在未来被弃用并移除。 前往议题 [#168](https://github.com/simple-robot/simbot-component-qq-guild/issues/168) 了解更多。

当你直接使用标准库模块时，你可以在一些与频道成员相关的事件中得到它的信息。

比如当你处理 `GuildMemberAdd` 类型事件时，可以通过 `data` 获取到 `EventMember`。

Kotlin:

```KOTLIN
bot.subscribe<GuildMemberAdd> {
    val member: EventMember = data
}
```

Java:

```JAVA
bot.subscribe(EventProcessors.async(GuildMemberAdd.class, (event, raw) -> {
    var member = event.getData();
    // ...
    return CompletableFuture.completedFuture(null);
}));
```

```JAVA
bot.subscribe(EventProcessors.block(GuildMemberAdd.class, (event, raw) -> {
    var member = event.getData();
}));
```

> **Tip:**
> 详细的事件列表请参考 [事件定义列表](component-qq-guild-event-list.html) 或 [API文档](https://docs.simbot.forte.love)。

## 组件库中的频道成员

组件中 `QGMember` 类型实现了simbot标准API中的 `Member` 类型，并提供与频道成员相关的功能。 如果你想要获取一个 `QGChannel`，你可以在 `QGBot`、`QGGuild` 或一个与子频道相关的事件中获取。

在 `QGBot` 中获取子频道你可以前往参考 [频道操作](component-qq-guild-qgbot.html#qgbot-guild)。

在 `QGGuild` 中获取频道成员你可以前往参考 [获取成员](component-qq-guild-qgguild.html#get-members)。

在事件中获取，那么这个事件应当与频道成员有所关联。 它们通常使用 `member` 属性获取。

> **Tip:**
> 详细的事件列表请参考 [事件定义列表](component-qq-guild-event-list.html) 或 [API文档](https://docs.simbot.forte.love)。

以 `QGMemberAddEvent` 事件为例：

Kotlin:

```KOTLIN
val event: QGMemberAddEvent = ...
val member = event.member()
```

Java:

```JAVA
QGMemberAddEvent event = ...
event.getMemberAsync()
    .thenAccept(member -> { ... })
```

```JAVA
QGMemberAddEvent event = ...
var member = event.getMemberBlocking() 
```

```JAVA
QGChannelCreateEvent event = ...
event.getMemberReserve()
        // 例如转为 Reactor 的 `Mono`
        .transform(SuspendReserves.mono())
        .subscribe(member -> { ... })
```

## 私聊消息

`QGMember` 实现simbot标准API中的 `Channel`，而它又支持 `SendSupport`， 也就是说 `QGMember` 支持向某个频道成员发送私聊消息。

Kotlin:

```KOTLIN
val member: QGMember = ...
member.send("消息内容")
member.send("消息内容".toText() + At("user id".ID))
```

Java:

```JAVA
QGMember member = ...

var sendTask1 = member.sendAsync("消息内容");
var sendTask2 = member.sendAsync(Messages.of(
        Text.of("文本消息"),
        At.of(Identifies.of("user id"))
));
```

Java:

```JAVA
QGMember member = ...

member.sendBlocking("消息内容");
member.sendBlocking(Messages.of(
        Text.of("文本消息"),
        At.of(Identifies.of("user id"))
));
```

Java:

```JAVA
QGTextChannel member = ...

member.sendReserve("消息内容")
        .transform(SuspendReserves.mono())
        .subscribe(receipt -> { ... });

member.sendReserve(Messages.of(
        Text.of("文本消息"),
        At.of(Identifies.of("user id"))
    )).transform(SuspendReserves.mono())
        .subscribe(receipt -> { ... });
```

> **Tip:**
> 有关消息元素、消息发送的更多内容前往参考 [消息元素](component-qq-guild-messages.html)

## 角色操作

`QGMember` 拥有一些获取或操作自身角色 (`QGMemberRole`) 的API。

> **Tip:**
> 有关角色的更多内容前往参考 [频道角色 QGRole](component-qq-guild-qgrole.html)。

### 获取角色

Kotlin:

```KOTLIN
val member: QGMember = ...
// 获取当前用户拥有的角色集合
val roles = member.roles
```

Java:

```JAVA
QGmember member = ...

// 可以直接在异步中遍历
// 第一个参数 scope 可以选择 QGGuild、QGBot 等，
// 或者直接使用 GlobalScope
member.getRoles().collectAsync(GlobalScope.INSTANCE, member -> { });

// 可以使用 Collectables.toListAsync / collectAsync
var rolesCollectable = member.getRoles();
Collectables.toListAsync(rolesCollectable)
        .thenAccept(role -> {});
```

```JAVA
QGmember member = ...

// 可以使用 SuspendReserves.list 转为 List
var roleList = member.getRoles().transform(SuspendReserves.list());

// 可以使用 Collectables 转成 Stream 或 List
var rolesCollectable = member.getRoles();
Collectables.asStream(rolesCollectable)
        .forEach(role -> {});
```

```JAVA
QGmember member = ...
        
// 可以直接在异步中遍历
// 第一个参数 scope 可以选择 QGGuild、QGBot 等，
// 或者直接使用 GlobalScope
member.getRoles().collectAsync(GlobalScope.INSTANCE, role -> { });

var rolesCollectable = guild.getRoles();
// 可以使用 Collectables 转为 Flux
Collectables.asFlux(rolesCollectable)
        .subscribe(role -> {  });
```

