diff --git a/Cargo.lock b/Cargo.lock
index f5aea19..20bc077 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1269,6 +1269,7 @@ dependencies = [
name = "rustina"
version = "0.1.0"
dependencies = [
+ "async-trait",
"crates_io_api",
"log",
"octocrab",
diff --git a/Cargo.toml b/Cargo.toml
index a121c92..86c9198 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,6 +16,7 @@ uuid = { version = "1.5.0", features = ["v4"] }
serde_json = "1.0.108"
serde = { version = "1.0.192", features = ["derive"] }
octocrab = { version = "0.32.0" }
+async-trait = "0.1.74"
[profile.release]
strip = true
diff --git a/src/functions/about.rs b/src/functions/about.rs
index 29e464e..db7fb63 100644
--- a/src/functions/about.rs
+++ b/src/functions/about.rs
@@ -1,4 +1,7 @@
-use crate::{hooks, utils::keyboard::Keyboard};
+use crate::{
+ hooks,
+ utils::{keyboard::Keyboard, message::Rustina},
+};
use teloxide::{
payloads::SendMessageSetters,
prelude::*,
@@ -19,7 +22,7 @@ pub async fn command(bot: &Bot, msg: &Message) -> ResponseResult<()> {
};
}
- bot.send_message(msg.chat.id, TEXT)
+ bot.send_message_tf(msg.chat.id, TEXT, msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard())
.await?;
diff --git a/src/functions/groups.rs b/src/functions/groups.rs
index f1a4ea7..9a54523 100644
--- a/src/functions/groups.rs
+++ b/src/functions/groups.rs
@@ -1,6 +1,7 @@
use crate::utils::{
groups::{Group, Groups},
keyboard::Keyboard,
+ message::Rustina,
};
use teloxide::{
payloads::{EditMessageTextSetters, SendMessageSetters},
@@ -11,7 +12,7 @@ use teloxide::{
static TEXT: &str = "Telegramdagi Rust Hamjamiyatlari yoki Guruhlari:\nAgar o'zingizni guruhingizni qo'shmoqchi bo'lsangiz, bizni community.json ni yangilang!";
pub async fn command(bot: &Bot, msg: &Message, groups: &Groups) -> ResponseResult<()> {
- bot.send_message(msg.chat.id, TEXT)
+ bot.send_message_tf(msg.chat.id, TEXT, msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard_list(groups, 1))
.disable_web_page_preview(true)
diff --git a/src/functions/help.rs b/src/functions/help.rs
index 4df89a9..a52a288 100644
--- a/src/functions/help.rs
+++ b/src/functions/help.rs
@@ -1,5 +1,5 @@
use super::start::keyboard;
-use crate::Command;
+use crate::{utils::message::Rustina, Command};
use teloxide::{payloads::SendMessageSetters, prelude::*, types::ParseMode};
static TEXT: &[(&str, &str)] = &[
@@ -30,7 +30,7 @@ pub async fn command(bot: &Bot, msg: &Message, _cmd: &Command) -> ResponseResult
text.push('\n');
}
- bot.send_message(msg.chat.id, text)
+ bot.send_message_tf(msg.chat.id, text, msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard())
.await?;
diff --git a/src/functions/joined.rs b/src/functions/joined.rs
index 1b58d4e..d6b83cd 100644
--- a/src/functions/joined.rs
+++ b/src/functions/joined.rs
@@ -1,5 +1,7 @@
use teloxide::{prelude::*, types::*};
+use crate::utils::message::{delete_timer, Rustina};
+
static TEXT: &str = "Salom bo'lajak Rustacean!\n\n\
Sizlarni bu guruhda ko'rib turganimizdan mamnunmiz. Bu guruh Rust dasturlash tiliga qaratilgan hisoblanib, \
bu yerda ushbu til haqida gaplashish, savollar berish yoki o'z fikrlaringiz bilan bo'lishishingiz mumkin. \
@@ -9,26 +11,11 @@ maslahatlar, va hamda /useful yordamoda foydali resurslar olishingiz mumkin.
pub async fn trigger(bot: &Bot, msg: &Message) -> ResponseResult<()> {
let message = bot
- .send_message(msg.chat.id, TEXT)
- .parse_mode(ParseMode::Html);
-
- let message: Message = if msg.thread_id.is_some() {
- message
- .message_thread_id(msg.thread_id.unwrap())
- .send()
- .await?
- } else {
- message.send().await?
- };
+ .send_message_tf(msg.chat.id, TEXT, msg)
+ .parse_mode(ParseMode::Html)
+ .await?;
- let thread_bot = bot.clone();
- tokio::spawn(async move {
- tokio::time::sleep(tokio::time::Duration::from_secs(60 * 5)).await;
- match thread_bot.delete_message(message.chat.id, message.id).await {
- Ok(_) => {}
- Err(_) => {}
- };
- });
+ delete_timer(bot, &message, 60 * 5).await?;
Ok(())
}
diff --git a/src/functions/latest.rs b/src/functions/latest.rs
index 2b3fc82..8935a26 100644
--- a/src/functions/latest.rs
+++ b/src/functions/latest.rs
@@ -1,4 +1,4 @@
-use crate::utils::{github::GitHub, keyboard::Keyboard};
+use crate::utils::{github::GitHub, keyboard::Keyboard, message::Rustina};
use octocrab::models::repos::Release;
use teloxide::{
payloads::SendMessageSetters,
@@ -9,7 +9,7 @@ use teloxide::{
pub async fn command(bot: &Bot, github: GitHub, msg: &Message) -> ResponseResult<()> {
let latest = github.get_latest().await.unwrap();
- bot.send_message(msg.chat.id, view(&latest))
+ bot.send_message_tf(msg.chat.id, view(&latest), msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard(&latest))
.await?;
diff --git a/src/functions/offtop.rs b/src/functions/offtop.rs
index 7e2b840..d71e4c9 100644
--- a/src/functions/offtop.rs
+++ b/src/functions/offtop.rs
@@ -1,4 +1,4 @@
-use crate::utils::keyboard::Keyboard;
+use crate::utils::{keyboard::Keyboard, message::Rustina};
use teloxide::{prelude::*, types::*};
static TEXT_FAIL: &str = "Ha-ha... yaxshi urinish!";
@@ -7,7 +7,8 @@ static TEXT_NON_REPLY: &str = "↪ Reply bilan ko'rsatingchi habarni!";
pub async fn command(bot: &Bot, msg: &Message, me: &Me) -> ResponseResult<()> {
if msg.reply_to_message().is_none() {
return {
- bot.send_message(msg.chat.id, TEXT_NON_REPLY).await?;
+ bot.send_message_tf(msg.chat.id, TEXT_NON_REPLY, msg)
+ .await?;
Ok(())
};
}
@@ -16,7 +17,7 @@ pub async fn command(bot: &Bot, msg: &Message, me: &Me) -> ResponseResult<()> {
if let Some(user) = msg.reply_to_message().as_ref().unwrap().from() {
if user.username.is_some() && user.username.clone().unwrap() == me.username() {
return {
- bot.send_message(msg.chat.id, TEXT_FAIL).await?;
+ bot.send_message_tf(msg.chat.id, TEXT_FAIL, msg).await?;
Ok(())
};
}
@@ -26,7 +27,7 @@ pub async fn command(bot: &Bot, msg: &Message, me: &Me) -> ResponseResult<()> {
bot.delete_message(msg.chat.id, msg.reply_to_message().unwrap().id)
.await?;
- bot.send_message(msg.chat.id, view(msg.reply_to_message().unwrap()))
+ bot.send_message_tf(msg.chat.id, view(msg.reply_to_message().unwrap()), msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard())
.await?;
diff --git a/src/functions/start.rs b/src/functions/start.rs
index 832d5b7..2a114fa 100644
--- a/src/functions/start.rs
+++ b/src/functions/start.rs
@@ -1,4 +1,4 @@
-use crate::utils::keyboard::Keyboard;
+use crate::utils::{keyboard::Keyboard, message::Rustina};
use teloxide::{
payloads::SendMessageSetters,
prelude::*,
@@ -12,7 +12,7 @@ Sizni ko'rib turganimdan bag'oyatda xursandman. Men O'zbek Rust jamiyati tomonid
"#;
pub async fn command(bot: &Bot, msg: &Message) -> ResponseResult<()> {
- bot.send_message(msg.chat.id, TEXT)
+ bot.send_message_tf(msg.chat.id, TEXT, msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard())
.await?;
diff --git a/src/functions/useful.rs b/src/functions/useful.rs
index 99ae364..135294a 100644
--- a/src/functions/useful.rs
+++ b/src/functions/useful.rs
@@ -1,5 +1,6 @@
use crate::utils::{
keyboard::Keyboard,
+ message::Rustina,
resources::{Resource, Resources},
};
use teloxide::{
@@ -16,7 +17,7 @@ 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)
+ bot.send_message_tf(msg.chat.id, TEXT, msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard_list(categories))
.disable_web_page_preview(true)
diff --git a/src/functions/version.rs b/src/functions/version.rs
index b1d4559..62452ed 100644
--- a/src/functions/version.rs
+++ b/src/functions/version.rs
@@ -1,4 +1,4 @@
-use crate::utils::{github::GitHub, keyboard::Keyboard};
+use crate::utils::{github::GitHub, keyboard::Keyboard, message::Rustina};
use octocrab::models::repos::Release;
use teloxide::{
payloads::SendMessageSetters,
@@ -12,7 +12,7 @@ pub async fn command(bot: &Bot, github: GitHub, msg: &Message) -> ResponseResult
let versions = github.get_list(1).await.unwrap();
let next_page = github.get_list(2).await.unwrap();
- bot.send_message(msg.chat.id, TEXT)
+ bot.send_message_tf(msg.chat.id, TEXT, msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard_list(1, versions, Some(next_page)))
.await?;
diff --git a/src/hooks/is_private.rs b/src/hooks/is_private.rs
index fcb520f..c04d289 100644
--- a/src/hooks/is_private.rs
+++ b/src/hooks/is_private.rs
@@ -4,7 +4,10 @@ use teloxide::{
types::{InlineKeyboardMarkup, ParseMode},
};
-use crate::utils::keyboard::Keyboard;
+use crate::utils::{
+ keyboard::Keyboard,
+ message::{delete_timer, Rustina},
+};
static TEXT: &str = "⚠️ Bu komanda faqat shaxsiy chat uchun!";
@@ -20,19 +23,12 @@ pub async fn is_private(bot: &Bot, msg: &Message) -> ResponseResult<()> {
};
let message = bot
- .send_message(msg.chat.id, TEXT)
+ .send_message_tf(msg.chat.id, TEXT, msg)
.parse_mode(ParseMode::Html)
.reply_markup(keyboard())
.await?;
- let thread_bot = bot.clone();
- tokio::spawn(async move {
- tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
- match thread_bot.delete_message(message.chat.id, message.id).await {
- Ok(_) => {}
- Err(_) => {}
- };
- });
+ delete_timer(bot, &message, 10).await?;
Ok(())
}
diff --git a/src/utils/message.rs b/src/utils/message.rs
index 2cc1fa7..8121267 100644
--- a/src/utils/message.rs
+++ b/src/utils/message.rs
@@ -1,5 +1,12 @@
-use teloxide::{payloads::*, prelude::*, requests::JsonRequest, types::*};
+use async_trait::async_trait;
+use teloxide::{
+ prelude::*,
+ requests::JsonRequest,
+ types::*,
+ {payloads, payloads::*},
+};
+#[async_trait]
pub trait Rustina {
type Err: std::error::Error + Send;
type SendMessageTF: Request;
@@ -11,9 +18,10 @@ pub trait Rustina {
T: Into;
}
+#[async_trait]
impl Rustina for Bot {
type Err = teloxide::errors::RequestError;
- type SendMessageTF = JsonRequest;
+ type SendMessageTF = JsonRequest;
fn send_message_tf(&self, chat_id: C, text: T, message: &Message) -> Self::SendMessageTF
where
@@ -21,15 +29,29 @@ impl Rustina for Bot {
T: Into,
{
match message.thread_id {
- Some(thread_id) => Self::SendMessageTF::new(
- self.clone(),
- teloxide::payloads::SendMessage::new(chat_id, text),
- )
- .message_thread_id(thread_id),
- None => Self::SendMessageTF::new(
- self.clone(),
- teloxide::payloads::SendMessage::new(chat_id, text),
- ),
+ Some(thread_id) => {
+ Self::SendMessageTF::new(self.clone(), payloads::SendMessage::new(chat_id, text))
+ .message_thread_id(thread_id)
+ }
+ None => {
+ Self::SendMessageTF::new(self.clone(), payloads::SendMessage::new(chat_id, text))
+ }
}
}
}
+
+// Delete a message after a certain time
+pub async fn delete_timer(bot: &Bot, message: &Message, timer: u64) -> ResponseResult<()> {
+ let bot = bot.clone();
+ let message = message.clone();
+
+ tokio::spawn(async move {
+ tokio::time::sleep(tokio::time::Duration::from_secs(timer)).await;
+ match bot.delete_message(message.chat.id, message.id).await {
+ Ok(_) => {}
+ Err(_) => {}
+ };
+ });
+
+ Ok(())
+}