Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43118c853c | ||
|
|
6ab264eb36 | ||
|
|
59af536e29 | ||
|
|
5c7eec68d0 |
@@ -35,7 +35,7 @@ pub async fn raise_if_in_voice(user: &User, channel_id: &str) -> Result<()> {
|
|||||||
.to_internal_error()?
|
.to_internal_error()?
|
||||||
> 0
|
> 0
|
||||||
{
|
{
|
||||||
Err(create_error!(NotConnected))
|
Err(create_error!(AlreadyConnected))
|
||||||
} else {
|
} else {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,40 +214,59 @@ pub async fn ingress(
|
|||||||
// forbid any size which goes over the limit and also limit the aspect ratio to stop people from making too tall or too wide and bypassing the limit.
|
// forbid any size which goes over the limit and also limit the aspect ratio to stop people from making too tall or too wide and bypassing the limit.
|
||||||
// TODO: figure out how to track audio stream quality
|
// TODO: figure out how to track audio stream quality
|
||||||
|
|
||||||
if event.event == "track_published"
|
if event.event == "track_published" {
|
||||||
&& (track.r#type == TrackType::Data as i32
|
let mut disconnect = false;
|
||||||
|| (track.r#type == TrackType::Video as i32
|
|
||||||
&& (user_limits.video_resolution[0] != 0
|
|
||||||
&& user_limits.video_resolution[1] != 0
|
|
||||||
&& track.width * track.height
|
|
||||||
> user_limits.video_resolution[0]
|
|
||||||
* user_limits.video_resolution[1])
|
|
||||||
|| (user_limits.video_aspect_ratio[0]
|
|
||||||
!= user_limits.video_aspect_ratio[1]
|
|
||||||
&& !(user_limits.video_aspect_ratio[0]
|
|
||||||
..=user_limits.video_aspect_ratio[1])
|
|
||||||
.contains(&(track.width as f32 / track.height as f32)))))
|
|
||||||
{
|
|
||||||
voice_client.remove_user(node, user_id, channel_id).await?;
|
|
||||||
delete_voice_state(channel_id, channel.server(), user_id).await?;
|
|
||||||
} else {
|
|
||||||
let partial = update_voice_state_tracks(
|
|
||||||
channel_id,
|
|
||||||
channel.server(),
|
|
||||||
user_id,
|
|
||||||
event.event == "track_published", // to avoid duplicating this entire case twice
|
|
||||||
track.source,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
EventV1::UserVoiceStateUpdate {
|
if track.r#type == TrackType::Data as i32 {
|
||||||
id: user_id.clone(),
|
log::debug!("User published data");
|
||||||
channel_id: channel_id.clone(),
|
disconnect = true;
|
||||||
data: partial,
|
};
|
||||||
}
|
|
||||||
.p(channel_id.clone())
|
if track.r#type == TrackType::Video as i32 {
|
||||||
.await;
|
if user_limits.video_resolution[0] != 0
|
||||||
|
&& user_limits.video_resolution[1] != 0
|
||||||
|
&& track.width * track.height
|
||||||
|
> user_limits.video_resolution[0] * user_limits.video_resolution[1]
|
||||||
|
{
|
||||||
|
log::debug!("User published video with out of bounds resolution");
|
||||||
|
disconnect = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
if user_limits.video_aspect_ratio[0] != user_limits.video_aspect_ratio[1]
|
||||||
|
&& !(user_limits.video_aspect_ratio[0]..=user_limits.video_aspect_ratio[1])
|
||||||
|
.contains(&(track.width as f32 / track.height as f32))
|
||||||
|
{
|
||||||
|
log::debug!("User published video with out of bounds aspect ratio");
|
||||||
|
disconnect = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
if disconnect {
|
||||||
|
log::debug!("Removing user {user_id} from channel {channel_id} {event:?} due to forbidden track.");
|
||||||
|
|
||||||
|
let _ = voice_client.remove_user(node, user_id, channel_id).await;
|
||||||
|
delete_voice_state(channel_id, channel.server(), user_id).await?;
|
||||||
|
|
||||||
|
return Ok(EmptyResponse);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
let partial = update_voice_state_tracks(
|
||||||
|
channel_id,
|
||||||
|
channel.server(),
|
||||||
|
user_id,
|
||||||
|
event.event == "track_published", // to avoid duplicating this entire case twice
|
||||||
|
track.source,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
EventV1::UserVoiceStateUpdate {
|
||||||
|
id: user_id.clone(),
|
||||||
|
channel_id: channel_id.clone(),
|
||||||
|
data: partial,
|
||||||
}
|
}
|
||||||
|
.p(channel_id.clone())
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -22,10 +22,11 @@ pub async fn delete_bot(
|
|||||||
bot.delete(db).await?;
|
bot.delete(db).await?;
|
||||||
|
|
||||||
for channel_id in get_user_voice_channels(&bot.id).await? {
|
for channel_id in get_user_voice_channels(&bot.id).await? {
|
||||||
let node = get_channel_node(&channel_id).await?.unwrap();
|
if let Some(node) = get_channel_node(&channel_id).await? {
|
||||||
let channel = Reference::from_unchecked(&channel_id).as_channel(db).await?;
|
let _ = voice_client.remove_user(&node, &bot.id, &channel_id).await;
|
||||||
|
}
|
||||||
|
|
||||||
voice_client.remove_user(&node, &bot.id, &channel_id).await?;
|
let channel = Reference::from_unchecked(&channel_id).as_channel(db).await?;
|
||||||
|
|
||||||
delete_voice_state(&channel_id, channel.server(), &bot.id).await?;
|
delete_voice_state(&channel_id, channel.server(), &bot.id).await?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,9 +48,10 @@ pub async fn remove_member(
|
|||||||
};
|
};
|
||||||
|
|
||||||
if is_in_voice_channel(&user.id, channel.id()).await? {
|
if is_in_voice_channel(&user.id, channel.id()).await? {
|
||||||
let node = get_channel_node(channel.id()).await?.unwrap();
|
if let Some(node) = get_channel_node(channel.id()).await? {
|
||||||
|
let _ = 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?;
|
delete_voice_state(channel.id(), None, &user.id).await?;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -79,15 +79,15 @@ pub async fn call(
|
|||||||
// should only ever loop once but just to cover our backs.
|
// should only ever loop once but just to cover our backs.
|
||||||
|
|
||||||
for channel_id in get_user_voice_channels(&user.id).await? {
|
for channel_id in get_user_voice_channels(&user.id).await? {
|
||||||
let node = get_channel_node(&channel_id).await?.unwrap();
|
if let Some(node) = get_channel_node(&channel_id).await? {
|
||||||
|
// if this errors its just a mismatching state - ignore and proceed to still delete our state
|
||||||
|
let _ = voice_client.remove_user(&node, &user.id, &channel_id).await;
|
||||||
|
};
|
||||||
|
|
||||||
let channel = Reference::from_unchecked(&channel_id)
|
let channel = Reference::from_unchecked(&channel_id)
|
||||||
.as_channel(db)
|
.as_channel(db)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
voice_client
|
|
||||||
.remove_user(&node, &user.id, &channel_id)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
delete_voice_state(&channel_id, channel.server(), &user.id).await?;
|
delete_voice_state(&channel_id, channel.server(), &user.id).await?;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -59,9 +59,9 @@ pub async fn ban(
|
|||||||
|
|
||||||
// If the member is in a voice channel while banned kick them from the voice channel
|
// If the member is in a voice channel while banned kick them from the voice channel
|
||||||
if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? {
|
if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? {
|
||||||
let node = get_channel_node(&channel_id).await?.unwrap();
|
if let Some(node) = get_channel_node(&channel_id).await?.unwrap() {
|
||||||
|
let _ = 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, Some(&server.id), &user.id).await?
|
delete_voice_state(&channel_id, Some(&server.id), &user.id).await?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,9 @@ pub async fn kick(
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? {
|
if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? {
|
||||||
let node = get_channel_node(&channel_id).await?.unwrap();
|
if let Some(node) = get_channel_node(&channel_id).await? {
|
||||||
|
let _ = 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, Some(&server.id), &user.id).await?;
|
delete_voice_state(&channel_id, Some(&server.id), &user.id).await?;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ pub async fn delete(
|
|||||||
} else {
|
} else {
|
||||||
if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? {
|
if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? {
|
||||||
if server.channels.iter().any(|c| c == &channel_id) {
|
if server.channels.iter().any(|c| c == &channel_id) {
|
||||||
let node = get_channel_node(&channel_id).await?.unwrap();
|
if let Some(node) = get_channel_node(&channel_id).await? {
|
||||||
|
let _ = 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, Some(&server.id), &user.id).await?;
|
delete_voice_state(&channel_id, Some(&server.id), &user.id).await?;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user