# 调用 QQ 开放接口

下面这些 demo 展示了 `BotApi` 在消息收发之外的常见用法。每个 demo 都是自包含的 event handler，通过聊天命令触发 API 调用。

| Demo                                                                                                                  | 涉及 API                                                                                                                              |
|-----------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|
| [`demo_api_permission.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_api_permission.rs)                | `BotApi::get_permissions`、`BotApi::post_permission_demand`、`APIPermissionDemandIdentify::guild_members`                              |
| [`demo_announce.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_announce.rs)                            | `BotApi::create_announce`、`BotApi::delete_announce`、`BotApi::create_recommend_announce`、`RecommendChannel`、`AnnouncesType`         |
| [`demo_schedule.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_schedule.rs)                            | `BotApi::create_schedule`、`get_schedule`、`update_schedule`、`delete_schedule`、`RemindType`                                          |
| [`demo_pins_message.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_pins_message.rs)                    | `BotApi::get_pins`、`BotApi::put_pin`、`BotApi::delete_pin`                                                                            |
| [`demo_get_reaction_users.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_get_reaction_users.rs)        | `BotApi::get_reaction_users`、`EmojiType::System`，按 `cookie` 字段翻页                                                                |
| [`demo_recall.rs`](https://github.com/YinMo19/botrs/blob/main/examples/demo_recall.rs)                                | `Context::recall_message`（也可走 `BotApi::recall_message`）                                                                           |

## 套路

所有调用都经由 `ctx.api`（一个 `Arc<BotApi>`），第一个参数固定是 `&ctx.token`。错误以 `botrs::BotError` 返回，框架不会自动重试，请就地处理。

```rust
// demo_recall.rs —— 发完立即撤回
let resp = message.reply(&ctx.api, &ctx.token, "this will vanish").await?;
if let Some(message_id) = resp.id {
    ctx.recall_message(channel_id, &message_id, /* hidetip */ true).await?;
}
```

对于 `get_reaction_users` 这类分页 API，按 demo 里的写法用返回的 `cookie` 与 `is_end` 自行驱动循环。

## 参见

- 指南：[`docs/zh/guide/api-client.md`](../guide/api-client.md)
- 可用方法的权威来源：`src/api.rs`（`BotApi` 的 impl）
- 上面表格里列出的 `examples/` demo 路径
