fix: move call system message to daemon,
check max participants when creating a token to avoid giving tokens but erroring when attempting to join, check if the channel actually supports voice
This commit is contained in:
@@ -14,16 +14,16 @@ lru = "0.7.6"
|
||||
ulid = "0.5.0"
|
||||
redis-kiss = "0.1.4"
|
||||
|
||||
# serde
|
||||
# Serde
|
||||
serde_json = "1.0.79"
|
||||
rmp-serde = "1.0.0"
|
||||
serde = "1.0.136"
|
||||
|
||||
# http
|
||||
# Http
|
||||
rocket = { version = "0.5.0-rc.2", features = ["json"] }
|
||||
rocket_empty = "0.1.1"
|
||||
|
||||
# async
|
||||
# Async
|
||||
futures = "0.3.21"
|
||||
async-std = { version = "1.8.0", features = [
|
||||
"tokio1",
|
||||
@@ -31,14 +31,17 @@ async-std = { version = "1.8.0", features = [
|
||||
"attributes",
|
||||
] }
|
||||
|
||||
# core
|
||||
# Core
|
||||
revolt-result = { path = "../../core/result" }
|
||||
revolt-models = { path = "../../core/models" }
|
||||
revolt-config = { path = "../../core/config" }
|
||||
revolt-database = { path = "../../core/database" }
|
||||
revolt-permissions = { path = "../../core/permissions" }
|
||||
|
||||
# voice
|
||||
# Voice
|
||||
livekit-api = "0.4.4"
|
||||
livekit-protocol = "0.4.0"
|
||||
livekit-runtime = { version = "0.3.1", features = ["tokio"] }
|
||||
|
||||
# RabbitMQ
|
||||
amqprs = { version = "1.7.0" }
|
||||
|
||||
@@ -6,11 +6,12 @@ use revolt_database::{
|
||||
util::reference::Reference,
|
||||
voice::{
|
||||
create_voice_state, delete_voice_state, get_user_moved_from_voice, get_user_moved_to_voice,
|
||||
get_voice_channel_members, take_channel_call_started_system_message,
|
||||
update_voice_state_tracks, VoiceClient,
|
||||
get_voice_channel_members, set_channel_call_started_system_message,
|
||||
take_channel_call_started_system_message, update_voice_state_tracks, VoiceClient,
|
||||
},
|
||||
Database, PartialMessage, SystemMessage,
|
||||
Database, PartialMessage, SystemMessage, AMQP,
|
||||
};
|
||||
use revolt_models::v0;
|
||||
use revolt_result::{Result, ToRevoltError};
|
||||
use rocket::{post, State};
|
||||
use rocket_empty::EmptyResponse;
|
||||
@@ -20,8 +21,9 @@ use crate::guard::AuthHeader;
|
||||
#[post("/<node>", data = "<body>")]
|
||||
pub async fn ingress(
|
||||
db: &State<Database>,
|
||||
node: &str,
|
||||
voice_client: &State<VoiceClient>,
|
||||
amqp: &State<AMQP>,
|
||||
node: &str,
|
||||
auth_header: AuthHeader<'_>,
|
||||
body: &str,
|
||||
) -> Result<EmptyResponse> {
|
||||
@@ -81,6 +83,37 @@ pub async fn ingress(
|
||||
.p(channel_id.clone())
|
||||
.await;
|
||||
};
|
||||
|
||||
// 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.clone())
|
||||
.as_user(db)
|
||||
.await?;
|
||||
|
||||
let mut call_started_message = SystemMessage::CallStarted {
|
||||
by: user_id.clone(),
|
||||
finished_at: None,
|
||||
}
|
||||
.into_message(channel.id().to_string());
|
||||
|
||||
set_channel_call_started_system_message(channel.id(), &call_started_message.id)
|
||||
.await?;
|
||||
|
||||
call_started_message
|
||||
.send(
|
||||
db,
|
||||
Some(amqp),
|
||||
v0::MessageAuthor::System {
|
||||
username: &user.username,
|
||||
avatar: user.avatar.as_ref().map(|file| file.id.as_ref()),
|
||||
},
|
||||
None,
|
||||
None,
|
||||
&channel,
|
||||
false,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
}
|
||||
// User left a channel
|
||||
"participant_left" => {
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
use std::env;
|
||||
|
||||
use revolt_database::voice::VoiceClient;
|
||||
use amqprs::{
|
||||
channel::ExchangeDeclareArguments,
|
||||
connection::{Connection, OpenConnectionArguments},
|
||||
};
|
||||
use revolt_config::config;
|
||||
use revolt_database::DatabaseInfo;
|
||||
use revolt_database::{voice::VoiceClient, AMQP};
|
||||
use revolt_result::Result;
|
||||
use rocket::{build, routes, Config};
|
||||
use std::net::Ipv4Addr;
|
||||
@@ -13,11 +18,40 @@ mod guard;
|
||||
async fn main() -> Result<(), rocket::Error> {
|
||||
revolt_config::configure!(voice_ingress);
|
||||
|
||||
let config = config().await;
|
||||
|
||||
let database = DatabaseInfo::Auto.connect().await.unwrap();
|
||||
let voice_client = VoiceClient::from_revolt_config().await;
|
||||
|
||||
let connection = Connection::open(&OpenConnectionArguments::new(
|
||||
&config.rabbit.host,
|
||||
config.rabbit.port,
|
||||
&config.rabbit.username,
|
||||
&config.rabbit.password,
|
||||
))
|
||||
.await
|
||||
.expect("Failed to connect to RabbitMQ");
|
||||
|
||||
let channel = connection
|
||||
.open_channel(None)
|
||||
.await
|
||||
.expect("Failed to open RabbitMQ channel");
|
||||
|
||||
channel
|
||||
.exchange_declare(
|
||||
ExchangeDeclareArguments::new(&config.pushd.exchange, "direct")
|
||||
.durable(true)
|
||||
.finish(),
|
||||
)
|
||||
.await
|
||||
.expect("Failed to declare exchange");
|
||||
|
||||
let amqp = AMQP::new(connection, channel);
|
||||
|
||||
let _rocket = build()
|
||||
.manage(database)
|
||||
.manage(voice_client)
|
||||
.manage(amqp)
|
||||
.mount("/", routes![api::ingress])
|
||||
.configure(Config {
|
||||
port: 8500,
|
||||
|
||||
Reference in New Issue
Block a user