added config file
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
<!-- - [x] Some kind of voting system. -->
|
<!-- - [x] Some kind of voting system. -->
|
||||||
<!-- - [x] ~~`/bk_week_top [category] [amount]` to get the top N posts in a category (e.g upvotes)~~ -->
|
<!-- - [x] ~~`/bk_week_top [category] [amount]` to get the top N posts in a category (e.g upvotes)~~ -->
|
||||||
<!-- - [x] ~~`/bk_cfg_sr [subreddit]` to change the target subreddit(s)~~ -->
|
<!-- - [x] ~~`/bk_cfg_sr [subreddit]` to change the target subreddit(s)~~ -->
|
||||||
|
- [ ] Language files?
|
||||||
- [ ] 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 (IMPOSSIBLE / REALLY FUCKING HARD) -->
|
<!-- - [ ] 10-minute schedule for updating Discord channel (IMPOSSIBLE / REALLY FUCKING HARD) -->
|
||||||
<!-- - [x] ~~Manually add posts~~ -->
|
<!-- - [x] ~~Manually add posts~~ -->
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"bk_week": {
|
||||||
|
"fetch_limit": 100,
|
||||||
|
"subreddits": "bytedicetesting"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"bk_week": {
|
||||||
|
"subreddits": "bytedicetesting",
|
||||||
|
"fetch_limit": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
-46
@@ -1,7 +1,7 @@
|
|||||||
use crate::websocket::send_cmd_json;
|
use crate::websocket::send_cmd_json;
|
||||||
use crate::{cmds, rs_println, websocket, Context, Data, Error, BK_WEEK};
|
use crate::{cmds, rs_println, websocket, Context, Error, BK_WEEK};
|
||||||
use crate::messages::*;
|
use crate::messages::*;
|
||||||
use crate::data::{self, dc_bind_bk};
|
use crate::data::{self, dc_bind_bk, get_mutex_data};
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
@@ -81,7 +81,7 @@ pub async fn bk_week_get(
|
|||||||
{
|
{
|
||||||
data::update_re_data(ctx.data()).await;
|
data::update_re_data(ctx.data()).await;
|
||||||
|
|
||||||
let reddit_data = get_reddit_data(ctx.data()).await?;
|
let reddit_data = get_mutex_data(&ctx.data().reddit_data).await?;
|
||||||
|
|
||||||
if let Some(post) = get_post_from_data(ctx, &reddit_data, &url).await? {
|
if let Some(post) = get_post_from_data(ctx, &reddit_data, &url).await? {
|
||||||
send_embed_for_post(ctx, post, &url).await?;
|
send_embed_for_post(ctx, post, &url).await?;
|
||||||
@@ -90,14 +90,6 @@ pub async fn bk_week_get(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_reddit_data(data: &Data) -> Result<Value, Error> {
|
|
||||||
let data_lock = data.reddit_data.lock().await;
|
|
||||||
return match data_lock.as_ref() {
|
|
||||||
Some(data) => Ok(data.clone()),
|
|
||||||
None => Err("Reddit data is corrupted".into()),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async fn get_post_from_data(ctx: Context<'_>, reddit_data: &Value, url: &str) -> Result<Option<Value>, Error> {
|
async fn get_post_from_data(ctx: Context<'_>, reddit_data: &Value, url: &str) -> Result<Option<Value>, Error> {
|
||||||
if let Some(bk_week) = reddit_data.get(BK_WEEK) {
|
if let Some(bk_week) = reddit_data.get(BK_WEEK) {
|
||||||
@@ -186,7 +178,7 @@ pub async fn bk_week_add(
|
|||||||
let shorturl = if shorturl_u.is_ok() { shorturl_u.unwrap() } else { url };
|
let shorturl = if shorturl_u.is_ok() { shorturl_u.unwrap() } else { url };
|
||||||
|
|
||||||
data::update_re_data(ctx.data()).await;
|
data::update_re_data(ctx.data()).await;
|
||||||
let reddit_data = get_reddit_data(ctx.data()).await.unwrap();
|
let reddit_data = get_mutex_data(&ctx.data().reddit_data).await?;
|
||||||
|
|
||||||
if let Some(bk_week) = reddit_data.get(BK_WEEK) {
|
if let Some(bk_week) = reddit_data.get(BK_WEEK) {
|
||||||
let a = approve.unwrap_or_else(|| false);
|
let a = approve.unwrap_or_else(|| false);
|
||||||
@@ -293,7 +285,7 @@ pub async fn bk_week_approve(
|
|||||||
}
|
}
|
||||||
|
|
||||||
data::update_re_data(ctx.data()).await;
|
data::update_re_data(ctx.data()).await;
|
||||||
let reddit_data = get_reddit_data(ctx.data()).await.unwrap();
|
let reddit_data = get_mutex_data(&ctx.data().reddit_data).await?;
|
||||||
|
|
||||||
approve_cmd(ctx, &url, &reddit_data, !disapprove.unwrap_or_else(|| false)).await;
|
approve_cmd(ctx, &url, &reddit_data, !disapprove.unwrap_or_else(|| false)).await;
|
||||||
|
|
||||||
@@ -392,7 +384,7 @@ pub async fn bk_week_update(
|
|||||||
|
|
||||||
send_cmd_json("add_new_posts", Some(json!([max_age_secs]))).await;
|
send_cmd_json("add_new_posts", Some(json!([max_age_secs]))).await;
|
||||||
data::update_re_data(ctx.data()).await;
|
data::update_re_data(ctx.data()).await;
|
||||||
let r_data = get_reddit_data(ctx.data()).await.unwrap();
|
let r_data = get_mutex_data(&ctx.data().reddit_data).await?;
|
||||||
|
|
||||||
let c_id_u = get_c_id(ctx).await;
|
let c_id_u = get_c_id(ctx).await;
|
||||||
|
|
||||||
@@ -464,8 +456,7 @@ async fn get_c_id(ctx: Context<'_>) -> Option<ChannelId> {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let d_lock = ctx.data().discord_data.lock().await;
|
let d = get_mutex_data(&ctx.data().reddit_data).await.unwrap();
|
||||||
let d = d_lock.as_ref().unwrap();
|
|
||||||
let c_id_u =
|
let c_id_u =
|
||||||
d["servers"]
|
d["servers"]
|
||||||
[ctx.guild_id().unwrap().to_string()]
|
[ctx.guild_id().unwrap().to_string()]
|
||||||
@@ -675,7 +666,7 @@ pub async fn bk_week_vote(
|
|||||||
{
|
{
|
||||||
data::update_re_data(ctx.data()).await;
|
data::update_re_data(ctx.data()).await;
|
||||||
let uid = ctx.author().id.get();
|
let uid = ctx.author().id.get();
|
||||||
let re_data = get_reddit_data(ctx.data()).await.unwrap();
|
let re_data = get_mutex_data(&ctx.data().reddit_data).await?;
|
||||||
let post_data = re_data[BK_WEEK].clone();
|
let post_data = re_data[BK_WEEK].clone();
|
||||||
let unw_vote = un_vote.unwrap_or_else(|| false);
|
let unw_vote = un_vote.unwrap_or_else(|| false);
|
||||||
|
|
||||||
@@ -742,7 +733,7 @@ pub async fn bk_week_top(
|
|||||||
) -> Result<(), Error>
|
) -> Result<(), Error>
|
||||||
{
|
{
|
||||||
let mut all: HashMap<&str, i32> = HashMap::new();
|
let mut all: HashMap<&str, i32> = HashMap::new();
|
||||||
let posts = &get_reddit_data(ctx.data()).await.unwrap()[BK_WEEK];
|
let posts = &get_mutex_data(&ctx.data().reddit_data).await?[BK_WEEK];
|
||||||
let posts_u = posts.as_object().unwrap();
|
let posts_u = posts.as_object().unwrap();
|
||||||
|
|
||||||
for (url, dat) in posts_u {
|
for (url, dat) in posts_u {
|
||||||
@@ -790,31 +781,3 @@ fn smallest_n<'a>(map: &'a HashMap<&'a str, i32>, n: usize) -> Vec<(&'a str, i32
|
|||||||
vec.sort_unstable_by(|a, b| a.1.cmp(b.1));
|
vec.sort_unstable_by(|a, b| a.1.cmp(b.1));
|
||||||
vec.into_iter().take(n).map(|(&k, &v)| (k, v)).collect()
|
vec.into_iter().take(n).map(|(&k, &v)| (k, v)).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[poise::command(
|
|
||||||
slash_command,
|
|
||||||
prefix_command,
|
|
||||||
owners_only,
|
|
||||||
required_bot_permissions = "SEND_MESSAGES | VIEW_CHANNEL"
|
|
||||||
)]
|
|
||||||
/// Changes the subreddit(s) the bot patrols in.
|
|
||||||
pub async fn bk_cfg_sr(
|
|
||||||
ctx: Context<'_>,
|
|
||||||
sr: String
|
|
||||||
) -> Result<(), Error>
|
|
||||||
{
|
|
||||||
let r = send_cmd_json("change_sr", Some(json!([sr]))).await;
|
|
||||||
|
|
||||||
if r.is_some() {
|
|
||||||
if r.unwrap()["value"].as_bool().unwrap() {
|
|
||||||
send_msg(ctx, "Successfully updated subreddits!".to_string(), true, true).await;
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
send_msg(ctx, "Failed to update subreddits: Failed-type response from Python.".to_string(), true, true).await;
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
+30
-1
@@ -1,6 +1,6 @@
|
|||||||
use std::process;
|
use std::process;
|
||||||
|
|
||||||
use crate::data::dc_add_server;
|
use crate::data::{dc_add_server, get_mutex_data};
|
||||||
use crate::websocket::send_cmd_json;
|
use crate::websocket::send_cmd_json;
|
||||||
use crate::{data, Context, Error};
|
use crate::{data, Context, Error};
|
||||||
use crate::messages::{edit_reply, send_embed, send_msg, Author, EmbedOptions, MANDATORY_MSG};
|
use crate::messages::{edit_reply, send_embed, send_msg, Author, EmbedOptions, MANDATORY_MSG};
|
||||||
@@ -8,6 +8,7 @@ use crate::messages::{edit_reply, send_embed, send_msg, Author, EmbedOptions, MA
|
|||||||
use poise::serenity_prelude::{OnlineStatus, Timestamp};
|
use poise::serenity_prelude::{OnlineStatus, Timestamp};
|
||||||
use rand::{seq::IteratorRandom, Rng};
|
use rand::{seq::IteratorRandom, Rng};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
|
|
||||||
#[poise::command(
|
#[poise::command(
|
||||||
@@ -216,3 +217,31 @@ pub async fn add_server(
|
|||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[poise::command(
|
||||||
|
slash_command,
|
||||||
|
prefix_command,
|
||||||
|
owners_only,
|
||||||
|
required_bot_permissions = "SEND_MESSAGES | VIEW_CHANNEL"
|
||||||
|
)]
|
||||||
|
/// Reloads the entire config file.
|
||||||
|
pub async fn reload_cfg(
|
||||||
|
ctx: Context<'_>
|
||||||
|
) -> Result<(), Error>
|
||||||
|
{
|
||||||
|
|
||||||
|
let d = get_mutex_data(&ctx.data().cfg).await?;
|
||||||
|
let d_str = serde_json::to_string(&d)?;
|
||||||
|
let r = send_cmd_json("update_cfg", Some(json!([d_str]))).await; // TODO: THIS
|
||||||
|
|
||||||
|
if r.is_some() {
|
||||||
|
if r.unwrap()["value"].as_bool().unwrap() {
|
||||||
|
send_msg(ctx, "Successfully reloaded the configs!".to_string(), true, true).await;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
send_msg(ctx, "Failed to reload configs: Failed-type response from Python.".to_string(), true, true).await;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
+47
-5
@@ -2,15 +2,18 @@ use std::{fs, io::Write};
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use serde_json::{self, Value, json};
|
use serde_json::{self, Value, json};
|
||||||
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
use crate::{Data, BK_WEEK, rs_println};
|
use crate::{Data, BK_WEEK, rs_println, Error};
|
||||||
use crate::websocket::send_cmd_json;
|
use crate::websocket::send_cmd_json;
|
||||||
|
|
||||||
|
|
||||||
static DATA_PATH_DC: &str = "./data/discord_data.json";
|
static DATA_PATH_DC: &str = "./data/discord_data.json";
|
||||||
static PRESET_PATH_DC: &str = "./data/discord_data_preset.json";
|
static PRESET_PATH_DC: &str = "./data/discord_data_preset.json";
|
||||||
static DATA_PATH_RE: &str = "./data/reddit_data.json";
|
static DATA_PATH_RE: &str = "./data/reddit_data.json";
|
||||||
static PRESET_PATH_RE: &str = "./data/reddit_data_preset.json";
|
static PRESET_PATH_RE: &str = "./data/reddit_data_preset.json";
|
||||||
|
static DATA_PATH_CFG: &str = "./data/cfg.json";
|
||||||
|
static PRESET_PATH_CFG: &str = "./data/cfg_default.json";
|
||||||
|
|
||||||
|
|
||||||
pub async fn read_dc_data(data: &Data, wipe: bool) {
|
pub async fn read_dc_data(data: &Data, wipe: bool) {
|
||||||
@@ -107,6 +110,35 @@ pub async fn write_re_data() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub async fn read_cfg_data(data: &Data, wipe: bool) {
|
||||||
|
if !Path::new(DATA_PATH_CFG).exists() || wipe {
|
||||||
|
rs_println!(
|
||||||
|
"{} creating new from preset...",
|
||||||
|
if !wipe { "cfg.json not found," } else { "[WIPE] (cfg.json)" }
|
||||||
|
);
|
||||||
|
generate_cfg_data();
|
||||||
|
}
|
||||||
|
|
||||||
|
let str_data = fs::read_to_string(DATA_PATH_CFG).unwrap();
|
||||||
|
let json_data = serde_json::from_str(&str_data).unwrap();
|
||||||
|
let mut cfg_data = data.cfg.lock().await;
|
||||||
|
*cfg_data = json_data;
|
||||||
|
|
||||||
|
send_cmd_json("update_cfg", Some(json!([str_data]))).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn generate_cfg_data() {
|
||||||
|
let preset_str = fs::read_to_string(PRESET_PATH_CFG).unwrap();
|
||||||
|
let preset_json: Value = serde_json::from_str(&preset_str).unwrap();
|
||||||
|
|
||||||
|
let json_str = serde_json::to_string_pretty(&preset_json).unwrap();
|
||||||
|
|
||||||
|
let mut file = fs::File::create(DATA_PATH_CFG).unwrap();
|
||||||
|
file.write_all(json_str.as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
pub async fn dc_add_server(data: &Data, server_id: u64) -> Result<(), ()> {
|
pub async fn dc_add_server(data: &Data, server_id: u64) -> Result<(), ()> {
|
||||||
let mut dc_data_lock = data.discord_data.lock().await;
|
let mut dc_data_lock = data.discord_data.lock().await;
|
||||||
let dc_data = dc_data_lock.as_mut().unwrap();
|
let dc_data = dc_data_lock.as_mut().unwrap();
|
||||||
@@ -155,3 +187,13 @@ pub async fn dc_contains_server(data: &Data, server_id: u64) -> bool {
|
|||||||
if servers.contains_key(&server_id.to_string()) { return true; }
|
if servers.contains_key(&server_id.to_string()) { return true; }
|
||||||
else { return false; }
|
else { return false; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
pub async fn get_mutex_data(data: &Mutex<Option<Value>>) -> Result<Value, Error> {
|
||||||
|
let data_lock = data.lock().await;
|
||||||
|
return match data_lock.as_ref() {
|
||||||
|
Some(data) => Ok(data.clone()),
|
||||||
|
None => Err("Cannot get mutex data: The data is corrupted!".into()),
|
||||||
|
};
|
||||||
|
}
|
||||||
+15
-11
@@ -1,4 +1,5 @@
|
|||||||
#![warn(unused_extern_crates)]
|
#![warn(unused_extern_crates)]
|
||||||
|
#![allow(clippy::needless_return)]
|
||||||
|
|
||||||
mod cmds;
|
mod cmds;
|
||||||
mod bk_week_cmds;
|
mod bk_week_cmds;
|
||||||
@@ -58,12 +59,13 @@ type Context<'a> = poise::Context<'a, Data, Error>;
|
|||||||
|
|
||||||
|
|
||||||
struct Data {
|
struct Data {
|
||||||
owners: Vec<u64>,
|
owners: Vec<u64>,
|
||||||
ball_prompts: [Vec<String>; 2],
|
ball_prompts: [Vec<String>; 2],
|
||||||
reddit_data: Mutex<Option<Value>>,
|
reddit_data: Mutex<Option<Value>>,
|
||||||
discord_data: Mutex<Option<Value>>,
|
discord_data: Mutex<Option<Value>>,
|
||||||
bk_mods: Vec<u64>,
|
cfg: Mutex<Option<Value>>,
|
||||||
args: Args
|
bk_mods: Vec<u64>,
|
||||||
|
args: Args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -159,14 +161,16 @@ async fn gen_data(args: Args, owners: Vec<u64>) -> Data {
|
|||||||
let data = Data {
|
let data = Data {
|
||||||
owners,
|
owners,
|
||||||
ball_prompts: [ball_classic, ball_quirk],
|
ball_prompts: [ball_classic, ball_quirk],
|
||||||
bk_mods: mods_vec_u64,
|
bk_mods: mods_vec_u64,
|
||||||
reddit_data: None.into(),
|
reddit_data: None.into(),
|
||||||
discord_data: None.into(),
|
discord_data: None.into(),
|
||||||
args: args.clone()
|
cfg: None.into(),
|
||||||
|
args: args.clone()
|
||||||
};
|
};
|
||||||
|
|
||||||
data::read_dc_data(&data, args.clone().wipe).await;
|
data::read_dc_data (&data, args.clone().wipe).await;
|
||||||
data::read_re_data(&data, args.clone().wipe).await;
|
data::read_re_data (&data, args.clone().wipe).await;
|
||||||
|
data::read_cfg_data(&data, args.clone().wipe).await;
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@@ -212,8 +216,8 @@ async fn gen_bot(data: Data, args: Args) -> Client {
|
|||||||
bk_week_cmds::bk_week_top(),
|
bk_week_cmds::bk_week_top(),
|
||||||
// bk_admin
|
// bk_admin
|
||||||
bk_week_cmds::bk_admin_bind(),
|
bk_week_cmds::bk_admin_bind(),
|
||||||
// bk_cfg
|
// cfg
|
||||||
bk_week_cmds::bk_cfg_sr()
|
cmds::reload_cfg()
|
||||||
],
|
],
|
||||||
event_handler: events::event_handler,
|
event_handler: events::event_handler,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
|||||||
+11
-3
@@ -1,8 +1,13 @@
|
|||||||
from io import TextIOWrapper
|
from io import TextIOWrapper
|
||||||
import asyncpraw as praw
|
import asyncpraw as praw
|
||||||
import os
|
import os
|
||||||
|
from typing import Final
|
||||||
from macros import *
|
from macros import *
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
BK_WEEKLY: Final[str] = "bk_weekly_art_posts"
|
||||||
|
BK_WEEK: Final[str] = "bk_week"
|
||||||
|
|
||||||
|
|
||||||
class Bot:
|
class Bot:
|
||||||
@@ -12,6 +17,8 @@ class Bot:
|
|||||||
username: str = os.environ.get("ASSISTANT_R_NAME")
|
username: str = os.environ.get("ASSISTANT_R_NAME")
|
||||||
password: str = os.environ.get("ASSISTANT_R_PASS")
|
password: str = os.environ.get("ASSISTANT_R_PASS")
|
||||||
|
|
||||||
|
fetch_limit = 0
|
||||||
|
|
||||||
useragent: str =\
|
useragent: str =\
|
||||||
f"{username} by u/RandomPersonDotExe aka u/Byte_Dice"\
|
f"{username} by u/RandomPersonDotExe aka u/Byte_Dice"\
|
||||||
if r_id == "YmZjr4zLr2qtHdpQXtj0sBOOdJzrXQ"\
|
if r_id == "YmZjr4zLr2qtHdpQXtj0sBOOdJzrXQ"\
|
||||||
@@ -48,6 +55,7 @@ class Bot:
|
|||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def change_sr(self, new_sr) -> bool:
|
async def update_cfg(self, new_cfg: dict) -> bool:
|
||||||
self.sr = await self.r.subreddit(new_sr)
|
self.sr = await self.r.subreddit(new_cfg[BK_WEEK]["subreddits"])
|
||||||
|
self.fetch_limit = new_cfg[BK_WEEK]["fetch_limit"]
|
||||||
return True
|
return True
|
||||||
+1
-1
@@ -57,7 +57,7 @@ async def bk_week_add(mention: models.Comment, bot: botPy.Bot):
|
|||||||
short_url = mention.submission.shortlink
|
short_url = mention.submission.shortlink
|
||||||
|
|
||||||
r = ""
|
r = ""
|
||||||
bd = bot.data[data.BK_WEEKLY]
|
bd = bot.data[botPy.BK_WEEKLY]
|
||||||
# TODO: ask if the messages should be changed
|
# TODO: ask if the messages should be changed
|
||||||
if short_url not in bd:
|
if short_url not in bd:
|
||||||
posts.add_post_url(bot, short_url)
|
posts.add_post_url(bot, short_url)
|
||||||
|
|||||||
+42
-22
@@ -1,13 +1,12 @@
|
|||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
from typing import Final
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import bot as botPy
|
import bot as botPy
|
||||||
from macros import *
|
from macros import *
|
||||||
|
|
||||||
|
|
||||||
BK_WEEKLY: Final[str] = "bk_weekly_art_posts"
|
DATA_PATH = os.path.abspath(os.path.join(os.path.join(os.getcwd(), "data")))
|
||||||
|
|
||||||
|
|
||||||
class PostData:
|
class PostData:
|
||||||
@@ -67,9 +66,7 @@ class PostData:
|
|||||||
|
|
||||||
|
|
||||||
def read_data(bot: botPy.Bot) -> bool:
|
def read_data(bot: botPy.Bot) -> bool:
|
||||||
# Intentionally unreadable >:]
|
r_path = os.path.join(DATA_PATH, "reddit_data.json")
|
||||||
data_path = os.path.abspath(os.path.join(os.path.join(os.getcwd(), "data")))
|
|
||||||
r_path = os.path.join(data_path, "reddit_data.json")
|
|
||||||
|
|
||||||
if os.path.isfile(r_path):
|
if os.path.isfile(r_path):
|
||||||
bot.data_f = open(r_path, "r+")
|
bot.data_f = open(r_path, "r+")
|
||||||
@@ -79,11 +76,11 @@ def read_data(bot: botPy.Bot) -> bool:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
py_print("reddit_data.json not found, creating new from preset...")
|
py_print("reddit_data.json not found, creating new from preset...")
|
||||||
with open(os.path.join(data_path, "reddit_data_preset.json", "r")) as f:
|
with open(os.path.join(DATA_PATH, "reddit_data_preset.json", "r")) as f:
|
||||||
data_preset_json = json.load(f)
|
data_preset_json = json.load(f)
|
||||||
|
|
||||||
data_preset_json[BK_WEEKLY].pop("EXAMPLE VALUE", None)
|
data_preset_json[botPy.BK_WEEKLY].pop("EXAMPLE VALUE", None)
|
||||||
data_preset_json[BK_WEEKLY].pop("EXAMPLE VALUE DELETED", None)
|
data_preset_json[botPy.BK_WEEKLY].pop("EXAMPLE VALUE DELETED", None)
|
||||||
|
|
||||||
with open(r_path, "w") as f:
|
with open(r_path, "w") as f:
|
||||||
json.dump(data_preset_json, f, indent = 2)
|
json.dump(data_preset_json, f, indent = 2)
|
||||||
@@ -104,9 +101,32 @@ def write_data(bot: botPy.Bot) -> bool:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
async def read_cfg(bot: botPy.Bot) -> bool:
|
||||||
|
r_path = os.path.join(DATA_PATH, "cfg.json")
|
||||||
|
|
||||||
|
if os.path.isfile(r_path):
|
||||||
|
bot.data_f = open(r_path, "r+")
|
||||||
|
|
||||||
|
else:
|
||||||
|
py_print("cfg.json not found, creating new from preset...")
|
||||||
|
with open(os.path.join(DATA_PATH, "cfg_default.json", "r")) as f:
|
||||||
|
data_preset_json = json.load(f)
|
||||||
|
|
||||||
|
with open(r_path, "w") as f:
|
||||||
|
json.dump(data_preset_json, f, indent = 2)
|
||||||
|
|
||||||
|
bot.data_f = open(r_path, "r+")
|
||||||
|
|
||||||
|
data_str = bot.data_f.read()
|
||||||
|
json_data = json.loads(data_str)
|
||||||
|
await bot.update_cfg(json_data)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def add_post_to_data(bot: botPy.Bot, new_data: PostData, bypass_conditions: bool = False) -> bool:
|
def add_post_to_data(bot: botPy.Bot, new_data: PostData, bypass_conditions: bool = False) -> bool:
|
||||||
if bypass_conditions:
|
if bypass_conditions:
|
||||||
bot.data[BK_WEEKLY][new_data.url] = new_data.to_json()
|
bot.data[botPy.BK_WEEKLY][new_data.url] = new_data.to_json()
|
||||||
if bot.args["dev"]:
|
if bot.args["dev"]:
|
||||||
py_print(f"Added post \"{new_data.url}\" (Conditions bypassed)")
|
py_print(f"Added post \"{new_data.url}\" (Conditions bypassed)")
|
||||||
return True
|
return True
|
||||||
@@ -114,14 +134,14 @@ def add_post_to_data(bot: botPy.Bot, new_data: PostData, bypass_conditions: bool
|
|||||||
# not sure what this is for
|
# not sure what this is for
|
||||||
updated = False
|
updated = False
|
||||||
|
|
||||||
if new_data.url not in bot.data[BK_WEEKLY] or updated:
|
if new_data.url not in bot.data[botPy.BK_WEEKLY] or updated:
|
||||||
bot.data[BK_WEEKLY][new_data.url] = new_data.to_json()
|
bot.data[botPy.BK_WEEKLY][new_data.url] = new_data.to_json()
|
||||||
if bot.args["dev"]:
|
if bot.args["dev"]:
|
||||||
py_print(f"Added post \"{new_data.url}\"")
|
py_print(f"Added post \"{new_data.url}\"")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if "removed" not in bot.data[BK_WEEKLY][new_data.url]:
|
if "removed" not in bot.data[botPy.BK_WEEKLY][new_data.url]:
|
||||||
updated = new_data.upvotes != bot.data[BK_WEEKLY][new_data.url]["post_data"]
|
updated = new_data.upvotes != bot.data[botPy.BK_WEEKLY][new_data.url]["post_data"]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
py_print(f"Failed to add post \"{new_data.url}\": Removed flag is True.")
|
py_print(f"Failed to add post \"{new_data.url}\": Removed flag is True.")
|
||||||
@@ -129,15 +149,15 @@ def add_post_to_data(bot: botPy.Bot, new_data: PostData, bypass_conditions: bool
|
|||||||
|
|
||||||
|
|
||||||
def set_approve_post(bot: botPy.Bot, approved: bool, url: str) -> bool:
|
def set_approve_post(bot: botPy.Bot, approved: bool, url: str) -> bool:
|
||||||
if not hasattr(bot.data[BK_WEEKLY][url], "removed"):
|
if not hasattr(bot.data[botPy.BK_WEEKLY][url], "removed"):
|
||||||
bot.data[BK_WEEKLY][url]["approved"]["by_human"] = approved
|
bot.data[botPy.BK_WEEKLY][url]["approved"]["by_human"] = approved
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def remove_post(bot: botPy.Bot, url: str, removed_by: str = "UNKNOWN", reason: str = "None") -> bool:
|
def remove_post(bot: botPy.Bot, url: str, removed_by: str = "UNKNOWN", reason: str = "None") -> bool:
|
||||||
weekly = bot.data[BK_WEEKLY]
|
weekly = bot.data[botPy.BK_WEEKLY]
|
||||||
|
|
||||||
if url in weekly:
|
if url in weekly:
|
||||||
weekly[url] = {
|
weekly[url] = {
|
||||||
@@ -153,7 +173,7 @@ def remove_post(bot: botPy.Bot, url: str, removed_by: str = "UNKNOWN", reason: s
|
|||||||
|
|
||||||
def remove_old_posts(bot: botPy.Bot, max_age: int) -> bool:
|
def remove_old_posts(bot: botPy.Bot, max_age: int) -> bool:
|
||||||
now = int(time.time())
|
now = int(time.time())
|
||||||
weekly = bot.data[BK_WEEKLY]
|
weekly = bot.data[botPy.BK_WEEKLY]
|
||||||
remove: list[str] = []
|
remove: list[str] = []
|
||||||
|
|
||||||
for url, post in weekly.items():
|
for url, post in weekly.items():
|
||||||
@@ -174,10 +194,10 @@ def set_vote_post(
|
|||||||
from_dc: bool = False,
|
from_dc: bool = False,
|
||||||
remove_vote: bool = False,
|
remove_vote: bool = False,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
if url not in bot.data[BK_WEEKLY]:
|
if url not in bot.data[botPy.BK_WEEKLY]:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
votes = bot.data[BK_WEEKLY][url]["votes"]
|
votes = bot.data[botPy.BK_WEEKLY][url]["votes"]
|
||||||
re_voters: set[str] = set(votes["voters_re"])
|
re_voters: set[str] = set(votes["voters_re"])
|
||||||
dc_voters: set[int] = set(votes["voters_dc"])
|
dc_voters: set[int] = set(votes["voters_dc"])
|
||||||
mod_voters: set[int] = set(votes["mod_voters"])
|
mod_voters: set[int] = set(votes["mod_voters"])
|
||||||
@@ -194,8 +214,8 @@ def set_vote_post(
|
|||||||
return False
|
return False
|
||||||
target_voters.add(user)
|
target_voters.add(user)
|
||||||
|
|
||||||
bot.data[BK_WEEKLY][url]["votes"]["voters_re"] = list(re_voters)
|
bot.data[botPy.BK_WEEKLY][url]["votes"]["voters_re"] = list(re_voters)
|
||||||
bot.data[BK_WEEKLY][url]["votes"]["voters_dc"] = list(dc_voters)
|
bot.data[botPy.BK_WEEKLY][url]["votes"]["voters_dc"] = list(dc_voters)
|
||||||
bot.data[BK_WEEKLY][url]["votes"]["mod_voters"] = list(mod_voters)
|
bot.data[botPy.BK_WEEKLY][url]["votes"]["mod_voters"] = list(mod_voters)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|||||||
+8
-5
@@ -26,17 +26,20 @@ async def main():
|
|||||||
if bot.args["dev"]:
|
if bot.args["dev"]:
|
||||||
py_print("ARGS:", str(bot.args))
|
py_print("ARGS:", str(bot.args))
|
||||||
|
|
||||||
py_print("Reading data...")
|
py_print("Reading config file...")
|
||||||
dr = data.read_data(bot)
|
await data.read_cfg(bot)
|
||||||
|
|
||||||
|
py_print("Reading Reddit data...")
|
||||||
|
rd = data.read_data(bot)
|
||||||
data_retries = 0
|
data_retries = 0
|
||||||
|
|
||||||
while not dr:
|
while not rd :
|
||||||
data_retries += 1
|
data_retries += 1
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
py_print(f"Failed to read data: File doesn't exist yet. Retrying (#{data_retries}/5)...")
|
py_print(f"Failed to read data: File doesn't exist yet. Retrying (#{data_retries}/5)...")
|
||||||
dr = data.read_data(bot)
|
rd = data.read_data(bot)
|
||||||
|
|
||||||
if data_retries == 5 and not dr:
|
if data_retries == 5 and not rd:
|
||||||
raise Exception("Couldn't read reddit_data.json: File doesn't exist")
|
raise Exception("Couldn't read reddit_data.json: File doesn't exist")
|
||||||
|
|
||||||
py_print("Successfully read data!")
|
py_print("Successfully read data!")
|
||||||
|
|||||||
+1
-1
@@ -69,7 +69,7 @@ async def fetch_posts_with_flair(bot: botPy.Bot, flair_name: str) -> list[models
|
|||||||
posts: list[models.Submission] = []
|
posts: list[models.Submission] = []
|
||||||
|
|
||||||
# ~36 OG-art posts per week, round limit to 50, 75 or 100
|
# ~36 OG-art posts per week, round limit to 50, 75 or 100
|
||||||
async for post in bot.sr.search(f"flair:\"{flair_name}\"", sort="new", limit=10):
|
async for post in bot.sr.search(f"flair:\"{flair_name}\"", sort="new", limit=bot.fetch_limit):
|
||||||
posts.append(post)
|
posts.append(post)
|
||||||
|
|
||||||
return posts
|
return posts
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ async def json_to_func(v: dict, bot: botPy.Bot) -> dict:
|
|||||||
case "set_approve_post": r = data .set_approve_post (bot, *v["args"])
|
case "set_approve_post": r = data .set_approve_post (bot, *v["args"])
|
||||||
case "set_vote_post": r = data .set_vote_post (bot, *v["args"])
|
case "set_vote_post": r = data .set_vote_post (bot, *v["args"])
|
||||||
case "remove_old_posts": r = data .remove_old_posts (bot, *v["args"])
|
case "remove_old_posts": r = data .remove_old_posts (bot, *v["args"])
|
||||||
case "change_sr": r = await bot .change_sr (*v["args"])
|
case "update_cfg": r = await bot .update_cfg (*v["args"])
|
||||||
case "stop_praw": r = await bot .stop ()
|
case "stop_praw": r = await bot .stop ()
|
||||||
case _: value_supported = False
|
case _: value_supported = False
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user