Guilds and Channels Models API Reference
This module provides data structures for guilds (servers) and channels within the QQ Guild Bot API.
Guild Types
Guild
Represents a QQ guild (server) that the bot has access to.
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>,
}
Fields
id
: Unique identifier for the guildname
: Guild nameicon
: Guild icon URL (optional)owner_id
: User ID of the guild ownerowner
: Whether the bot is the owner of the guildmember_count
: Current number of membersmax_members
: Maximum allowed membersdescription
: Guild descriptionjoined_at
: Timestamp when the bot joined the guildfeatures
: List of guild features enabledop_user_id
: Operator user ID
Example
rust
async fn handle_guild_create(ctx: Context, guild: Guild) {
println!("Joined guild: {} (ID: {})", guild.name, guild.id);
println!("Member count: {}", guild.member_count.unwrap_or(0));
if guild.owner {
println!("Bot is the owner of this guild");
}
}
GuildRole
Represents a role within a guild.
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>,
}
Fields
id
: Unique identifier for the rolename
: Role namecolor
: Role color (as hex value)hoist
: Whether the role is displayed separately in member listnumber
: Role position/prioritymember_limit
: Maximum number of members that can have this role
Example
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!("Role: {} (ID: {})", role.name, role.id);
if let Some(color) = role.color {
println!(" Color: #{:06X}", color);
}
if let Some(limit) = role.member_limit {
println!(" Member limit: {}", limit);
}
}
Ok(())
}
GuildRoles
Container for guild role information.
rust
pub struct GuildRoles {
pub guild_id: String,
pub roles: Vec<GuildRole>,
pub role_num_limit: Option<u32>,
}
Fields
guild_id
: ID of the guild these roles belong toroles
: List of roles in the guildrole_num_limit
: Maximum number of roles allowed in the guild
Channel Types
Channel
Represents a channel within a guild.
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>,
}
Fields
id
: Unique identifier for the channelguild_id
: ID of the guild this channel belongs toname
: Channel namechannel_type
: Type of channel (text, voice, etc.)sub_type
: Channel subtype for additional classificationposition
: Channel position in the channel listparent_id
: ID of parent channel (for channel categories)owner_id
: ID of the channel ownerprivate_type
: Privacy setting for the channelspeak_permission
: Speaking permission requirementsapplication_id
: Associated application IDpermissions
: Channel-specific permissions
Example
rust
async fn handle_channel_create(ctx: Context, channel: Channel) {
println!("New channel created: {} (Type: {:?})", channel.name, channel.channel_type);
match channel.channel_type {
ChannelType::Text => {
println!("Text channel created in guild {}", channel.guild_id);
}
ChannelType::Voice => {
println!("Voice channel created in guild {}", channel.guild_id);
}
ChannelType::Category => {
println!("Category created in guild {}", channel.guild_id);
}
_ => {
println!("Other channel type created");
}
}
}
ChannelType
Enumeration of different channel types.
rust
pub enum ChannelType {
Text = 0,
Voice = 1,
Category = 4,
Announcement = 5,
Forum = 10,
Live = 11,
Application = 12,
}
Variants
Text
: Text channel for messagesVoice
: Voice channel for audio communicationCategory
: Category to organize channelsAnnouncement
: Announcement channelForum
: Forum channel for threaded discussionsLive
: Live streaming channelApplication
: Application-specific channel
Example
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!("Created text channel: {}", channel.name);
Ok(channel)
}
ChannelSubType
Enumeration of channel subtypes for additional classification.
rust
pub enum ChannelSubType {
Chat = 0,
Announcement = 1,
Guide = 2,
Game = 3,
}
Variants
Chat
: General chat channelAnnouncement
: Announcement-specific channelGuide
: Guide or help channelGame
: Gaming-related channel
Member Types
Member
Represents a member of a guild.
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>,
}
Fields
user
: User information for this membernick
: Member's nickname in the guildroles
: List of role IDs assigned to the memberjoined_at
: Timestamp when the member joined the guilddeaf
: Whether the member is deafened in voice channelsmute
: Whether the member is muted in voice channels
Example
rust
async fn handle_member_update(ctx: Context, member: Member) {
if let Some(user) = &member.user {
println!("Member updated: {}", user.username.as_deref().unwrap_or("Unknown"));
if let Some(nick) = &member.nick {
println!("Nickname: {}", nick);
}
println!("Roles: {:?}", member.roles);
}
}
User
Represents user information.
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>,
}
Fields
id
: Unique user identifierusername
: User's display nameavatar
: Avatar image URLbot
: Whether this user is a botunion_openid
: Union OpenID for cross-platform identificationunion_user_account
: Union user account identifier
Channel Management
Creating Channels
rust
async fn setup_guild_channels(ctx: Context, guild_id: &str) -> Result<()> {
// Create a category
let category = ctx.create_channel(
guild_id,
"General",
ChannelType::Category,
None,
Some(0), // position at top
None,
None,
None,
None,
).await?;
// Create text channels under the category
let general_chat = ctx.create_channel(
guild_id,
"general",
ChannelType::Text,
Some(ChannelSubType::Chat),
Some(1),
Some(&category.id), // parent category
None,
None,
None,
).await?;
let announcements = ctx.create_channel(
guild_id,
"announcements",
ChannelType::Text,
Some(ChannelSubType::Announcement),
Some(2),
Some(&category.id),
None,
None,
None,
).await?;
println!("Created category '{}' with channels:", category.name);
println!(" - {}", general_chat.name);
println!(" - {}", announcements.name);
Ok(())
}
Channel Permissions
rust
async fn manage_channel_permissions(ctx: Context, channel_id: &str, user_id: &str) -> Result<()> {
// Get current permissions for a user
let permissions = ctx.get_channel_user_permissions(channel_id, user_id).await?;
println!("User permissions: {}", permissions.permissions);
// Get permissions for a role
let role_id = "role_id_here";
let role_permissions = ctx.get_channel_role_permissions(channel_id, role_id).await?;
println!("Role permissions: {}", role_permissions.permissions);
Ok(())
}
Guild Member Management
rust
async fn manage_guild_members(ctx: Context, guild_id: &str) -> Result<()> {
// Get guild members
let members = ctx.get_guild_members(guild_id, Some(100), None).await?;
println!("Guild has {} members", members.len());
for member in &members {
if let Some(user) = &member.user {
println!("Member: {}", user.username.as_deref().unwrap_or("Unknown"));
println!(" Roles: {:?}", member.roles);
if let Some(joined) = &member.joined_at {
println!(" Joined: {}", joined);
}
}
}
// Get specific member
let user_id = "specific_user_id";
let member = ctx.get_guild_member(guild_id, user_id).await?;
if let Some(user) = &member.user {
println!("Found member: {}", user.username.as_deref().unwrap_or("Unknown"));
}
Ok(())
}
Role Management
rust
async fn manage_roles(ctx: Context, guild_id: &str) -> Result<()> {
// Create a new role
let new_role = ctx.create_guild_role(
guild_id,
"Moderator",
Some(0x0099ff), // Blue color
Some(true), // Hoist (display separately)
Some(100), // Member limit
).await?;
println!("Created role: {} (ID: {})", new_role.name, new_role.id);
// Assign role to a user
let user_id = "user_id_here";
ctx.add_guild_role_member(guild_id, &new_role.id, user_id, None).await?;
println!("Assigned role to user");
// Update role
let updated_role = ctx.update_guild_role(
guild_id,
&new_role.id,
"Senior Moderator",
Some(0xff9900), // Orange color
Some(true),
Some(50), // Reduced member limit
).await?;
println!("Updated role: {}", updated_role.name);
// Remove role from user
ctx.remove_guild_role_member(guild_id, &new_role.id, user_id, None).await?;
println!("Removed role from user");
// Delete role
ctx.delete_guild_role(guild_id, &new_role.id).await?;
println!("Deleted role");
Ok(())
}
Common Usage Patterns
Guild Discovery
rust
async fn explore_guilds(ctx: Context) -> Result<()> {
let guilds = ctx.get_guilds(None, None).await?;
for guild in guilds {
println!("Guild: {} (ID: {})", guild.name, guild.id);
// Get channels for this guild
let channels = ctx.get_channels(&guild.id).await?;
println!(" Channels ({}):", channels.len());
for channel in channels {
let type_name = match channel.channel_type {
ChannelType::Text => "Text",
ChannelType::Voice => "Voice",
ChannelType::Category => "Category",
ChannelType::Announcement => "Announcement",
ChannelType::Forum => "Forum",
ChannelType::Live => "Live",
ChannelType::Application => "Application",
};
println!(" {} - {} ({})", channel.name, type_name, channel.id);
}
}
Ok(())
}
Channel Organization
rust
async fn organize_channels(ctx: Context, guild_id: &str) -> Result<()> {
let channels = ctx.get_channels(guild_id).await?;
// Group channels by category
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);
}
}
}
// Print organized structure
for (_, (category, children)) in categories {
println!("Category: {}", category.name);
for child in children {
println!(" └─ {}", child.name);
}
}
if !orphaned_channels.is_empty() {
println!("Uncategorized channels:");
for channel in orphaned_channels {
println!(" - {}", channel.name);
}
}
Ok(())
}
See Also
- Client API - Main client for guild and channel operations
- Context API - Context object for API access
- Messages - Message types and handling
- Users & Members - User and member management