command permissions & better styling

This commit is contained in:
2025-03-01 01:48:00 +01:00
parent 1466448fd3
commit ec7315ebfd
3 changed files with 66 additions and 38 deletions
+5 -1
View File
@@ -10,7 +10,7 @@ An automation tool for Byte Dice. It's both a Discord and Reddit bot in one prog
**You can learn more about copyright by reading the full [license](/LICENSE.txt).**
## How to run
### Dependecies:
### Dependencies:
This program uses Rust (v1.82.0) and Python (v3.11.4), you can likely use other versions if they are compatible. This program also uses these Python modules:
* asyncio
@@ -40,6 +40,10 @@ You can install Python modules by running `$ pip install {module}` or `$ python
| `ASSISTANT_R_PASS` | The password for the Reddit bot/account. |
| `ASSISTANT_OWNERS` | A list of user ids that "own" the bot. Separate each owner with a comma and NO spaces. |
### Required permissions:
* Send Messages
* and... nothing else.
### How to run:
* Download the code (and extract if needed).
* Open a terminal and CD to the downloaded folder.
+31 -26
View File
@@ -42,7 +42,8 @@ async fn not_bk_mod_msg(ctx: Context<'_>) {
#[poise::command(
slash_command,
prefix_command
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Shows helpful information on how to use the bk_week section of the bot.
pub async fn bk_week_help(
@@ -73,9 +74,10 @@ pub async fn bk_week_help(
#[poise::command(
slash_command,
prefix_command
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Retrieves the data of a single post just for you. The data has to be within the database to work.
/// Fetches the data of a single post, just for you. The data has to be within the database to work.
pub async fn bk_week_get(
ctx: Context<'_>,
#[description = "The post URL."] url: String
@@ -105,7 +107,7 @@ async fn get_post_from_data(ctx: Context<'_>, reddit_data: &Value, url: &str) ->
if let Some(bk_week) = reddit_data.get(BK_WEEK) {
if let Some(post) = bk_week.get(url) {
if post.get("removed").is_some() {
send_post_removed_message(ctx, url, post.get("removed_by").unwrap().as_str().unwrap()).await;
send_post_removed_message(ctx, url, post).await;
return Ok(None);
}
return Ok(Some(post.clone()));
@@ -116,7 +118,7 @@ async fn get_post_from_data(ctx: Context<'_>, reddit_data: &Value, url: &str) ->
}
else {
send_data_corrupted_message(ctx, url).await;
rs_println!("{}", serde_json::to_string_pretty(reddit_data).unwrap());
rs_println!("{}", serde_json::to_string_pretty(reddit_data)?);
}
return Ok(None);
}
@@ -142,15 +144,10 @@ async fn send_post_not_found_message(ctx: Context<'_>, url: &str) {
}
async fn send_post_removed_message(ctx: Context<'_>, url: &str, rm_by: &str) {
send_msg(
async fn send_post_removed_message(ctx: Context<'_>, url: &str, post: &Value) {
send_embed(
ctx,
format!(
r#"Post URL \"<{}>\" is removed: Post is removed from the data! (Removed by: `{}`)
Hint: Run the command `/bk_week_add [URL]` in a Discord channel or `u/ByteDiceAssistant bk_week_add` in a Reddit post."#,
url, rm_by
).trim().to_string(),
true,
embed_post_removed(post, url, true),
true
).await;
}
@@ -174,7 +171,8 @@ async fn send_data_corrupted_message(ctx: Context<'_>, url: &str) {
#[poise::command(
slash_command,
prefix_command
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Fetches a post from Reddit and adds it to the database.
pub async fn bk_week_add(
@@ -245,7 +243,8 @@ async fn send_updated_msg(ctx: Context<'_>, url: &str) {
#[poise::command(
slash_command,
prefix_command
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Removes a post from the database. It will show who last removed it.
pub async fn bk_week_remove(
@@ -265,7 +264,7 @@ pub async fn bk_week_remove(
if r["value"].as_bool().unwrap() {
send_msg(
ctx,
format!("Successfully flagged URL \"{}\" as `\"removed\": true` and `\"removed_by\": \"{}\"`", url, auth),
"Successfully flagged the post as removed!".to_string(),
true,
true
).await;
@@ -282,7 +281,8 @@ pub async fn bk_week_remove(
#[poise::command(
slash_command,
prefix_command
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Approves a post in the database. Approving posts tells the bot that it's original.
pub async fn bk_week_approve(
@@ -308,17 +308,17 @@ pub async fn bk_week_approve(
async fn approve_cmd(ctx: Context<'_>, url: &str, reddit_data: &Value, approve: bool) {
if let Some(post) = reddit_data.get(BK_WEEK).unwrap().get(&url) {
if post.get("removed").is_some() {
send_post_removed_message(ctx, &url, post.get("removed_by").unwrap().as_str().unwrap()).await;
send_post_removed_message(ctx, &url, post).await;
return;
}
let r = websocket::send_cmd_json("set_approve_post", Some(json!([approve, &url]))).await.unwrap();
if r.get("value").is_some() {
if approve {
send_msg(ctx, format!("Successfully flagged URL \"<{}>\" as `approved:by_human`!", &url), true, true).await;
send_msg(ctx, "Successfully flagged the post as approved (by a human)!".to_string(), true, true).await;
}
else {
send_msg(ctx, format!("Successfully removed flag `approved:by_human` from URL \"<{}>\"!", &url), true, true).await;
send_msg(ctx, "Successfully removed the \"approved (by a human)\" flag from the post!".to_string(), true, true).await;
}
}
else {
@@ -337,7 +337,8 @@ async fn approve_cmd(ctx: Context<'_>, url: &str, reddit_data: &Value, approve:
slash_command,
prefix_command,
default_member_permissions = "ADMINISTRATOR",
guild_only
guild_only,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Sets the channel where the bot will dump all log info. It's recommended to only run this once.
pub async fn bk_admin_bind(
@@ -369,7 +370,8 @@ async fn send_server_not_in_data_msg(ctx: Context<'_>) {
slash_command,
prefix_command,
guild_only,
guild_cooldown = 120
guild_cooldown = 120,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Updates all logs
pub async fn bk_week_update(
@@ -658,7 +660,8 @@ async fn remove_dupes(http: &Http, c_id: ChannelId, msgs_json: &Value) {
#[poise::command(
slash_command,
prefix_command
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Adds/removes a vote from a post. These votes are not tied to Reddit upvotes.
pub async fn bk_week_vote(
@@ -678,7 +681,7 @@ pub async fn bk_week_vote(
return Ok(());
}
if post_data[&url].get("removed").is_some() {
send_post_removed_message(ctx, &url, post_data[&url]["removed_by"].as_str().unwrap()).await;
send_post_removed_message(ctx, &url, &post_data[&url]).await;
return Ok(());
}
@@ -721,7 +724,8 @@ pub async fn bk_week_vote(
#[poise::command(
slash_command,
prefix_command
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Gets the top N (up to 10) posts within a certain category, such as upvotes. (Sorted descending.)
pub async fn bk_week_top(
@@ -790,7 +794,8 @@ fn smallest_n<'a>(map: &'a HashMap<&'a str, i32>, n: usize) -> Vec<(&'a str, i32
#[poise::command(
slash_command,
prefix_command,
owners_only
owners_only,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Changes the subreddit(s) the bot patrols in.
pub async fn bk_cfg_sr(
+30 -11
View File
@@ -10,7 +10,11 @@ use rand::{seq::IteratorRandom, Rng};
use regex::Regex;
#[poise::command(slash_command, prefix_command)]
#[poise::command(
slash_command,
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Check if you have connection to the bot.
pub async fn ping(
ctx: Context<'_>,
@@ -26,8 +30,8 @@ pub async fn ping(
#[poise::command(
slash_command,
prefix_command,
default_member_permissions = "ADMINISTRATOR",
owners_only
owners_only,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Stops the bot... if you're mighty enough!
pub async fn stop(
@@ -61,8 +65,8 @@ pub async fn stop(
#[poise::command(
slash_command,
prefix_command,
default_member_permissions = "ADMINISTRATOR",
owners_only
owners_only,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Creates an embed.
pub async fn embed(
@@ -109,8 +113,8 @@ pub async fn embed(
#[poise::command(
slash_command,
prefix_command,
default_member_permissions = "ADMINISTRATOR",
owners_only
owners_only,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Sends a message.
pub async fn send(
@@ -125,7 +129,12 @@ pub async fn send(
#[poise::command(slash_command, prefix_command, rename = "8_ball")]
#[poise::command(
slash_command,
prefix_command,
rename = "8_ball",
required_bot_permissions = "SEND_MESSAGES"
)]
/// Magic 8-ball. Ask a question, get an answer.
pub async fn eight_ball(
ctx: Context<'_>,
@@ -147,7 +156,11 @@ pub async fn eight_ball(
}
#[poise::command(slash_command, prefix_command)]
#[poise::command(
slash_command,
prefix_command,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Convert a long reddit URL to a short one. The bot ONLY uses shortURLs when asking for one.
pub async fn re_shorturl(
ctx: Context<'_>,
@@ -180,7 +193,13 @@ pub fn to_shorturl(url: &str) -> Result<String, &str> {
}
#[poise::command(slash_command, prefix_command, default_member_permissions = "ADMINISTRATOR", guild_only)]
#[poise::command(
slash_command,
prefix_command,
default_member_permissions = "ADMINISTRATOR",
guild_only,
required_bot_permissions = "SEND_MESSAGES"
)]
/// Add your server to my database so I can sell it! (/s), I only store some minimal data the bot needs.
pub async fn add_server(
ctx: Context<'_>
@@ -192,7 +211,7 @@ pub async fn add_server(
send_msg(ctx, "Added your server to my data! Thanks for letting me steal it! (/s)".to_string(), true, true).await;
}
else {
send_msg(ctx, "Oopsies `(。>\\\\<)`. It looks like my data i-is \\**sob*\\*... c-cor-corrupted!".to_string(), true, true).await;
send_msg(ctx, "Oopsies `(。>\\\\<)`. It looks like my data i-is \\**sob*\\*... c-corrupted!".to_string(), true, true).await;
}
return Ok(());