wip
This commit is contained in:
+90
-47
@@ -1,39 +1,97 @@
|
||||
mod workers;
|
||||
|
||||
use std::env;
|
||||
use std::{env, num::NonZeroU64, path::PathBuf, str::FromStr};
|
||||
|
||||
use futures::StreamExt;
|
||||
use postcard::{from_bytes, to_stdvec};
|
||||
use types::jobs::JobResponse;
|
||||
use serenity::{
|
||||
Client,
|
||||
all::{Context, EventHandler, GatewayIntents, Ready},
|
||||
async_trait,
|
||||
};
|
||||
use songbird::SerenityInit;
|
||||
use types::{jobs::{JobResponse, Jobs, PlayJob}, misc::new_uuid_v4};
|
||||
use which::which;
|
||||
use yt_dlp::{Downloader, client::Libraries};
|
||||
|
||||
struct Handler {
|
||||
nats_client: async_nats::Client,
|
||||
yt_downloader: Downloader,
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl EventHandler for Handler {
|
||||
async fn ready(&self, ctx: Context, ready: Ready) {
|
||||
println!("{} is connected!", ready.user.name);
|
||||
|
||||
let voice_manager = songbird::get(&ctx).await;
|
||||
|
||||
let mut subscriber = self
|
||||
.nats_client
|
||||
.queue_subscribe("corro-dj.*", "group1".to_string())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
// Receive and process messages
|
||||
while let Some(message) = subscriber.next().await {
|
||||
println!("Received message {:?}", message);
|
||||
|
||||
let subject = message.subject.split(".").collect::<Vec<&str>>()[1];
|
||||
|
||||
let result = match subject {
|
||||
"download" => workers::download::download(
|
||||
&self.yt_downloader,
|
||||
from_bytes(&message.payload).unwrap(),
|
||||
)
|
||||
.await
|
||||
.map(|res| JobResponse {
|
||||
content: res.content.map(Jobs::Download),
|
||||
error: res.error,
|
||||
}),
|
||||
"play" => {
|
||||
workers::play::play(&voice_manager, PlayJob {
|
||||
uuid: new_uuid_v4(),
|
||||
path: PathBuf::new(),
|
||||
guild_id: NonZeroU64::from_str("302837320250294283").unwrap(),
|
||||
channel_id: NonZeroU64::from_str("863014198703423499").unwrap()
|
||||
})
|
||||
.await
|
||||
.map(|res| JobResponse {
|
||||
content: res.content.map(Jobs::Play),
|
||||
error: res.error,
|
||||
})
|
||||
}
|
||||
_ => Err(format!("subject {subject} does not exists")),
|
||||
};
|
||||
|
||||
let response = match result {
|
||||
Ok(response) => response,
|
||||
Err(err) => JobResponse {
|
||||
content: None,
|
||||
error: Some(err),
|
||||
},
|
||||
};
|
||||
|
||||
println!("response {:?}", response);
|
||||
|
||||
if let Some(reply) = message.reply {
|
||||
self.nats_client
|
||||
.publish(reply, to_stdvec(&response).unwrap().into())
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment");
|
||||
|
||||
let mut client = Client::builder(&token, intents)
|
||||
.event_handler(Handler)
|
||||
.framework(framework)
|
||||
.register_songbird()
|
||||
// We insert our own HTTP client here to make use of in
|
||||
// `~play`. If we wanted, we could supply cookies and auth
|
||||
// details ahead of time.
|
||||
//
|
||||
// Generally, we don't want to make a new Client for every request!
|
||||
.type_map_insert::<HttpKey>(HttpClient::new())
|
||||
.await
|
||||
.expect("Err creating client");
|
||||
let discord_token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment");
|
||||
|
||||
let nats_client = async_nats::connect("nats://localhost:4222")
|
||||
.await
|
||||
.expect("Error creating nats client");
|
||||
|
||||
let mut subscriber = nats_client
|
||||
.queue_subscribe("corro-dj.*", "group1".to_string())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let yt_downloader = Downloader::builder(
|
||||
Libraries::new(which("yt-dlp").unwrap(), which("ffmpeg").unwrap()),
|
||||
"output",
|
||||
@@ -42,33 +100,18 @@ async fn main() {
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
// Receive and process messages
|
||||
while let Some(message) = subscriber.next().await {
|
||||
println!("Received message {:?}", message);
|
||||
let handler = Handler {
|
||||
nats_client,
|
||||
yt_downloader,
|
||||
};
|
||||
|
||||
let subject = message.subject.split(".").collect::<Vec<&str>>()[1];
|
||||
let mut discord_client = Client::builder(&discord_token, GatewayIntents::empty())
|
||||
.event_handler(handler)
|
||||
.register_songbird()
|
||||
.await
|
||||
.expect("Error creating discord client");
|
||||
|
||||
let result = match subject {
|
||||
"download" => {
|
||||
workers::download::download(&yt_downloader, from_bytes(&message.payload).unwrap())
|
||||
.await
|
||||
}
|
||||
_ => Err(format!("subject {subject} does not exists")),
|
||||
};
|
||||
|
||||
let response = match result {
|
||||
Ok(response) => response,
|
||||
Err(err) => JobResponse {
|
||||
content: None,
|
||||
error: Some(err),
|
||||
},
|
||||
};
|
||||
|
||||
if let Some(reply) = message.reply {
|
||||
nats_client
|
||||
.publish(reply, to_stdvec(&response).unwrap().into())
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
if let Err(why) = discord_client.start().await {
|
||||
println!("Client error: {why:?}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
pub mod download;
|
||||
pub mod play;
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use songbird::Songbird;
|
||||
use types::jobs::{JobResponse, PlayJob, PlayResponse};
|
||||
|
||||
pub async fn play(
|
||||
voice_manager: &Option<Arc<Songbird>>,
|
||||
job: PlayJob,
|
||||
) -> Result<JobResponse<PlayResponse>, String> {
|
||||
println!("job: {:?}", job);
|
||||
|
||||
if let Some(voice_manager) = voice_manager {
|
||||
if let Err(why) = voice_manager.join(job.guild_id, job.channel_id).await {
|
||||
println!("{why}:?");
|
||||
return Err(format!("{why}"));
|
||||
};
|
||||
|
||||
Ok(JobResponse {
|
||||
content: Some(PlayResponse {}),
|
||||
error: None,
|
||||
})
|
||||
} else {
|
||||
Err("No voice_manager defined".to_string())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user