use grammers_client::types::{Chat, Message, User};
use grammers_client::{Client, Update};
use log::debug;
use std::collections::HashMap;
use crate::db::Database;
use crate::handlers;
pub async fn handle_updates(
mut tg: Client,
chat_map: HashMap<i64, String>,
db: &mut Database,
) -> Result<(), Box<dyn std::error::Error>> {
let me = tg.get_me().await?;
loop {
match tg.next_update().await? {
Update::NewMessage(message) => {
match message.outgoing() {
true => debug!("out {}({}) ", message.chat().name(), message.chat().id()),
false => debug!("in {}({})", message.chat().name(), message.chat().id()),
};
if is_you(&me, &message) {
handlers::you_hander::handle_message(&mut tg, &message, chat_map.clone(), db)
.await?;
} else if is_monitored_chat(&message, &db.get_chat_ids()) {
handlers::message_handler::handle_message(&mut tg, &message, db).await?;
} else {
debug!(
"Ignoring update from {}({})",
message.chat().name(),
message.chat().id()
)
}
}
_ => {}
};
}
}
fn is_you(me: &User, message: &Message) -> bool {
let is_you = match message.sender() {
Some(sender) => sender.id() == me.id(),
None => false,
};
is_you
}
fn is_monitored_chat(message: &Message, chat_ids: &[i64]) -> bool {
let direction = if message.outgoing() {
"outgoing"
} else {
"incoming"
};
let chat = if matches!(message.chat(), Chat::User(_)) {
"user"
} else if matches!(message.chat(), Chat::Group(_)) {
"group"
} else if matches!(message.chat(), Chat::Channel(_)) {
"channel"
} else {
"unknown"
};
debug!(
"{}-{} ChatId:{} Watched?{} ",
direction,
chat,
&message.chat().id(),
chat_ids.contains(&message.chat().id()),
);
chat_ids.contains(&message.chat().id())
}