Shorten the time until the next tick if it's required to send a start notification
This commit is contained in:
39
src/main.rs
39
src/main.rs
@@ -4,14 +4,16 @@ mod db;
|
|||||||
mod error;
|
mod error;
|
||||||
mod schema;
|
mod schema;
|
||||||
|
|
||||||
use std::{env, fs::File, io::BufReader, sync::Arc, time::Duration};
|
use std::time::Duration;
|
||||||
|
use std::{env, fs::File, io::BufReader, sync::Arc};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use async_mutex::Mutex;
|
use async_mutex::Mutex;
|
||||||
use bot::fetch_and_announce_appointment;
|
use bot::fetch_and_announce_appointment;
|
||||||
use chrono::{DateTime, NaiveTime, TimeZone, Utc};
|
use chrono::{DateTime, NaiveDateTime, NaiveTime, TimeZone, Utc};
|
||||||
use chrono_tz::Europe;
|
use chrono_tz::Europe;
|
||||||
use db::ChatInfo;
|
use db::ChatInfo;
|
||||||
|
use diesel::result::Error::NotFound;
|
||||||
use diesel::{Connection, RunQueryDsl, SqliteConnection};
|
use diesel::{Connection, RunQueryDsl, SqliteConnection};
|
||||||
use diesel::{ExpressionMethods, QueryDsl};
|
use diesel::{ExpressionMethods, QueryDsl};
|
||||||
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
|
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
|
||||||
@@ -23,7 +25,7 @@ use teloxide::prelude::RequesterExt;
|
|||||||
use teloxide::requests::Requester;
|
use teloxide::requests::Requester;
|
||||||
use teloxide::types::ChatId;
|
use teloxide::types::ChatId;
|
||||||
use teloxide::{adaptors::throttle::Limits, Bot};
|
use teloxide::{adaptors::throttle::Limits, Bot};
|
||||||
use tokio::time::interval;
|
use tokio::time::sleep;
|
||||||
|
|
||||||
use crate::db::DbChat;
|
use crate::db::DbChat;
|
||||||
|
|
||||||
@@ -77,11 +79,36 @@ async fn main() {
|
|||||||
{
|
{
|
||||||
let db = db.clone();
|
let db = db.clone();
|
||||||
let bot = bot.clone();
|
let bot = bot.clone();
|
||||||
|
let poll_duration = Duration::from_secs(config.poll_interval);
|
||||||
tokio::task::spawn(async move {
|
tokio::task::spawn(async move {
|
||||||
let mut interval = interval(Duration::from_secs(config.poll_interval));
|
|
||||||
interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Delay);
|
|
||||||
loop {
|
loop {
|
||||||
interval.tick().await;
|
let now = Utc::now();
|
||||||
|
|
||||||
|
let next_appointment = db.lock().await.transaction(|db| {
|
||||||
|
use schema::chat::dsl::*;
|
||||||
|
chat.select(next_appointment_start)
|
||||||
|
.filter(next_appointment_start.is_not_null())
|
||||||
|
.filter(next_appointment_start.gt(now.timestamp()))
|
||||||
|
.order(next_appointment_start.asc())
|
||||||
|
.first::<Option<i64>>(db)
|
||||||
|
});
|
||||||
|
|
||||||
|
let next_appointment = match next_appointment {
|
||||||
|
Err(NotFound) => None,
|
||||||
|
Ok(appointment) => appointment,
|
||||||
|
Err(e) => Err(e).unwrap(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let sleep_duration = next_appointment
|
||||||
|
.map(|timestamp| NaiveDateTime::from_timestamp(timestamp, 0))
|
||||||
|
.map(|naive_date_time| DateTime::<Utc>::from_utc(naive_date_time, Utc))
|
||||||
|
.map(|date_time| date_time - now)
|
||||||
|
.map(|duration| duration.to_std().unwrap())
|
||||||
|
.filter(|duration| *duration < poll_duration)
|
||||||
|
.unwrap_or(poll_duration);
|
||||||
|
|
||||||
|
sleep(sleep_duration).await;
|
||||||
|
|
||||||
// TODO Log the error and continue instead
|
// TODO Log the error and continue instead
|
||||||
check_task(&bot, config.reminder_time, &db).await.unwrap();
|
check_task(&bot, config.reminder_time, &db).await.unwrap();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user