use std::time::Duration; use grammers_client::{types::Message, Client, InputMessage, Update}; use crate::{bot::handlers::Handler, utils::messages::get_message}; #[derive(Clone)] pub struct Rotator; async fn rotator(replied_message: Message, text: String) { let mut skip = 1; let start = std::time::SystemTime::now(); let mut current = std::time::SystemTime::now(); while current .duration_since(start) .map(|dur| dur.as_secs()) .unwrap_or(100) < 10 { let rotated = text .chars() .cycle() .skip(skip) .take(text.len()) .collect::(); skip += 1; if skip == rotated.len() { skip = 1; } replied_message.edit(rotated).await.ok(); current = std::time::SystemTime::now(); tokio::time::sleep(Duration::from_millis(200)).await; } replied_message.delete().await.ok(); } #[async_trait::async_trait] impl Handler for Rotator { async fn react(&self, _: &Client, update: &Update) -> anyhow::Result<()> { let Some(message) = get_message(update) else { return Ok(()); }; if let Some(text) = message.text().strip_prefix(".rl").map(str::trim) { let replied_message = message.reply(InputMessage::from(text).silent(true)).await?; tokio::spawn(rotator(replied_message, text.to_string())); } Ok(()) } }