use std::{env, error::Error, time::Duration};
use fetcher::{
Job, Task,
actions::{sink, transform_body, transforms::field::Replace},
auth,
job::{JobResult, trigger},
scaffold::{InitResult, init},
sinks::Telegram,
sources::{
Email,
email::{self, ViewMode},
},
};
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn Error>> {
let InitResult { ctrlc_cancel_token } = init();
let auth = auth::Google::new(
env::var("GOOGLE_CLIENT_ID")?,
env::var("GOOGLE_CLIENT_SECRET")?,
env::var("GOOGLE_REFRESH_TOKEN")?,
);
let filters = email::Filters::builder()
.sender("notifications@github.com")
.subject("release")
.build();
let email_source = Email::new_gmail()
.email("example@gmail.com")
.auth(auth)
.filters(filters)
.view_mode(ViewMode::Delete)
.call();
let actions = (
transform_body(Replace::new(
"(?s)(You are receiving this because you are subscribed to this thread).*",
"",
)?),
sink(Telegram::new(env::var("TELEGRAM_BOT_TOKEN")?, -123_456_789)),
);
let task = Task::builder("github releases")
.source(email_source)
.action(actions)
.build_without_replies();
let mut job = Job::builder("github releases")
.tasks(task)
.trigger(trigger::Every(Duration::from_secs(
30 * 60,
)))
.cancel_token(Some(ctrlc_cancel_token))
.build_with_default_error_handling();
let result = job.run().await;
match result {
JobResult::Ok => Ok(()),
JobResult::Err(errors) => Err(Box::new(errors.into_first()) as Box<_>),
JobResult::Panicked { payload: _ } => Ok(()),
JobResult::TriggerFailed(_) => unreachable!(),
}
}