2021-09-29 01:03:47 +00:00
|
|
|
use std::collections::HashMap;
|
2021-04-09 00:22:17 +00:00
|
|
|
use std::time::Duration;
|
|
|
|
|
2021-09-29 01:03:47 +00:00
|
|
|
use chrono::{DateTime, Utc};
|
|
|
|
use uuid::Uuid;
|
|
|
|
|
2023-02-05 12:11:30 +00:00
|
|
|
use crate::config::Config;
|
|
|
|
use crate::database::DbPool;
|
2022-06-24 23:27:09 +00:00
|
|
|
use crate::ethereum::contracts::Blockchain;
|
2023-02-05 12:11:30 +00:00
|
|
|
|
|
|
|
use super::periodic_tasks::*;
|
2021-04-09 00:22:17 +00:00
|
|
|
|
2022-06-21 16:17:30 +00:00
|
|
|
#[derive(Debug, Eq, Hash, PartialEq)]
|
2023-02-05 09:29:46 +00:00
|
|
|
enum PeriodicTask {
|
2022-06-20 20:28:46 +00:00
|
|
|
NftMonitor,
|
2022-08-28 12:01:26 +00:00
|
|
|
EthereumSubscriptionMonitor,
|
|
|
|
SubscriptionExpirationMonitor,
|
2022-08-19 19:21:42 +00:00
|
|
|
MoneroPaymentMonitor,
|
2023-02-05 09:29:46 +00:00
|
|
|
IncomingActivityQueueExecutor,
|
|
|
|
OutgoingActivityQueueExecutor,
|
2023-02-05 01:22:33 +00:00
|
|
|
DeleteExtraneousPosts,
|
2023-02-05 20:28:40 +00:00
|
|
|
DeleteEmptyProfiles,
|
2022-06-20 20:28:46 +00:00
|
|
|
}
|
|
|
|
|
2023-02-05 09:29:46 +00:00
|
|
|
impl PeriodicTask {
|
2022-06-20 20:28:46 +00:00
|
|
|
/// Returns task period (in seconds)
|
|
|
|
fn period(&self) -> i64 {
|
|
|
|
match self {
|
|
|
|
Self::NftMonitor => 30,
|
2022-08-28 12:01:26 +00:00
|
|
|
Self::EthereumSubscriptionMonitor => 300,
|
|
|
|
Self::SubscriptionExpirationMonitor => 300,
|
2022-08-19 19:21:42 +00:00
|
|
|
Self::MoneroPaymentMonitor => 30,
|
2023-02-05 09:29:46 +00:00
|
|
|
Self::IncomingActivityQueueExecutor => 5,
|
|
|
|
Self::OutgoingActivityQueueExecutor => 5,
|
2023-02-05 01:22:33 +00:00
|
|
|
Self::DeleteExtraneousPosts => 3600,
|
2023-02-05 20:28:40 +00:00
|
|
|
Self::DeleteEmptyProfiles => 3600,
|
2022-06-20 20:28:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-05 09:29:46 +00:00
|
|
|
fn is_ready(&self, last_run: &Option<DateTime<Utc>>) -> bool {
|
|
|
|
match last_run {
|
|
|
|
Some(last_run) => {
|
|
|
|
let time_passed = Utc::now() - *last_run;
|
|
|
|
time_passed.num_seconds() >= self.period()
|
|
|
|
},
|
|
|
|
None => true,
|
|
|
|
}
|
2022-06-20 20:28:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-14 10:29:14 +00:00
|
|
|
pub fn run(
|
2022-07-14 13:34:50 +00:00
|
|
|
config: Config,
|
2022-06-24 23:27:09 +00:00
|
|
|
mut maybe_blockchain: Option<Blockchain>,
|
2022-12-03 21:23:52 +00:00
|
|
|
db_pool: DbPool,
|
2022-06-14 10:29:14 +00:00
|
|
|
) -> () {
|
2022-04-12 12:39:32 +00:00
|
|
|
tokio::spawn(async move {
|
2022-12-15 17:43:30 +00:00
|
|
|
let mut scheduler_state = HashMap::from([
|
2023-02-05 09:29:46 +00:00
|
|
|
(PeriodicTask::NftMonitor, None),
|
|
|
|
(PeriodicTask::EthereumSubscriptionMonitor, None),
|
|
|
|
(PeriodicTask::SubscriptionExpirationMonitor, None),
|
|
|
|
(PeriodicTask::MoneroPaymentMonitor, None),
|
|
|
|
(PeriodicTask::IncomingActivityQueueExecutor, None),
|
|
|
|
(PeriodicTask::OutgoingActivityQueueExecutor, None),
|
2022-12-15 17:43:30 +00:00
|
|
|
]);
|
2023-02-05 01:22:33 +00:00
|
|
|
if config.retention.extraneous_posts.is_some() {
|
|
|
|
scheduler_state.insert(PeriodicTask::DeleteExtraneousPosts, None);
|
|
|
|
};
|
2023-02-05 20:28:40 +00:00
|
|
|
if config.retention.empty_profiles.is_some() {
|
|
|
|
scheduler_state.insert(PeriodicTask::DeleteEmptyProfiles, None);
|
|
|
|
};
|
2022-06-20 20:28:46 +00:00
|
|
|
|
|
|
|
let mut interval = tokio::time::interval(Duration::from_secs(5));
|
2021-09-29 01:03:47 +00:00
|
|
|
let mut token_waitlist_map: HashMap<Uuid, DateTime<Utc>> = HashMap::new();
|
2021-04-09 00:22:17 +00:00
|
|
|
loop {
|
|
|
|
interval.tick().await;
|
2021-11-06 12:48:52 +00:00
|
|
|
|
2022-06-20 20:28:46 +00:00
|
|
|
for (task, last_run) in scheduler_state.iter_mut() {
|
2023-02-05 09:29:46 +00:00
|
|
|
if !task.is_ready(last_run) {
|
2022-06-20 20:28:46 +00:00
|
|
|
continue;
|
|
|
|
};
|
2022-06-21 16:17:30 +00:00
|
|
|
let task_result = match task {
|
2023-02-05 09:29:46 +00:00
|
|
|
PeriodicTask::NftMonitor => {
|
|
|
|
nft_monitor(
|
2022-06-29 17:30:36 +00:00
|
|
|
maybe_blockchain.as_mut(),
|
|
|
|
&db_pool,
|
|
|
|
&mut token_waitlist_map,
|
|
|
|
).await
|
2022-06-20 20:28:46 +00:00
|
|
|
},
|
2023-02-05 09:29:46 +00:00
|
|
|
PeriodicTask::EthereumSubscriptionMonitor => {
|
|
|
|
ethereum_subscription_monitor(
|
2023-02-05 12:11:30 +00:00
|
|
|
&config,
|
2022-06-29 17:30:36 +00:00
|
|
|
maybe_blockchain.as_mut(),
|
|
|
|
&db_pool,
|
|
|
|
).await
|
2022-06-20 20:28:46 +00:00
|
|
|
},
|
2023-02-05 09:29:46 +00:00
|
|
|
PeriodicTask::SubscriptionExpirationMonitor => {
|
|
|
|
subscription_expiration_monitor(&config, &db_pool).await
|
2022-08-28 12:01:26 +00:00
|
|
|
},
|
2023-02-05 09:29:46 +00:00
|
|
|
PeriodicTask::MoneroPaymentMonitor => {
|
|
|
|
monero_payment_monitor(&config, &db_pool).await
|
2022-08-19 19:21:42 +00:00
|
|
|
},
|
2023-02-05 09:29:46 +00:00
|
|
|
PeriodicTask::IncomingActivityQueueExecutor => {
|
|
|
|
incoming_activity_queue_executor(&config, &db_pool).await
|
2022-12-11 23:29:57 +00:00
|
|
|
},
|
2023-02-05 09:29:46 +00:00
|
|
|
PeriodicTask::OutgoingActivityQueueExecutor => {
|
|
|
|
outgoing_activity_queue_executor(&config, &db_pool).await
|
2022-12-11 18:41:08 +00:00
|
|
|
},
|
2023-02-05 01:22:33 +00:00
|
|
|
PeriodicTask::DeleteExtraneousPosts => {
|
|
|
|
delete_extraneous_posts(&config, &db_pool).await
|
|
|
|
},
|
2023-02-05 20:28:40 +00:00
|
|
|
PeriodicTask::DeleteEmptyProfiles => {
|
|
|
|
delete_empty_profiles(&config, &db_pool).await
|
|
|
|
},
|
2022-06-20 20:28:46 +00:00
|
|
|
};
|
2022-06-21 16:17:30 +00:00
|
|
|
task_result.unwrap_or_else(|err| {
|
|
|
|
log::error!("{:?}: {}", task, err);
|
|
|
|
});
|
2022-06-20 20:28:46 +00:00
|
|
|
*last_run = Some(Utc::now());
|
|
|
|
};
|
2022-08-28 12:01:26 +00:00
|
|
|
};
|
2021-04-09 00:22:17 +00:00
|
|
|
});
|
|
|
|
}
|