|
@@ -1,5 +1,8 @@
|
|
use telegram_bot::{telegram_types::{TelegramMessage}, TelegramBot};
|
|
use telegram_bot::{telegram_types::{TelegramMessage}, TelegramBot};
|
|
-use orm::{db_func::{create_new_item_price, create_new_user, get_user_by_chat_id, set_chat_id_by_token}, users};
|
|
|
|
|
|
+use orm::{db_func::{
|
|
|
|
+ create_new_item_price, create_new_user, get_user_by_chat_id, set_chat_id_by_token, get_from_key_value,
|
|
|
|
+
|
|
|
|
+}, users};
|
|
use sea_orm::{DatabaseConnection, DbErr};
|
|
use sea_orm::{DatabaseConnection, DbErr};
|
|
use regex::Regex;
|
|
use regex::Regex;
|
|
use log::{warn, error, debug};
|
|
use log::{warn, error, debug};
|
|
@@ -14,6 +17,26 @@ enum AuthResult {
|
|
Fail
|
|
Fail
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+enum MsgType {
|
|
|
|
+ Start,
|
|
|
|
+ Register,
|
|
|
|
+ ItemPrice,
|
|
|
|
+ Undefined
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+fn msg_router(msg: &TelegramMessage) -> MsgType{
|
|
|
|
+ let regex_message = Regex::new(
|
|
|
|
+ r"token:(?P<token>[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12})"
|
|
|
|
+ ).unwrap();
|
|
|
|
+ let msg_text = msg.text.as_str();
|
|
|
|
+ match msg_text {
|
|
|
|
+ msg_text if msg_text == "/start" => MsgType::Start,
|
|
|
|
+ msg_text if regex_message.is_match(msg_text) => MsgType::Register,
|
|
|
|
+ msg_text if msg_text.split('!').count() > 1 => MsgType::ItemPrice,
|
|
|
|
+ _ => MsgType::Undefined,
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
pub async fn handle_message(
|
|
pub async fn handle_message(
|
|
@@ -21,40 +44,90 @@ pub async fn handle_message(
|
|
gs_hub: &Sheets<hyper_rustls::HttpsConnector<hyper_util::client::legacy::connect::HttpConnector>>,
|
|
gs_hub: &Sheets<hyper_rustls::HttpsConnector<hyper_util::client::legacy::connect::HttpConnector>>,
|
|
sheet_id: &str
|
|
sheet_id: &str
|
|
) {
|
|
) {
|
|
- let auth_res = match check_authentication(msg, db).await {
|
|
|
|
- Ok(res) => res,
|
|
|
|
- Err(err) => {
|
|
|
|
- error!("DATABASE ERROR {err}");
|
|
|
|
- AuthResult::Fail
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
- match auth_res {
|
|
|
|
- AuthResult::Register => {
|
|
|
|
|
|
+ let usr = get_user_by_chat_id(db, msg.chat.id).await.unwrap_or(None);
|
|
|
|
+
|
|
|
|
+ match msg_router(msg) {
|
|
|
|
+ MsgType::Start => {
|
|
|
|
+ let mut key = "start_msg";
|
|
|
|
+ if usr.is_some() {
|
|
|
|
+ key = "guide_msg"
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let text =match get_from_key_value(db, key).await {
|
|
|
|
+ Ok(val) => val,
|
|
|
|
+ Err(err) => {
|
|
|
|
+ error!("Error getting from key_value {err}");
|
|
|
|
+ String::from("Произошла ошибка обратитесь к администратору MH_HM_GKV")
|
|
|
|
+ }
|
|
|
|
+ };
|
|
match tg_bot.send_message(
|
|
match tg_bot.send_message(
|
|
msg.chat.id,
|
|
msg.chat.id,
|
|
- format!("Успешная авторизация {}", msg.chat.username).as_str(),
|
|
|
|
|
|
+ text.as_str(),
|
|
None
|
|
None
|
|
- ).await { Ok(_) => (), Err(_) => ()}
|
|
|
|
|
|
+ ).await {
|
|
|
|
+ Ok(_) => (),
|
|
|
|
+ Err(err) => {
|
|
|
|
+ error!("Telegram api unavaliable or request is broken {err}");
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ MsgType::Register => {
|
|
|
|
+ let reg_res = match register(msg, db).await {
|
|
|
|
+ Ok(val) => val,
|
|
|
|
+ Err(err) => {
|
|
|
|
+ error!("Error registering {err}");
|
|
|
|
+ AuthResult::Fail
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ match reg_res {
|
|
|
|
+ AuthResult::Register => {
|
|
|
|
+ let text =match get_from_key_value(db, "guide_msg").await {
|
|
|
|
+ Ok(val) => val,
|
|
|
|
+ Err(err) => {
|
|
|
|
+ error!("Error getting from key_value {err}");
|
|
|
|
+ String::from("Произошла ошибка обратитесь к администратору MH_RG_GKV")
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ match tg_bot.send_message(
|
|
|
|
+ msg.chat.id,
|
|
|
|
+ format!("Успешная авторизация {}", msg.chat.username).as_str(),
|
|
|
|
+ None
|
|
|
|
+ ).await { Ok(_) => (), Err(err) => error!("Error sending msg {err}")};
|
|
|
|
+
|
|
|
|
+ match tg_bot.send_message(
|
|
|
|
+ msg.chat.id,
|
|
|
|
+ text.as_str(),
|
|
|
|
+ None
|
|
|
|
+ ).await { Ok(_) => (), Err(err) => error!("Error sending msg {err}")}
|
|
|
|
+ },
|
|
|
|
+ _ => warn!("Error registering {}", msg.text)
|
|
|
|
+ };
|
|
},
|
|
},
|
|
- AuthResult::Success => {
|
|
|
|
- match handle_item_price(msg, tg_bot, db, gs_hub, sheet_id).await {
|
|
|
|
- Ok(range) => match range {
|
|
|
|
- Some(range) => {
|
|
|
|
- match tg_bot.send_message(
|
|
|
|
- msg.chat.id,
|
|
|
|
- format!("Добавлена строка {range}, {}", msg.text).as_str(),
|
|
|
|
- None
|
|
|
|
- ).await { Ok(_) => (), Err(_) => ()}
|
|
|
|
- }, None => ()
|
|
|
|
|
|
+ MsgType::ItemPrice => {
|
|
|
|
+ match usr {
|
|
|
|
+ Some(_user) => {
|
|
|
|
+ match handle_item_price(msg, tg_bot, db, gs_hub, sheet_id).await {
|
|
|
|
+ Ok(range) => match range {
|
|
|
|
+ Some(range) => {
|
|
|
|
+ match tg_bot.send_message(
|
|
|
|
+ msg.chat.id,
|
|
|
|
+ format!("Добавлена строка {range}, {}", msg.text).as_str(),
|
|
|
|
+ None
|
|
|
|
+ ).await { Ok(_) => (), Err(err) => error!("Error sending msg {err}")}
|
|
|
|
+ }, None => ()
|
|
|
|
+ },
|
|
|
|
+ Err(_) => ()
|
|
|
|
+ }
|
|
},
|
|
},
|
|
- Err(_) => ()
|
|
|
|
|
|
+ None => ()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- AuthResult::Fail => return
|
|
|
|
- };
|
|
|
|
|
|
+ MsgType::Undefined => {},
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
-async fn check_authentication(
|
|
|
|
|
|
+async fn register(
|
|
msg: &TelegramMessage, db: &DatabaseConnection
|
|
msg: &TelegramMessage, db: &DatabaseConnection
|
|
) -> Result<AuthResult, DbErr> {
|
|
) -> Result<AuthResult, DbErr> {
|
|
let regex_message = Regex::new(
|
|
let regex_message = Regex::new(
|