From 54fd78cb9e8376f62fd1175af696e51b385b6978 Mon Sep 17 00:00:00 2001 From: Sokhibjon Orzikulov Date: Fri, 17 Nov 2023 14:11:56 +0500 Subject: [PATCH] implemented group feature --- delta/groups.ts | 99 -------------------------------------- delta/mod.ts | 2 - src/functions/groups.rs | 74 ++++++++++++++++++++++------ src/functions/mod.rs | 13 ++--- src/utils/group_manager.rs | 12 ++++- 5 files changed, 74 insertions(+), 126 deletions(-) delete mode 100644 delta/groups.ts diff --git a/delta/groups.ts b/delta/groups.ts deleted file mode 100644 index 396a2b6..0000000 --- a/delta/groups.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Composer, Context, InlineKeyboard } from "../deps.ts"; -import communities from "../communities.json" assert { type: "json" }; -import pager from "../utils/pager.ts"; -import { reply } from "../utils/sender.ts"; - -const composer = new Composer(); -const ctxMenuText = - "Telegramdagi Rust Hamjamiyatlari yoki Guruhlari:\nAgar o'zingizni guruhingizni qo'shmoqchi bo'lsangiz, bizni community.json ni yangilang!"; - -composer.command("group", async (ctx: Context): Promise => { - const keyboard = new InlineKeyboard(); - - for (const community of pager(1)) { - keyboard.text( - community.name, - `detail_${1}_${community.telegram.replace("@", "")}`, - ).row(); - } - - if (pager(2).length > 0) { - keyboard.text(`Keyingi ➡️`, `group_2`); - } - - await reply(ctx, ctxMenuText, keyboard, { - disable_web_page_preview: true, - }); -}); - -composer.callbackQuery(/^group_(\d+)$/, async (ctx: Context) => { - const page = Number(ctx.match![1]); - const keyboard = new InlineKeyboard(); - - for (const community of pager(page)) { - keyboard.text( - community.name, - `detail_${page}_${community.telegram.replace("@", "")}`, - ).row(); - } - - if (pager(page - 1).length > 0) { - keyboard.text(`⬅️ Oldingi`, `group_${page - 1}`); - } - - if (pager(page + 1).length > 0) { - keyboard.text(`Keyingi ➡️`, `group_${page + 1}`); - } - - await ctx.editMessageText(ctxMenuText, { - parse_mode: "HTML", - reply_markup: keyboard, - disable_web_page_preview: true, - }); -}); - -composer.callbackQuery(/^detail_(\d+)_(.*)$/, async (ctx: Context) => { - const keyboard = new InlineKeyboard(); - const page = ctx.match![1]; - const result = communities.filter((com) => - com.telegram.replace("@", "") === ctx.match![2] - ); - - if (result.length) { - const data = result[0]; - - if (data.telegram) { - keyboard.url( - `Telegram`, - `https://t.me/${data.telegram.replace("@", "")}`, - ); - } - - if (data.link) { - keyboard.url(`Web`, data.link); - } - - keyboard.row().text(`🔙 Orqaga`, `group_${page}`); - - await ctx.editMessageText( - `${data.name}` + - `\n` + - `\n` + - `${data.about}` + - `\n` + - `\n` + - `Use the following buttons to get to the links:`, - { - parse_mode: "HTML", - reply_markup: keyboard, - }, - ); - } else { - await ctx.editMessageText(`Ushbu guruh mavjud emas!`, { - parse_mode: "HTML", - reply_markup: new InlineKeyboard().text(`🔙 Orqaga`, `group_${page}`), - }); - } -}); - -export default composer; diff --git a/delta/mod.ts b/delta/mod.ts index a15b3b3..bc91709 100644 --- a/delta/mod.ts +++ b/delta/mod.ts @@ -2,7 +2,6 @@ import which from "./which.ts"; import { Bot } from "../deps.ts"; import channel from "./channel.ts"; import trigger from "./trigger.ts"; -import groups from "./groups.ts"; import useful from "./useful.ts"; import latest from "./latest.ts"; import version from "./version.ts"; @@ -10,7 +9,6 @@ import version from "./version.ts"; export default async (bot: Bot) => { await bot .use(which) - .use(groups) .use(useful) .use(latest) .use(version) diff --git a/src/functions/groups.rs b/src/functions/groups.rs index 1ecc0f9..316d0d6 100644 --- a/src/functions/groups.rs +++ b/src/functions/groups.rs @@ -1,4 +1,4 @@ -use crate::utils::{group_manager::Groups, keyboard_manager::Keyboard}; +use crate::utils::{group_manager::{Groups, Group}, keyboard_manager::Keyboard}; use teloxide::{ payloads::SendMessageSetters, prelude::*, @@ -12,26 +12,39 @@ pub async fn command(bot: &Bot, msg: &Message) -> ResponseResult<()> { bot.send_message(msg.chat.id, TEXT) .parse_mode(ParseMode::Html) - .reply_markup(keyboard(&groups, 1)) + .reply_markup(keyboard_list(&groups, 1)) .await?; Ok(()) } -pub async fn callback(bot: &Bot, q: &CallbackQuery, args: &Vec<&str>) -> ResponseResult<()> { +pub async fn callback_list(bot: &Bot, q: &CallbackQuery, args: &Vec<&str>) -> ResponseResult<()> { let groups: Groups = Groups::new(); - - // Parse page - let page: i32 = match args[1].parse() { - Ok(page) => page, - Err(_) => 1, - }; - - if args.is_empty() { + + if !args.is_empty() { if let Some(Message { id, chat, .. }) = q.message.clone() { bot.edit_message_text(chat.id, id, TEXT) .parse_mode(ParseMode::Html) - .reply_markup(keyboard(&groups, page)) + .reply_markup(keyboard_list(&groups, args[0].parse().unwrap_or(1))) + .await?; + } else if let Some(id) = q.inline_message_id.clone() { + bot.edit_message_text_inline(id, "Oopsie, something went wrong...") + .await?; + } + } + + Ok(()) +} + +pub async fn callback_detail(bot: &Bot, q: &CallbackQuery, args: &Vec<&str>) -> ResponseResult<()> { + let groups: Groups = Groups::new(); + let find = groups.find_group(args[1..].join("_").to_string()); + + if !args.is_empty() { + if let Some(Message { id, chat, .. }) = q.message.clone() { + bot.edit_message_text(chat.id, id, view_detail(&find)) + .parse_mode(ParseMode::Html) + .reply_markup(keyboard_detail( args[0].parse().unwrap_or(1), &find)) .await?; } else if let Some(id) = q.inline_message_id.clone() { bot.edit_message_text_inline(id, "Oopsie, something went wrong...") @@ -42,7 +55,18 @@ pub async fn callback(bot: &Bot, q: &CallbackQuery, args: &Vec<&str>) -> Respons Ok(()) } -pub fn keyboard(groups: &Groups, page: i32) -> InlineKeyboardMarkup { +pub fn view_detail(data: &Option) -> String { + match data { + Some(d) => { + format!("{}\n\n{}\n\nUse the following buttons to get to the links:", d.name, d.about) + }, + None => { + "Ushbu guruh mavjud emas!".to_string() + } + } +} + +pub fn keyboard_list(groups: &Groups, page: i32) -> InlineKeyboardMarkup { let mut keyboard = Keyboard::new(); for group in groups.get_groups(page, 5) { @@ -58,11 +82,31 @@ pub fn keyboard(groups: &Groups, page: i32) -> InlineKeyboardMarkup { } if !groups.get_groups(page + 1, 5).is_empty() { - keyboard.text(&"Keyingi ➡️", &format!("group_{}", page + 1)); + keyboard.text("Keyingi ➡️", &format!("group_{}", page + 1)); } if page > 1 { - keyboard.text(&"⬅️ Oldingi", &format!("group_{}", page - 1)); + keyboard.text("⬅️ Oldingi", &format!("group_{}", page - 1)); + } + + keyboard.get() +} + +pub fn keyboard_detail(page: i32, data: &Option) -> InlineKeyboardMarkup { + let mut keyboard = Keyboard::new(); + + if let Some(group) = data { + keyboard.url("Telegram", &format!("https://t.me/{}", group.telegram)); + + if group.link.is_some() { + keyboard.url("Web", &group.link.clone().unwrap()); + } + + keyboard.row(); + + keyboard.text("🔙 Orqaga", &format!("group_{}", page)); + } else { + keyboard.text("🔙 Orqaga", &format!("group_{}", page)); } keyboard.get() diff --git a/src/functions/mod.rs b/src/functions/mod.rs index 1406d06..627bc5c 100644 --- a/src/functions/mod.rs +++ b/src/functions/mod.rs @@ -31,19 +31,16 @@ pub async fn commands( pub async fn callback(bot: Bot, q: CallbackQuery) -> Result<(), Box> { let mut args: Vec<&str> = Vec::new(); - println!("Receiving callback: {:?}", q.data); - if let Some(data) = q.data.clone() { - if data.contains("_") { - args = data.split("_").collect(); + if data.contains('_') { + args = data.split('_').collect(); } else { args.push(&data); } - println!("Parsed arguments: {:?}", args); - - let _ = match args[0] { - "group" => crate::functions::groups::callback(&bot, &q, &args).await, + let _ = match args.remove(0) { + "group" => crate::functions::groups::callback_list(&bot, &q, &args).await, + "detail" => crate::functions::groups::callback_detail(&bot, &q, &args).await, _ => Ok(()), }; } diff --git a/src/utils/group_manager.rs b/src/utils/group_manager.rs index 77cea14..11179dd 100644 --- a/src/utils/group_manager.rs +++ b/src/utils/group_manager.rs @@ -26,8 +26,6 @@ impl Groups { let start = (page_number - 1) * page_size; let end = page_number * page_size; - println!("start: {}, end: {}", start, end); - if start < 0 || end < 0 { return Vec::new(); } @@ -42,4 +40,14 @@ impl Groups { self.groups[start as usize..end as usize].to_vec() } + + pub fn find_group(&self, query: String) -> Option { + let search: Vec<&Group> = self.groups.iter().filter(|group| group.telegram[1..] == query).collect(); + + if search.is_empty() { + return None; + } + + Some(search[0].clone()) + } }