use grammers_client::types::{Chat, Message};
use grammers_client::{Client, InputMessage};
use reqwest;
use std::error::Error;
use crate::db::Database;
use super::{get_message_video, whisper};
pub async fn handle_message(
tg: &mut Client,
message: &Message,
db: &mut Database,
) -> Result<(), Box<dyn std::error::Error>> {
let output = if is_youtube_url(message.text()) {
let youtube_url = message.text().to_string();
if is_youtube_video(&youtube_url).await {
let args = vec!["-y", &youtube_url, "-p", "extract_wisdom"];
super::fabric::execute_fabric_command(&args).await?
} else {
"Invalid YouTube URL or not a video".to_owned()
}
} else if crate::handlers::has_video(&message) {
let message_media = get_message_video(&message);
let media_path = match message_media {
Some(media) => Some(crate::handlers::download_media(tg, media, message.id()).await),
None => None,
};
let mut output = match media_path {
Some(path) => whisper::whisper_rs(&path, db.get_whisper_model()).await,
None => "".to_owned(),
};
if output.starts_with("🚫") {
output = "".to_owned();
}
output
} else {
"".to_owned()
};
if !output.is_empty() {
send_response(tg, &message.chat(), &output, message.reply_to_message_id()).await
} else {
Ok(())
}
}
async fn is_youtube_video(youtube_url: &str) -> bool {
let checker_url = format!("https://www.youtube.com/oembed?url={}", youtube_url);
match reqwest::get(&checker_url).await {
Ok(response) => response.status().is_success(),
Err(_) => false,
}
}
fn is_youtube_url(text: &str) -> bool {
text.contains("youtube.com") || text.contains("youtu.be")
}
async fn send_response(
tg: &Client,
chat: &Chat,
message: &str,
reply_to: Option<i32>,
) -> Result<(), Box<dyn Error>> {
let chunk_size = 4096;
let mut start = 0;
let mut end;
while start < message.len() {
end = start + chunk_size;
if end > message.len() {
end = message.len();
} else {
while !message.is_char_boundary(end) {
end -= 1;
}
if let Some(last_space) = message[start..end].rfind(|c: char| c == ' ' || c == '\n') {
end = start + last_space;
}
}
tg.send_message(
chat,
InputMessage::text(&message[start..end]).reply_to(reply_to),
)
.await?;
start = end;
while start < message.len() && message[start..].starts_with(|c: char| c == ' ' || c == '\n')
{
start += 1;
}
}
Ok(())
}