diff --git a/bk_week_help.md b/bk_week_help.md new file mode 100644 index 0000000..0f38b2e --- /dev/null +++ b/bk_week_help.md @@ -0,0 +1,39 @@ +# Discord Commands + +### `/bk_week_add [url] [approve]` +Adds a URL to the list of posts. This is done automatically by the bot for certain posts. +- **`[approve]`**: `true` or `false`, determines whether to pre-approve the post. + +### `/bk_week_remove [url]` +Removes an existing URL from the list of posts. + +### `/bk_week_approve [url]` +Flags the post as **human_approved**, confirming that the artwork is original. + +### `/bk_week_disapprove [url]` +Reverses the effect of `/bk_week_approve`. + +#### **Examples** +``` +/bk_week_add https://reddit.com/post_url false +/bk_week_add https://reddit.com/post_url +/bk_week_approve https://reddit.com/post_url +``` + +--- + +# Reddit Commands + +To execute a command on the Reddit bot, include `"u/ByteDiceAssistant [args]"` in a comment. +- **`[args]`**: The command you want to run. + +### `bk_week_add` +Adds the post to the list of posts. +- **Only moderators of a subreddit or the OP (Original Poster) can use this command.** + +#### **Examples** +``` +"u/ByteDiceAssistant bk_week_add" +"Cool art, let me add that. u/ByteDiceAssistant bk_week_add" +"Cool art. Just gonna u/ByteDiceAssistant bk_week_add so it can become featured." +``` \ No newline at end of file diff --git a/bk_week_help.txt b/bk_week_help.txt deleted file mode 100644 index 3c494f4..0000000 --- a/bk_week_help.txt +++ /dev/null @@ -1,46 +0,0 @@ -``` ---- Discord commands --- -/bk_week_add [url] [approve] - Takes a URL and adds it to the list of posts. - This is done automatically by the bot for certain posts. - [approve] is true or false, and determines wether to pre- - approve the post. -/bk_week_remove [url] - Takes an existing URL and removes it from the list of posts. -/bk_week_approve [url] - Takes an existing URL and flags the post as human_approved. - Approve a post to tell the bot that an art piece is original art. -/bk_week_disapprove [url] - Does what /bk_week_approve does, but opposite. - -EXAMPLES: -/bk_week_add https://reddit.com/abc123 false -/bk_week_approve https://reddit.com/def456 - ---- Reddit commands --- -To execute a command on the Reddit bot, type "u/ByteDiceAssistant [args]" in a comment. -[args] should be replaced with a command: - -add - Adds the post the command was ran in to the list of posts. - -EXAMPLES: -u/ByteDiceAssistant add - -You can even do this: (without the quotes) - """ - Hey guys welcome back to my lets play, today we are checking out original art. - Wow, this art is original and cool. - - u/ByteDiceAssistant add - - I want this art to be recognized - """ -and this: - "Cool art. u/ByteDiceAssistant add -and this: - """ - Cool art. u/ByteDiceAssistant add - Very cool. - """ - -But you cant do this: (without the quotes) - "Cool art. u/ByteDiceAssistant add very cool." - "Cool art. u/ByteDiceAssistant add. Very cool." - "Cool art. u/ByteDiceAssistant add." (Notice the period?) -``` \ No newline at end of file diff --git a/data/reddit_data_preset.json b/data/reddit_data_preset.json index 34cb950..35388ae 100644 --- a/data/reddit_data_preset.json +++ b/data/reddit_data_preset.json @@ -1,7 +1,7 @@ { "file_created_correctly": true, "bk_weekly_art_posts": { - "EXAMPLE VALUE DO NOT INCLUDE IN FINAL": { + "EXAMPLE VALUE": { "post_data": { "title": "I JUST BOUGHT THE CONTINENT OF NORTH AMERICA FOR A DOLLAR!", "upvotes": 69420, diff --git a/src/bk_week_cmds.rs b/src/bk_week_cmds.rs index 01737ab..1ad2abf 100644 --- a/src/bk_week_cmds.rs +++ b/src/bk_week_cmds.rs @@ -1,4 +1,7 @@ -use crate::{rs_println, websocket, Context, Error}; +use serde_json::json; + +use crate::websocket::send_cmd_json; +use crate::{Context, Error}; use crate::messages::send_msg; use std::fs; @@ -8,7 +11,7 @@ pub async fn bk_week_help( ctx: Context<'_>, ) -> Result<(), Error> { - let help = fs::read_to_string("./bk_week_help.txt").unwrap(); + let help = fs::read_to_string("./bk_week_help.md").unwrap(); send_msg(ctx, help, true, true).await; return Ok(()); @@ -21,9 +24,7 @@ pub async fn bk_week_get( #[description = "The post URL"] url: Option ) -> Result<(), Error> { - // log all posts in a thread - rs_println!("Sending hello to python..."); - websocket::send_msg("Hello from Rust!").await; + send_cmd_json("update_data_file", json!([])).await; return Ok(()); } diff --git a/src/macros.rs b/src/macros.rs index 01765f1..0cc7c59 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,9 +1,8 @@ #[macro_export] macro_rules! rs_println { ($($arg:tt)*) => { - println!("{}RS{} - {}", + println!("{}RS - {}", "\x1b[31m", - "\x1b[0m", format!($($arg)*) ); }; @@ -13,10 +12,9 @@ macro_rules! rs_println { #[macro_export] macro_rules! rs_errln { ($($arg:tt)*) => { - println!("{}ERROR{} RS{} - {}", + println!("{}ERROR{} RS - {}", "\x1b[41m", "\x1b[0m\x1b[31m", - "\x1b[0m", format!($($arg)*) ); process::exit(1); diff --git a/src/python/data.py b/src/python/data.py index 2d34a45..6e9012d 100644 --- a/src/python/data.py +++ b/src/python/data.py @@ -79,6 +79,7 @@ def read_data(bot: botPy.Bot): def write_data(bot: botPy.Bot): + bot.data["TEST"] = True bot.data_f.seek(0) json.dump(bot.data, bot.data_f, indent=2) bot.data_f.truncate() diff --git a/src/python/macros.py b/src/python/macros.py index e30c4ce..0390624 100644 --- a/src/python/macros.py +++ b/src/python/macros.py @@ -2,7 +2,7 @@ from printColors import PrintColors def py_print(*args: str): print( - PrintColors.FG.blue + "Py" + PrintColors.Special.reset, + PrintColors.FG.blue + "Py", "-", " ".join(args) ) @@ -10,7 +10,7 @@ def py_print(*args: str): def py_error(*args: str): print( PrintColors.BG.red + "ERROR" + PrintColors.Special.reset, - PrintColors.FG.blue + "Py" + PrintColors.Special.reset, + PrintColors.FG.blue + "Py", "-", " ".join(args) ) diff --git a/src/python/py_websocket.py b/src/python/py_websocket.py index a1088a6..fcf4b55 100644 --- a/src/python/py_websocket.py +++ b/src/python/py_websocket.py @@ -1,8 +1,10 @@ import websockets import asyncio +import json from macros import py_print import bot as botPy +import data ws_global = None is_connected = False @@ -23,9 +25,37 @@ async def websocket_client(bot: botPy.Bot): while True: response = await ws.recv() py_print(f"Received from Rust: {response}") + parse_json(response, bot) + + +def parse_json(response: str, bot: botPy.Bot): + if response.startswith("json:"): + json_str = response[5:] + try: + json_response = json.loads(json_str) + json_to_func(json_response, bot) + except json.JSONDecodeError as e: + if bot.args["dev"]: py_print(f"failed to parse json: {json_str}\n reason: {e}") def run_thread(bot: botPy.Bot): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - loop.run_until_complete(websocket_client(bot)) \ No newline at end of file + loop.run_until_complete(websocket_client(bot)) + + +def json_to_func(v: dict, bot: botPy.Bot): + if "type" not in v or "value" not in v or not isinstance(v, dict): + if bot.args["dev"]: py_print("JSON is not a dictionary or does not include \"type\" and \"value\" keys.") + return + if v["type"] != "function": + if bot.args["dev"]: py_print(f"Type \"{v['type']}\" is not supported.") + return + + value_supported = True + match v["value"]: + case "update_data_file": data.write_data(bot) + case _: value_supported = False + + if bot.args["dev"] and not value_supported: + print(f"Value {v['value']} is not supported") \ No newline at end of file diff --git a/src/websocket.rs b/src/websocket.rs index 21c1f1d..646416e 100644 --- a/src/websocket.rs +++ b/src/websocket.rs @@ -4,6 +4,7 @@ use tokio::net::TcpListener; use tokio_tungstenite::{accept_async, tungstenite}; use futures::StreamExt; use std::sync::Arc; +use serde_json::Value; use crate::rs_println; use crate::Args; @@ -33,6 +34,22 @@ pub async fn send_msg(msg: &str) { } +pub async fn send_cmd_json(func_name: &str, func_args: Value) { + unsafe { + if let Some(sender) = &GLOBAL_SENDER { + let mut sender = sender.lock().await; + if let Some(s) = sender.as_mut() { + let json_str: String = format!( + "json:{{\"type\": \"function\", \"value\":\"{}\", \"args\": {}}}", + func_name, func_args + ); + s.send(tungstenite::Message::Text(json_str.into())).await.unwrap(); + } + } + } +} + + pub async fn start(args: Args) { rs_println!("Starting local websocket..."); let ip = format!("127.0.0.1:{}", args.port);