diff --git a/src/db.rs b/src/db.rs index b9ff2b2..58d7b23 100644 --- a/src/db.rs +++ b/src/db.rs @@ -32,7 +32,7 @@ pub(crate) fn update_scheme() -> Result<()> { conn.execute(t, params![])?; } } - info!("Scheme updated."); + info!("Database schema updated."); Ok(()) } @@ -162,7 +162,7 @@ pub(crate) async fn add_conf(message: Message) -> Result<(), Error> { id = :id", )?; stmt.execute_named(&[(":id", &update.id.to_string()), (":title", &update.title)])?; - //println!("Conf {:?} updated: {:?}", update.title, get_conf(update.id)); + info!("Conf {:?} updated: {:?}", update.title, get_conf(update.id)); } Err(_) => { let update = Conf { @@ -173,7 +173,7 @@ pub(crate) async fn add_conf(message: Message) -> Result<(), Error> { let unix_time = utils::unixtime().await; let mut stmt = conn.prepare_cached( - "UPDATE conf + "INSERT OR IGNORE INTO conf SET title = :title, date = :date diff --git a/src/handlers.rs b/src/handlers.rs new file mode 100644 index 0000000..65f9eec --- /dev/null +++ b/src/handlers.rs @@ -0,0 +1,113 @@ +use telegram_bot::*; +use crate::mystem::MyStem; +use crate::errors; +use crate::db; +use crate::commands; +use crate::utils; + + +pub async fn handler( + api: Api, + message: Message, + token: String, + mystem: &mut MyStem, + me: User, +) -> Result<(), errors::Error> { + + match message.kind { + MessageKind::Text { ref data, .. } => { + let title = utils::get_title(&message); + info!( + "<{}({})>[{}({})]: {}", + &message.chat.id(), + title, + &message.from.id, + &message.from.first_name, + data + ); + db::add_sentence(&message, mystem).await?; + match data.as_str() { + "/here" => commands::here(api, message).await?, + "/top" => commands::top(api, message).await?, + "/stat" => commands::top(api, message).await?, + "/markov_all" => commands::markov_all(api, message).await?, + _ => (), + } + } + MessageKind::Photo { ref caption, .. } => { + let title = utils::get_title(&message); + info!( + "<{}({})>[{}({})]: *PHOTO* {}", + &message.chat.id(), + title, + &message.from.id, + &message.from.first_name, + caption.clone().unwrap_or("NO_TITLE".to_string()) + ); + utils::get_files(api, message, token).await?; + } + + MessageKind::Document { ref caption, .. } => { + let title = utils::get_title(&message); + info!( + "<{}({})>[{}({})]: *DOCUMENT* {}", + &message.chat.id(), + title, + &message.from.id, + &message.from.first_name, + caption.clone().unwrap_or("NO_TITLE".to_string()) + ); + utils::get_files(api, message, token).await?; + } + + MessageKind::Sticker { .. } => { + let title = utils::get_title(&message); + info!( + "<{}({})>[{}({})]: *STICKER*", + &message.chat.id(), + title, + &message.from.id, + &message.from.first_name, + ); + utils::get_files(api, message, token).await?; + } + + MessageKind::Voice { .. } => { + let title = utils::get_title(&message); + info!( + "<{}({})>[{}({})]: *VOICE*", + &message.chat.id(), + title, + &message.from.id, + &message.from.first_name, + ); + utils::get_files(api, message, token).await?; + } + + MessageKind::Video { .. } => { + let title = utils::get_title(&message); + info!( + "<{}({})>[{}({})]: *VIDEO*", + &message.chat.id(), + title, + &message.from.id, + &message.from.first_name, + ); + utils::get_files(api, message, token).await?; + } + + MessageKind::VideoNote { .. } => { + let title = utils::get_title(&message); + info!( + "<{}({})>[{}({})]: *VIDEO_NOTE*", + &message.chat.id(), + title, + &message.from.id, + &message.from.first_name, + ); + utils::get_files(api, message, token).await?; + } + _ => (), + }; + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index 6d72bce..390a60e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,112 +11,10 @@ mod db; mod errors; mod mystem; mod utils; +mod handlers; + use mystem::MyStem; -async fn handler( - api: Api, - message: Message, - token: String, - mystem: &mut MyStem, -) -> Result<(), errors::Error> { - match message.kind { - MessageKind::Text { ref data, .. } => { - let title = utils::get_title(&message); - info!( - "<{}({})>[{}({})]: {}", - &message.chat.id(), - title, - &message.from.id, - &message.from.first_name, - data - ); - db::add_sentence(&message, mystem).await?; - match data.as_str() { - "/here" => commands::here(api, message).await?, - "/top" => commands::top(api, message).await?, - "/stat" => commands::top(api, message).await?, - "/markov_all" => commands::markov_all(api, message).await?, - _ => (), - } - } - MessageKind::Photo { ref caption, .. } => { - let title = utils::get_title(&message); - info!( - "<{}({})>[{}({})]: *PHOTO* {}", - &message.chat.id(), - title, - &message.from.id, - &message.from.first_name, - caption.clone().unwrap_or("NO_TITLE".to_string()) - ); - utils::get_files(api, message, token).await?; - } - - MessageKind::Document { ref caption, .. } => { - let title = utils::get_title(&message); - info!( - "<{}({})>[{}({})]: *DOCUMENT* {}", - &message.chat.id(), - title, - &message.from.id, - &message.from.first_name, - caption.clone().unwrap_or("NO_TITLE".to_string()) - ); - utils::get_files(api, message, token).await?; - } - - MessageKind::Sticker { .. } => { - let title = utils::get_title(&message); - info!( - "<{}({})>[{}({})]: *STICKER*", - &message.chat.id(), - title, - &message.from.id, - &message.from.first_name, - ); - utils::get_files(api, message, token).await?; - } - - MessageKind::Voice { .. } => { - let title = utils::get_title(&message); - info!( - "<{}({})>[{}({})]: *VOICE*", - &message.chat.id(), - title, - &message.from.id, - &message.from.first_name, - ); - utils::get_files(api, message, token).await?; - } - - MessageKind::Video { .. } => { - let title = utils::get_title(&message); - info!( - "<{}({})>[{}({})]: *VIDEO*", - &message.chat.id(), - title, - &message.from.id, - &message.from.first_name, - ); - utils::get_files(api, message, token).await?; - } - - MessageKind::VideoNote { .. } => { - let title = utils::get_title(&message); - info!( - "<{}({})>[{}({})]: *VIDEO_NOTE*", - &message.chat.id(), - title, - &message.from.id, - &message.from.first_name, - ); - utils::get_files(api, message, token).await?; - } - _ => (), - }; - Ok(()) -} - #[tokio::main] async fn main() -> Result<(), errors::Error> { env_logger::from_env(Env::default().default_filter_or("info")).init(); @@ -133,15 +31,15 @@ async fn main() -> Result<(), errors::Error> { } }; let api = Api::new(token.clone()); - // Fetch new updates via long poll method let mut stream = api.stream(); + let me = api.send(GetMe).await?; + info!("GetMe result: Username: {}, First Name: {}, ID {}", me.username.as_ref().unwrap(), me.first_name, me.id); while let Some(update) = stream.next().await { - // If the received update contains a new message... let update = update?; if let UpdateKind::Message(message) = update.kind { - db::add_user(message.clone()).await?; db::add_conf(message.clone()).await?; - handler(api.clone(), message, token.clone(), &mut mystem).await?; + db::add_user(message.clone()).await?; + handlers::handler(api.clone(), message, token.clone(), &mut mystem, me.clone()).await?; } } Ok(()) diff --git a/src/mystem.rs b/src/mystem.rs index 9cfcce1..310b904 100644 --- a/src/mystem.rs +++ b/src/mystem.rs @@ -1,8 +1,6 @@ use crate::errors; use serde_json::Value; -use std::io::prelude::*; -use std::io::BufReader; -use std::io::{Error, Write}; +use std::io::{Error, Write, BufReader, prelude::*}; use subprocess::{Popen, PopenConfig, PopenError, Redirection}; pub struct MyStem {