Added language support to python. TODO: add language placeholders
This commit is contained in:
@@ -11,6 +11,10 @@ subreddits = "bytedicetesting"
|
|||||||
# How many posts the bot scans when running `/re_updatediscord`.
|
# How many posts the bot scans when running `/re_updatediscord`.
|
||||||
fetch_limit = 100
|
fetch_limit = 100
|
||||||
|
|
||||||
|
# A list of flairs the post must be tagged under to be scraped.
|
||||||
|
# Leave empty to search for everything
|
||||||
|
search_flairs = ["Original Art"]
|
||||||
|
|
||||||
[commands]
|
[commands]
|
||||||
# Disabled selected command categories. All commands and their categories can be viewed in the README.
|
# Disabled selected command categories. All commands and their categories can be viewed in the README.
|
||||||
# "admin" and "owner" categories are always enabled.
|
# "admin" and "owner" categories are always enabled.
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ pub async fn cmd(
|
|||||||
let d_str = toml::to_string(&d)?;
|
let d_str = toml::to_string(&d)?;
|
||||||
let r = send_cmd_json("update_cfg", Some(json!([d_str])), true).await;
|
let r = send_cmd_json("update_cfg", Some(json!([d_str])), true).await;
|
||||||
|
|
||||||
if r.is_some() && r.unwrap()["value"].as_bool().unwrap() {
|
if r.is_none() { return Ok(()); }
|
||||||
|
|
||||||
|
if r.unwrap()["value"].as_bool().unwrap() {
|
||||||
send_msg(
|
send_msg(
|
||||||
ctx,
|
ctx,
|
||||||
lang!("dc_msg_reload_cfg_success", toml::to_string_pretty(&d).unwrap()),
|
lang!("dc_msg_reload_cfg_success", toml::to_string_pretty(&d).unwrap()),
|
||||||
|
|||||||
+3
-2
@@ -4,7 +4,7 @@ use std::path::Path;
|
|||||||
use serde_json::{self, Value, json};
|
use serde_json::{self, Value, json};
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
use crate::{errln, rs_println, Data, Error, CFG_DATA_RE, LANG};
|
use crate::{errln, rs_println, Data, Error, CFG_DATA_RE, LANG, LANG_NAME};
|
||||||
use crate::websocket::send_cmd_json;
|
use crate::websocket::send_cmd_json;
|
||||||
|
|
||||||
|
|
||||||
@@ -220,9 +220,10 @@ pub fn load_lang_data(lang: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let str_data = fs::read_to_string(full_path).unwrap();
|
let str_data = fs::read_to_string(full_path).unwrap();
|
||||||
let json_data = serde_json::from_str(&str_data).unwrap();
|
let json_data: Option<Value> = serde_json::from_str(&str_data).unwrap();
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
LANG = json_data;
|
LANG = json_data;
|
||||||
|
LANG_NAME = Some(lang);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
+3
-2
@@ -95,8 +95,9 @@ struct Data {
|
|||||||
|
|
||||||
static CFG_DATA_RE: &str = "posts";
|
static CFG_DATA_RE: &str = "posts";
|
||||||
|
|
||||||
pub static mut LANG: Option<serde_json::Value> = None;
|
pub static mut LANG_NAME: Option<String> = None;
|
||||||
pub static mut NOPING: bool = false;
|
pub static mut LANG: Option<serde_json::Value> = None;
|
||||||
|
pub static mut NOPING: bool = false;
|
||||||
|
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
|||||||
+12
-2
@@ -1,5 +1,5 @@
|
|||||||
use crate::messages::send_dm;
|
use crate::messages::send_dm;
|
||||||
use crate::{errln, lang, rs_println, Args};
|
use crate::{errln, lang, rs_println, Args, LANG_NAME};
|
||||||
|
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
@@ -21,7 +21,17 @@ pub async fn start(args: Args) -> PyResult<()> {
|
|||||||
|
|
||||||
let code = get_code(&format!("{}{}main.py", path, slash));
|
let code = get_code(&format!("{}{}main.py", path, slash));
|
||||||
let py_args = args_str.replace(":true", ":True").replace(":false", ":False");
|
let py_args = args_str.replace(":true", ":True").replace(":false", ":False");
|
||||||
let app_path = CString::new(format!("args = {}\n{}", py_args, code)).unwrap();
|
let app_path: CString;
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
app_path = CString::new(
|
||||||
|
format!("args = {}\nlang_name = {}\n{}",
|
||||||
|
py_args,
|
||||||
|
LANG_NAME.clone().unwrap(),
|
||||||
|
code
|
||||||
|
)
|
||||||
|
).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
let mut traceback: String = String::new();
|
let mut traceback: String = String::new();
|
||||||
let mut is_error = false;
|
let mut is_error = false;
|
||||||
|
|||||||
+3
-3
@@ -41,6 +41,7 @@ class Bot:
|
|||||||
self.sr = None
|
self.sr = None
|
||||||
self.data_f: TextIOWrapper = None
|
self.data_f: TextIOWrapper = None
|
||||||
self.data: dict = {}
|
self.data: dict = {}
|
||||||
|
self.flairs: list[str] = []
|
||||||
|
|
||||||
async def initialize(self):
|
async def initialize(self):
|
||||||
self.sr = await self.r.subreddit("+".join(self.sr_list))
|
self.sr = await self.r.subreddit("+".join(self.sr_list))
|
||||||
@@ -58,13 +59,12 @@ class Bot:
|
|||||||
|
|
||||||
async def update_cfg_str(self, new_cfg: str) -> bool:
|
async def update_cfg_str(self, new_cfg: str) -> bool:
|
||||||
json_cfg = toml.loads(new_cfg)
|
json_cfg = toml.loads(new_cfg)
|
||||||
self.sr_list = json_cfg[CFG_DATA_RE]["subreddits"].split("+")
|
self.update_cfg(json_cfg)
|
||||||
self.sr = await self.r.subreddit("+".join(self.sr_list))
|
|
||||||
self.fetch_limit = json_cfg[CFG_DATA_RE]["fetch_limit"]
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def update_cfg(self, new_cfg: dict) -> bool:
|
async def update_cfg(self, new_cfg: dict) -> bool:
|
||||||
self.sr_list = new_cfg[CFG_DATA_RE]["subreddits"].split("+")
|
self.sr_list = new_cfg[CFG_DATA_RE]["subreddits"].split("+")
|
||||||
self.sr = await self.r.subreddit("+".join(self.sr_list))
|
self.sr = await self.r.subreddit("+".join(self.sr_list))
|
||||||
self.fetch_limit = new_cfg[CFG_DATA_RE]["fetch_limit"]
|
self.fetch_limit = new_cfg[CFG_DATA_RE]["fetch_limit"]
|
||||||
|
self.flairs = new_cfg[CFG_DATA_RE]["search_flair"]
|
||||||
return True
|
return True
|
||||||
+35
-1
@@ -1,5 +1,13 @@
|
|||||||
|
import json
|
||||||
|
import os
|
||||||
from printColors import PrintColors
|
from printColors import PrintColors
|
||||||
|
|
||||||
|
|
||||||
|
G_LANG_NAME: str = ""
|
||||||
|
G_LANG: dict[str, str] = {}
|
||||||
|
DATA_PATH_LANG: str = "./data/lang/"
|
||||||
|
|
||||||
|
|
||||||
def py_print(*args):
|
def py_print(*args):
|
||||||
print(
|
print(
|
||||||
PrintColors.FG.blue + "Py",
|
PrintColors.FG.blue + "Py",
|
||||||
@@ -14,4 +22,30 @@ def py_error(*args):
|
|||||||
"-",
|
"-",
|
||||||
" ".join(args) + PrintColors.Special.reset
|
" ".join(args) + PrintColors.Special.reset
|
||||||
)
|
)
|
||||||
quit()
|
quit()
|
||||||
|
|
||||||
|
|
||||||
|
def lang(k: str) -> str:
|
||||||
|
t = G_LANG.get(k)
|
||||||
|
if k is None: py_error(f"Key not found in language \"{G_LANG_NAME}\": {k}")
|
||||||
|
return str(t)
|
||||||
|
|
||||||
|
|
||||||
|
def init_lang(lang_name: str):
|
||||||
|
global G_LANG, G_LANG_NAME
|
||||||
|
G_LANG_NAME = lang_name
|
||||||
|
|
||||||
|
full_path = f"{DATA_PATH_LANG}{lang_name}.json"
|
||||||
|
|
||||||
|
if not os.path.exists(full_path):
|
||||||
|
py_error(f"File for language \"{lang_name}\" ({lang_name}.json) not found!\n Hint: You can download official language files at https://github.com/ByteDice/ByteDiceAssistant in the data/langs/... folder")
|
||||||
|
|
||||||
|
with open(full_path, "r") as f:
|
||||||
|
str_data = f.read()
|
||||||
|
|
||||||
|
try:
|
||||||
|
json_data = json.loads(str_data)
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
py_error(f"Failed to parse JSON for language \"{lang_name}\":\n{e}")
|
||||||
|
|
||||||
|
G_LANG = json_data
|
||||||
+5
-2
@@ -19,9 +19,12 @@ async def main():
|
|||||||
|
|
||||||
# args is supposed to be undefined.
|
# args is supposed to be undefined.
|
||||||
# It gets defined in Rust.
|
# It gets defined in Rust.
|
||||||
try: await bot.set_args(args)
|
try:
|
||||||
|
await bot.set_args(args)
|
||||||
|
init_lang(lang_name)
|
||||||
except NameError:
|
except NameError:
|
||||||
py_print("No command args found from Rust. Don't worry though, we have backup in place.")
|
py_print("No command args or language name found from Rust. Don't worry though, we have backup in place.")
|
||||||
|
init_lang("en")
|
||||||
|
|
||||||
if bot.args["dev"]:
|
if bot.args["dev"]:
|
||||||
py_print("ARGS:", str(bot.args))
|
py_print("ARGS:", str(bot.args))
|
||||||
|
|||||||
+7
-3
@@ -14,7 +14,7 @@ async def add_new_posts(bot: botPy.Bot, max_age: int) -> bool:
|
|||||||
cross_emoji = emoji.emojize(":cross_mark:")
|
cross_emoji = emoji.emojize(":cross_mark:")
|
||||||
|
|
||||||
py_print("Fetching posts...")
|
py_print("Fetching posts...")
|
||||||
posts = await fetch_posts_with_flair(bot, "Original Art")
|
posts = await fetch_posts_with_flair(bot, bot.flairs)
|
||||||
|
|
||||||
py_print("Evaluating posts...")
|
py_print("Evaluating posts...")
|
||||||
|
|
||||||
@@ -65,11 +65,15 @@ async def add_new_posts(bot: botPy.Bot, max_age: int) -> bool:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
async def fetch_posts_with_flair(bot: botPy.Bot, flair_name: str) -> list[models.Submission]:
|
async def fetch_posts_with_flair(bot: botPy.Bot, flair_names: list[str]) -> list[models.Submission]:
|
||||||
posts: list[models.Submission] = []
|
posts: list[models.Submission] = []
|
||||||
|
|
||||||
|
flair_names_str = \
|
||||||
|
f"flair:{flair_names[0]}" if len(flair_names) == 1\
|
||||||
|
else " OR ".join(f"flair:{flair}" for flair in flair_names)
|
||||||
|
|
||||||
# ~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=bot.fetch_limit):
|
async for post in bot.sr.search(f"{flair_names_str}", sort="new", limit=bot.fetch_limit):
|
||||||
posts.append(post)
|
posts.append(post)
|
||||||
|
|
||||||
return posts
|
return posts
|
||||||
|
|||||||
+11
-10
@@ -7,6 +7,7 @@ import bot as botPy
|
|||||||
import data
|
import data
|
||||||
import posts
|
import posts
|
||||||
import cmds
|
import cmds
|
||||||
|
import macros
|
||||||
|
|
||||||
ws_global = None
|
ws_global = None
|
||||||
is_connected = False
|
is_connected = False
|
||||||
@@ -74,16 +75,16 @@ async def json_to_func(v: dict, bot: botPy.Bot) -> dict:
|
|||||||
r = False
|
r = False
|
||||||
|
|
||||||
match v["value"]:
|
match v["value"]:
|
||||||
case "update_data_file": r = data .write_data (bot)
|
case "update_data_file": r = data .write_data (bot)
|
||||||
case "respond_mentions": r = await cmds .respond_to_mention(bot)
|
case "respond_mentions": r = await cmds .respond_to_mention(bot)
|
||||||
case "add_new_posts": r = await posts.add_new_posts (bot, *v["args"])
|
case "add_new_posts": r = await posts .add_new_posts (bot, *v["args"])
|
||||||
case "add_post_url": r = await posts.add_post_url (bot, *v["args"])
|
case "add_post_url": r = await posts .add_post_url (bot, *v["args"])
|
||||||
case "remove_post_url": r = data .remove_post (bot, *v["args"])
|
case "remove_post_url": r = data .remove_post (bot, *v["args"])
|
||||||
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 "update_cfg": r = await bot .update_cfg_str (*v["args"])
|
case "update_cfg": r = await bot .update_cfg_str (*v["args"])
|
||||||
case "stop_praw": r = await bot .stop ()
|
case "stop_praw": r = await bot .stop ()
|
||||||
case _: value_supported = False
|
case _: value_supported = False
|
||||||
|
|
||||||
print_result = v["print"]
|
print_result = v["print"]
|
||||||
|
|||||||
+1
-1
@@ -70,7 +70,7 @@ pub async fn send_cmd_json(func_name: &str, func_args: Option<Value>, print_outp
|
|||||||
{ return r; }
|
{ return r; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if !["respond_mentions"].contains(&func_name) || <Args as clap::Parser>::parse().dev {
|
if <Args as clap::Parser>::parse().dev {
|
||||||
rs_println!("Received from Python: [RESPONSE] {:?}", r);
|
rs_println!("Received from Python: [RESPONSE] {:?}", r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user