diff --git a/build.rs b/build.rs index 7609593..d506869 100644 --- a/build.rs +++ b/build.rs @@ -2,4 +2,4 @@ fn main() { // trigger recompilation when a new migration is added println!("cargo:rerun-if-changed=migrations"); -} \ No newline at end of file +} diff --git a/src/bot.rs b/src/bot.rs index 845cc5d..283a1a5 100644 --- a/src/bot.rs +++ b/src/bot.rs @@ -1,4 +1,2 @@ pub mod bot; -pub mod log; pub mod sanitize; -pub mod util; diff --git a/src/bot/bot.rs b/src/bot/bot.rs index f9c0e00..1735f96 100644 --- a/src/bot/bot.rs +++ b/src/bot/bot.rs @@ -1,6 +1,5 @@ use anyhow; -use sqlx::migrate::MigrateDatabase; -use sqlx::{Sqlite, SqlitePool}; +use sqlx::SqlitePool; use std::env; use std::fmt; use std::str; @@ -13,9 +12,6 @@ use teloxide::types::InputFile; use teloxide::{prelude::*, update_listeners::Polling, utils::command::BotCommands}; use tracing::{event, Level}; -use super::log::log_init; -use super::util::make_database_url; - use crate::dl::delete_if_exists; use crate::dl::download; @@ -38,19 +34,10 @@ where .expect(format!("env '{}' parse error", name).as_str()) } -pub async fn bot_main() -> anyhow::Result<()> { - log_init(); +pub async fn bot_main(db: SqlitePool) -> anyhow::Result<()> { event!(Level::INFO, "start"); - let db_url = make_database_url(); - if !Sqlite::database_exists(&db_url).await.unwrap_or(false) { - Sqlite::create_database(&db_url) - .await - .expect("failed to create database"); - } - - let db = SqlitePool::connect(&db_url).await?; - sqlx::migrate!().run(&db).await?; + // db_init let bot = Bot::new(env::var("BOT_TOKEN")?); let listener = Polling::builder(bot.clone()) @@ -104,29 +91,33 @@ struct DbUser { pub first_name: String, pub last_name: Option, pub can_download: i64, - pub is_admin: i64 + pub is_admin: i64, } async fn cmd_test(bot: Bot, msg: Message, db: SqlitePool) -> HandlerResult { bot.send_message(msg.chat.id, "test response").await?; let user = msg.from().unwrap(); - - let conn = db.acquire().await?; - sqlx::query("INSERT OR IGNORE user - (tg_id, user_name, first_name, last_name, can_download, is_admin) - VALUES ($1, $2, $3, $4, $5, $6);") - .bind(user.id.0 as i64) - .bind(&user.username) - .bind(&user.first_name) - .bind(&user.last_name) - .bind(0) - .bind(0) - .execute(&db).await.expect("insert"); - let db_user = sqlx::query_as!(DbUser, - "SELECT * FROM user WHERE id = 1 LIMIT 1;") - .fetch_one(&db).await.expect("fetch_one"); + sqlx::query( + "INSERT OR IGNORE INTO user + (tg_id, username, first_name, last_name, can_download, is_admin) + VALUES ($1, $2, $3, $4, $5, $6);", + ) + .bind(user.id.0 as i64) + .bind(&user.username) + .bind(&user.first_name) + .bind(&user.last_name) + .bind(0) + .bind(0) + .execute(&db) + .await + .expect("insert"); + + let db_user = sqlx::query_as!(DbUser, "SELECT * FROM user WHERE id = 1 LIMIT 1;") + .fetch_one(&db) + .await + .expect("fetch_one"); dbg!(db_user); Ok(()) } diff --git a/src/db.rs b/src/db.rs new file mode 100644 index 0000000..ace23dc --- /dev/null +++ b/src/db.rs @@ -0,0 +1,18 @@ +use sqlx::migrate::MigrateDatabase; +use sqlx::{Sqlite, SqlitePool}; + +use super::util::make_database_url; + +pub async fn db_init() -> SqlitePool { + let db_url = make_database_url(); + if !Sqlite::database_exists(&db_url).await.unwrap_or(false) { + Sqlite::create_database(&db_url) + .await + .expect("failed to create database"); + } + + let db = SqlitePool::connect(&db_url).await.unwrap(); + sqlx::migrate!().run(&db).await.unwrap(); + + db +} diff --git a/src/bot/log.rs b/src/log.rs similarity index 86% rename from src/bot/log.rs rename to src/log.rs index 0d15fbc..1d47e7f 100644 --- a/src/bot/log.rs +++ b/src/log.rs @@ -1,14 +1,18 @@ use std::io; use tracing::{level_filters::LevelFilter, Subscriber}; //use tracing_appender::rolling::{RollingFileAppender, Rotation}; -use tracing_subscriber::{fmt, layer::SubscriberExt, layer::Filter, prelude::*}; +use tracing_subscriber::{fmt, layer::Filter, layer::SubscriberExt, prelude::*}; //use super::util::VAR_LOG; // A layer filter to prevent polling timeout errors from clogging logs struct TeloxideNoiseFilter {} impl Filter for TeloxideNoiseFilter { - fn enabled(&self, meta: &tracing::Metadata<'_>, _: &tracing_subscriber::layer::Context<'_,S>) -> bool { + fn enabled( + &self, + meta: &tracing::Metadata<'_>, + _: &tracing_subscriber::layer::Context<'_, S>, + ) -> bool { if let Some(module_path) = meta.module_path() { if module_path == "teloxide::error_handlers" { false @@ -21,7 +25,6 @@ impl Filter for TeloxideNoiseFilter { } } - #[cfg(debug_assertions)] const LOG_LEVEL: LevelFilter = LevelFilter::DEBUG; diff --git a/src/main.rs b/src/main.rs index 563b3eb..4bb61dc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,10 +5,21 @@ use bot::bot::bot_main; mod dl; +mod util; + +mod log; +use log::log_init; + +mod db; +use db::db_init; + #[tokio::main] async fn main() -> anyhow::Result<()> { dotenv().ok(); - bot_main().await?; + log_init(); + let db = db_init().await; + + bot_main(db).await?; Ok(()) } diff --git a/src/bot/util.rs b/src/util.rs similarity index 100% rename from src/bot/util.rs rename to src/util.rs