频道与子频道模型 API 参考
该模块为 QQ 频道机器人 API 中的频道(服务器)和子频道提供数据结构。
频道类型
Guild
表示机器人可以访问的 QQ 频道(服务器)。
rust
pub struct Guild {
pub id: String,
pub name: String,
pub icon: Option<String>,
pub owner_id: String,
pub owner: bool,
pub member_count: Option<u32>,
pub max_members: Option<u32>,
pub description: Option<String>,
pub joined_at: Option<String>,
pub features: Vec<String>,
pub op_user_id: Option<String>,
}
字段
id
: 频道的唯一标识符name
: 频道名称icon
: 频道图标 URL(可选)owner_id
: 频道所有者的用户 IDowner
: 机器人是否为频道所有者member_count
: 当前成员数量max_members
: 允许的最大成员数description
: 频道描述joined_at
: 机器人加入频道的时间戳features
: 启用的频道功能列表op_user_id
: 操作员用户 ID
示例
rust
async fn handle_guild_create(ctx: Context, guild: Guild) {
println!("加入频道: {} (ID: {})", guild.name, guild.id);
println!("成员数量: {}", guild.member_count.unwrap_or(0));
if guild.owner {
println!("机器人是该频道的所有者");
}
}
GuildRole
表示频道内的身份组。
rust
pub struct GuildRole {
pub id: String,
pub name: String,
pub color: Option<u32>,
pub hoist: Option<bool>,
pub number: Option<u32>,
pub member_limit: Option<u32>,
}
字段
id
: 身份组的唯一标识符name
: 身份组名称color
: 身份组颜色(十六进制值)hoist
: 是否在成员列表中单独显示number
: 身份组位置/优先级member_limit
: 可拥有此身份组的最大成员数
示例
rust
async fn list_guild_roles(ctx: Context, guild_id: &str) -> Result<()> {
let roles = ctx.get_guild_roles(guild_id).await?;
for role in roles.roles {
println!("身份组: {} (ID: {})", role.name, role.id);
if let Some(color) = role.color {
println!(" 颜色: #{:06X}", color);
}
if let Some(limit) = role.member_limit {
println!(" 成员限制: {}", limit);
}
}
Ok(())
}
GuildRoles
频道身份组信息的容器。
rust
pub struct GuildRoles {
pub guild_id: String,
pub roles: Vec<GuildRole>,
pub role_num_limit: Option<u32>,
}
字段
guild_id
: 这些身份组所属频道的 IDroles
: 频道中的身份组列表role_num_limit
: 频道中允许的最大身份组数量
子频道类型
Channel
表示频道内的子频道。
rust
pub struct Channel {
pub id: String,
pub guild_id: String,
pub name: String,
pub channel_type: ChannelType,
pub sub_type: Option<ChannelSubType>,
pub position: Option<u32>,
pub parent_id: Option<String>,
pub owner_id: Option<String>,
pub private_type: Option<u32>,
pub speak_permission: Option<u32>,
pub application_id: Option<String>,
pub permissions: Option<String>,
}
字段
id
: 子频道的唯一标识符guild_id
: 该子频道所属频道的 IDname
: 子频道名称channel_type
: 子频道类型(文字、语音等)sub_type
: 子频道子类型,用于额外分类position
: 子频道在子频道列表中的位置parent_id
: 父子频道 ID(用于子频道分类)owner_id
: 子频道所有者的 IDprivate_type
: 子频道的隐私设置speak_permission
: 发言权限要求application_id
: 关联的应用程序 IDpermissions
: 子频道特定权限
示例
rust
async fn handle_channel_create(ctx: Context, channel: Channel) {
println!("创建新子频道: {} (类型: {:?})", channel.name, channel.channel_type);
match channel.channel_type {
ChannelType::Text => {
println!("在频道 {} 中创建了文字子频道", channel.guild_id);
}
ChannelType::Voice => {
println!("在频道 {} 中创建了语音子频道", channel.guild_id);
}
ChannelType::Category => {
println!("在频道 {} 中创建了分类", channel.guild_id);
}
_ => {
println!("创建了其他类型的子频道");
}
}
}
ChannelType
不同子频道类型的枚举。
rust
pub enum ChannelType {
Text = 0,
Voice = 1,
Category = 4,
Announcement = 5,
Forum = 10,
Live = 11,
Application = 12,
}
变体
Text
: 用于消息的文字子频道Voice
: 用于音频通信的语音子频道Category
: 用于组织子频道的分类Announcement
: 公告子频道Forum
: 用于话题讨论的论坛子频道Live
: 直播子频道Application
: 应用程序特定子频道
示例
rust
async fn create_text_channel(ctx: Context, guild_id: &str, name: &str) -> Result<Channel> {
let channel = ctx.create_channel(
guild_id,
name,
ChannelType::Text,
None, // sub_type
None, // position
None, // parent_id
None, // private_type
None, // speak_permission
None, // application_id
).await?;
println!("创建文字子频道: {}", channel.name);
Ok(channel)
}
ChannelSubType
用于额外分类的子频道子类型枚举。
rust
pub enum ChannelSubType {
Chat = 0,
Announcement = 1,
Guide = 2,
Game = 3,
}
变体
Chat
: 普通聊天子频道Announcement
: 公告专用子频道Guide
: 指南或帮助子频道Game
: 游戏相关子频道
成员类型
Member
表示频道的成员。
rust
pub struct Member {
pub user: Option<User>,
pub nick: Option
<String>,
pub roles: Vec<String>,
pub joined_at: Option<String>,
pub deaf: Option<bool>,
pub mute: Option<bool>,
}
字段
user
: 该成员的用户信息nick
: 成员在频道中的昵称roles
: 分配给成员的身份组 ID 列表joined_at
: 成员加入频道的时间戳deaf
: 成员在语音子频道中是否被拒听mute
: 成员在语音子频道中是否被静音
示例
rust
async fn handle_member_update(ctx: Context, member: Member) {
if let Some(user) = &member.user {
println!("成员更新: {}", user.username.as_deref().unwrap_or("未知"));
if let Some(nick) = &member.nick {
println!("昵称: {}", nick);
}
println!("身份组: {:?}", member.roles);
}
}
User
表示用户信息。
rust
pub struct User {
pub id: String,
pub username: Option<String>,
pub avatar: Option<String>,
pub bot: Option<bool>,
pub union_openid: Option<String>,
pub union_user_account: Option<String>,
}
字段
id
: 唯一用户标识符username
: 用户的显示名称avatar
: 头像图片 URLbot
: 该用户是否为机器人union_openid
: 用于跨平台识别的联合 OpenIDunion_user_account
: 联合用户账户标识符
子频道管理
创建子频道
rust
async fn setup_guild_channels(ctx: Context, guild_id: &str) -> Result<()> {
// 创建分类
let category = ctx.create_channel(
guild_id,
"常规",
ChannelType::Category,
None,
Some(0), // 位置在顶部
None,
None,
None,
None,
).await?;
// 在分类下创建文字子频道
let general_chat = ctx.create_channel(
guild_id,
"闲聊",
ChannelType::Text,
Some(ChannelSubType::Chat),
Some(1),
Some(&category.id), // 父分类
None,
None,
None,
).await?;
let announcements = ctx.create_channel(
guild_id,
"公告",
ChannelType::Text,
Some(ChannelSubType::Announcement),
Some(2),
Some(&category.id),
None,
None,
None,
).await?;
println!("创建分类 '{}' 及其子频道:", category.name);
println!(" - {}", general_chat.name);
println!(" - {}", announcements.name);
Ok(())
}
子频道权限
rust
async fn manage_channel_permissions(ctx: Context, channel_id: &str, user_id: &str) -> Result<()> {
// 获取用户的当前权限
let permissions = ctx.get_channel_user_permissions(channel_id, user_id).await?;
println!("用户权限: {}", permissions.permissions);
// 获取身份组权限
let role_id = "role_id_here";
let role_permissions = ctx.get_channel_role_permissions(channel_id, role_id).await?;
println!("身份组权限: {}", role_permissions.permissions);
Ok(())
}
频道成员管理
rust
async fn manage_guild_members(ctx: Context, guild_id: &str) -> Result<()> {
// 获取频道成员
let members = ctx.get_guild_members(guild_id, Some(100), None).await?;
println!("频道有 {} 个成员", members.len());
for member in &members {
if let Some(user) = &member.user {
println!("成员: {}", user.username.as_deref().unwrap_or("未知"));
println!(" 身份组: {:?}", member.roles);
if let Some(joined) = &member.joined_at {
println!(" 加入时间: {}", joined);
}
}
}
// 获取特定成员
let user_id = "specific_user_id";
let member = ctx.get_guild_member(guild_id, user_id).await?;
if let Some(user) = &member.user {
println!("找到成员: {}", user.username.as_deref().unwrap_or("未知"));
}
Ok(())
}
身份组管理
rust
async fn manage_roles(ctx: Context, guild_id: &str) -> Result<()> {
// 创建新身份组
let new_role = ctx.create_guild_role(
guild_id,
"管理员",
Some(0x0099ff), // 蓝色
Some(true), // 单独显示
Some(100), // 成员限制
).await?;
println!("创建身份组: {} (ID: {})", new_role.name, new_role.id);
// 为用户分配身份组
let user_id = "user_id_here";
ctx.add_guild_role_member(guild_id, &new_role.id, user_id, None).await?;
println!("为用户分配身份组");
// 更新身份组
let updated_role = ctx.update_guild_role(
guild_id,
&new_role.id,
"高级管理员",
Some(0xff9900), // 橙色
Some(true),
Some(50), // 减少成员限制
).await?;
println!("更新身份组: {}", updated_role.name);
// 移除用户的身份组
ctx.remove_guild_role_member(
guild_id, &new_role.id, user_id, None).await?;
println!("移除用户的身份组");
// 删除身份组
ctx.delete_guild_role(guild_id, &new_role.id).await?;
println!("删除身份组");
Ok(())
}
常见使用模式
频道发现
rust
async fn explore_guilds(ctx: Context) -> Result<()> {
let guilds = ctx.get_guilds(None, None).await?;
for guild in guilds {
println!("频道: {} (ID: {})", guild.name, guild.id);
// 获取该频道的子频道
let channels = ctx.get_channels(&guild.id).await?;
println!(" 子频道 ({}):", channels.len());
for channel in channels {
let type_name = match channel.channel_type {
ChannelType::Text => "文字",
ChannelType::Voice => "语音",
ChannelType::Category => "分类",
ChannelType::Announcement => "公告",
ChannelType::Forum => "论坛",
ChannelType::Live => "直播",
ChannelType::Application => "应用",
};
println!(" {} - {} ({})", channel.name, type_name, channel.id);
}
}
Ok(())
}
子频道组织
rust
async fn organize_channels(ctx: Context, guild_id: &str) -> Result<()> {
let channels = ctx.get_channels(guild_id).await?;
// 按分类分组子频道
let mut categories = std::collections::HashMap::new();
let mut orphaned_channels = Vec::new();
for channel in channels {
match (channel.channel_type, &channel.parent_id) {
(ChannelType::Category, _) => {
categories.insert(channel.id.clone(), (channel, Vec::new()));
}
(_, Some(parent_id)) => {
if let Some((_, children)) = categories.get_mut(parent_id) {
children.push(channel);
}
}
(_, None) => {
orphaned_channels.push(channel);
}
}
}
// 打印组织结构
for (_, (category, children)) in categories {
println!("分类: {}", category.name);
for child in children {
println!(" └─ {}", child.name);
}
}
if !orphaned_channels.is_empty() {
println!("未分类的子频道:");
for channel in orphaned_channels {
println!(" - {}", channel.name);
}
}
Ok(())
}