From 99968c72a5efbd535362e050baf314f9e0cff709 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Fri, 30 Jul 2021 19:24:41 +0200 Subject: refactor: browser as modular funcs --- src/browser.rs | 43 ----------------------------- src/browser/mod.rs | 19 +++++++++++++ src/browser/web_browser.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 13 ++++----- 4 files changed, 92 insertions(+), 51 deletions(-) delete mode 100644 src/browser.rs create mode 100644 src/browser/mod.rs create mode 100644 src/browser/web_browser.rs diff --git a/src/browser.rs b/src/browser.rs deleted file mode 100644 index 4900f6c..0000000 --- a/src/browser.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::config::Config; -use std::{thread, time}; -use thirtyfour::prelude::{By, WebDriverResult}; -use thirtyfour::{FirefoxCapabilities, WebDriver, WebDriverCommands}; - -const LOGIN_URL: &str = "https://studenti.smartedu.unict.it/WorkFlow2011/Logon/Logon.aspx"; - -pub async fn init(driver_url: &String) -> WebDriver { - let driver = match WebDriver::new(driver_url, FirefoxCapabilities::new()).await { - Ok(driver) => driver, - Err(_) => { - panic!("Firefox can't be opened"); - } - }; - - return driver; -} - -pub async fn login(driver: &WebDriver, credentials: &Config) -> WebDriverResult<()> { - driver.get(LOGIN_URL).await?; - - let cf_input = driver - .find_element(By::Name("ctl01$contents$UserName")) - .await?; - cf_input.send_keys(&credentials.cf).await?; - - let psw_input = driver - .find_element(By::Name("ctl01$contents$UserPassword")) - .await?; - psw_input.send_keys(&credentials.password).await?; - - thread::sleep(time::Duration::from_millis(1000)); - - driver - .find_element(By::Name("ctl01$contents$LogonButton")) - .await? - .click() - .await?; - - thread::sleep(time::Duration::from_millis(2000)); - - Ok(()) -} diff --git a/src/browser/mod.rs b/src/browser/mod.rs new file mode 100644 index 0000000..8359c51 --- /dev/null +++ b/src/browser/mod.rs @@ -0,0 +1,19 @@ +use self::web_browser::{Browser, WEB_BROWSER}; +use crate::Config; +use thirtyfour::prelude::WebDriverResult; + +mod web_browser; + +pub async fn init(driver_url: &String) { + unsafe { + WEB_BROWSER = Some(Browser::new(driver_url).await); + } +} + +pub async unsafe fn login(credentials: &Config) -> WebDriverResult<()> { + if let Some(driver) = &WEB_BROWSER { + driver._login(credentials).await?; + } + + Ok(()) +} diff --git a/src/browser/web_browser.rs b/src/browser/web_browser.rs new file mode 100644 index 0000000..53b8baa --- /dev/null +++ b/src/browser/web_browser.rs @@ -0,0 +1,68 @@ +use crate::Config; +use std::{thread, time}; +use thirtyfour::error::{WebDriverError, WebDriverErrorInfo, WebDriverErrorValue}; +use thirtyfour::prelude::{By, WebDriverResult}; +use thirtyfour::{FirefoxCapabilities, WebDriver, WebDriverCommands}; + +const LOGIN_URL: &str = "https://studenti.smartedu.unict.it/WorkFlow2011/Logon/Logon.aspx"; + +pub struct Browser { + driver: Option, +} + +impl Browser { + pub async fn new(driver_url: &String) -> Self { + Self { + driver: Some( + WebDriver::new(driver_url, FirefoxCapabilities::new()) + .await + .unwrap(), + ), + } + } + + // TODO: Close the driver fixing the borrowing error + // async fn _close(self) -> Result<(), Box> { + // Ok(()) + // } + + pub async unsafe fn _login(&self, credentials: &Config) -> WebDriverResult<()> { + if let Some(_d) = &self.driver { + _d.get(LOGIN_URL).await?; + + let cf_input = _d.find_element(By::Name("ctl01$contents$UserName")).await?; + cf_input.send_keys(&credentials.cf).await?; + + let psw_input = _d + .find_element(By::Name("ctl01$contents$UserPassword")) + .await?; + psw_input.send_keys(&credentials.password).await?; + + thread::sleep(time::Duration::from_millis(1000)); + + _d.find_element(By::Name("ctl01$contents$LogonButton")) + .await? + .click() + .await?; + + thread::sleep(time::Duration::from_millis(2000)); + + if _d.current_url().await? == LOGIN_URL { + return Err(WebDriverError::SessionNotCreated(WebDriverErrorInfo { + status: 400, + error: "SessionNotCreated".to_string(), + value: WebDriverErrorValue { + message: "SessionNotCreated".to_string(), + error: None, + stacktrace: None, + data: None, + }, + })); + } + } + + Ok(()) + } +} + +pub static mut WEB_BROWSER: Option = None; diff --git a/src/main.rs b/src/main.rs index b854f49..203dca2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,5 @@ use std::error::Error; use teloxide::prelude::*; -use thirtyfour::WebDriver; - mod browser; mod commands; mod config; @@ -18,13 +16,13 @@ async fn main() -> Result<(), Box> { let bot = Bot::from_env().auto_send(); let config = Config::from_env().unwrap(); - let driver: WebDriver = browser::init(&config.driver_url).await; - match browser::login(&driver, &config).await { - Ok(_) => {} - Err(e) => { + unsafe { + browser::init(&config.driver_url).await; + + if let Err(e) = browser::login(&config).await { panic!("You can't connect: `{}`, credentials are {:?}", e, config); } - }; + } Dispatcher::new(bot) .messages_handler(|rx: DispatcherHandlerRx, Message>| { @@ -44,7 +42,6 @@ async fn main() -> Result<(), Box> { .await; log::info!("Closing bot... Goodbye!"); - driver.quit().await?; Ok(()) } -- cgit v1.2.3-18-g5258