botrs 0.12.2

A Rust QQ Bot framework based on QQ Guild Bot API
Documentation
# BotApi

`BotApi` 是 QQ 频道开放接口的同步风格门面:它持有 HTTP 客户端,构造请求,使用 `Token` 完成签名,并把响应解析成模型类型返回。所有方法都是 `async` 的,返回 `Result<T, BotError>`。

## 构造

```rust
use botrs::{BotApi, http::HttpClient, Token};

let http = HttpClient::new(/* 超时秒 */ 30, /* 是否沙箱 */ false)?;
let api = BotApi::new(http);
let token = Token::new("app_id", "secret");

let me = api.get_bot_info(&token).await?;
```

`BotApi` 实现了 `Clone`,开销很小(内部 HTTP 客户端是引用计数的)。当 bot 通过 `Client` 驱动时,同一个 `BotApi` 实例会通过 `Context::api` 暴露给事件处理器。

## 方法目录

每个方法的签名都是 `&self, token: &Token, …`,返回 `Result<…>`。下面按业务域归类列出全部 100+ 路由。具体的参数与响应结构请查阅 [消息模型](./models/messages.md)、[频道与子频道](./models/guilds-channels.md)、[其他类型](./models/other-types.md)。

### 机器人身份

- `get_bot_info` —— `/users/@me`,返回 `BotInfo`- `get_gateway` —— 网关地址 + 推荐分片数。

### Guild

- `get_guild` / `get_guilds` / `get_guilds_with_pager`
- 成员:`get_guild_member``get_guild_members``get_guild_members_with_pager`
- 角色成员:`get_guild_role_members``get_guild_role_members_with_pager`
- 禁言:`mute_all``cancel_mute_all``mute_member``mute_multi_member``multi_member_mute``cancel_mute_multi_member`

### 子频道

- `get_channel``get_channels`
- `create_channel``create_private_channel``update_channel` / `patch_channel``delete_channel`
- 权限:`get_channel_user_permissions``get_channel_role_permissions``update_channel_user_permissions``update_channel_role_permissions``put_channel_permissions``put_channel_roles_permissions`

### 角色

- `get_guild_roles`
- `create_guild_role``create_guild_role_with_update``update_guild_role``update_guild_role_with_update``delete_guild_role`
- 赋予 / 移除:`create_guild_role_member``delete_guild_role_member``member_add_role``member_delete_role``delete_member``delete_member_with_options`

### 频道消息

- `get_message``get_messages``get_messages_with_params`
- 发送:`post_message_with_params`(推荐);旧接口:`post_message``post_message_to_create``post_message_api`- 编辑:`patch_message_with_params`(推荐);旧接口:`patch_message``patch_message_to_create``patch_message_api`- 撤回:`recall_message`
### 私信

- 创建会话:`create_dms`(别名 `create_direct_message`)。
- 发送:`post_dms_with_params`;旧接口:`post_dms``post_direct_message`- 撤回:`retract_dm_message`- 设置引导:`post_dm_setting_guide``post_dm_setting_guide_message`
### 群 / C2C 消息

- 发送:`post_group_message_with_params``post_c2c_message_with_params``post_c` 是 C2C 别名);旧接口:`post_group_message``post_group_message_to_create``post_group_api_message``post_group_rich_media_message`- 撤回:`retract_group_message``retract_c`- 文件上传:`post_group_file``post_c2c_file`
### 表情回应

- `put_reaction``delete_reaction``delete_own_message_reaction`
- `create_message_reaction``get_reaction_users``get_message_reaction_users`

### 精华消息

- `put_pin``delete_pin``get_pins``clean_pins`

### 公告

- 频道:`create_guild_announce``delete_guild_announce``clean_guild_announces``create_guild_recommend_announce``create_recommend_announce`
- 子频道:`create_channel_announce``delete_channel_announce``clean_channel_announces`
- 简写:`create_announce``delete_announce`

### 日程

- `get_schedules``get_schedule``create_schedule``create_schedule_with_model``update_schedule``update_schedule_with_model``delete_schedule`

### API 权限

- `get_permissions`(别名 `get_api_permissions`)、`post_permission_demand``require_api_permissions`

### 音频 / 语音

- `post_audio`(使用 `AudioControl`)、`update_audio`
- `on_microphone``off_microphone``list_voice_channel_members`

### 设置引导

- `post_setting_guide``post_setting_guide_message`

### 互动

- `put_interaction` —— 应答按钮 / 互动事件。

### Webhook 会话

- `create_session``check_sessions``session_list``remove_session``transport`

### 消息推送配置

- `get_message_setting` —— 频道推送和私信开关。

### 生命周期

- `close` —— 等待请求结束并关闭底层客户端。
- `http` —— 借出底层 `HttpClient`,便于做高级定制。

## 完整示例

**回应 @ 提及,并附带按钮键盘。** 一次构建键盘,挂到 `MessageParams` 上,再交给 `_with_params` 系列方法。

```rust
let keyboard = MessageKeyboard::new()
    .with_row(MessageKeyboardRow::new()
        .with_button(MessageKeyboardButton::primary("ok", "OK"))
        .with_button(MessageKeyboardButton::secondary("cancel", "Cancel")));

let params = MessageParams::new_text("Choose:")
    .with_reply(message.id.as_deref().unwrap_or(""))
    .with_keyboard(keyboard);

api.post_message_with_params(&token, &channel_id, params).await?;
```

**分页拉取成员列表。** 用 pager 辅助方法,避免手动维护 `after` 游标。

```rust
let pager = ctx.api.get_guild_members_with_pager(
    &ctx.token, &guild_id, GuildMembersPager::default(),
).await?;
for member in pager.items {
    /* ... */
}
```

**安全地更新子频道权限。** `validate()` 会在请求发出前检查权限串能不能被解析为整数。

```rust
let body = UpdateChannelPermissions::new(Some("1024"), Some("0"));
body.validate()?;
api.update_channel_user_permissions(&token, &channel_id, &user_id, &body).await?;
```

## 错误处理

所有方法都返回 `Result<T, BotError>`,可以按变体匹配:

- `BotError::Http` —— 传输层错误(超时、DNS 等)。
- `BotError::Api { code, message, .. }` —— 非 2xx 响应及其 QQ 错误码。
- `BotError::Auth` —— Token 签名或刷新失败。
- `BotError::InvalidData` —— 本地校验失败(例如非法的权限字符串)。

收到 429 时 `BotError::Api` 会携带可用的 `Retry-After`;框架不会自动重试,你可以根据自身节流需求自行包一层退避。

## 参见

- [Client]./client.md —— 持有 `BotApi` 的高层事件循环。
- [Context]./context.md —— 事件回调中的请求作用域包装器,暴露同样的接口。
- [模型]./models/messages.md —— 请求与响应的结构体定义。
- [Token]./token.md —— 凭证管理与刷新。