added a schedule system
This commit is contained in:
@@ -4,16 +4,16 @@
|
|||||||
<!-- - [x] ~~Discord bot /bk_help command~~ -->
|
<!-- - [x] ~~Discord bot /bk_help command~~ -->
|
||||||
<!-- - [x] ~~Scrape the data~~ -->
|
<!-- - [x] ~~Scrape the data~~ -->
|
||||||
<!-- - [x] ~~Put it in a JSON~~ -->
|
<!-- - [x] ~~Put it in a JSON~~ -->
|
||||||
<!-- - [x] ~~Multithread so it can run both Discord and Reddit bot!!!~~ -->¨
|
<!-- - [x] ~~Multithread so it can run both Discord and Reddit bot!!!~~ -->
|
||||||
<!-- - [x] Security that only allows bk mods to run these commands. -->
|
<!-- - [x] Security that only allows bk mods to run these commands. -->
|
||||||
<!-- - [x] Some kind of voting system. -->
|
<!-- - [x] Some kind of voting system. -->
|
||||||
- [ ] `/bk_week_top [category] [amount]` to get the top N posts in a category (e.g upvotes)
|
- [ ] `/bk_week_top [category] [amount]` to get the top N posts in a category (e.g upvotes)
|
||||||
- [ ] Allow updating the data autonomously and via manual commands.
|
- [ ] Allow updating the data autonomously and via manual commands.
|
||||||
- [ ] 10-minute schedule for updating Discord channel
|
- [ ] 10-minute schedule for updating Discord channel
|
||||||
- [ ] Manually add posts
|
<!-- - [x] ~~Manually add posts~~ -->
|
||||||
- [ ] via `u/[bot] add`
|
<!-- - [x] ~~via `u/[bot] add`~~ -->
|
||||||
- [ ] 2 minute schedule for responding to commands
|
|
||||||
<!-- - [x] ~~via `/bk_week_add [url]`~~ -->
|
<!-- - [x] ~~via `/bk_week_add [url]`~~ -->
|
||||||
|
<!-- - [x] ~~2 minute schedule for responding to commands~~ -->
|
||||||
<!-- - [x] ~~Manually remove posts via `/bk_week_remove [url]`~~ -->
|
<!-- - [x] ~~Manually remove posts via `/bk_week_remove [url]`~~ -->
|
||||||
<!-- - [x] ~~Manually approve posts via `/bk_week_approve [url]`~~ -->
|
<!-- - [x] ~~Manually approve posts via `/bk_week_approve [url]`~~ -->
|
||||||
<!-- - [x] ~~Manually un-approve posts via `/bk_week_disapprove [url]`~~ -->
|
<!-- - [x] ~~Manually un-approve posts via `/bk_week_disapprove [url]`~~ -->
|
||||||
|
|||||||
+52
-3
@@ -9,8 +9,11 @@ mod macros;
|
|||||||
mod websocket;
|
mod websocket;
|
||||||
mod data;
|
mod data;
|
||||||
|
|
||||||
|
use std::future::Future;
|
||||||
|
use std::pin::Pin;
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use poise::serenity_prelude as serenity;
|
use poise::serenity_prelude as serenity;
|
||||||
@@ -20,6 +23,9 @@ use serde_json::Value;
|
|||||||
use tokio::runtime::Runtime;
|
use tokio::runtime::Runtime;
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
|
use tokio::task::JoinHandle;
|
||||||
|
use tokio::time;
|
||||||
|
use websocket::send_cmd_json;
|
||||||
|
|
||||||
|
|
||||||
// TODO: bot command permissions
|
// TODO: bot command permissions
|
||||||
@@ -43,6 +49,11 @@ struct Args {
|
|||||||
noping: bool
|
noping: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
type Error = Box<dyn std::error::Error + Send + Sync>;
|
||||||
|
type Context<'a> = poise::Context<'a, Data, Error>;
|
||||||
|
|
||||||
|
|
||||||
struct Data {
|
struct Data {
|
||||||
ball_prompts: [Vec<String>; 2],
|
ball_prompts: [Vec<String>; 2],
|
||||||
byte_dice_id: u64,
|
byte_dice_id: u64,
|
||||||
@@ -50,10 +61,7 @@ struct Data {
|
|||||||
discord_data: Mutex<Option<Value>>,
|
discord_data: Mutex<Option<Value>>,
|
||||||
bk_mods_json: Value,
|
bk_mods_json: Value,
|
||||||
args: Args
|
args: Args
|
||||||
// TODO: schedules
|
|
||||||
}
|
}
|
||||||
type Error = Box<dyn std::error::Error + Send + Sync>;
|
|
||||||
type Context<'a> = poise::Context<'a, Data, Error>;
|
|
||||||
|
|
||||||
|
|
||||||
static BK_WEEK: &str = "bk_weekly_art_posts";
|
static BK_WEEK: &str = "bk_weekly_art_posts";
|
||||||
@@ -100,6 +108,13 @@ async fn main() {
|
|||||||
let _ = python::start(python_args);
|
let _ = python::start(python_args);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let schedules: Vec<(Duration, fn() -> Pin<Box<dyn Future<Output = ()> + Send>>)> = vec![
|
||||||
|
(Duration::from_secs(/* 2 * 60 */ 30), || Box::pin(read_reddit_inbox())),
|
||||||
|
(Duration::from_secs(/* 10 * 60 */ 60), || Box::pin(update_post_channels()))
|
||||||
|
];
|
||||||
|
|
||||||
|
run_schedules(schedules).await;
|
||||||
|
|
||||||
rust.join().unwrap();
|
rust.join().unwrap();
|
||||||
python.join().unwrap();
|
python.join().unwrap();
|
||||||
}
|
}
|
||||||
@@ -192,3 +207,37 @@ async fn gen_bot(data: Data, args: Args) -> Client {
|
|||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async fn run_schedule<F: Fn() -> Pin<Box<dyn Future<Output = ()> + Send>>>(d: Duration, f: F) {
|
||||||
|
let mut ticker = time::interval(d);
|
||||||
|
loop {
|
||||||
|
ticker.tick().await;
|
||||||
|
f().await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async fn run_schedules(schedules: Vec<(Duration, fn() -> Pin<Box<dyn Future<Output = ()> + Send>>)>) {
|
||||||
|
let mut handles: Vec<JoinHandle<()>> = vec![];
|
||||||
|
|
||||||
|
rs_println!("Starting schedules...");
|
||||||
|
for (d, f) in schedules {
|
||||||
|
let handle = tokio::spawn(run_schedule(d, f));
|
||||||
|
handles.push(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
for handle in handles {
|
||||||
|
let _ = handle.await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async fn read_reddit_inbox() {
|
||||||
|
unsafe { if !websocket::HAS_CONNECTED { return; } }
|
||||||
|
send_cmd_json("respond_mentions", None).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn update_post_channels() {
|
||||||
|
println!("simulated update post channels");
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ type Receiver = Arc<Mutex<Option<SplitStream<WebSocketStream<TcpStream>>>>>;
|
|||||||
static mut GLOBAL_SENDER: Option<Sender> = None;
|
static mut GLOBAL_SENDER: Option<Sender> = None;
|
||||||
static mut GLOBAL_RECEIVER: Option<Receiver> = None;
|
static mut GLOBAL_RECEIVER: Option<Receiver> = None;
|
||||||
static mut REPLY_HELLO: bool = false;
|
static mut REPLY_HELLO: bool = false;
|
||||||
|
pub static mut HAS_CONNECTED: bool = false;
|
||||||
|
|
||||||
|
|
||||||
async fn set_sender(sender: Sender) {
|
async fn set_sender(sender: Sender) {
|
||||||
@@ -139,6 +140,7 @@ async fn handle_message(msg: tungstenite::protocol::Message, args: Args) {
|
|||||||
if !REPLY_HELLO {
|
if !REPLY_HELLO {
|
||||||
send_msg("[Connection test] Hello from Rust!").await;
|
send_msg("[Connection test] Hello from Rust!").await;
|
||||||
REPLY_HELLO = true;
|
REPLY_HELLO = true;
|
||||||
|
HAS_CONNECTED = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user