50 lines
1.4 KiB
Rust
50 lines
1.4 KiB
Rust
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::<String>();
|
|
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(())
|
|
}
|
|
}
|