Implemented roll request, updated API requests

This commit is contained in:
2024-12-20 15:13:31 -05:00
parent bb03654d5f
commit 8ac0e59b8c
23 changed files with 459 additions and 150 deletions

View File

@@ -2,23 +2,31 @@ use std::sync::Arc;
use axum::extract::State;
use axum::middleware::from_extractor;
use axum::{Extension, Json, Router};
use axum::response::IntoResponse;
use axum::routing::post;
use reqwest::StatusCode;
use serde::Deserialize;
use crate::api::auth::{AuthorizationMiddleware, Session};
use crate::AppState;
use crate::bot::commands::audio::join_voice_channel;
use crate::bot::commands::audio::pause::pause_track;
use crate::bot::commands::audio::play::enqueue_track;
use crate::bot::commands::audio::resume::resume_track;
use crate::bot::handler::get_songbird;
use crate::error::SirenResult;
use crate::error::{Error, SirenResult};
pub fn get_routes() -> Router<Arc<AppState>> {
Router::new()
.route("/play", post(play_audio))
.route_layer(from_extractor::<AuthorizationMiddleware>())
.route("/pause", post(pause_audio))
.route_layer(from_extractor::<AuthorizationMiddleware>())
.route("/resume", post(resume_audio))
.route_layer(from_extractor::<AuthorizationMiddleware>())
}
#[derive(Deserialize)]
struct TrackRequest {
struct PlayTrackRequest {
url: String,
guild_id: u64,
}
@@ -26,13 +34,66 @@ struct TrackRequest {
async fn play_audio(
Extension(session): Extension<Session>,
State(state): State<Arc<AppState>>,
Json(payload): Json<TrackRequest>,
Json(payload): Json<PlayTrackRequest>,
) -> SirenResult<()> {
log::debug!("Playing audio in guild: {}", payload.guild_id);
// Check if the user exists in the cache
let user_id = match state.cache.user(session.user_id) {
Some(user) => user.id,
None => return Err(Error::not_found("User not found".to_string())),
};
// Validate if the guild exists in the cache
let guild_id = match state.cache.guild(payload.guild_id) {
Some(guild) => guild.id,
None => return Err(Error::not_found("Guild not found".to_string())),
};
// Play the track
let manager = get_songbird();
let user_id = state.cache.user(session.user_id).unwrap().id;
let guild_id = state.cache.guild(payload.guild_id).unwrap().id;
let _channel_id = join_voice_channel(&state.cache, &manager, &guild_id, &user_id).await?;
enqueue_track(manager, guild_id.to_owned(), &payload.url).await?;
Ok(())
}
#[derive(Deserialize)]
struct GuildTrackRequest {
guild_id: u64,
}
async fn pause_audio(
Extension(_): Extension<Session>,
State(state): State<Arc<AppState>>,
Json(payload): Json<GuildTrackRequest>,
) -> SirenResult<()> {
log::debug!("Pausing audio in guild: {}", payload.guild_id);
// Validate if the guild exists in the cache
let guild_id = match state.cache.guild(payload.guild_id) {
Some(guild) => guild.id,
None => return Err(Error::not_found("Guild not found".to_string())),
};
// Pause the track
let manager = get_songbird();
pause_track(manager, &guild_id).await
}
async fn resume_audio(
Extension(_): Extension<Session>,
State(state): State<Arc<AppState>>,
Json(payload): Json<GuildTrackRequest>,
) -> SirenResult<()> {
log::debug!("Pausing audio in guild: {}", payload.guild_id);
// Validate if the guild exists in the cache
let guild_id = match state.cache.guild(payload.guild_id) {
Some(guild) => guild.id,
None => return Err(Error::not_found("Guild not found".to_string())),
};
// Pause the track
let manager = get_songbird();
resume_track(manager, &guild_id).await
}