rearrange mod file structure

This commit is contained in:
mykola2312 2024-03-02 02:10:11 +02:00
parent e8245413ab
commit b70bdde318
7 changed files with 60 additions and 39 deletions

View file

@ -2,4 +2,4 @@
fn main() { fn main() {
// trigger recompilation when a new migration is added // trigger recompilation when a new migration is added
println!("cargo:rerun-if-changed=migrations"); println!("cargo:rerun-if-changed=migrations");
} }

View file

@ -1,4 +1,2 @@
pub mod bot; pub mod bot;
pub mod log;
pub mod sanitize; pub mod sanitize;
pub mod util;

View file

@ -1,6 +1,5 @@
use anyhow; use anyhow;
use sqlx::migrate::MigrateDatabase; use sqlx::SqlitePool;
use sqlx::{Sqlite, SqlitePool};
use std::env; use std::env;
use std::fmt; use std::fmt;
use std::str; use std::str;
@ -13,9 +12,6 @@ use teloxide::types::InputFile;
use teloxide::{prelude::*, update_listeners::Polling, utils::command::BotCommands}; use teloxide::{prelude::*, update_listeners::Polling, utils::command::BotCommands};
use tracing::{event, Level}; use tracing::{event, Level};
use super::log::log_init;
use super::util::make_database_url;
use crate::dl::delete_if_exists; use crate::dl::delete_if_exists;
use crate::dl::download; use crate::dl::download;
@ -38,19 +34,10 @@ where
.expect(format!("env '{}' parse error", name).as_str()) .expect(format!("env '{}' parse error", name).as_str())
} }
pub async fn bot_main() -> anyhow::Result<()> { pub async fn bot_main(db: SqlitePool) -> anyhow::Result<()> {
log_init();
event!(Level::INFO, "start"); event!(Level::INFO, "start");
let db_url = make_database_url(); // db_init
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?;
let bot = Bot::new(env::var("BOT_TOKEN")?); let bot = Bot::new(env::var("BOT_TOKEN")?);
let listener = Polling::builder(bot.clone()) let listener = Polling::builder(bot.clone())
@ -104,29 +91,33 @@ struct DbUser {
pub first_name: String, pub first_name: String,
pub last_name: Option<String>, pub last_name: Option<String>,
pub can_download: i64, pub can_download: i64,
pub is_admin: i64 pub is_admin: i64,
} }
async fn cmd_test(bot: Bot, msg: Message, db: SqlitePool) -> HandlerResult { async fn cmd_test(bot: Bot, msg: Message, db: SqlitePool) -> HandlerResult {
bot.send_message(msg.chat.id, "test response").await?; bot.send_message(msg.chat.id, "test response").await?;
let user = msg.from().unwrap(); 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, sqlx::query(
"SELECT * FROM user WHERE id = 1 LIMIT 1;") "INSERT OR IGNORE INTO user
.fetch_one(&db).await.expect("fetch_one"); (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); dbg!(db_user);
Ok(()) Ok(())
} }

18
src/db.rs Normal file
View file

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

View file

@ -1,14 +1,18 @@
use std::io; use std::io;
use tracing::{level_filters::LevelFilter, Subscriber}; use tracing::{level_filters::LevelFilter, Subscriber};
//use tracing_appender::rolling::{RollingFileAppender, Rotation}; //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; //use super::util::VAR_LOG;
// A layer filter to prevent polling timeout errors from clogging logs // A layer filter to prevent polling timeout errors from clogging logs
struct TeloxideNoiseFilter {} struct TeloxideNoiseFilter {}
impl<S: Subscriber> Filter<S> for TeloxideNoiseFilter { impl<S: Subscriber> Filter<S> 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 let Some(module_path) = meta.module_path() {
if module_path == "teloxide::error_handlers" { if module_path == "teloxide::error_handlers" {
false false
@ -21,7 +25,6 @@ impl<S: Subscriber> Filter<S> for TeloxideNoiseFilter {
} }
} }
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
const LOG_LEVEL: LevelFilter = LevelFilter::DEBUG; const LOG_LEVEL: LevelFilter = LevelFilter::DEBUG;

View file

@ -5,10 +5,21 @@ use bot::bot::bot_main;
mod dl; mod dl;
mod util;
mod log;
use log::log_init;
mod db;
use db::db_init;
#[tokio::main] #[tokio::main]
async fn main() -> anyhow::Result<()> { async fn main() -> anyhow::Result<()> {
dotenv().ok(); dotenv().ok();
bot_main().await?; log_init();
let db = db_init().await;
bot_main(db).await?;
Ok(()) Ok(())
} }