1- use crate :: utils:: { keyboard:: Keyboard , resources:: Resources } ;
1+ use crate :: utils:: {
2+ keyboard:: Keyboard ,
3+ resources:: { Resource , Resources } ,
4+ } ;
25use teloxide:: {
36 payloads:: SendMessageSetters ,
47 prelude:: * ,
@@ -15,27 +18,138 @@ pub async fn command(bot: &Bot, msg: &Message, resources: &Resources) -> Respons
1518
1619 bot. send_message ( msg. chat . id , TEXT )
1720 . parse_mode ( ParseMode :: Html )
18- . reply_markup ( keyboard_list ( 1 , categories) )
21+ . reply_markup ( keyboard_list ( categories) )
1922 . disable_web_page_preview ( true )
2023 . await ?;
2124
2225 Ok ( ( ) )
2326}
2427
25- pub fn keyboard_list ( page : u32 , categories : Vec < String > ) -> InlineKeyboardMarkup {
28+ pub async fn callback_list (
29+ bot : & Bot ,
30+ q : & CallbackQuery ,
31+ resources : & Resources ,
32+ ) -> ResponseResult < ( ) > {
33+ let categories = resources. get_keys ( ) ;
34+
35+ if let Some ( Message { id, chat, .. } ) = q. message . clone ( ) {
36+ bot. edit_message_text ( chat. id , id, TEXT )
37+ . parse_mode ( ParseMode :: Html )
38+ . reply_markup ( keyboard_list ( categories) )
39+ . disable_web_page_preview ( true )
40+ . await ?;
41+ } else if let Some ( id) = q. inline_message_id . clone ( ) {
42+ bot. edit_message_text_inline ( id, "Oopsie, something went wrong..." )
43+ . await ?;
44+ }
45+
46+ Ok ( ( ) )
47+ }
48+
49+ pub async fn callback_category_list (
50+ bot : & Bot ,
51+ q : & CallbackQuery ,
52+ args : & Vec < & str > ,
53+ resources : & Resources ,
54+ ) -> ResponseResult < ( ) > {
55+ let find = resources. get_materials ( args. join ( "_" ) . as_str ( ) ) . unwrap ( ) ;
56+
57+ if !args. is_empty ( ) {
58+ if let Some ( Message { id, chat, .. } ) = q. message . clone ( ) {
59+ bot. edit_message_text ( chat. id , id, view_category_list ( & args. join ( " " ) ) )
60+ . parse_mode ( ParseMode :: Html )
61+ . reply_markup ( keyboard_category_list ( find, args. join ( "_" ) ) )
62+ . await ?;
63+ } else if let Some ( id) = q. inline_message_id . clone ( ) {
64+ bot. edit_message_text_inline ( id, "Oopsie, something went wrong..." )
65+ . await ?;
66+ }
67+ }
68+
69+ Ok ( ( ) )
70+ }
71+
72+ pub async fn callback_material_detail (
73+ bot : & Bot ,
74+ q : & CallbackQuery ,
75+ args : & Vec < & str > ,
76+ resources : & Resources ,
77+ ) -> ResponseResult < ( ) > {
78+ let find = resources
79+ . get_material ( args[ 1 ..] . join ( "_" ) . as_str ( ) , args[ 0 ] . parse ( ) . unwrap ( ) )
80+ . unwrap ( ) ;
81+
82+ if !args. is_empty ( ) {
83+ if let Some ( Message { id, chat, .. } ) = q. message . clone ( ) {
84+ bot. edit_message_text ( chat. id , id, view_material_detail ( find) )
85+ . parse_mode ( ParseMode :: Html )
86+ . reply_markup ( keyboard_material_detail ( find, args[ 1 ..] . join ( "_" ) ) )
87+ . await ?;
88+ } else if let Some ( id) = q. inline_message_id . clone ( ) {
89+ bot. edit_message_text_inline ( id, "Oopsie, something went wrong..." )
90+ . await ?;
91+ }
92+ }
93+
94+ Ok ( ( ) )
95+ }
96+
97+ pub fn view_category_list ( category : & str ) -> String {
98+ format ! ( "<b>Siz hozirda {}{} kategoriyasi ichida turibsiz.</b>\n Iltimos, keltirilgan materiallardan birini tanlang..." ,
99+ & category[ 0 ..1 ] . to_uppercase( ) , & category[ 1 ..] . replace( '_' , " " ) )
100+ }
101+
102+ pub fn view_material_detail ( material : & Resource ) -> String {
103+ format ! (
104+ "<b>{}</b>\n \n <i>{}</i>\n \n <b>Ushbu pastdagi tugmacha orqali lavha ga o'tib oling:</b>" ,
105+ material. name, material. desc
106+ )
107+ }
108+
109+ pub fn keyboard_list ( categories : Vec < String > ) -> InlineKeyboardMarkup {
26110 let mut keyboard = Keyboard :: new ( ) ;
27111
28112 for category in categories {
29113 keyboard. text (
30114 & format ! (
31115 "{}{}" ,
32116 & category[ 0 ..1 ] . to_uppercase( ) ,
33- & category[ 1 ..] . replace( "_" , " " )
117+ & category[ 1 ..] . replace( '_' , " " )
118+ ) ,
119+ & format ! ( "category_{}" , category) ,
120+ ) ;
121+ keyboard. row ( ) ;
122+ }
123+
124+ keyboard. get ( )
125+ }
126+
127+ pub fn keyboard_category_list ( material : & [ Resource ] , category : String ) -> InlineKeyboardMarkup {
128+ let mut keyboard = Keyboard :: new ( ) ;
129+
130+ for ( index, value) in material. iter ( ) . enumerate ( ) {
131+ keyboard. text (
132+ & format ! (
133+ "{}{}" ,
134+ & value. name[ 0 ..1 ] . to_uppercase( ) ,
135+ & value. name[ 1 ..] . replace( '_' , " " )
34136 ) ,
35- & format ! ( "useful_ {}_{}" , page , category) ,
137+ & format ! ( "material_ {}_{}" , index , category) ,
36138 ) ;
37139 keyboard. row ( ) ;
38140 }
39141
142+ keyboard. text ( "🔙 Orqaga" , "useful" ) ;
143+
144+ keyboard. get ( )
145+ }
146+
147+ pub fn keyboard_material_detail ( resource : & Resource , category : String ) -> InlineKeyboardMarkup {
148+ let mut keyboard = Keyboard :: new ( ) ;
149+
150+ keyboard. url ( "Web Sahifasi" , & resource. link ) ;
151+ keyboard. row ( ) ;
152+ keyboard. text ( "🔙 Orqaga" , & format ! ( "category_{}" , category) ) ;
153+
40154 keyboard. get ( )
41155}
0 commit comments