diff --git a/crates/bonfire/src/events/impl.rs b/crates/bonfire/src/events/impl.rs index e2bd1456..4f6bf905 100644 --- a/crates/bonfire/src/events/impl.rs +++ b/crates/bonfire/src/events/impl.rs @@ -4,7 +4,7 @@ use futures::future::join_all; use revolt_database::{ events::client::{EventV1, ReadyPayloadFields}, util::permissions::DatabasePermissionQuery, - voice::{delete_voice_state, get_voice_channel_members, get_voice_state, get_channel_voice_state}, + voice::get_channel_voice_state, Channel, Database, Member, MemberCompositeKey, Presence, RelationshipStatus, }; use revolt_models::v0; @@ -21,7 +21,7 @@ impl Cache { pub async fn can_view_channel(&self, db: &Database, channel: &Channel) -> bool { #[allow(deprecated)] match &channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { + Channel::TextChannel { server, .. } => { let member = self.members.get(server); let server = self.servers.get(server); let mut query = @@ -298,20 +298,14 @@ impl State { let id = &id.to_string(); for (channel_id, channel) in &self.cache.channels { - #[allow(deprecated)] - match channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - if server == id { - channel_ids.insert(channel_id.clone()); + if channel.server() == Some(id) { + channel_ids.insert(channel_id.clone()); - if self.cache.can_view_channel(db, channel).await { - added_channels.push(channel_id.clone()); - } else { - removed_channels.push(channel_id.clone()); - } - } + if self.cache.can_view_channel(db, channel).await { + added_channels.push(channel_id.clone()); + } else { + removed_channels.push(channel_id.clone()); } - _ => {} } } diff --git a/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs b/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs index 7e8c0268..8d45c772 100644 --- a/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs +++ b/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs @@ -9,14 +9,13 @@ use crate::{ bson::{doc, from_bson, from_document, to_document, Bson, DateTime, Document}, options::FindOptions, }, - AbstractChannels, AbstractServers, Channel, Invite, MongoDb, User, DISCRIMINATOR_SEARCH_SPACE, + AbstractServers, Invite, MongoDb, User, DISCRIMINATOR_SEARCH_SPACE, }; use bson::{oid::ObjectId, to_bson}; use futures::StreamExt; use iso8601_timestamp::Timestamp; use rand::seq::SliceRandom; -use revolt_permissions::DEFAULT_WEBHOOK_PERMISSIONS; -use revolt_result::{Error, ErrorType}; +use revolt_permissions::{ChannelPermission, DEFAULT_WEBHOOK_PERMISSIONS}; use serde::{Deserialize, Serialize}; use unicode_segmentation::UnicodeSegmentation; @@ -1081,6 +1080,14 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { channel_id: String, } + #[allow(clippy::enum_variant_names)] + #[derive(serde::Serialize, serde::Deserialize)] + enum Channel { + Group { owner: String }, + TextChannel { server: String }, + VoiceChannel { server: String } + } + let webhooks = db .db() .collection::("channel_webhooks") @@ -1092,9 +1099,8 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .await; for webhook in webhooks { - #[allow(deprecated)] - match db.fetch_channel(&webhook.channel_id).await { - Ok(channel) => { + match db.col::("channels").find_one(doc! { "_id": &webhook.channel_id }).await.unwrap() { + Some(channel) => { let creator_id = match channel { Channel::Group { owner, .. } => owner, Channel::TextChannel { server, .. } @@ -1102,7 +1108,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { let server = db.fetch_server(&server).await.expect("server"); server.owner } - _ => unreachable!("not server or group channel!"), }; db.db() @@ -1120,17 +1125,13 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .await .expect("update webhook"); } - Err(Error { - error_type: ErrorType::NotFound, - .. - }) => { + None => { db.db() .collection::("channel_webhooks") .delete_one(doc! { "_id": webhook._id }) .await .expect("failed to delete invalid webhook"); } - Err(err) => panic!("{err:?}"), } } } @@ -1171,40 +1172,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .expect("failed to update users"); } - if revision <= 41 { - info!("Running migration [revision 32 / 26-01-2025]: Add `is_publishing` and `is_receiving` to members"); - - db.col::("server_members") - .update_many( - doc! {}, - doc! { - "$set": { - "is_publishing": true, - "is_receiving": true - } - } - ) - .await - .expect("Failed to update members"); - } - - if revision <= 42 { - info!("Running migration [revision 33 / 29-04-2025]: Convert all `VoiceChannel`'s into `TextChannel` "); - - db.col::("channels") - .update_many( - doc! { "channel_type": "VoiceChannel" }, - doc! { - "$set": { - "channel_type": "TextChannel", - "voice": {} - } - } - ) - .await - .expect("Failed to update voice channels"); - }; - if revision <= 43 { info!( "Running migration [revision 43 / 05-06-2025]: convert role ranks to uniform numbers." @@ -1262,6 +1229,41 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } } + if revision <= 46 { + info!("Running migration [revision 46 / 29-04-2025]: Convert all `VoiceChannel`'s into `TextChannel`"); + + db.col::("channels") + .update_many( + doc! { "channel_type": "VoiceChannel" }, + doc! { + "$set": { + "channel_type": "TextChannel", + "voice": {} + } + } + ) + .await + .expect("Failed to update voice channels"); + }; + + if revision <= 47 { + info!("Running migration [revision 47 / 29-04-2025]: Add Video to default permissions"); + + db.col::("servers") + .update_many( + doc! { }, + doc! { + "$bit": { + "default_permissions": { + "or": ChannelPermission::Video as i64 + }, + } + } + ) + .await + .expect("Failed to update voice channels"); + }; + // Reminder to update LATEST_REVISION when adding new migrations. LATEST_REVISION.max(revision) } diff --git a/crates/core/database/src/models/channels/model.rs b/crates/core/database/src/models/channels/model.rs index 01647ef3..dcaa7839 100644 --- a/crates/core/database/src/models/channels/model.rs +++ b/crates/core/database/src/models/channels/model.rs @@ -9,8 +9,7 @@ use serde::{Deserialize, Serialize}; use ulid::Ulid; use crate::{ - events::client::EventV1, Database, File, PartialServer, - Server, SystemMessage, User, AMQP, + events::client::EventV1, Database, File, PartialServer, Server, SystemMessage, User, AMQP, }; #[cfg(feature = "mongodb")] @@ -112,37 +111,6 @@ auto_derived!( #[serde(skip_serializing_if = "Option::is_none")] voice: Option, }, - #[deprecated = "Use TextChannel { voice } instead"] - VoiceChannel { - /// Unique Id - #[serde(rename = "_id")] - id: String, - /// Id of the server this channel belongs to - server: String, - - /// Display name of the channel - name: String, - #[serde(skip_serializing_if = "Option::is_none")] - /// Channel description - description: Option, - /// Custom icon attachment - #[serde(skip_serializing_if = "Option::is_none")] - icon: Option, - - /// Default permissions assigned to users in this channel - #[serde(skip_serializing_if = "Option::is_none")] - default_permissions: Option, - /// Permissions assigned based on role to this channel - #[serde( - default = "HashMap::::new", - skip_serializing_if = "HashMap::::is_empty" - )] - role_permissions: HashMap, - - /// Whether this channel is marked as not safe for work - #[serde(skip_serializing_if = "crate::if_false", default)] - nsfw: bool, - }, } #[derive(Default)] @@ -449,15 +417,14 @@ impl Channel { Channel::DirectMessage { id, .. } | Channel::Group { id, .. } | Channel::SavedMessages { id, .. } - | Channel::TextChannel { id, .. } - | Channel::VoiceChannel { id, .. } => id, + | Channel::TextChannel { id, .. } => id, } } /// Clone this channel's server id pub fn server(&self) -> Option<&str> { match self { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { + Channel::TextChannel { server, .. } => { Some(server) } _ => None, @@ -467,7 +434,7 @@ impl Channel { /// Gets this channel's voice information pub fn voice(&self) -> Option> { match self { - Self::DirectMessage { .. } | Channel::VoiceChannel { .. } => { + Self::DirectMessage { .. } | Self::Group { .. } => { Some(Cow::Owned(VoiceInformation::default())) } Self::TextChannel { @@ -659,7 +626,6 @@ impl Channel { voice.replace(v); } } - Self::VoiceChannel { .. } => {} } } diff --git a/crates/core/database/src/models/messages/model.rs b/crates/core/database/src/models/messages/model.rs index d265c052..38d3167b 100644 --- a/crates/core/database/src/models/messages/model.rs +++ b/crates/core/database/src/models/messages/model.rs @@ -115,7 +115,10 @@ auto_derived!( #[serde(rename = "message_unpinned")] MessageUnpinned { id: String, by: String }, #[serde(rename = "call_started")] - CallStarted { by: String, finished_at: Option }, + CallStarted { + by: String, + finished_at: Option, + }, } /// Name and / or avatar override information @@ -328,9 +331,7 @@ impl Message { } let server_id = match channel { - Channel::TextChannel { ref server, .. } | Channel::VoiceChannel { ref server, .. } => { - Some(server.clone()) - } + Channel::TextChannel { ref server, .. } => Some(server.clone()), _ => None, }; @@ -488,8 +489,7 @@ impl Message { user_mentions.retain(|m| recipients_hash.contains(m)); role_mentions.clear(); } - Channel::TextChannel { ref server, .. } - | Channel::VoiceChannel { ref server, .. } => { + Channel::TextChannel { ref server, .. }=> { let mentions_vec = Vec::from_iter(user_mentions.iter().cloned()); let valid_members = db.fetch_members(server.as_str(), &mentions_vec[..]).await; @@ -681,7 +681,6 @@ impl Message { ) .await?; - if !self.has_suppressed_notifications() && (self.mentions.is_some() || self.contains_mass_push_mention()) { @@ -797,7 +796,7 @@ impl Message { query: MessageQuery, perspective: &User, include_users: Option, - server_id: Option, + server_id: Option<&str>, ) -> Result { let messages: Vec = db .fetch_messages(query) @@ -840,9 +839,7 @@ impl Message { v0::SystemMessage::MessageUnpinned { by, .. } => { users.push(by.clone()); } - v0::SystemMessage::CallStarted { by, .. } => { - users.push(by.clone()) - } + v0::SystemMessage::CallStarted { by, .. } => users.push(by.clone()), } } users @@ -857,7 +854,7 @@ impl Message { users, members: if let Some(server_id) = server_id { Some( - db.fetch_members(&server_id, &user_ids) + db.fetch_members(server_id, &user_ids) .await? .into_iter() .map(Into::into) diff --git a/crates/core/database/src/models/server_members/model.rs b/crates/core/database/src/models/server_members/model.rs index 4e8521f1..6ff439b4 100644 --- a/crates/core/database/src/models/server_members/model.rs +++ b/crates/core/database/src/models/server_members/model.rs @@ -4,10 +4,18 @@ use revolt_result::{create_error, Result}; use crate::voice::get_channel_voice_state; use crate::{ - events::client::EventV1, if_false, util::permissions::DatabasePermissionQuery, Channel, + events::client::EventV1, util::permissions::DatabasePermissionQuery, Channel, Database, File, Server, SystemMessage, User, }; +fn default_true() -> bool { + true +} + +fn is_true(x: &bool) -> bool { + *x +} + auto_derived_partial!( /// Server Member pub struct Member { @@ -33,11 +41,11 @@ auto_derived_partial!( pub timeout: Option, /// Whether the member is server-wide voice muted - #[serde(skip_serializing_if = "Option::is_none")] - pub can_publish: Option, + #[serde(skip_serializing_if = "is_true", default = "default_true")] + pub can_publish: bool, /// Whether the member is server-wide voice deafened - #[serde(skip_serializing_if = "Option::is_none")] - pub can_receive: Option, + #[serde(skip_serializing_if = "is_true", default = "default_true")] + pub can_receive: bool, }, "PartialMember" ); @@ -79,8 +87,8 @@ impl Default for Member { avatar: None, roles: vec![], timeout: None, - can_publish: None, - can_receive: None, + can_publish: true, + can_receive: true, } } } @@ -211,8 +219,8 @@ impl Member { FieldsMember::Nickname => self.nickname = None, FieldsMember::Roles => self.roles.clear(), FieldsMember::Timeout => self.timeout = None, - FieldsMember::CanReceive => self.can_receive = None, - FieldsMember::CanPublish => self.can_publish = None, + FieldsMember::CanReceive => self.can_receive = true, + FieldsMember::CanPublish => self.can_publish = true, } } diff --git a/crates/core/database/src/tasks/ack.rs b/crates/core/database/src/tasks/ack.rs index c12e41f3..c26de03b 100644 --- a/crates/core/database/src/tasks/ack.rs +++ b/crates/core/database/src/tasks/ack.rs @@ -14,7 +14,7 @@ use validator::HasLen; use revolt_result::Result; use super::DelayedTask; -use crate::Channel::{TextChannel, VoiceChannel}; +use crate::Channel::TextChannel; /// Enumeration of possible events #[derive(Debug, Eq, PartialEq)] @@ -191,17 +191,14 @@ pub async fn handle_ack_event( .await .expect("Failed to fetch channel from db"); - match channel { - TextChannel { server, .. } | VoiceChannel { server, .. } => { - if let Err(err) = - amqp.mass_mention_message_sent(server, mass_mentions).await - { - revolt_config::capture_error(&err); - } - } - _ => { - panic!("Unknown channel type when sending mass mention event"); + if let TextChannel { server, .. } = channel { + if let Err(err) = + amqp.mass_mention_message_sent(server, mass_mentions).await + { + revolt_config::capture_error(&err); } + } else { + panic!("Unknown channel type when sending mass mention event"); } } } diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index 6e60fe62..832081a0 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -202,25 +202,6 @@ impl From for Channel { nsfw, voice: voice.map(|voice| voice.into()), }, - crate::Channel::VoiceChannel { - id, - server, - name, - description, - icon, - default_permissions, - role_permissions, - nsfw, - } => Channel::VoiceChannel { - id, - server, - name, - description, - icon: icon.map(|file| file.into()), - default_permissions, - role_permissions, - nsfw, - }, } } } @@ -285,25 +266,6 @@ impl From for crate::Channel { nsfw, voice: voice.map(|voice| voice.into()), }, - Channel::VoiceChannel { - id, - server, - name, - description, - icon, - default_permissions, - role_permissions, - nsfw, - } => crate::Channel::VoiceChannel { - id, - server, - name, - description, - icon: icon.map(|file| file.into()), - default_permissions, - role_permissions, - nsfw, - }, } } } diff --git a/crates/core/database/src/util/bulk_permissions.rs b/crates/core/database/src/util/bulk_permissions.rs index 99dda7e6..976b0d69 100644 --- a/crates/core/database/src/util/bulk_permissions.rs +++ b/crates/core/database/src/util/bulk_permissions.rs @@ -159,9 +159,7 @@ impl<'z> BulkDatabasePermissionQuery<'z> { Channel::DirectMessage { .. } => ChannelType::DirectMessage, Channel::Group { .. } => ChannelType::Group, Channel::SavedMessages { .. } => ChannelType::SavedMessages, - Channel::TextChannel { .. } | Channel::VoiceChannel { .. } => { - ChannelType::ServerChannel - } + Channel::TextChannel { .. } => ChannelType::ServerChannel, } } else { ChannelType::Unknown diff --git a/crates/core/database/src/util/permissions.rs b/crates/core/database/src/util/permissions.rs index 99200105..85db4826 100644 --- a/crates/core/database/src/util/permissions.rs +++ b/crates/core/database/src/util/permissions.rs @@ -187,17 +187,17 @@ impl PermissionQuery for DatabasePermissionQuery<'_> { async fn do_we_have_publish_overwrites(&mut self) -> bool { if let Some(member) = &self.member { - member.can_publish.unwrap_or(false) + member.can_publish } else { - false + true } } async fn do_we_have_receive_overwrites(&mut self) -> bool { if let Some(member) = &self.member { - member.can_receive.unwrap_or(false) + member.can_receive } else { - false + true } } @@ -216,9 +216,7 @@ impl PermissionQuery for DatabasePermissionQuery<'_> { Cow::Borrowed(Channel::SavedMessages { .. }) | Cow::Owned(Channel::SavedMessages { .. }) => ChannelType::SavedMessages, Cow::Borrowed(Channel::TextChannel { .. }) - | Cow::Owned(Channel::TextChannel { .. }) - | Cow::Borrowed(Channel::VoiceChannel { .. }) - | Cow::Owned(Channel::VoiceChannel { .. }) => ChannelType::ServerChannel, + | Cow::Owned(Channel::TextChannel { .. }) => ChannelType::ServerChannel, } } else { ChannelType::Unknown @@ -349,9 +347,7 @@ impl PermissionQuery for DatabasePermissionQuery<'_> { #[allow(deprecated)] match channel { Cow::Borrowed(Channel::TextChannel { server, .. }) - | Cow::Owned(Channel::TextChannel { server, .. }) - | Cow::Borrowed(Channel::VoiceChannel { server, .. }) - | Cow::Owned(Channel::VoiceChannel { server, .. }) => { + | Cow::Owned(Channel::TextChannel { server, .. }) => { if let Some(known_server) = // I'm not sure why I can't just pattern match both at once here? // It throws some weird error and the provided fix doesn't work :/ diff --git a/crates/core/database/src/voice/mod.rs b/crates/core/database/src/voice/mod.rs index def56db1..11be9020 100644 --- a/crates/core/database/src/voice/mod.rs +++ b/crates/core/database/src/voice/mod.rs @@ -129,14 +129,19 @@ pub async fn get_user_voice_channel_in_server( .to_internal_error() } -pub fn get_allowed_sources(limits: &FeaturesLimits, permissions: PermissionValue) -> Vec<&'static str> { +pub fn get_allowed_sources( + limits: &FeaturesLimits, + permissions: PermissionValue, +) -> Vec<&'static str> { let mut allowed_sources = Vec::new(); if permissions.has(ChannelPermission::Speak as u64) { + println!("can speak"); allowed_sources.push("microphone") }; if permissions.has(ChannelPermission::Video as u64) && limits.video { + println!("can video"); allowed_sources.extend(["camera", "screen_share", "screen_share_audio"]); }; @@ -362,9 +367,7 @@ pub async fn sync_voice_permissions( .iter() .flatten() { - let user = Reference::from_unchecked(&user_id) - .as_user(db) - .await?; + let user = Reference::from_unchecked(user_id).as_user(db).await?; sync_user_voice_permissions(db, voice_client, &node, &user, channel, server, role_id) .await?; diff --git a/crates/core/database/src/voice/voice_client.rs b/crates/core/database/src/voice/voice_client.rs index cf76b44d..36defd79 100644 --- a/crates/core/database/src/voice/voice_client.rs +++ b/crates/core/database/src/voice/voice_client.rs @@ -1,4 +1,4 @@ -use crate::models::{Channel, User}; +use crate::{models::{Channel, User}, Database}; use livekit_api::{ access_token::{AccessToken, VideoGrants}, services::room::{CreateRoomOptions, RoomClient as InnerRoomClient, UpdateParticipantOptions}, @@ -63,6 +63,7 @@ impl VoiceClient { pub async fn create_token( &self, node: &str, + db: &Database, user: &User, permissions: PermissionValue, channel: &Channel, @@ -75,11 +76,12 @@ impl VoiceClient { AccessToken::with_api_key(&room.node.key, &room.node.secret) .with_name(&format!("{}#{}", user.username, user.discriminator)) .with_identity(&user.id) - .with_metadata(&serde_json::to_string(&user).to_internal_error()?) + .with_metadata(&serde_json::to_string(&user.clone().into(db, None).await).to_internal_error()?) .with_ttl(Duration::from_secs(10)) .with_grants(VideoGrants { room_join: true, can_publish: true, + can_publish_data: false, can_publish_sources: allowed_sources .into_iter() .map(ToString::to_string) diff --git a/crates/core/models/src/v0/channels.rs b/crates/core/models/src/v0/channels.rs index 4c6ddcf0..7281bd9a 100644 --- a/crates/core/models/src/v0/channels.rs +++ b/crates/core/models/src/v0/channels.rs @@ -113,43 +113,6 @@ auto_derived!( #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] voice: Option, }, - #[deprecated = "Use TextChannel { voice } instead"] - VoiceChannel { - /// 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, - #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] - /// Channel description - description: Option, - /// Custom icon attachment - #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] - icon: 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 a channel @@ -294,7 +257,7 @@ auto_derived!( permissions: u64, }, Field { - /// Allow / deny values to set for members in this `TextChannel` or `VoiceChannel` + /// Allow / deny values to set for members in this server channel permissions: Override, }, } @@ -345,8 +308,7 @@ impl Channel { Channel::DirectMessage { id, .. } | Channel::Group { id, .. } | Channel::SavedMessages { id, .. } - | Channel::TextChannel { id, .. } - | Channel::VoiceChannel { id, .. } => id, + | Channel::TextChannel { id, .. } => id, } } @@ -358,9 +320,7 @@ impl Channel { match self { Channel::DirectMessage { .. } => None, Channel::SavedMessages { .. } => Some("Saved Messages"), - Channel::TextChannel { name, .. } - | Channel::Group { name, .. } - | Channel::VoiceChannel { name, .. } => Some(name), + Channel::TextChannel { name, .. } | Channel::Group { name, .. } => Some(name), } } } diff --git a/crates/core/models/src/v0/server_members.rs b/crates/core/models/src/v0/server_members.rs index de49bebb..bdd28a31 100644 --- a/crates/core/models/src/v0/server_members.rs +++ b/crates/core/models/src/v0/server_members.rs @@ -1,7 +1,6 @@ use std::collections::HashMap; use super::{File, Role, User}; -use crate::if_false; use iso8601_timestamp::Timestamp; use once_cell::sync::Lazy; @@ -32,6 +31,14 @@ pub static RE_COLOUR: Lazy = Lazy::new(|| { Regex::new(r"(?i)^(?:[a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+|(repeating-)?(linear|conic|radial)-gradient\(([a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+|\d+deg)([ ]+(\d{1,3}%|0))?(,[ ]*([a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+)([ ]+(\d{1,3}%|0))?)+\))$").unwrap() }); +fn default_true() -> bool { + true +} + +fn is_true(x: &bool) -> bool { + *x +} + auto_derived_partial!( /// Server Member pub struct Member { @@ -60,11 +67,11 @@ auto_derived_partial!( pub timeout: Option, /// Whether the member is server-wide voice muted - #[serde(skip_serializing_if = "Option::is_none")] - pub can_publish: Option, + #[serde(skip_serializing_if = "is_true", default = "default_true")] + pub can_publish: bool, /// Whether the member is server-wide voice deafened - #[serde(skip_serializing_if = "Option::is_none")] - pub can_receive: Option, + #[serde(skip_serializing_if = "is_true", default = "default_true")] + pub can_receive: bool, }, "PartialMember" ); diff --git a/crates/core/permissions/src/impl.rs b/crates/core/permissions/src/impl.rs index f175d6bd..064fee3e 100644 --- a/crates/core/permissions/src/impl.rs +++ b/crates/core/permissions/src/impl.rs @@ -63,6 +63,7 @@ pub async fn calculate_server_permissions(query: &mut P) -> if !query.do_we_have_publish_overwrites().await { permissions.revoke(ChannelPermission::Speak as u64); + permissions.revoke(ChannelPermission::Video as u64); } if !query.do_we_have_receive_overwrites().await { diff --git a/crates/core/permissions/src/models/server.rs b/crates/core/permissions/src/models/server.rs index e6355eed..8391029a 100644 --- a/crates/core/permissions/src/models/server.rs +++ b/crates/core/permissions/src/models/server.rs @@ -39,7 +39,7 @@ pub enum DataPermissionPoly { permissions: u64, }, Field { - /// Allow / deny values to set for members in this `TextChannel` or `VoiceChannel` + /// Allow / deny values to set for members in this server channel permissions: Override, }, } diff --git a/crates/daemons/pushd/src/consumers/outbound/apn.rs b/crates/daemons/pushd/src/consumers/outbound/apn.rs index cf8cea17..02f9c0da 100644 --- a/crates/daemons/pushd/src/consumers/outbound/apn.rs +++ b/crates/daemons/pushd/src/consumers/outbound/apn.rs @@ -67,7 +67,7 @@ impl ApnsOutboundConsumer { match ¬ification.channel { Channel::DirectMessage { .. } => notification.author.clone(), Channel::Group { name, .. } => format!("{}, #{}", notification.author, name), - Channel::TextChannel { name, .. } | Channel::VoiceChannel { name, .. } => { + Channel::TextChannel { name, .. } => { format!("{} in #{}", notification.author, name) } _ => "Unknown".to_string(), diff --git a/crates/daemons/pushd/src/consumers/outbound/fcm.rs b/crates/daemons/pushd/src/consumers/outbound/fcm.rs index 10e174d4..b13829c9 100644 --- a/crates/daemons/pushd/src/consumers/outbound/fcm.rs +++ b/crates/daemons/pushd/src/consumers/outbound/fcm.rs @@ -31,7 +31,7 @@ impl FcmOutboundConsumer { match ¬ification.channel { Channel::DirectMessage { .. } => notification.author.clone(), Channel::Group { name, .. } => format!("{}, #{}", notification.author, name), - Channel::TextChannel { name, .. } | Channel::VoiceChannel { name, .. } => { + Channel::TextChannel { name, .. } => { format!("{} in #{}", notification.author, name) } _ => "Unknown".to_string(), diff --git a/crates/daemons/voice-ingress/src/api.rs b/crates/daemons/voice-ingress/src/api.rs index a8e1e0fe..9004a17c 100644 --- a/crates/daemons/voice-ingress/src/api.rs +++ b/crates/daemons/voice-ingress/src/api.rs @@ -59,7 +59,7 @@ pub async fn ingress( let channel_id = channel_id.to_internal_error()?; let user_id = user_id.to_internal_error()?; - let channel = Reference::from_unchecked(&channel_id) + let channel = Reference::from_unchecked(channel_id) .as_channel(db) .await?; @@ -86,7 +86,7 @@ pub async fn ingress( // First user who joined - send call started system message. if event.room.as_ref().unwrap().num_participants == 1 { - let user = Reference::from_unchecked(&user_id) + let user = Reference::from_unchecked(user_id) .as_user(db) .await?; @@ -120,7 +120,7 @@ pub async fn ingress( let channel_id = channel_id.to_internal_error()?; let user_id = user_id.to_internal_error()?; - let channel = Reference::from_unchecked(&channel_id) + let channel = Reference::from_unchecked(channel_id) .as_channel(db) .await?; @@ -179,11 +179,11 @@ pub async fn ingress( let user_id = user_id.to_internal_error()?; let track = event.track.as_ref().to_internal_error()?; - let channel = Reference::from_unchecked(&channel_id) + let channel = Reference::from_unchecked(channel_id) .as_channel(db) .await?; - let user = Reference::from_unchecked(&user_id) + let user = Reference::from_unchecked(user_id) .as_user(db) .await?; diff --git a/crates/delta/src/routes/channels/channel_delete.rs b/crates/delta/src/routes/channels/channel_delete.rs index 1282f658..9a2309a7 100644 --- a/crates/delta/src/routes/channels/channel_delete.rs +++ b/crates/delta/src/routes/channels/channel_delete.rs @@ -1,5 +1,10 @@ use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{delete_voice_state, get_channel_node, get_voice_channel_members, is_in_voice_channel, VoiceClient}, Channel, Database, PartialChannel, User, AMQP + util::{permissions::DatabasePermissionQuery, reference::Reference}, + voice::{ + delete_voice_state, get_channel_node, get_voice_channel_members, is_in_voice_channel, + VoiceClient, + }, + Channel, Database, PartialChannel, User, AMQP, }; use revolt_models::v0; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; @@ -29,16 +34,18 @@ pub async fn delete( #[allow(deprecated)] match &channel { Channel::SavedMessages { .. } => Err(create_error!(NoEffect))?, - Channel::DirectMessage { .. } => channel - .update( - db, - PartialChannel { - active: Some(false), - ..Default::default() - }, - vec![], - ) - .await?, + Channel::DirectMessage { .. } => { + channel + .update( + db, + PartialChannel { + active: Some(false), + ..Default::default() + }, + vec![], + ) + .await? + } Channel::Group { .. } => { channel .remove_user_from_group( @@ -53,11 +60,13 @@ pub async fn delete( if is_in_voice_channel(&user.id, channel.id()).await? { let node = get_channel_node(channel.id()).await?.unwrap(); - voice_client.remove_user(&node, &user.id, channel.id()).await?; + voice_client + .remove_user(&node, &user.id, channel.id()) + .await?; delete_voice_state(channel.id(), None, &user.id).await?; }; - }, - Channel::TextChannel { .. } | Channel::VoiceChannel { .. } => { + } + Channel::TextChannel { .. } => { permissions.throw_if_lacking_channel_permission(ChannelPermission::ManageChannel)?; channel.delete(db).await?; diff --git a/crates/delta/src/routes/channels/group_remove_member.rs b/crates/delta/src/routes/channels/group_remove_member.rs index 21e71714..0ded3ef3 100644 --- a/crates/delta/src/routes/channels/group_remove_member.rs +++ b/crates/delta/src/routes/channels/group_remove_member.rs @@ -1,4 +1,4 @@ -use revolt_database::{util::reference::Reference, voice::{delete_voice_state, get_channel_node, is_in_voice_channel, raise_if_in_voice, VoiceClient}, Channel, Database, User, AMQP}; +use revolt_database::{util::reference::Reference, voice::{delete_voice_state, get_channel_node, is_in_voice_channel, VoiceClient}, Channel, Database, User, AMQP}; use revolt_permissions::ChannelPermission; use revolt_result::{create_error, Result}; diff --git a/crates/delta/src/routes/channels/message_query.rs b/crates/delta/src/routes/channels/message_query.rs index 19b1d401..ff66e375 100644 --- a/crates/delta/src/routes/channels/message_query.rs +++ b/crates/delta/src/routes/channels/message_query.rs @@ -1,6 +1,6 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, - Channel, Database, Message, MessageFilter, MessageQuery, MessageTimePeriod, User, + Database, Message, MessageFilter, MessageQuery, MessageTimePeriod, User, }; use revolt_models::v0::{self, MessageSort}; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; @@ -65,13 +65,7 @@ pub async fn query( }, &user, include_users, - #[allow(deprecated)] - match channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - Some(server) - } - _ => None, - }, + channel.server(), ) .await .map(Json) diff --git a/crates/delta/src/routes/channels/message_search.rs b/crates/delta/src/routes/channels/message_search.rs index 6adb1837..74bc2017 100644 --- a/crates/delta/src/routes/channels/message_search.rs +++ b/crates/delta/src/routes/channels/message_search.rs @@ -1,6 +1,6 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, - Channel, Database, Message, MessageFilter, MessageQuery, MessageTimePeriod, User, + Database, Message, MessageFilter, MessageQuery, MessageTimePeriod, User, }; use revolt_models::v0; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; @@ -31,7 +31,7 @@ pub async fn search( })?; if options.query.is_some() && options.pinned.is_some() { - return Err(create_error!(InvalidOperation)) + return Err(create_error!(InvalidOperation)); } let channel = target.as_channel(db).await?; @@ -69,13 +69,7 @@ pub async fn search( }, &user, include_users, - #[allow(deprecated)] - match channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - Some(server) - } - _ => None, - }, + channel.server(), ) .await .map(Json) diff --git a/crates/delta/src/routes/channels/permissions_set.rs b/crates/delta/src/routes/channels/permissions_set.rs index 88f5f34f..545f6bb8 100644 --- a/crates/delta/src/routes/channels/permissions_set.rs +++ b/crates/delta/src/routes/channels/permissions_set.rs @@ -1,5 +1,5 @@ use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{sync_voice_permissions, VoiceClient}, Channel, Database, User + util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{sync_voice_permissions, VoiceClient}, Database, User }; use revolt_models::v0; use revolt_permissions::{calculate_channel_permissions, ChannelPermission, Override}; @@ -10,7 +10,7 @@ use rocket::{serde::json::Json, State}; /// /// Sets permissions for the specified role in this channel. /// -/// Channel must be a `TextChannel` or `VoiceChannel`. +/// Channel must be a `TextChannel`. #[openapi(tag = "Channel Permissions")] #[put("//permissions/", data = "", rank = 2)] pub async fn set_role_permissions( diff --git a/crates/delta/src/routes/channels/permissions_set_default.rs b/crates/delta/src/routes/channels/permissions_set_default.rs index 3cfcf1a0..ad14a88e 100644 --- a/crates/delta/src/routes/channels/permissions_set_default.rs +++ b/crates/delta/src/routes/channels/permissions_set_default.rs @@ -10,7 +10,7 @@ use rocket::{serde::json::Json, State}; /// /// Sets permissions for the default role in this channel. /// -/// Channel must be a `Group`, `TextChannel` or `VoiceChannel`. +/// Channel must be a `Group` or `TextChannel`. #[openapi(tag = "Channel Permissions")] #[put("//permissions/default", data = "", rank = 1)] pub async fn set_default_channel_permissions( diff --git a/crates/delta/src/routes/channels/voice_join.rs b/crates/delta/src/routes/channels/voice_join.rs index 8b6ae389..58d35fd7 100644 --- a/crates/delta/src/routes/channels/voice_join.rs +++ b/crates/delta/src/routes/channels/voice_join.rs @@ -93,7 +93,7 @@ pub async fn call( } let token = voice_client - .create_token(&node, &user, current_permissions, &channel) + .create_token(&node, db, &user, current_permissions, &channel) .await?; let room = voice_client.create_room(&node, &channel).await?; diff --git a/crates/delta/src/routes/servers/member_edit.rs b/crates/delta/src/routes/servers/member_edit.rs index 9b0248a4..158d7c86 100644 --- a/crates/delta/src/routes/servers/member_edit.rs +++ b/crates/delta/src/routes/servers/member_edit.rs @@ -44,7 +44,7 @@ pub async fn edit( // Fetch server and member let mut server = server.as_server(db).await?; - let target_user = member.as_user(&db).await?; + let target_user = member.as_user(db).await?; let mut member = member.as_member(db, &server.id).await?; // Fetch our currrent permissions @@ -208,7 +208,7 @@ pub async fn edit( .create_room(&new_node, &new_voice_channel) .await?; let token = voice_client - .create_token(&new_node, &target_user, permissions, &new_voice_channel) + .create_token(&new_node, db, &target_user, permissions, &new_voice_channel) .await?; voice_client diff --git a/crates/delta/src/routes/servers/permissions_set_default.rs b/crates/delta/src/routes/servers/permissions_set_default.rs index aeeb50c6..863de71e 100644 --- a/crates/delta/src/routes/servers/permissions_set_default.rs +++ b/crates/delta/src/routes/servers/permissions_set_default.rs @@ -1,5 +1,5 @@ use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{sync_voice_permissions, VoiceClient}, Database, PartialServer, Server, User + util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{sync_voice_permissions, VoiceClient}, Database, PartialServer, User }; use revolt_models::v0; use revolt_permissions::{