diff --git a/src/main.rs b/src/main.rs index ffb3c8a..0c9a544 100644 --- a/src/main.rs +++ b/src/main.rs @@ -203,164 +203,6 @@ async fn main() -> Result<(), Box> { bm.dispatch(&mut db).await; } -async fn botscript_command_handler( - bot: Bot, - mut db: DB, - bm: BotMessage, - msg: Message, -) -> BotResult<()> { - info!("Eval BM: {:?}", bm); - let buttons = bm - .resolve_buttons(&mut db) - .await? - .map(|buttons| InlineKeyboardMarkup { - inline_keyboard: buttons - .iter() - .map(|r| { - r.iter() - .map(|b| match b { - botscript::ButtonLayout::Callback { - name, - literal: _, - callback, - } => InlineKeyboardButton::callback(name, callback), - }) - .collect() - }) - .collect(), - }); - let literal = bm.literal().map_or("", |s| s.as_str()); - - let ma = MessageAnswerer::new(&bot, &mut db, msg.chat.id.0); - ma.answer(literal, None, buttons).await?; - - Ok(()) -} - -async fn callback_handler(bot: Bot, mut db: DB, q: CallbackQuery) -> BotResult<()> { - bot.answer_callback_query(&q.id).await?; - - let data = match q.data { - Some(ref data) => data, - None => { - // not really our case to handle - return Ok(()); - } - }; - - let callback = match CallbackStore::get_callback(&mut db, data).await? { - Some(callback) => callback, - None => { - warn!("Not found callback for data: {data}"); - // doing this silently beacuse end user shouldn't know about backend internal data - return Ok(()); - } - }; - - match callback { - Callback::MoreInfo => { - let keyboard = Some(single_button_markup!( - create_callback_button("go_home", Callback::GoHome, &mut db).await? - )); - - let chat_id = q.chat_id().map(|i| i.0).unwrap_or(q.from.id.0 as i64); - let message_id = q.message.map_or_else( - || { - Err(BotError::MsgTooOld( - "Failed to get message id, probably message too old".to_string(), - )) - }, - |m| Ok(m.id().0), - )?; - MessageAnswerer::new(&bot, &mut db, chat_id) - .replace_message(message_id, "more_info_msg", keyboard) - .await? - } - Callback::ProjectPage { id } => { - let nextproject = match db - .get_literal_value(&format!("project_{}_msg", id + 1)) - .await? - .unwrap_or("emptyproject".into()) - .as_str() - { - "end" | "empty" | "none" => None, - _ => Some( - create_callback_button( - "next_project", - Callback::ProjectPage { id: id + 1 }, - &mut db, - ) - .await?, - ), - }; - let prevproject = match id.wrapping_sub(1) { - 0 => None, - _ => Some( - create_callback_button( - "prev_project", - Callback::ProjectPage { - id: id.wrapping_sub(1), - }, - &mut db, - ) - .await?, - ), - }; - let keyboard = buttons_markup!( - [prevproject, nextproject].into_iter().flatten(), - [create_callback_button("go_home", Callback::GoHome, &mut db).await?] - ); - - let chat_id = q.chat_id().map(|i| i.0).unwrap_or(q.from.id.0 as i64); - let message_id = q.message.map_or_else( - || { - Err(BotError::MsgTooOld( - "Failed to get message id, probably message too old".to_string(), - )) - }, - |m| Ok(m.id().0), - )?; - MessageAnswerer::new(&bot, &mut db, chat_id) - .replace_message(message_id, &format!("project_{}_msg", id), Some(keyboard)) - .await? - } - Callback::GoHome => { - let keyboard = make_start_buttons(&mut db).await?; - - let chat_id = q.chat_id().map(|i| i.0).unwrap_or(q.from.id.0 as i64); - let message_id = q.message.map_or_else( - || { - Err(BotError::MsgTooOld( - "Failed to get message id, probably message too old".to_string(), - )) - }, - |m| Ok(m.id().0), - )?; - MessageAnswerer::new(&bot, &mut db, chat_id) - .replace_message(message_id, "start", Some(keyboard)) - .await? - } - Callback::LeaveApplication => { - let application = Application::new(q.from.clone()).store(&mut db).await?; - let msg = send_application_to_chat(&bot, &mut db, &application).await?; - - let (chat_id, msg_id) = MessageAnswerer::new(&bot, &mut db, q.from.id.0 as i64) - .answer("left_application_msg", None, None) - .await?; - MessageForward::new(msg.chat.id.0, msg.id.0, chat_id, msg_id, false) - .store(&mut db) - .await?; - } - Callback::AskQuestion => { - MessageAnswerer::new(&bot, &mut db, q.from.id.0 as i64) - .answer("ask_question_msg", None, None) - .await?; - } - }; - - Ok(()) -} - async fn send_application_to_chat( bot: &Bot, db: &mut DB, @@ -431,76 +273,6 @@ async fn notify_admin(text: &str) { } } -async fn user_command_handler( - mut db: DB, - bot: Bot, - msg: Message, - cmd: UserCommands, -) -> BotResult<()> { - let tguser = match msg.from.clone() { - Some(user) => user, - None => return Ok(()), // do nothing, cause its not usecase of function - }; - let user = db - .get_or_init_user(tguser.id.0 as i64, &tguser.first_name) - .await?; - let user = update_user_tg(user, &tguser); - user.update_user(&mut db).await?; - info!( - "MSG: {}", - msg.html_text().unwrap_or("|EMPTY_MESSAGE|".into()) - ); - match cmd { - UserCommands::Start(meta) => { - if !meta.is_empty() { - user.insert_meta(&mut db, &meta).await?; - } - let variant = match meta.as_str() { - "" => None, - variant => Some(variant), - }; - let mut db2 = db.clone(); - MessageAnswerer::new(&bot, &mut db, msg.chat.id.0) - .answer("start", variant, Some(make_start_buttons(&mut db2).await?)) - .await?; - Ok(()) - } - UserCommands::Help => { - bot.send_message(msg.chat.id, UserCommands::descriptions().to_string()) - .await?; - Ok(()) - } - } -} - -async fn make_start_buttons(db: &mut DB) -> BotResult { - let mut buttons: Vec> = Vec::new(); - buttons.push(vec![ - create_callback_button("show_projects", Callback::ProjectPage { id: 1 }, db).await?, - ]); - buttons.push(vec![ - create_callback_button("more_info", Callback::MoreInfo, db).await?, - ]); - buttons.push(vec![ - create_callback_button("leave_application", Callback::LeaveApplication, db).await?, - ]); - buttons.push(vec![ - create_callback_button("ask_question", Callback::AskQuestion, db).await?, - ]); - - Ok(InlineKeyboardMarkup::new(buttons)) -} - -async fn echo(bot: Bot, msg: Message) -> BotResult<()> { - if let Some(photo) = msg.photo() { - info!("File ID: {}", photo[0].file.id); - } - bot.send_message(msg.chat.id, msg.html_text().unwrap_or("UNWRAP".into())) - .parse_mode(teloxide::types::ParseMode::Html) - .await?; - Ok(()) -} - fn update_user_tg(user: db::User, tguser: &teloxide::types::User) -> db::User { db::User { first_name: tguser.first_name.clone(),