diff --git a/Cargo.lock b/Cargo.lock index 427aee8..6d21b2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -307,9 +307,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" +checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" dependencies = [ "libc", "windows-sys", diff --git a/src/functions/about.rs b/src/functions/about.rs index 67df6e4..29e464e 100644 --- a/src/functions/about.rs +++ b/src/functions/about.rs @@ -1,4 +1,4 @@ -use crate::{hooks, utils::keyboard_manager::Keyboard}; +use crate::{hooks, utils::keyboard::Keyboard}; use teloxide::{ payloads::SendMessageSetters, prelude::*, diff --git a/src/functions/groups.rs b/src/functions/groups.rs index fb41b13..91637ba 100644 --- a/src/functions/groups.rs +++ b/src/functions/groups.rs @@ -1,6 +1,6 @@ use crate::utils::{ - group_manager::{Group, Groups}, - keyboard_manager::Keyboard, + groups::{Group, Groups}, + keyboard::Keyboard, }; use teloxide::{ payloads::SendMessageSetters, diff --git a/src/functions/inline.rs b/src/functions/inline.rs index 6601478..1359557 100644 --- a/src/functions/inline.rs +++ b/src/functions/inline.rs @@ -2,7 +2,7 @@ use crates_io_api::{AsyncClient, Crate, CratesQuery}; use std::error::Error; use teloxide::{prelude::*, types::*}; -use crate::utils::inline_manager::*; +use crate::utils::inlines::*; pub async fn inline( bot: Bot, diff --git a/src/functions/latest.rs b/src/functions/latest.rs index 7a491df..2b3fc82 100644 --- a/src/functions/latest.rs +++ b/src/functions/latest.rs @@ -1,4 +1,4 @@ -use crate::utils::{github::GitHub, keyboard_manager::Keyboard}; +use crate::utils::{github::GitHub, keyboard::Keyboard}; use octocrab::models::repos::Release; use teloxide::{ payloads::SendMessageSetters, diff --git a/src/functions/mod.rs b/src/functions/mod.rs index cdb765e..10d85bd 100644 --- a/src/functions/mod.rs +++ b/src/functions/mod.rs @@ -8,16 +8,15 @@ pub mod latest; pub mod offtop; pub mod rules; pub mod start; +pub mod useful; pub mod version; pub use inline::inline; -use crate::utils::github::GitHub; -use crate::utils::group_manager::Groups; +use crate::utils::{github::GitHub, groups::Groups, resources::Resources}; use crate::Command; use std::error::Error; -use teloxide::prelude::*; -use teloxide::types::*; +use teloxide::{prelude::*, types::*}; pub async fn commands( bot: Bot, @@ -26,6 +25,7 @@ pub async fn commands( cmd: Command, github: GitHub, groups: Groups, + resources: Resources, ) -> Result<(), Box> { let _ = match cmd { Command::Start => crate::functions::start::command(&bot, &msg).await, @@ -36,6 +36,7 @@ pub async fn commands( Command::Latest => crate::functions::latest::command(&bot, github, &msg).await, Command::Version => crate::functions::version::command(&bot, github, &msg).await, Command::Off => crate::functions::offtop::command(&bot, &msg, &me).await, + Command::Useful => crate::functions::useful::command(&bot, &msg, &resources).await, }; Ok(()) diff --git a/src/functions/rules.rs b/src/functions/rules.rs index cb528af..c5da183 100644 --- a/src/functions/rules.rs +++ b/src/functions/rules.rs @@ -1,4 +1,4 @@ -use crate::{hooks, utils::keyboard_manager::Keyboard}; +use crate::{hooks, utils::keyboard::Keyboard}; use teloxide::{ payloads::SendMessageSetters, prelude::*, diff --git a/src/functions/start.rs b/src/functions/start.rs index d63e5da..832d5b7 100644 --- a/src/functions/start.rs +++ b/src/functions/start.rs @@ -1,4 +1,4 @@ -use crate::utils::keyboard_manager::Keyboard; +use crate::utils::keyboard::Keyboard; use teloxide::{ payloads::SendMessageSetters, prelude::*, diff --git a/src/functions/useful.rs b/src/functions/useful.rs new file mode 100644 index 0000000..4177ae7 --- /dev/null +++ b/src/functions/useful.rs @@ -0,0 +1,41 @@ +use crate::utils::{keyboard::Keyboard, resources::Resources}; +use teloxide::{ + payloads::SendMessageSetters, + prelude::*, + types::{InlineKeyboardMarkup, ParseMode}, +}; + +static TEXT: &str = "Rustga oid foydali materiallar:\n\ +Agar o'zingizdan material qo'shmoqchi bo'lsangiz, bizni \ +\ +source.json ni yangilang!"; + +pub async fn command(bot: &Bot, msg: &Message, resources: &Resources) -> ResponseResult<()> { + let categories = resources.get_keys(); + + bot.send_message(msg.chat.id, TEXT) + .parse_mode(ParseMode::Html) + .reply_markup(keyboard_list(1, categories)) + .disable_web_page_preview(true) + .await?; + + Ok(()) +} + +pub fn keyboard_list(page: u32, categories: Vec) -> InlineKeyboardMarkup { + let mut keyboard = Keyboard::new(); + + for category in categories { + keyboard.text( + &format!( + "{}{}", + &category[0..1].to_uppercase(), + &category[1..].replace("_", " ") + ), + &format!("useful_{}_{}", page, category), + ); + keyboard.row(); + } + + keyboard.get() +} diff --git a/src/functions/version.rs b/src/functions/version.rs index 1ea36c3..b1d4559 100644 --- a/src/functions/version.rs +++ b/src/functions/version.rs @@ -1,4 +1,4 @@ -use crate::utils::{github::GitHub, keyboard_manager::Keyboard}; +use crate::utils::{github::GitHub, keyboard::Keyboard}; use octocrab::models::repos::Release; use teloxide::{ payloads::SendMessageSetters, diff --git a/src/hooks/is_private.rs b/src/hooks/is_private.rs index 96192be..16783cc 100644 --- a/src/hooks/is_private.rs +++ b/src/hooks/is_private.rs @@ -4,7 +4,7 @@ use teloxide::{ types::{InlineKeyboardMarkup, ParseMode}, }; -use crate::utils::keyboard_manager::Keyboard; +use crate::utils::keyboard::Keyboard; static TEXT: &str = "⚠️ Bu komanda faqat shaxsiy chat uchun!"; diff --git a/src/lib.rs b/src/lib.rs index a8a35f1..e31baa6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,6 +35,9 @@ pub enum Command { /// Report offtopic Off, + + /// Useful resources + Useful, } pub fn handler() -> UpdateHandler> { diff --git a/src/main.rs b/src/main.rs index 1797ff2..22c9b38 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use crates_io_api::AsyncClient; use rustina::{ handler, - utils::{github::GitHub, group_manager::Groups}, + utils::{github::GitHub, groups::Groups, resources::Resources}, }; use std::error::Error; use teloxide::prelude::*; @@ -13,16 +13,17 @@ async fn main() -> Result<(), Box> { let bot = Bot::from_env(); - let groups: Groups = Groups::new(); + let groups = Groups::new(); let github = GitHub::new(); let crates_client = AsyncClient::new( "Rustina Assistant (rust@maid.uz)", std::time::Duration::from_millis(100), ) .unwrap(); + let resources = Resources::new(); Dispatcher::builder(bot, handler()) - .dependencies(dptree::deps![crates_client, github, groups]) + .dependencies(dptree::deps![crates_client, github, groups, resources]) // If no handler succeeded to handle an update, this closure will be called .default_handler(|upd| async move { log::warn!("Unhandled update: {:?}", upd); diff --git a/src/utils/group_manager.rs b/src/utils/groups.rs similarity index 100% rename from src/utils/group_manager.rs rename to src/utils/groups.rs diff --git a/src/utils/inline_manager.rs b/src/utils/inlines.rs similarity index 98% rename from src/utils/inline_manager.rs rename to src/utils/inlines.rs index 8d7d76c..62d0167 100644 --- a/src/utils/inline_manager.rs +++ b/src/utils/inlines.rs @@ -1,4 +1,4 @@ -use super::keyboard_manager::Keyboard; +use super::keyboard::Keyboard; use crates_io_api::Crate; use teloxide::types::*; diff --git a/src/utils/keyboard_manager.rs b/src/utils/keyboard.rs similarity index 100% rename from src/utils/keyboard_manager.rs rename to src/utils/keyboard.rs diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 701861c..81184b8 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,4 +1,5 @@ pub mod github; -pub mod group_manager; -pub mod inline_manager; -pub mod keyboard_manager; +pub mod groups; +pub mod inlines; +pub mod keyboard; +pub mod resources; diff --git a/src/utils/resources.rs b/src/utils/resources.rs new file mode 100644 index 0000000..a29d9bf --- /dev/null +++ b/src/utils/resources.rs @@ -0,0 +1,36 @@ +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +static RESOURCE: &'static str = include_str!("../../source.json"); + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct Resource { + pub name: String, + pub desc: String, + pub link: String, +} + +#[derive(Clone, Debug)] +pub struct Resources { + materials: HashMap>, +} + +impl Resources { + pub fn new() -> Self { + Resources { + materials: serde_json::from_str(RESOURCE).unwrap(), + } + } + + pub fn get_keys(&self) -> Vec { + self.materials.keys().map(|k| k.to_string()).collect() + } + + pub fn get_materials(&self, key: &str) -> Option<&Vec> { + self.materials.get(key) + } + + pub fn get_material(&self, key: &str, index: usize) -> Option<&Resource> { + self.materials.get(key).and_then(|v| v.get(index)) + } +}