From 6c3d29d705d1ac0590c93554fabc3eb7081a792a Mon Sep 17 00:00:00 2001 From: Benjamin Sherriff Date: Sun, 8 Oct 2023 17:11:34 -0400 Subject: [PATCH] Fixes --- service/src/bot/api/routes.rs | 60 +++++++++++++++++++++++++++++++++- service/src/dnd/mod.rs | 0 service/src/main.rs | 1 + ui/src/api/guilds.ts | 13 ++++++++ ui/src/api/spells.ts | 2 +- ui/src/app/management/page.tsx | 38 +++++++++++---------- 6 files changed, 95 insertions(+), 19 deletions(-) create mode 100644 service/src/dnd/mod.rs diff --git a/service/src/bot/api/routes.rs b/service/src/bot/api/routes.rs index 089e5aa..1b87fb0 100644 --- a/service/src/bot/api/routes.rs +++ b/service/src/bot/api/routes.rs @@ -6,7 +6,7 @@ use serde::{Serialize, Deserialize}; use serenity::model::prelude::{GuildChannel, ChannelType}; use siren::ServiceError; -use crate::{AppState, bot::commands::audio::{play::play_track, join}, db::guilds::InsertGuild}; +use crate::{AppState, bot::commands::audio::{play::play_track, join}, db::guilds::{InsertGuild, QueryGuild}}; #[get("/guilds")] async fn get_guilds(data: web::Data>) -> HttpResponse { @@ -249,6 +249,34 @@ struct SetVolume { volume: String } +#[get("/{guild_id}/voice/volume")] +async fn get_volume(path: web::Path) -> HttpResponse { + let guild_id = path.into_inner(); + let guild_id = match guild_id.parse::() { + Ok(id) => id, + Err(err) => { + warn!("Could not parse guild id: {:?}", err); + return ResponseError::error_response(&ServiceError { + status: 422, + message: err.to_string() + }) + } + }; + + let volume = match QueryGuild::get(guild_id as i64) { + Ok(guild) => guild.volume, + Err(err) => { + warn!("Could not get volume: {:?}", err); + return ResponseError::error_response(&ServiceError { + status: 422, + message: err.to_string() + }) + } + }; + + HttpResponse::Ok().json(volume) +} + #[post("/{guild_id}/voice/volume")] async fn set_volume(path: web::Path, volume: web::Json::, data: web::Data>) -> HttpResponse { let guild_id = path.into_inner(); @@ -277,6 +305,34 @@ async fn set_volume(path: web::Path, volume: web::Json::, dat HttpResponse::Ok().finish() } +#[post("/{guild_id}/voice/skip")] +async fn skip(path: web::Path, data: web::Data>) -> HttpResponse { + let guild_id = path.into_inner(); + let guild_id = match guild_id.parse::() { + Ok(id) => id, + Err(err) => { + warn!("Could not parse guild id: {:?}", err); + return ResponseError::error_response(&ServiceError { + status: 422, + message: err.to_string() + }) + } + }; + + if let Some(handler_lock) = data.songbird.get(guild_id) { + let handler = handler_lock.lock().await; + if let Err(err) = handler.queue().skip() { + warn!("Could not skip track: {:?}", err); + return ResponseError::error_response(&ServiceError { + status: 422, + message: err.to_string() + }) + } + } + + HttpResponse::Ok().finish() +} + pub fn init_routes(config: &mut web::ServiceConfig) { config .service(get_guilds) @@ -289,5 +345,7 @@ pub fn init_routes(config: &mut web::ServiceConfig) { .service(resume) .service(pause) .service(set_volume) + .service(get_volume) + .service(skip) ); } \ No newline at end of file diff --git a/service/src/dnd/mod.rs b/service/src/dnd/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/service/src/main.rs b/service/src/main.rs index e76172e..130b20f 100644 --- a/service/src/main.rs +++ b/service/src/main.rs @@ -18,6 +18,7 @@ use crate::bot::{commands::oai::GPTModel, handler::Handler}; use dotenv::dotenv; +mod dnd; mod bot; mod db; diff --git a/ui/src/api/guilds.ts b/ui/src/api/guilds.ts index 67969b1..3b21ea8 100644 --- a/ui/src/api/guilds.ts +++ b/ui/src/api/guilds.ts @@ -11,6 +11,10 @@ export async function getTextChannels(guildId: number): Promise return response?.data || { data: [] }; } +export async function sendMessage(guildId: number, channelId: number, message: string): Promise { + await postRequest(`guilds/${guildId}/text/${channelId}/message`, { message }); +} + export async function getVoiceChannels(guildId: number): Promise { const response = await getRequest(`guilds/${guildId}/voice`, {}); return response?.data || { data: [] }; @@ -35,3 +39,12 @@ export async function resumeTrack(guildId: number): Promise { export async function setVolume(guildId: number, volume: number): Promise { await postRequest(`guilds/${guildId}/voice/volume`, { volume: `${volume}` }); } + +export async function skipTrack(guildId: number): Promise { + await postRequest(`guilds/${guildId}/voice/skip`, {}); +} + +export async function getVolume(guildId: number): Promise { + const response = await getRequest(`guilds/${guildId}/voice/volume`, {}); + return response?.data?.volume || 0; +} diff --git a/ui/src/api/spells.ts b/ui/src/api/spells.ts index 1c2e0eb..de28c1a 100644 --- a/ui/src/api/spells.ts +++ b/ui/src/api/spells.ts @@ -19,7 +19,7 @@ interface GetSpellsParams { } export async function getSpells(params?: GetSpellsParams): Promise { - const response = await getRequest('spells', { + const response = await getRequest('dnd/spells', { name: params?.name, like_name: params?.like_name, schools: params?.schools?.join(','), diff --git a/ui/src/app/management/page.tsx b/ui/src/app/management/page.tsx index bf90fd9..7b90ebb 100644 --- a/ui/src/app/management/page.tsx +++ b/ui/src/app/management/page.tsx @@ -7,11 +7,13 @@ import { pauseTrack, playTrack, resumeTrack, + sendMessage, setVolume, + skipTrack, stopTrack } from '@/api/guilds'; import { GuildChannel, GuildInfo } from '@/api/guilds.types'; -import { Button, Slider, Tabs, TextInput } from '@mantine/core'; +import { Button, Slider, Tabs, TextInput, Textarea } from '@mantine/core'; import { useForm } from '@mantine/form'; import React, { useEffect, useState } from 'react'; @@ -39,6 +41,7 @@ export default function Page() { const playForm = useForm({ initialValues: { + message: '', trackUrl: '', volume: 50.0 } @@ -48,26 +51,32 @@ export default function Page() { {guilds.map((guild) => ( - setActiveGuild(guild)}> + setActiveGuild(guild)}> {guild.name} ))} {guilds.map((guild) => ( - +

{guild.name}

Text Channels

{textChannels.map((channel) => ( - + {channel.name} ))} {textChannels.map((channel) => ( - - {channel.name} + +
sendMessage(activeGuild!.id, channel.id, values.message))} + > +