Integrate voso, join_call route for channels.

This commit is contained in:
Paul
2021-03-31 11:48:52 +01:00
parent 37df18dbf7
commit 60731e1c70
9 changed files with 120 additions and 44 deletions

View File

@@ -0,0 +1,65 @@
use crate::database::*;
use crate::util::result::{Error, Result};
use crate::util::variables::{USE_VOSO, VOSO_URL, VOSO_MANAGE_TOKEN};
use serde::{Serialize, Deserialize};
use rocket_contrib::json::JsonValue;
#[derive(Serialize, Deserialize)]
struct CreateUserResponse {
token: String
}
#[post("/<target>/join_call")]
pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
if !*USE_VOSO {
return Err(Error::VosoUnavailable)
}
let target = target.fetch_channel().await?;
let perm = permissions::PermissionCalculator::new(&user)
.with_channel(&target)
.for_channel()
.await?;
if !perm.get_voice_call() {
return Err(Error::MissingPermission)
}
// To join a call:
// - Check if the room exists.
// - If not, create it.
let client = reqwest::Client::new();
if let Err(error) = client
.get(&format!("{}/room/{}", *VOSO_URL, target.id()))
.header(reqwest::header::AUTHORIZATION, VOSO_MANAGE_TOKEN.to_string())
.send()
.await {
if error.status() == Some(reqwest::StatusCode::NOT_FOUND) {
if let Err(_) = client
.post(&format!("{}/room/{}", *VOSO_URL, target.id()))
.header(reqwest::header::AUTHORIZATION, VOSO_MANAGE_TOKEN.to_string())
.send()
.await {
return Err(Error::VosoUnavailable)
}
} else {
return Err(Error::VosoUnavailable)
}
}
// Then create a user for the room.
if let Ok(response) = client
.post(&format!("{}/room/{}/user/{}", *VOSO_URL, target.id(), user.id))
.header(reqwest::header::AUTHORIZATION, VOSO_MANAGE_TOKEN.to_string())
.send()
.await {
let res: CreateUserResponse = response.json()
.await
.map_err(|_| Error::InvalidOperation)?;
Ok(json!(res))
} else {
Err(Error::VosoUnavailable)
}
}

View File

@@ -5,6 +5,7 @@ mod fetch_channel;
mod group_add_member;
mod group_create;
mod group_remove_member;
mod join_call;
mod message_delete;
mod message_edit;
mod message_fetch;
@@ -24,6 +25,7 @@ pub fn routes() -> Vec<Route> {
message_delete::req,
group_create::req,
group_add_member::req,
group_remove_member::req
group_remove_member::req,
join_call::req,
]
}

View File

@@ -1,6 +1,6 @@
use crate::util::variables::{
AUTUMN_URL, DISABLE_REGISTRATION, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY, USE_AUTUMN,
USE_EMAIL, USE_HCAPTCHA, VAPID_PUBLIC_KEY,
USE_EMAIL, USE_HCAPTCHA, VAPID_PUBLIC_KEY, USE_VOSO, VOSO_URL
};
use mongodb::bson::doc;
@@ -9,7 +9,7 @@ use rocket_contrib::json::JsonValue;
#[get("/")]
pub async fn root() -> JsonValue {
json!({
"revolt": "0.3.3-alpha.8",
"revolt": "0.4.0-alpha.0",
"features": {
"registration": !*DISABLE_REGISTRATION,
"captcha": {
@@ -21,6 +21,10 @@ pub async fn root() -> JsonValue {
"autumn": {
"enabled": *USE_AUTUMN,
"url": *AUTUMN_URL
},
"voso": {
"enabled": *USE_VOSO,
"url": *VOSO_URL
}
},
"ws": *EXTERNAL_WS_URL,