Recombined bot and service, fixed dockerfile

This commit is contained in:
Benjamin Sherriff
2023-10-05 15:38:59 -04:00
parent 5915a29dd5
commit 5dcc2a6afc
27 changed files with 64 additions and 153 deletions

View File

@@ -1,6 +1,5 @@
{
"rust-analyzer.linkedProjects": [
"./service/Cargo.toml",
"./bot/Cargo.toml",
"./service/Cargo.toml"
]
}

View File

@@ -1,7 +0,0 @@
RUST_LOG=warn,bot=info
SERVICE_HOST=localhost
SERVICE_PORT=5000
DISCORD_TOKEN=
OPENAI_API_KEY=

View File

@@ -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"]

View File

@@ -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"]

View File

@@ -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

View File

@@ -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:

View File

@@ -8,4 +8,7 @@ DATABASE_PORT=5432
SERVICE_HOST=localhost
SERVICE_PORT=5000
DATA_DIR_PATH=
DATA_DIR_PATH=
DISCORD_TOKEN=
OPENAI_API_KEY=

View File

@@ -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"]

View File

@@ -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"]
# ==========
# 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"]

View File

@@ -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:

View File

@@ -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};

View File

@@ -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);
}
}
}

View File

@@ -27,6 +27,7 @@ pub struct QuerySpell {
#[derive(Debug)]
pub struct QueryFilters {
pub by_name: Option<String>,
pub like_name: Option<String>,
pub by_schools: Option<Vec<String>>,
pub by_levels: Option<Vec<i32>>,
pub by_ritual: Option<bool>,
@@ -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 {

View File

@@ -10,6 +10,7 @@ use super::{Spell, InsertSpell};
#[derive(Serialize, Deserialize)]
struct GetAllParams {
name: Option<String>,
like_name: Option<String>,
schools: Option<String>,
levels: Option<String>,
ritual: Option<bool>,
@@ -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 &params.schools {
Some(schools) => Some(schools.split(",").map(|s| s.to_string()).collect()),
None => None

View File

@@ -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()

View File

@@ -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<GetSpellsResponse> {
const response = await getRequest('spells', {
name: params?.name,
like_name: params?.like_name,
schools: params?.schools?.join(','),
levels: params?.levels?.join(','),
ritual: params?.ritual,