revolt_database/tasks/
mod.rs1use crate::{Database, AMQP};
4
5use async_std::task;
6use std::time::Instant;
7
8const WORKER_COUNT: usize = 5;
9
10pub mod ack;
11pub mod authifier_relay;
12pub mod last_message_id;
13pub mod process_embeds;
14
15pub fn start_workers(db: Database, amqp: AMQP) {
17 task::spawn(authifier_relay::worker());
18
19 for _ in 0..WORKER_COUNT {
20 task::spawn(ack::worker(db.clone(), amqp.clone()));
21 task::spawn(last_message_id::worker(db.clone()));
22 task::spawn(process_embeds::worker(db.clone()));
23 }
24}
25
26pub struct DelayedTask<T> {
28 pub data: T,
29 run_now: bool,
30 last_updated: Instant,
31 first_seen: Instant,
32}
33
34static EXPIRE_CONSTANT: u64 = 30;
36
37static SAVE_CONSTANT: u64 = 5;
39
40impl<T> DelayedTask<T> {
41 pub fn new(data: T) -> Self {
43 DelayedTask {
44 data,
45 run_now: false,
46 last_updated: Instant::now(),
47 first_seen: Instant::now(),
48 }
49 }
50
51 pub fn delay(&mut self) {
53 self.last_updated = Instant::now()
54 }
55
56 pub fn run_immediately(&mut self) {
58 self.run_now = true
59 }
60
61 pub fn should_run(&self) -> bool {
63 self.run_now
64 || self.first_seen.elapsed().as_secs() > EXPIRE_CONSTANT
65 || self.last_updated.elapsed().as_secs() > SAVE_CONSTANT
66 }
67}