Recombined bot and service, fixed dockerfile
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"rust-analyzer.linkedProjects": [
|
"rust-analyzer.linkedProjects": [
|
||||||
"./service/Cargo.toml",
|
"./service/Cargo.toml"
|
||||||
"./bot/Cargo.toml",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
RUST_LOG=warn,bot=info
|
|
||||||
|
|
||||||
SERVICE_HOST=localhost
|
|
||||||
SERVICE_PORT=5000
|
|
||||||
|
|
||||||
DISCORD_TOKEN=
|
|
||||||
OPENAI_API_KEY=
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "bot"
|
|
||||||
version = "0.2.4"
|
|
||||||
edition = "2021"
|
|
||||||
authors = ["Ben Sherriff <hello@bensherriff.com>"]
|
|
||||||
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"]
|
|
||||||
@@ -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"]
|
|
||||||
27
bot/Makefile
27
bot/Makefile
@@ -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
|
|
||||||
@@ -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:
|
|
||||||
@@ -8,4 +8,7 @@ DATABASE_PORT=5432
|
|||||||
|
|
||||||
SERVICE_HOST=localhost
|
SERVICE_HOST=localhost
|
||||||
SERVICE_PORT=5000
|
SERVICE_PORT=5000
|
||||||
DATA_DIR_PATH=
|
DATA_DIR_PATH=
|
||||||
|
|
||||||
|
DISCORD_TOKEN=
|
||||||
|
OPENAI_API_KEY=
|
||||||
@@ -43,3 +43,12 @@ features = ["json", "rustls-tls"]
|
|||||||
version = "2.1.2"
|
version = "2.1.2"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["postgres", "32-column-tables", "serde_json", "r2d2", "with-deprecated"]
|
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"]
|
||||||
|
|||||||
@@ -1,12 +1,36 @@
|
|||||||
FROM rust:1.72.1-bookworm as builder
|
# =========
|
||||||
|
# Builder
|
||||||
WORKDIR /service
|
# =========
|
||||||
USER root
|
FROM rust:bookworm as builder
|
||||||
|
WORKDIR /builder
|
||||||
|
|
||||||
COPY migrations ./migrations
|
COPY migrations ./migrations
|
||||||
COPY data ./data
|
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
COPY Cargo.toml ./
|
COPY Cargo.toml ./
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y cmake
|
||||||
RUN cargo build --release
|
RUN cargo build --release
|
||||||
CMD ["./target/release/service"]
|
|
||||||
|
# ==========
|
||||||
|
# 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"]
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ services:
|
|||||||
DATABASE_PORT: 5432
|
DATABASE_PORT: 5432
|
||||||
SERVICE_HOST: service
|
SERVICE_HOST: service
|
||||||
SERVICE_PORT: 5000
|
SERVICE_PORT: 5000
|
||||||
|
DATA_DIR_PATH: /data
|
||||||
|
volumes:
|
||||||
|
- ${DATA_DIR_PATH}:/data
|
||||||
ports:
|
ports:
|
||||||
- ${SERVICE_PORT:-5000}:5000
|
- ${SERVICE_PORT:-5000}:5000
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use serenity::builder::CreateApplicationCommand;
|
|||||||
use serenity::model::application::interaction::application_command::ApplicationCommandInteraction;
|
use serenity::model::application::interaction::application_command::ApplicationCommandInteraction;
|
||||||
use songbird::EventHandler;
|
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};
|
use super::{create_response, edit_response};
|
||||||
|
|
||||||
@@ -4,7 +4,6 @@ use std::sync::Arc;
|
|||||||
|
|
||||||
use commands::audio::{create_response, AudioConfig, AudioConfigs};
|
use commands::audio::{create_response, AudioConfig, AudioConfigs};
|
||||||
|
|
||||||
use dotenv::dotenv;
|
|
||||||
use log::{error, warn, info};
|
use log::{error, warn, info};
|
||||||
use serenity::async_trait;
|
use serenity::async_trait;
|
||||||
use serenity::framework::StandardFramework;
|
use serenity::framework::StandardFramework;
|
||||||
@@ -15,9 +14,9 @@ use serenity::http::Http;
|
|||||||
use serenity::prelude::*;
|
use serenity::prelude::*;
|
||||||
use songbird::SerenityInit;
|
use songbird::SerenityInit;
|
||||||
|
|
||||||
use crate::commands::oai::GPTModel;
|
use crate::bot::commands::oai::GPTModel;
|
||||||
|
|
||||||
mod commands;
|
pub mod commands;
|
||||||
|
|
||||||
struct Handler {
|
struct Handler {
|
||||||
// Open AI Config
|
// Open AI Config
|
||||||
@@ -108,11 +107,7 @@ impl EventHandler for Handler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
pub async fn run() {
|
||||||
async fn main() {
|
|
||||||
dotenv().ok();
|
|
||||||
env_logger::init_from_env(env_logger::Env::default().filter_or("RUST_LOG", "warn,siren=info"));
|
|
||||||
|
|
||||||
let token: String = env::var("DISCORD_TOKEN").expect("Expected a token in the environment");
|
let token: String = env::var("DISCORD_TOKEN").expect("Expected a token in the environment");
|
||||||
let intents: GatewayIntents = GatewayIntents::all();
|
let intents: GatewayIntents = GatewayIntents::all();
|
||||||
|
|
||||||
@@ -171,4 +166,4 @@ async fn main() {
|
|||||||
if let Err(why) = client.start_autosharded().await {
|
if let Err(why) = client.start_autosharded().await {
|
||||||
error!("An error occurred while running the client: {:?}", why);
|
error!("An error occurred while running the client: {:?}", why);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,7 @@ pub struct QuerySpell {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct QueryFilters {
|
pub struct QueryFilters {
|
||||||
pub by_name: Option<String>,
|
pub by_name: Option<String>,
|
||||||
|
pub like_name: Option<String>,
|
||||||
pub by_schools: Option<Vec<String>>,
|
pub by_schools: Option<Vec<String>>,
|
||||||
pub by_levels: Option<Vec<i32>>,
|
pub by_levels: Option<Vec<i32>>,
|
||||||
pub by_ritual: Option<bool>,
|
pub by_ritual: Option<bool>,
|
||||||
@@ -43,6 +44,7 @@ impl Default for QueryFilters {
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
by_name: None,
|
by_name: None,
|
||||||
|
like_name: None,
|
||||||
by_schools: None,
|
by_schools: None,
|
||||||
by_levels: None,
|
by_levels: None,
|
||||||
by_ritual: None,
|
by_ritual: None,
|
||||||
@@ -65,6 +67,9 @@ impl QuerySpell {
|
|||||||
let offset = (page - 1) * limit;
|
let offset = (page - 1) * limit;
|
||||||
query = query.offset(offset as i64);
|
query = query.offset(offset as i64);
|
||||||
if let Some(name) = &filters.by_name {
|
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)));
|
query = query.filter(spells::name.ilike(format!("%{}%", name)));
|
||||||
}
|
}
|
||||||
if let Some(schools) = &filters.by_schools {
|
if let Some(schools) = &filters.by_schools {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use super::{Spell, InsertSpell};
|
|||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
struct GetAllParams {
|
struct GetAllParams {
|
||||||
name: Option<String>,
|
name: Option<String>,
|
||||||
|
like_name: Option<String>,
|
||||||
schools: Option<String>,
|
schools: Option<String>,
|
||||||
levels: Option<String>,
|
levels: Option<String>,
|
||||||
ritual: Option<bool>,
|
ritual: Option<bool>,
|
||||||
@@ -35,6 +36,7 @@ async fn get_all(req: HttpRequest) -> HttpResponse {
|
|||||||
};
|
};
|
||||||
let mut filters = QueryFilters::default();
|
let mut filters = QueryFilters::default();
|
||||||
filters.by_name = params.name.clone();
|
filters.by_name = params.name.clone();
|
||||||
|
filters.like_name = params.like_name.clone();
|
||||||
filters.by_schools = match ¶ms.schools {
|
filters.by_schools = match ¶ms.schools {
|
||||||
Some(schools) => Some(schools.split(",").map(|s| s.to_string()).collect()),
|
Some(schools) => Some(schools.split(",").map(|s| s.to_string()).collect()),
|
||||||
None => None
|
None => None
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use actix_web::{HttpServer, App};
|
|||||||
use dotenv::dotenv;
|
use dotenv::dotenv;
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
|
|
||||||
|
mod bot;
|
||||||
mod db;
|
mod db;
|
||||||
|
|
||||||
#[actix_web::main]
|
#[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 host = env::var("SERVICE_HOST").unwrap_or("localhost".to_string());
|
||||||
let port = env::var("SERVICE_PORT").unwrap_or("5000".to_string());
|
let port = env::var("SERVICE_PORT").unwrap_or("5000".to_string());
|
||||||
|
|
||||||
|
tokio::spawn(bot::run());
|
||||||
|
|
||||||
match HttpServer::new(|| {
|
match HttpServer::new(|| {
|
||||||
let cors = Cors::default()
|
let cors = Cors::default()
|
||||||
.allow_any_origin()
|
.allow_any_origin()
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { GetSpellsResponse } from './spells.types';
|
|||||||
|
|
||||||
interface GetSpellsParams {
|
interface GetSpellsParams {
|
||||||
name?: string;
|
name?: string;
|
||||||
|
like_name?: string;
|
||||||
schools?: string[];
|
schools?: string[];
|
||||||
levels?: number[];
|
levels?: number[];
|
||||||
ritual?: boolean;
|
ritual?: boolean;
|
||||||
@@ -20,6 +21,7 @@ interface GetSpellsParams {
|
|||||||
export async function getSpells(params?: GetSpellsParams): Promise<GetSpellsResponse> {
|
export async function getSpells(params?: GetSpellsParams): Promise<GetSpellsResponse> {
|
||||||
const response = await getRequest('spells', {
|
const response = await getRequest('spells', {
|
||||||
name: params?.name,
|
name: params?.name,
|
||||||
|
like_name: params?.like_name,
|
||||||
schools: params?.schools?.join(','),
|
schools: params?.schools?.join(','),
|
||||||
levels: params?.levels?.join(','),
|
levels: params?.levels?.join(','),
|
||||||
ritual: params?.ritual,
|
ritual: params?.ritual,
|
||||||
|
|||||||
Reference in New Issue
Block a user