summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2021-08-04 17:22:21 +0200
committerSanto Cariotti <santo@dcariotti.me>2021-08-04 17:22:21 +0200
commit909e2cbdf8cbb311f4abef2c0c1d176987580a76 (patch)
treedbcfa17a56a12c7549c9867842cd44b14c917de1
parent1be956d27668dcf2052ea82b191ae1917e6cb11b (diff)
feat: get faculties for the /room command
-rw-r--r--src/browser/mod.rs17
-rw-r--r--src/browser/web_browser.rs34
-rw-r--r--src/commands.rs25
3 files changed, 73 insertions, 3 deletions
diff --git a/src/browser/mod.rs b/src/browser/mod.rs
index 8359c51..2765c6d 100644
--- a/src/browser/mod.rs
+++ b/src/browser/mod.rs
@@ -1,3 +1,5 @@
+use std::collections::HashMap;
+
use self::web_browser::{Browser, WEB_BROWSER};
use crate::Config;
use thirtyfour::prelude::WebDriverResult;
@@ -17,3 +19,18 @@ pub async unsafe fn login(credentials: &Config) -> WebDriverResult<()> {
Ok(())
}
+
+pub async unsafe fn get_faculties() -> WebDriverResult<Option<HashMap<String, String>>> {
+ if let Some(driver) = &WEB_BROWSER {
+ match driver.faculties().await? {
+ Some(faculties) => {
+ return Ok(Some(faculties));
+ }
+ None => {
+ return Ok(Some(HashMap::<String, String>::new()));
+ }
+ };
+ }
+
+ Ok(Some(HashMap::<String, String>::new()))
+}
diff --git a/src/browser/web_browser.rs b/src/browser/web_browser.rs
index 804c82f..d2ba6c4 100644
--- a/src/browser/web_browser.rs
+++ b/src/browser/web_browser.rs
@@ -1,10 +1,13 @@
use crate::Config;
+use std::collections::HashMap;
use std::{thread, time};
+use thirtyfour::common::capabilities::firefox::FirefoxPreferences;
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?ReturnUrl=%2fStudenti%2fDefault.aspx";
+const ROOMS_URL: &str = "https://studenti.smartedu.unict.it/StudentSpaceReserv?Type=unaTantum";
pub struct Browser {
driver: Option<WebDriver>,
@@ -70,6 +73,37 @@ impl Browser {
Ok(())
}
+
+ pub async fn faculties(&self) -> WebDriverResult<Option<HashMap<String, String>>> {
+ if let Some(_d) = &self.driver {
+ _d.get(ROOMS_URL).await?;
+ thread::sleep(time::Duration::from_millis(1000));
+
+ _d.find_element(By::Css(
+ "span[aria-labelledby='select2-dipartimentoSelector-container']",
+ ))
+ .await?
+ .click()
+ .await?;
+
+ let list_elements = _d
+ .find_elements(By::Css("#select2-dipartimentoSelector-results li"))
+ .await?;
+
+ let mut faculties_ids = HashMap::<String, String>::new();
+
+ for i in list_elements {
+ faculties_ids.insert(
+ i.get_attribute("data-select2-id").await.unwrap().unwrap(),
+ i.text().await.unwrap(),
+ );
+ }
+
+ return Ok(Some(faculties_ids));
+ }
+
+ Ok(None)
+ }
}
pub static mut WEB_BROWSER: Option<Browser> = None;
diff --git a/src/commands.rs b/src/commands.rs
index a3a3694..2653600 100644
--- a/src/commands.rs
+++ b/src/commands.rs
@@ -1,3 +1,4 @@
+use crate::browser;
use crate::config::Config;
use std::error::Error;
use teloxide::payloads::SendMessageSetters;
@@ -39,9 +40,27 @@ pub async fn handler(
cx.answer(Command::descriptions()).await?;
}
Command::Room => {
- let url_button =
- InlineKeyboardButton::callback("hello".to_string(), "hello_call".to_string());
- let keyboard = InlineKeyboardMarkup::default().append_row(vec![url_button]);
+ let faculties;
+ let mut faculties_array: Vec<Vec<InlineKeyboardButton>> = vec![];
+ unsafe {
+ faculties = browser::get_faculties().await.unwrap();
+ }
+
+ if let Some(faculties_texts) = faculties {
+ for (key, value) in faculties_texts {
+ faculties_array.push(vec![InlineKeyboardButton::callback(
+ value,
+ format!("faculty_{}", key),
+ )]);
+ }
+ } else {
+ faculties_array.push(vec![InlineKeyboardButton::callback(
+ "No such element".to_string(),
+ "".into(),
+ )]);
+ }
+
+ let keyboard = InlineKeyboardMarkup::new(faculties_array);
cx.answer("Where?").reply_markup(keyboard).await?;
}
}