#![allow(deprecated)] use super::{File, UserVoiceState}; use revolt_permissions::{Override, OverrideField}; use std::collections::{HashMap, HashSet}; #[cfg(feature = "rocket")] use rocket::FromForm; auto_derived!( /// Channel #[serde(tag = "channel_type")] pub enum Channel { /// Personal "Saved Notes" channel which allows users to save messages SavedMessages { /// Unique Id #[cfg_attr(feature = "serde", serde(rename = "_id"))] id: String, /// Id of the user this channel belongs to user: String, }, /// Direct message channel between two users DirectMessage { /// Unique Id #[cfg_attr(feature = "serde", serde(rename = "_id"))] id: String, /// Whether this direct message channel is currently open on both sides active: bool, /// 2-tuple of user ids participating in direct message recipients: Vec, /// Id of the last message sent in this channel #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] last_message_id: Option, }, /// Group channel between 1 or more participants Group { /// Unique Id #[cfg_attr(feature = "serde", serde(rename = "_id"))] id: String, /// Display name of the channel name: String, /// User id of the owner of the group owner: String, /// Channel description #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] description: Option, /// Array of user ids participating in channel recipients: Vec, /// Custom icon attachment #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] icon: Option, /// Id of the last message sent in this channel #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] last_message_id: Option, /// Permissions assigned to members of this group /// (does not apply to the owner of the group) #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] permissions: Option, /// Whether this group is marked as not safe for work #[cfg_attr( feature = "serde", serde(skip_serializing_if = "crate::if_false", default) )] nsfw: bool, }, /// Text channel belonging to a server TextChannel { /// Unique Id #[cfg_attr(feature = "serde", serde(rename = "_id"))] id: String, /// Id of the server this channel belongs to server: String, /// Display name of the channel name: String, /// Channel description #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] description: Option, /// Custom icon attachment #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] icon: Option, /// Id of the last message sent in this channel #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] last_message_id: Option, /// Default permissions assigned to users in this channel #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] default_permissions: Option, /// Permissions assigned based on role to this channel #[cfg_attr( feature = "serde", serde( default = "HashMap::::new", skip_serializing_if = "HashMap::::is_empty" ) )] role_permissions: HashMap, /// Whether this channel is marked as not safe for work #[cfg_attr( feature = "serde", serde(skip_serializing_if = "crate::if_false", default) )] nsfw: bool, /// Voice Information for when this channel is also a voice channel #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] voice: Option, }, } /// Voice information for a channel #[derive(Default)] #[cfg_attr(feature = "validator", derive(validator::Validate))] pub struct VoiceInformation { /// Maximium amount of users allowed in the voice channel at once #[cfg_attr(feature = "validator", validate(range(min = 1)))] #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub max_users: Option, } /// Partial representation of a channel #[derive(Default)] pub struct PartialChannel { #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub name: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub owner: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub description: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub icon: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub nsfw: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub active: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub permissions: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub role_permissions: Option>, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub default_permissions: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub last_message_id: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub voice: Option, } /// Optional fields on channel object pub enum FieldsChannel { Description, Icon, DefaultPermissions, Voice, } /// New webhook information #[cfg_attr(feature = "validator", derive(validator::Validate))] pub struct DataEditChannel { /// Channel name #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))] pub name: Option, /// Channel description #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))] pub description: Option, /// Group owner pub owner: Option, /// Icon /// /// Provide an Autumn attachment Id. #[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))] pub icon: Option, /// Whether this channel is age-restricted pub nsfw: Option, /// Whether this channel is archived pub archived: Option, /// Voice Information for voice channels pub voice: Option, /// Fields to remove from channel #[cfg_attr(feature = "serde", serde(default))] pub remove: Vec, } /// Create new group #[derive(Default)] #[cfg_attr(feature = "validator", derive(validator::Validate))] pub struct DataCreateGroup { /// Group name #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))] pub name: String, /// Group description #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))] pub description: Option, /// Group icon #[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))] pub icon: Option, /// Array of user IDs to add to the group /// /// Must be friends with these users. #[cfg_attr(feature = "validator", validate(length(min = 0, max = 49)))] #[serde(default)] pub users: HashSet, /// Whether this group is age-restricted #[serde(skip_serializing_if = "Option::is_none")] pub nsfw: Option, } /// Server Channel Type #[derive(Default)] pub enum LegacyServerChannelType { /// Text Channel #[default] Text, /// Voice Channel Voice, } /// Create new server channel #[derive(Default)] #[cfg_attr(feature = "validator", derive(validator::Validate))] pub struct DataCreateServerChannel { /// Channel type #[serde(rename = "type", default = "LegacyServerChannelType::default")] pub channel_type: LegacyServerChannelType, /// Channel name #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))] pub name: String, /// Channel description #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))] pub description: Option, /// Whether this channel is age restricted #[serde(skip_serializing_if = "Option::is_none")] pub nsfw: Option, /// Voice Information for when this channel is also a voice channel #[serde(skip_serializing_if = "Option::is_none")] pub voice: Option, } /// New default permissions #[serde(untagged)] pub enum DataDefaultChannelPermissions { Value { /// Permission values to set for members in a `Group` permissions: u64, }, Field { /// Allow / deny values to set for members in this server channel permissions: Override, }, } /// New role permissions pub struct DataSetRolePermissions { /// Allow / deny values to set for this role pub permissions: Override, } /// Options when deleting a channel #[cfg_attr(feature = "rocket", derive(FromForm))] pub struct OptionsChannelDelete { /// Whether to not send a leave message pub leave_silently: Option, } /// Voice server token response pub struct CreateVoiceUserResponse { /// Token for authenticating with the voice server pub token: String, /// Url of the livekit server to connect to pub url: String, } /// Voice state for a channel pub struct ChannelVoiceState { pub id: String, /// The states of the users who are connected to the channel pub participants: Vec, } /// Join a voice channel pub struct DataJoinCall { /// Name of the node to join pub node: Option, /// Whether to force disconnect any other existing voice connections /// /// Useful for disconnecting on another device and joining on a new. pub force_disconnect: Option, /// Users which should be notified of the call starting /// /// Only used when the user is the first one connected. pub recipients: Option>, } ); impl Channel { /// Get a reference to this channel's id pub fn id(&self) -> &str { match self { Channel::DirectMessage { id, .. } | Channel::Group { id, .. } | Channel::SavedMessages { id, .. } | Channel::TextChannel { id, .. } => id, } } /// This returns a Result because the recipient name can't be determined here without a db call, /// which can't be done since this is models, which can't reference the database crate. /// /// If it returns None, you need to fetch the name from the db. pub fn name(&self) -> Option<&str> { match self { Channel::DirectMessage { .. } => None, Channel::SavedMessages { .. } => Some("Saved Messages"), Channel::TextChannel { name, .. } | Channel::Group { name, .. } => Some(name), } } }