command permissions & better styling
This commit is contained in:
@@ -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).**
|
**You can learn more about copyright by reading the full [license](/LICENSE.txt).**
|
||||||
|
|
||||||
## How to run
|
## 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:
|
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
|
* 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_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. |
|
| `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:
|
### How to run:
|
||||||
* Download the code (and extract if needed).
|
* Download the code (and extract if needed).
|
||||||
* Open a terminal and CD to the downloaded folder.
|
* Open a terminal and CD to the downloaded folder.
|
||||||
|
|||||||
+31
-26
@@ -42,7 +42,8 @@ async fn not_bk_mod_msg(ctx: Context<'_>) {
|
|||||||
|
|
||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_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.
|
/// Shows helpful information on how to use the bk_week section of the bot.
|
||||||
pub async fn bk_week_help(
|
pub async fn bk_week_help(
|
||||||
@@ -73,9 +74,10 @@ pub async fn bk_week_help(
|
|||||||
|
|
||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_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(
|
pub async fn bk_week_get(
|
||||||
ctx: Context<'_>,
|
ctx: Context<'_>,
|
||||||
#[description = "The post URL."] url: String
|
#[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(bk_week) = reddit_data.get(BK_WEEK) {
|
||||||
if let Some(post) = bk_week.get(url) {
|
if let Some(post) = bk_week.get(url) {
|
||||||
if post.get("removed").is_some() {
|
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(None);
|
||||||
}
|
}
|
||||||
return Ok(Some(post.clone()));
|
return Ok(Some(post.clone()));
|
||||||
@@ -116,7 +118,7 @@ async fn get_post_from_data(ctx: Context<'_>, reddit_data: &Value, url: &str) ->
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
send_data_corrupted_message(ctx, url).await;
|
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);
|
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) {
|
async fn send_post_removed_message(ctx: Context<'_>, url: &str, post: &Value) {
|
||||||
send_msg(
|
send_embed(
|
||||||
ctx,
|
ctx,
|
||||||
format!(
|
embed_post_removed(post, url, true),
|
||||||
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,
|
|
||||||
true
|
true
|
||||||
).await;
|
).await;
|
||||||
}
|
}
|
||||||
@@ -174,7 +171,8 @@ async fn send_data_corrupted_message(ctx: Context<'_>, url: &str) {
|
|||||||
|
|
||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_command,
|
slash_command,
|
||||||
prefix_command
|
prefix_command,
|
||||||
|
required_bot_permissions = "SEND_MESSAGES"
|
||||||
)]
|
)]
|
||||||
/// Fetches a post from Reddit and adds it to the database.
|
/// Fetches a post from Reddit and adds it to the database.
|
||||||
pub async fn bk_week_add(
|
pub async fn bk_week_add(
|
||||||
@@ -245,7 +243,8 @@ async fn send_updated_msg(ctx: Context<'_>, url: &str) {
|
|||||||
|
|
||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_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.
|
/// Removes a post from the database. It will show who last removed it.
|
||||||
pub async fn bk_week_remove(
|
pub async fn bk_week_remove(
|
||||||
@@ -265,7 +264,7 @@ pub async fn bk_week_remove(
|
|||||||
if r["value"].as_bool().unwrap() {
|
if r["value"].as_bool().unwrap() {
|
||||||
send_msg(
|
send_msg(
|
||||||
ctx,
|
ctx,
|
||||||
format!("Successfully flagged URL \"{}\" as `\"removed\": true` and `\"removed_by\": \"{}\"`", url, auth),
|
"Successfully flagged the post as removed!".to_string(),
|
||||||
true,
|
true,
|
||||||
true
|
true
|
||||||
).await;
|
).await;
|
||||||
@@ -282,7 +281,8 @@ pub async fn bk_week_remove(
|
|||||||
|
|
||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_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.
|
/// Approves a post in the database. Approving posts tells the bot that it's original.
|
||||||
pub async fn bk_week_approve(
|
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) {
|
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 let Some(post) = reddit_data.get(BK_WEEK).unwrap().get(&url) {
|
||||||
if post.get("removed").is_some() {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let r = websocket::send_cmd_json("set_approve_post", Some(json!([approve, &url]))).await.unwrap();
|
let r = websocket::send_cmd_json("set_approve_post", Some(json!([approve, &url]))).await.unwrap();
|
||||||
if r.get("value").is_some() {
|
if r.get("value").is_some() {
|
||||||
if approve {
|
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 {
|
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 {
|
else {
|
||||||
@@ -337,7 +337,8 @@ async fn approve_cmd(ctx: Context<'_>, url: &str, reddit_data: &Value, approve:
|
|||||||
slash_command,
|
slash_command,
|
||||||
prefix_command,
|
prefix_command,
|
||||||
default_member_permissions = "ADMINISTRATOR",
|
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.
|
/// 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(
|
pub async fn bk_admin_bind(
|
||||||
@@ -369,7 +370,8 @@ async fn send_server_not_in_data_msg(ctx: Context<'_>) {
|
|||||||
slash_command,
|
slash_command,
|
||||||
prefix_command,
|
prefix_command,
|
||||||
guild_only,
|
guild_only,
|
||||||
guild_cooldown = 120
|
guild_cooldown = 120,
|
||||||
|
required_bot_permissions = "SEND_MESSAGES"
|
||||||
)]
|
)]
|
||||||
/// Updates all logs
|
/// Updates all logs
|
||||||
pub async fn bk_week_update(
|
pub async fn bk_week_update(
|
||||||
@@ -658,7 +660,8 @@ async fn remove_dupes(http: &Http, c_id: ChannelId, msgs_json: &Value) {
|
|||||||
|
|
||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_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.
|
/// Adds/removes a vote from a post. These votes are not tied to Reddit upvotes.
|
||||||
pub async fn bk_week_vote(
|
pub async fn bk_week_vote(
|
||||||
@@ -678,7 +681,7 @@ pub async fn bk_week_vote(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
if post_data[&url].get("removed").is_some() {
|
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(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -721,7 +724,8 @@ pub async fn bk_week_vote(
|
|||||||
|
|
||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_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.)
|
/// Gets the top N (up to 10) posts within a certain category, such as upvotes. (Sorted descending.)
|
||||||
pub async fn bk_week_top(
|
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(
|
#[poise::command(
|
||||||
slash_command,
|
slash_command,
|
||||||
prefix_command,
|
prefix_command,
|
||||||
owners_only
|
owners_only,
|
||||||
|
required_bot_permissions = "SEND_MESSAGES"
|
||||||
)]
|
)]
|
||||||
/// Changes the subreddit(s) the bot patrols in.
|
/// Changes the subreddit(s) the bot patrols in.
|
||||||
pub async fn bk_cfg_sr(
|
pub async fn bk_cfg_sr(
|
||||||
|
|||||||
+30
-11
@@ -10,7 +10,11 @@ use rand::{seq::IteratorRandom, Rng};
|
|||||||
use regex::Regex;
|
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.
|
/// Check if you have connection to the bot.
|
||||||
pub async fn ping(
|
pub async fn ping(
|
||||||
ctx: Context<'_>,
|
ctx: Context<'_>,
|
||||||
@@ -26,8 +30,8 @@ pub async fn ping(
|
|||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_command,
|
slash_command,
|
||||||
prefix_command,
|
prefix_command,
|
||||||
default_member_permissions = "ADMINISTRATOR",
|
owners_only,
|
||||||
owners_only
|
required_bot_permissions = "SEND_MESSAGES"
|
||||||
)]
|
)]
|
||||||
/// Stops the bot... if you're mighty enough!
|
/// Stops the bot... if you're mighty enough!
|
||||||
pub async fn stop(
|
pub async fn stop(
|
||||||
@@ -61,8 +65,8 @@ pub async fn stop(
|
|||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_command,
|
slash_command,
|
||||||
prefix_command,
|
prefix_command,
|
||||||
default_member_permissions = "ADMINISTRATOR",
|
owners_only,
|
||||||
owners_only
|
required_bot_permissions = "SEND_MESSAGES"
|
||||||
)]
|
)]
|
||||||
/// Creates an embed.
|
/// Creates an embed.
|
||||||
pub async fn embed(
|
pub async fn embed(
|
||||||
@@ -109,8 +113,8 @@ pub async fn embed(
|
|||||||
#[poise::command(
|
#[poise::command(
|
||||||
slash_command,
|
slash_command,
|
||||||
prefix_command,
|
prefix_command,
|
||||||
default_member_permissions = "ADMINISTRATOR",
|
owners_only,
|
||||||
owners_only
|
required_bot_permissions = "SEND_MESSAGES"
|
||||||
)]
|
)]
|
||||||
/// Sends a message.
|
/// Sends a message.
|
||||||
pub async fn send(
|
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.
|
/// Magic 8-ball. Ask a question, get an answer.
|
||||||
pub async fn eight_ball(
|
pub async fn eight_ball(
|
||||||
ctx: Context<'_>,
|
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.
|
/// Convert a long reddit URL to a short one. The bot ONLY uses shortURLs when asking for one.
|
||||||
pub async fn re_shorturl(
|
pub async fn re_shorturl(
|
||||||
ctx: Context<'_>,
|
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.
|
/// 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(
|
pub async fn add_server(
|
||||||
ctx: Context<'_>
|
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;
|
send_msg(ctx, "Added your server to my data! Thanks for letting me steal it! (/s)".to_string(), true, true).await;
|
||||||
}
|
}
|
||||||
else {
|
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(());
|
return Ok(());
|
||||||
|
|||||||
Reference in New Issue
Block a user