diff --git a/.vscode/settings.json b/.vscode/settings.json index ffa8b01..92e36aa 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,5 @@ { "rust-analyzer.linkedProjects": [ - "./service/Cargo.toml", - "./bot/Cargo.toml", + "./service/Cargo.toml" ] } \ No newline at end of file diff --git a/bot/.env.TEMPLATE b/bot/.env.TEMPLATE deleted file mode 100644 index 07f5e95..0000000 --- a/bot/.env.TEMPLATE +++ /dev/null @@ -1,7 +0,0 @@ -RUST_LOG=warn,bot=info - -SERVICE_HOST=localhost -SERVICE_PORT=5000 - -DISCORD_TOKEN= -OPENAI_API_KEY= \ No newline at end of file diff --git a/bot/Cargo.toml b/bot/Cargo.toml deleted file mode 100644 index d57de98..0000000 --- a/bot/Cargo.toml +++ /dev/null @@ -1,42 +0,0 @@ -[package] -name = "bot" -version = "0.2.4" -edition = "2021" -authors = ["Ben Sherriff "] -repository = "https://github.com/bensherriff/siren" -readme = "README.md" -license = "GPL-3.0-or-later" - -[dependencies] -chrono = { version = "0.4.31", features = ["serde"] } -dotenv = "0.15.0" -serde_json = "1.0.107" -log = "0.4.20" -env_logger = "0.10.0" -service = { path = "../service" } - -[dependencies.serenity] -version = "0.11.6" -default-features = false -features = ["client", "gateway", "rustls_backend", "model", "voice", "cache", "framework", "standard_framework"] - -[dependencies.songbird] -version = "0.3.2" -features = ["builtin-queue", "yt-dlp"] - -[dependencies.tokio] -version = "1.32.0" -features = ["macros", "rt-multi-thread"] - -[dependencies.serde] -version = "1.0.188" -features = ["derive"] - -[dependencies.reqwest] -version = "0.11.22" -default-features = false -features = ["json", "rustls-tls"] - -[dependencies.pyo3] -version = "0.19.2" -features = ["auto-initialize"] diff --git a/bot/Dockerfile b/bot/Dockerfile deleted file mode 100644 index 5811412..0000000 --- a/bot/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -# Builder -FROM rust:1.72.1-bookworm as builder -WORKDIR /builder - -COPY src ./src -COPY Cargo.toml ./ -RUN cargo build --release - -# Packages -FROM debian:bullseye-slim as packages -WORKDIR /packages - -RUN apt-get update && apt-get install -y curl tar xz-utils && \ - curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux > yt-dlp && \ - chmod +x yt-dlp && \ - curl -L https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz > ffmpeg.tar.xz && \ - tar -xJf ffmpeg.tar.xz --wildcards */bin/ffmpeg --transform='s/^.*\///' && rm ffmpeg.tar.xz - -# FROM debian:bullseye-slim as libraries -# WORKDIR /libraries -# RUN apt-get update && apt-get install -y unzip && \ -# curl -L https://download.pytorch.org/libtorch/cu117/libtorch-cxx11-abi-shared-with-deps-2.0.1%2Bcu117.zip > libtorch.zip && \ -# unzip libtorch.zip && rm libtorch.zip - -# Runner -FROM debian:bullseye-slim as runtime -WORKDIR /bot -RUN apt-get update && apt-get install -y libopus-dev libpq5 libpq-dev && apt-get auto-remove -y -COPY --from=builder /builder/target/release/bot /usr/local/bin/bot -COPY --from=packages /packages /usr/bin -# COPY --from=libraries /libraries /usr/lib - -# ARG LIBTORCH=/usr/lib/libtorch -# ARG LD_LIBRARY_PATH=${LIBTORCH}/lib:${LD_LIBRARY_PATH} - -# ADD migrations ./ -CMD ["bot"] diff --git a/bot/Makefile b/bot/Makefile deleted file mode 100644 index 0845f7c..0000000 --- a/bot/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -#!make -SHELL := /bin/bash - -include .env - -.PHONY: help build test up down exec clean - -help: ## Help command - @echo - @cat Makefile | grep -E '^[a-zA-Z\/_-]+:.*?## .*$$' | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' - @echo - -build: ## Build the docker image - docker compose build - -db: ## Start the docker database - docker compose up -d db - -up: ## Start the app - docker compose up -d - -down: ## Stop the app - docker compose down - -clean: - docker compose down && \ - docker image rm siren-bot diff --git a/bot/docker-compose.yml b/bot/docker-compose.yml deleted file mode 100644 index e35d8fb..0000000 --- a/bot/docker-compose.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: '3.8' - -name: siren -services: - bot: - image: siren-bot:${BOT_VERSION:-latest} - container_name: siren-bot - build: - context: . - dockerfile: ./Dockerfile - args: - - VERSION=${BOT_VERSION:-latest} - env_file: - - .env - networks: - - frontend - restart: unless-stopped - - -networks: - frontend: diff --git a/service/.env.TEMPLATE b/service/.env.TEMPLATE index 6527927..e8d5b3e 100644 --- a/service/.env.TEMPLATE +++ b/service/.env.TEMPLATE @@ -8,4 +8,7 @@ DATABASE_PORT=5432 SERVICE_HOST=localhost SERVICE_PORT=5000 -DATA_DIR_PATH= \ No newline at end of file +DATA_DIR_PATH= + +DISCORD_TOKEN= +OPENAI_API_KEY= \ No newline at end of file diff --git a/service/Cargo.toml b/service/Cargo.toml index a76b62d..5f615ae 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -43,3 +43,12 @@ features = ["json", "rustls-tls"] version = "2.1.2" default-features = false features = ["postgres", "32-column-tables", "serde_json", "r2d2", "with-deprecated"] + +[dependencies.serenity] +version = "0.11.6" +default-features = false +features = ["client", "gateway", "rustls_backend", "model", "voice", "cache", "framework", "standard_framework"] + +[dependencies.songbird] +version = "0.3.2" +features = ["builtin-queue", "yt-dlp"] diff --git a/service/Dockerfile b/service/Dockerfile index 11a9177..095ea6d 100644 --- a/service/Dockerfile +++ b/service/Dockerfile @@ -1,12 +1,36 @@ -FROM rust:1.72.1-bookworm as builder - -WORKDIR /service -USER root +# ========= +# Builder +# ========= +FROM rust:bookworm as builder +WORKDIR /builder COPY migrations ./migrations -COPY data ./data COPY src ./src COPY Cargo.toml ./ +RUN apt-get update && apt-get install -y cmake RUN cargo build --release -CMD ["./target/release/service"] \ No newline at end of file + +# ========== +# Packages +# ========== +FROM debian:bookworm-slim as packages +WORKDIR /packages + +RUN apt-get update && apt-get install -y curl tar xz-utils && \ + curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux > yt-dlp && \ + chmod +x yt-dlp && \ + curl -L https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz > ffmpeg.tar.xz && \ + tar -xJf ffmpeg.tar.xz --wildcards */bin/ffmpeg --transform='s/^.*\///' && rm ffmpeg.tar.xz + +# ========= +# Runtime +# ========= +FROM rust:bookworm as runtime +WORKDIR /service +USER root + +COPY --from=builder /builder/target/release/service /usr/local/bin/service +COPY --from=packages /packages /usr/bin + +CMD ["service"] diff --git a/service/docker-compose.yml b/service/docker-compose.yml index 984c3c5..b3b5d2c 100644 --- a/service/docker-compose.yml +++ b/service/docker-compose.yml @@ -17,6 +17,9 @@ services: DATABASE_PORT: 5432 SERVICE_HOST: service SERVICE_PORT: 5000 + DATA_DIR_PATH: /data + volumes: + - ${DATA_DIR_PATH}:/data ports: - ${SERVICE_PORT:-5000}:5000 depends_on: diff --git a/bot/src/commands/audio/mod.rs b/service/src/bot/commands/audio/mod.rs similarity index 100% rename from bot/src/commands/audio/mod.rs rename to service/src/bot/commands/audio/mod.rs diff --git a/bot/src/commands/audio/pause.rs b/service/src/bot/commands/audio/pause.rs similarity index 100% rename from bot/src/commands/audio/pause.rs rename to service/src/bot/commands/audio/pause.rs diff --git a/bot/src/commands/audio/play.rs b/service/src/bot/commands/audio/play.rs similarity index 98% rename from bot/src/commands/audio/play.rs rename to service/src/bot/commands/audio/play.rs index 386e6a2..cb0442b 100644 --- a/bot/src/commands/audio/play.rs +++ b/service/src/bot/commands/audio/play.rs @@ -5,7 +5,7 @@ use serenity::builder::CreateApplicationCommand; use serenity::model::application::interaction::application_command::ApplicationCommandInteraction; use songbird::EventHandler; -use crate::commands::audio::{join, leave, add_song, get_songbird, AudioConfigs}; +use crate::bot::commands::audio::{join, leave, add_song, get_songbird, AudioConfigs}; use super::{create_response, edit_response}; diff --git a/bot/src/commands/audio/resume.rs b/service/src/bot/commands/audio/resume.rs similarity index 100% rename from bot/src/commands/audio/resume.rs rename to service/src/bot/commands/audio/resume.rs diff --git a/bot/src/commands/audio/skip.rs b/service/src/bot/commands/audio/skip.rs similarity index 100% rename from bot/src/commands/audio/skip.rs rename to service/src/bot/commands/audio/skip.rs diff --git a/bot/src/commands/audio/stop.rs b/service/src/bot/commands/audio/stop.rs similarity index 100% rename from bot/src/commands/audio/stop.rs rename to service/src/bot/commands/audio/stop.rs diff --git a/bot/src/commands/audio/volume.rs b/service/src/bot/commands/audio/volume.rs similarity index 100% rename from bot/src/commands/audio/volume.rs rename to service/src/bot/commands/audio/volume.rs diff --git a/bot/src/commands/help.rs b/service/src/bot/commands/help.rs similarity index 100% rename from bot/src/commands/help.rs rename to service/src/bot/commands/help.rs diff --git a/bot/src/commands/mod.rs b/service/src/bot/commands/mod.rs similarity index 100% rename from bot/src/commands/mod.rs rename to service/src/bot/commands/mod.rs diff --git a/bot/src/commands/oai.rs b/service/src/bot/commands/oai.rs similarity index 100% rename from bot/src/commands/oai.rs rename to service/src/bot/commands/oai.rs diff --git a/bot/src/commands/ping.rs b/service/src/bot/commands/ping.rs similarity index 100% rename from bot/src/commands/ping.rs rename to service/src/bot/commands/ping.rs diff --git a/bot/src/commands/schedule.rs b/service/src/bot/commands/schedule.rs similarity index 100% rename from bot/src/commands/schedule.rs rename to service/src/bot/commands/schedule.rs diff --git a/bot/src/main.rs b/service/src/bot/mod.rs similarity index 96% rename from bot/src/main.rs rename to service/src/bot/mod.rs index c0857d2..43dcce0 100644 --- a/bot/src/main.rs +++ b/service/src/bot/mod.rs @@ -4,7 +4,6 @@ use std::sync::Arc; use commands::audio::{create_response, AudioConfig, AudioConfigs}; -use dotenv::dotenv; use log::{error, warn, info}; use serenity::async_trait; use serenity::framework::StandardFramework; @@ -15,9 +14,9 @@ use serenity::http::Http; use serenity::prelude::*; use songbird::SerenityInit; -use crate::commands::oai::GPTModel; +use crate::bot::commands::oai::GPTModel; -mod commands; +pub mod commands; struct Handler { // Open AI Config @@ -108,11 +107,7 @@ impl EventHandler for Handler { } } -#[tokio::main] -async fn main() { - dotenv().ok(); - env_logger::init_from_env(env_logger::Env::default().filter_or("RUST_LOG", "warn,siren=info")); - +pub async fn run() { let token: String = env::var("DISCORD_TOKEN").expect("Expected a token in the environment"); let intents: GatewayIntents = GatewayIntents::all(); @@ -171,4 +166,4 @@ async fn main() { if let Err(why) = client.start_autosharded().await { error!("An error occurred while running the client: {:?}", why); } -} +} \ No newline at end of file diff --git a/service/src/db/spells/model.rs b/service/src/db/spells/model.rs index 027aaf6..d8f71f3 100644 --- a/service/src/db/spells/model.rs +++ b/service/src/db/spells/model.rs @@ -27,6 +27,7 @@ pub struct QuerySpell { #[derive(Debug)] pub struct QueryFilters { pub by_name: Option, + pub like_name: Option, pub by_schools: Option>, pub by_levels: Option>, pub by_ritual: Option, @@ -43,6 +44,7 @@ impl Default for QueryFilters { fn default() -> Self { Self { by_name: None, + like_name: None, by_schools: None, by_levels: None, by_ritual: None, @@ -65,6 +67,9 @@ impl QuerySpell { let offset = (page - 1) * limit; query = query.offset(offset as i64); if let Some(name) = &filters.by_name { + query = query.filter(spells::name.eq(name)); + } + if let Some(name) = &filters.like_name { query = query.filter(spells::name.ilike(format!("%{}%", name))); } if let Some(schools) = &filters.by_schools { diff --git a/service/src/db/spells/routes.rs b/service/src/db/spells/routes.rs index 5d985f8..cf61605 100644 --- a/service/src/db/spells/routes.rs +++ b/service/src/db/spells/routes.rs @@ -10,6 +10,7 @@ use super::{Spell, InsertSpell}; #[derive(Serialize, Deserialize)] struct GetAllParams { name: Option, + like_name: Option, schools: Option, levels: Option, ritual: Option, @@ -35,6 +36,7 @@ async fn get_all(req: HttpRequest) -> HttpResponse { }; let mut filters = QueryFilters::default(); filters.by_name = params.name.clone(); + filters.like_name = params.like_name.clone(); filters.by_schools = match ¶ms.schools { Some(schools) => Some(schools.split(",").map(|s| s.to_string()).collect()), None => None diff --git a/service/src/main.rs b/service/src/main.rs index 53e0402..bd2a483 100644 --- a/service/src/main.rs +++ b/service/src/main.rs @@ -10,6 +10,7 @@ use actix_web::{HttpServer, App}; use dotenv::dotenv; use log::{error, info, warn}; +mod bot; mod db; #[actix_web::main] @@ -25,6 +26,8 @@ async fn main() -> std::io::Result<()> { let host = env::var("SERVICE_HOST").unwrap_or("localhost".to_string()); let port = env::var("SERVICE_PORT").unwrap_or("5000".to_string()); + tokio::spawn(bot::run()); + match HttpServer::new(|| { let cors = Cors::default() .allow_any_origin() diff --git a/ui/src/api/spells.ts b/ui/src/api/spells.ts index c5b13f3..1c2e0eb 100644 --- a/ui/src/api/spells.ts +++ b/ui/src/api/spells.ts @@ -3,6 +3,7 @@ import { GetSpellsResponse } from './spells.types'; interface GetSpellsParams { name?: string; + like_name?: string; schools?: string[]; levels?: number[]; ritual?: boolean; @@ -20,6 +21,7 @@ interface GetSpellsParams { export async function getSpells(params?: GetSpellsParams): Promise { const response = await getRequest('spells', { name: params?.name, + like_name: params?.like_name, schools: params?.schools?.join(','), levels: params?.levels?.join(','), ritual: params?.ritual,