realized its not impossible and added reading channel to /bk_week_update
This commit is contained in:
+79
-7
@@ -1,11 +1,11 @@
|
||||
use crate::websocket::send_cmd_json;
|
||||
use crate::{rs_println, websocket, Context, Error, BK_WEEK};
|
||||
use crate::messages::{send_embed, send_msg, EmbedOptions};
|
||||
use crate::messages::{edit_msg, send_embed, send_msg, EmbedOptions};
|
||||
use crate::data::{self, dc_bind_bk};
|
||||
|
||||
use std::fs;
|
||||
|
||||
use poise::serenity_prelude::Timestamp;
|
||||
use poise::serenity_prelude::{ChannelId, GetMessages, Message, Timestamp};
|
||||
use serde_json::{json, Value};
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ pub async fn bk_week_help(
|
||||
}
|
||||
|
||||
send_msg(ctx, help, true, true).await;
|
||||
data::read_dc_data(ctx.data(), false);
|
||||
data::read_dc_data(ctx.data(), false).await;
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
@@ -66,7 +66,7 @@ pub async fn bk_week_get(
|
||||
}
|
||||
|
||||
async fn get_reddit_data(ctx: Context<'_>) -> Result<Value, Error> {
|
||||
let data_lock = ctx.data().reddit_data.lock().unwrap();
|
||||
let data_lock = ctx.data().reddit_data.lock().await;
|
||||
match data_lock.as_ref() {
|
||||
Some(data) => Ok(data.clone()),
|
||||
None => Err("Reddit data is corrupted".into()),
|
||||
@@ -307,20 +307,92 @@ pub async fn bk_week_disapprove(
|
||||
|
||||
|
||||
#[poise::command(slash_command, prefix_command, default_member_permissions = "ADMINISTRATOR", guild_only)]
|
||||
/// Sets the channel where the bot will dump all log info. It's reccommended to only run this once.
|
||||
/// Sets the channel where the bot will dump all log info. It's recommended to only run this once.
|
||||
pub async fn bk_week_bind(
|
||||
ctx: Context<'_>
|
||||
) -> Result<(), Error>
|
||||
{
|
||||
let c_id = ctx.channel_id().into();
|
||||
let r = dc_bind_bk(ctx.data(), ctx.guild_id().unwrap().into(), c_id);
|
||||
let r = dc_bind_bk(ctx.data(), ctx.guild_id().unwrap().into(), c_id).await;
|
||||
|
||||
if r {
|
||||
send_msg(ctx, format!("Successfully bound channel ID `{}` as the bk_week channel!", c_id), true, true).await;
|
||||
}
|
||||
else {
|
||||
send_msg(ctx, "Your server is not in the data!\nHint: Run the command `/add_server` inside of a Discord server.".to_string(), true, true).await;
|
||||
send_server_not_in_data_msg(ctx).await;
|
||||
}
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
||||
async fn send_server_not_in_data_msg(ctx: Context<'_>) {
|
||||
send_msg(ctx, "Your server is not in the data!\nHint: Run the command `/add_server` inside of a Discord server.".to_string(), true, true).await;
|
||||
}
|
||||
|
||||
|
||||
#[poise::command(slash_command, prefix_command, default_member_permissions = "ADMINISTRATOR", guild_only)]
|
||||
/// Updates all logs
|
||||
pub async fn bk_week_update(
|
||||
ctx: Context<'_>,
|
||||
#[description = "Only adds new posts, leaves everything else unchanged."] only_add: Option<bool>
|
||||
) -> Result<(), Error>
|
||||
{
|
||||
if !data::dc_contains_server(ctx.data(), ctx.guild_id().unwrap().into()).await {
|
||||
send_server_not_in_data_msg(ctx).await;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let d_lock = ctx.data().discord_data.lock().await;
|
||||
let d = d_lock.as_ref().unwrap();
|
||||
let c_id =
|
||||
d["servers"]
|
||||
[ctx.guild_id().unwrap().to_string()]
|
||||
["bk_week_channel"].as_u64().unwrap();
|
||||
|
||||
if c_id == 0 {
|
||||
send_msg(ctx, "Could not find bk_week_channel in data!\nHint: Run `/bk_week_bind` in a (preferably read-only) channel.".to_string(), true, true).await;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let c = ChannelId::new(c_id);
|
||||
|
||||
let mut p_text = format!("Reading messages in <#{}>...", c_id);
|
||||
let progress = send_msg(ctx, p_text.clone(), true, true).await;
|
||||
|
||||
let b = GetMessages::new().limit(100);
|
||||
let mut msgs = c.messages(ctx.http(), b).await.unwrap();
|
||||
msgs = msgs.into_iter().filter(|item| item.author.id == ctx.framework().bot_id).collect();
|
||||
|
||||
let mut last_msg: Option<Message> = msgs.last().cloned();
|
||||
|
||||
while last_msg.is_some() {
|
||||
let new_b = GetMessages::new().limit(100).before(last_msg.clone().unwrap());
|
||||
let new_msgs = c.messages(ctx.http(), new_b).await.unwrap();
|
||||
|
||||
last_msg = new_msgs.last().cloned();
|
||||
|
||||
if new_msgs.is_empty() {
|
||||
break;
|
||||
}
|
||||
|
||||
let filtered_msgs: Vec<Message> = new_msgs
|
||||
.into_iter()
|
||||
.filter(|item| item.author.id == ctx.framework().bot_id)
|
||||
.collect();
|
||||
|
||||
msgs.extend(filtered_msgs);
|
||||
}
|
||||
|
||||
p_text = p_text.as_str().to_owned() + " Done!";
|
||||
edit_msg(ctx, progress.unwrap(), p_text).await;
|
||||
|
||||
|
||||
// TODO: parse to JSON
|
||||
// TODO: add new posts to channel
|
||||
// TODO: edit outdated posts
|
||||
// TODO: remove removed posts
|
||||
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
+22
-3
@@ -38,7 +38,7 @@ pub async fn stop(
|
||||
|
||||
if should_stop && is_creator {
|
||||
let msg = send_msg(ctx, "Saving data...".to_string(), true, true).await.unwrap();
|
||||
data::write_dc_data(ctx.data());
|
||||
data::write_dc_data(ctx.data()).await;
|
||||
data::write_re_data().await;
|
||||
send_cmd_json("stop_praw", json!([])).await;
|
||||
|
||||
@@ -92,13 +92,32 @@ pub async fn embed(
|
||||
).await;
|
||||
|
||||
if !reply_unwrap {
|
||||
send_msg(ctx, "Mandatory success response.".to_string(), true, true).await;
|
||||
send_msg(ctx, "Mandatory success response, please ignore.".to_string(), true, true).await;
|
||||
}
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[poise::command(
|
||||
slash_command,
|
||||
prefix_command,
|
||||
default_member_permissions = "ADMINISTRATOR"
|
||||
)]
|
||||
/// Sends a message.
|
||||
pub async fn send(
|
||||
ctx: Context<'_>,
|
||||
#[description = "The message to send (NO EMPHERAL)"] msg: String
|
||||
) -> Result<(), Error>
|
||||
{
|
||||
send_msg(ctx, msg, false, false).await;
|
||||
send_msg(ctx, "Mandatory success response, please ignore.".to_string(), true, true).await;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[poise::command(slash_command, prefix_command, rename = "8_ball")]
|
||||
/// Magic 8-ball. Ask a question, get an answer.
|
||||
pub async fn eight_ball(
|
||||
@@ -149,7 +168,7 @@ pub async fn add_server(
|
||||
ctx: Context<'_>
|
||||
) -> Result<(), Error>
|
||||
{
|
||||
let r = dc_add_server(ctx.data(), ctx.guild_id().unwrap().into());
|
||||
let r = dc_add_server(ctx.data(), ctx.guild_id().unwrap().into()).await;
|
||||
|
||||
if r {
|
||||
send_msg(ctx, "Added your server to my data! Thanks for letting me steal it! (/s)".to_string(), true, true).await;
|
||||
|
||||
+27
-11
@@ -13,7 +13,7 @@ static DATA_PATH_RE: &str = "./data/reddit_data.json";
|
||||
static PRESET_PATH_RE: &str = "./data/reddit_data_preset.json";
|
||||
|
||||
|
||||
pub fn read_dc_data(data: &Data, wipe: bool) {
|
||||
pub async fn read_dc_data(data: &Data, wipe: bool) {
|
||||
if !Path::new(DATA_PATH_DC).exists() || wipe {
|
||||
rs_println!(
|
||||
"{} creating new from preset...",
|
||||
@@ -24,7 +24,7 @@ pub fn read_dc_data(data: &Data, wipe: bool) {
|
||||
|
||||
let str_data = fs::read_to_string(DATA_PATH_DC).unwrap();
|
||||
let json_data = serde_json::from_str(&str_data).unwrap();
|
||||
let mut dc_data = data.discord_data.lock().unwrap();
|
||||
let mut dc_data = data.discord_data.lock().await;
|
||||
*dc_data = json_data;
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ fn generate_dc_data() {
|
||||
}
|
||||
|
||||
|
||||
pub fn write_dc_data(data: &Data) {
|
||||
pub async fn write_dc_data(data: &Data) {
|
||||
if !Path::new(DATA_PATH_DC).exists() {
|
||||
generate_dc_data();
|
||||
}
|
||||
@@ -55,13 +55,15 @@ pub fn write_dc_data(data: &Data) {
|
||||
.open(DATA_PATH_DC)
|
||||
.unwrap();
|
||||
|
||||
let json_str = serde_json::to_string_pretty(&data.discord_data).unwrap();
|
||||
let mut dc_data_lock = data.discord_data.lock().await;
|
||||
let dc_data = dc_data_lock.as_mut().unwrap();
|
||||
let json_str = serde_json::to_string_pretty(dc_data).unwrap();
|
||||
|
||||
file.write_all(json_str.as_bytes()).unwrap();
|
||||
}
|
||||
|
||||
|
||||
pub fn read_re_data(data: &Data, wipe: bool) {
|
||||
pub async fn read_re_data(data: &Data, wipe: bool) {
|
||||
if !Path::new(DATA_PATH_RE).exists() || wipe {
|
||||
rs_println!(
|
||||
"{} creating new from preset...",
|
||||
@@ -72,7 +74,7 @@ pub fn read_re_data(data: &Data, wipe: bool) {
|
||||
|
||||
let str_data = fs::read_to_string(DATA_PATH_RE).unwrap();
|
||||
let json_data = serde_json::from_str(&str_data).unwrap();
|
||||
let mut re_data = data.reddit_data.lock().unwrap();
|
||||
let mut re_data = data.reddit_data.lock().await;
|
||||
*re_data = json_data;
|
||||
}
|
||||
|
||||
@@ -95,7 +97,7 @@ fn generate_re_data() {
|
||||
|
||||
pub async fn update_re_data(data: &Data) {
|
||||
send_cmd_json("update_data_file", json!([])).await;
|
||||
read_re_data(data, false);
|
||||
read_re_data(data, false).await;
|
||||
}
|
||||
|
||||
|
||||
@@ -104,8 +106,8 @@ pub async fn write_re_data() {
|
||||
}
|
||||
|
||||
|
||||
pub fn dc_add_server(data: &Data, server_id: u64) -> bool {
|
||||
let mut dc_data_lock = data.discord_data.lock().unwrap();
|
||||
pub async fn dc_add_server(data: &Data, server_id: u64) -> bool {
|
||||
let mut dc_data_lock = data.discord_data.lock().await;
|
||||
let dc_data = dc_data_lock.as_mut().unwrap();
|
||||
|
||||
if dc_data.get("servers").is_none() { return false; }
|
||||
@@ -120,8 +122,8 @@ pub fn dc_add_server(data: &Data, server_id: u64) -> bool {
|
||||
}
|
||||
|
||||
|
||||
pub fn dc_bind_bk(data: &Data, server_id: u64, channel_id: u64) -> bool {
|
||||
let mut dc_data_lock = data.discord_data.lock().unwrap();
|
||||
pub async fn dc_bind_bk(data: &Data, server_id: u64, channel_id: u64) -> bool {
|
||||
let mut dc_data_lock = data.discord_data.lock().await;
|
||||
let dc_data = dc_data_lock.as_mut().unwrap();
|
||||
|
||||
if dc_data.get("servers").is_none() { return false; }
|
||||
@@ -137,4 +139,18 @@ pub fn dc_bind_bk(data: &Data, server_id: u64, channel_id: u64) -> bool {
|
||||
server.insert("bk_week_channel".to_string(), channel_id.into());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
pub async fn dc_contains_server(data: &Data, server_id: u64) -> bool {
|
||||
let dc_data_lock = data.discord_data.lock().await;
|
||||
let dc_data = dc_data_lock.as_ref().unwrap();
|
||||
|
||||
if dc_data.get("servers").is_none() { return false; }
|
||||
|
||||
let mut clone = dc_data.clone();
|
||||
let servers = clone["servers"].as_object_mut().unwrap();
|
||||
|
||||
if servers.contains_key(&server_id.to_string()) { return true; }
|
||||
else { return false; }
|
||||
}
|
||||
+10
-8
@@ -11,7 +11,6 @@ mod data;
|
||||
|
||||
use std::process;
|
||||
use std::thread;
|
||||
use std::sync::Mutex;
|
||||
|
||||
use clap::Parser;
|
||||
use poise::serenity_prelude as serenity;
|
||||
@@ -19,10 +18,11 @@ use poise::serenity_prelude::Client;
|
||||
use serde::Serialize;
|
||||
use serde_json::Value;
|
||||
use tokio::runtime::Runtime;
|
||||
use tokio::sync::Mutex;
|
||||
use serde_json;
|
||||
|
||||
|
||||
// TODO: update bk_week help files
|
||||
// TODO: /bk_week_adds sets as added by bot instead of human
|
||||
// TODO: bot command permissions
|
||||
// TODO: bk_mod verification system
|
||||
|
||||
@@ -35,7 +35,7 @@ struct Args {
|
||||
py: bool,
|
||||
#[arg(long, help = "Runs only the Rust part of the program.")]
|
||||
rs: bool,
|
||||
#[arg(short = 'd', long, help = "Enables dev mode. Dev mode shows more debug info and turns of certain security measures.")]
|
||||
#[arg(short = 'd', long, help = "Enables dev mode. Dev mode shows more debug info and turns off certain security measures.")]
|
||||
dev: bool,
|
||||
#[arg(short = 'w', long, help = "Wipes all data before running the program.")]
|
||||
wipe: bool
|
||||
@@ -97,7 +97,7 @@ async fn main() {
|
||||
|
||||
|
||||
async fn start(args: Args) {
|
||||
let data = gen_data(args);
|
||||
let data = gen_data(args).await;
|
||||
let mut bot = gen_bot(data).await;
|
||||
|
||||
rs_println!("Starting bot...");
|
||||
@@ -105,7 +105,7 @@ async fn start(args: Args) {
|
||||
}
|
||||
|
||||
|
||||
fn gen_data(args: Args) -> Data {
|
||||
async fn gen_data(args: Args) -> Data {
|
||||
let ball_classic_str = std::fs::read_to_string("./data/8-ball_classic.txt").unwrap();
|
||||
let ball_quirk_str = std::fs::read_to_string("./data/8-ball_quirky.txt").unwrap();
|
||||
|
||||
@@ -120,8 +120,8 @@ fn gen_data(args: Args) -> Data {
|
||||
args: args.clone()
|
||||
};
|
||||
|
||||
data::read_dc_data(&data, args.clone().wipe);
|
||||
data::read_re_data(&data, args.clone().wipe);
|
||||
data::read_dc_data(&data, args.clone().wipe).await;
|
||||
data::read_re_data(&data, args.clone().wipe).await;
|
||||
|
||||
return data;
|
||||
}
|
||||
@@ -142,6 +142,7 @@ async fn gen_bot(data: Data) -> Client {
|
||||
commands: vec![
|
||||
cmds::ping(),
|
||||
cmds::embed(),
|
||||
cmds::send(),
|
||||
cmds::stop(),
|
||||
cmds::eight_ball(),
|
||||
cmds::re_shorturl(),
|
||||
@@ -153,7 +154,8 @@ async fn gen_bot(data: Data) -> Client {
|
||||
bk_week_cmds::bk_week_remove(),
|
||||
bk_week_cmds::bk_week_approve(),
|
||||
bk_week_cmds::bk_week_disapprove(),
|
||||
bk_week_cmds::bk_week_bind()
|
||||
bk_week_cmds::bk_week_bind(),
|
||||
bk_week_cmds::bk_week_update()
|
||||
],
|
||||
event_handler: events::event_handler,
|
||||
..Default::default()
|
||||
|
||||
Reference in New Issue
Block a user