renamed count commands and added tags commands
This commit is contained in:
@@ -17,3 +17,4 @@ features = ["cache", "framework", "standard_framework", "rustls_backend", "unsta
|
|||||||
[dependencies.tokio]
|
[dependencies.tokio]
|
||||||
version = "1.0"
|
version = "1.0"
|
||||||
features = ["macros", "signal", "rt-multi-thread"]
|
features = ["macros", "signal", "rt-multi-thread"]
|
||||||
|
|
||||||
|
@@ -30,7 +30,7 @@
|
|||||||
nativeBuildInputs = with pkgs; [
|
nativeBuildInputs = with pkgs; [
|
||||||
rust-bin.nightly.latest.default
|
rust-bin.nightly.latest.default
|
||||||
];
|
];
|
||||||
cargoSha256 = "sha256-K+WHOEo6reNfcs7pOZZmHZfZl4pUqlykfTdqgSyVURU=";
|
cargoSha256 = "sha256-0Apd8a9IdQJ8Mj5Xvm1/wM0PSc7PgciIptmz/KGx8XM=";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
14
init.sql
14
init.sql
@@ -3,3 +3,17 @@ CREATE TABLE IF NOT EXISTS words (
|
|||||||
name varchar not null,
|
name varchar not null,
|
||||||
reg varchar not null,
|
reg varchar not null,
|
||||||
owner varchar );
|
owner varchar );
|
||||||
|
|
||||||
|
ALTER SEQUENCE words_id_seq RESTART;
|
||||||
|
UPDATE words SET id = DEFAULT;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS tags (
|
||||||
|
id serial primary key,
|
||||||
|
name varchar unique not null,
|
||||||
|
value varchar not null,
|
||||||
|
owner varchar );
|
||||||
|
|
||||||
|
ALTER SEQUENCE tags_id_seq RESTART;
|
||||||
|
UPDATE tags SET id = DEFAULT;
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
|
||||||
|
@@ -14,7 +14,8 @@ use serenity::{
|
|||||||
use tokio_postgres::Row;
|
use tokio_postgres::Row;
|
||||||
|
|
||||||
#[command]
|
#[command]
|
||||||
pub async fn kitna(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
#[aliases("kitna")]
|
||||||
|
pub async fn count(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||||
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
||||||
if query == "" {
|
if query == "" {
|
||||||
msg.reply(ctx, "bruh kitna kya?").await?;
|
msg.reply(ctx, "bruh kitna kya?").await?;
|
||||||
@@ -29,14 +30,14 @@ pub async fn kitna(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
let id = msg.author.id.to_string();
|
let id = msg.author.id.to_string();
|
||||||
let mut query_helper = db
|
let mut query_helper = db
|
||||||
.query(
|
.query(
|
||||||
format!("select name from words where '{}' ~ reg", query).as_str(),
|
format!("SELECT name FROM words WHERE '{}' ~ reg", query).as_str(),
|
||||||
&[],
|
&[],
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
if query_helper.is_empty() {
|
if query_helper.is_empty() {
|
||||||
query_helper = db
|
query_helper = db
|
||||||
.query(
|
.query(
|
||||||
format!("select name from words where name='{}'", query).as_str(),
|
format!("SELECT name FROM words WHERE name='{}'", query).as_str(),
|
||||||
&[],
|
&[],
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
@@ -44,7 +45,7 @@ pub async fn kitna(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
msg.reply(
|
msg.reply(
|
||||||
ctx,
|
ctx,
|
||||||
format!(
|
format!(
|
||||||
"No entry for '{}' found. If you want to add it, run ',count add {}&<regex>'",
|
"No entry for '{}' found. If you want to add it, run ',cadd {}&<regex>'",
|
||||||
query, query
|
query, query
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@@ -61,7 +62,7 @@ pub async fn kitna(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
let name: &str = row.get(0);
|
let name: &str = row.get(0);
|
||||||
let query_result: i32 = db
|
let query_result: i32 = db
|
||||||
.query_one(
|
.query_one(
|
||||||
format!("select count from user{} where name='{}'", id, name).as_str(),
|
format!("SELECT count FROM user{} WHERE name='{}'", id, name).as_str(),
|
||||||
&[],
|
&[],
|
||||||
)
|
)
|
||||||
.await?
|
.await?
|
||||||
@@ -73,11 +74,11 @@ pub async fn kitna(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[command]
|
#[command]
|
||||||
pub async fn add(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
pub async fn cadd(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||||
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
||||||
let queries = query.splitn(2, "&").collect::<Vec<&str>>();
|
let queries = query.splitn(2, "&").collect::<Vec<&str>>();
|
||||||
if queries.len() != 2 {
|
if queries.len() != 2 {
|
||||||
msg.reply(ctx, "Please use the proper syntax: `,count add <name>&<regex>`\nIf you don't know what regex is, just do: `,count add <name>&<name>`")
|
msg.reply(ctx, "Please use the proper syntax: `,cadd <name>&<regex>`\nIf you don't know what regex is, just do: `,cadd <name>&<name>`")
|
||||||
.await?;
|
.await?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
@@ -92,7 +93,7 @@ pub async fn add(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
.clone();
|
.clone();
|
||||||
let check_existense = db
|
let check_existense = db
|
||||||
.query(
|
.query(
|
||||||
format!("select name, reg from words where name='{}'", queries[0]).as_str(),
|
format!("SELECT name, reg FROM words WHERE name='{}'", queries[0]).as_str(),
|
||||||
&[],
|
&[],
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
@@ -107,7 +108,7 @@ pub async fn add(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
}
|
}
|
||||||
db.execute(
|
db.execute(
|
||||||
format!(
|
format!(
|
||||||
"insert into words(name, reg, owner) values('{}','(?i){}', '{}')",
|
"INSERT INTO words(name, reg, owner) VALUES('{}','(?i){}', '{}')",
|
||||||
queries[0],
|
queries[0],
|
||||||
queries[1],
|
queries[1],
|
||||||
msg.author.id.to_string()
|
msg.author.id.to_string()
|
||||||
@@ -121,7 +122,7 @@ pub async fn add(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[command]
|
#[command]
|
||||||
pub async fn rm(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
pub async fn crm(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||||
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
||||||
if query == "" {
|
if query == "" {
|
||||||
msg.reply(ctx, "remove what?").await?;
|
msg.reply(ctx, "remove what?").await?;
|
||||||
@@ -134,7 +135,7 @@ pub async fn rm(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
.clone();
|
.clone();
|
||||||
let owner = db
|
let owner = db
|
||||||
.query(
|
.query(
|
||||||
format!("select owner from words where name = '{}'", query).as_str(),
|
format!("SELECT owner FROM words WHERE name = '{}'", query).as_str(),
|
||||||
&[],
|
&[],
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
@@ -146,7 +147,7 @@ pub async fn rm(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
db.execute(
|
db.execute(
|
||||||
format!("delete from words where name='{}'", query,).as_str(),
|
format!("DELETE FROM words WHERE name='{}'", query,).as_str(),
|
||||||
&[],
|
&[],
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
@@ -155,13 +156,13 @@ pub async fn rm(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[command]
|
#[command]
|
||||||
pub async fn change(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
pub async fn cedit(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||||
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
||||||
let queries = query.splitn(2, "&").collect::<Vec<&str>>();
|
let queries = query.splitn(2, "&").collect::<Vec<&str>>();
|
||||||
if queries.len() != 2 {
|
if queries.len() != 2 {
|
||||||
msg.reply(
|
msg.reply(
|
||||||
ctx,
|
ctx,
|
||||||
"Please use the proper syntax\n,count change <name>&<regex>",
|
"Please use the proper syntax\n,cedit <name>&<regex>",
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -177,7 +178,7 @@ pub async fn change(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
.clone();
|
.clone();
|
||||||
let owner = db
|
let owner = db
|
||||||
.query(
|
.query(
|
||||||
format!("select owner from words where name = '{}'", queries[0]).as_str(),
|
format!("SELECT owner FROM words WHERE name = '{}'", queries[0]).as_str(),
|
||||||
&[],
|
&[],
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
@@ -190,7 +191,7 @@ pub async fn change(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
|||||||
}
|
}
|
||||||
db.execute(
|
db.execute(
|
||||||
format!(
|
format!(
|
||||||
"update words set reg='(?i){}' where name='{}'",
|
"UPDATE words SET reg='(?i){}' WHERE name='{}'",
|
||||||
queries[1], queries[0]
|
queries[1], queries[0]
|
||||||
)
|
)
|
||||||
.as_str(),
|
.as_str(),
|
||||||
@@ -237,18 +238,24 @@ macro_rules! make_terminal_components {
|
|||||||
.custom_id("next")
|
.custom_id("next")
|
||||||
.disabled($terminal == "last")
|
.disabled($terminal == "last")
|
||||||
})
|
})
|
||||||
|
.create_button(|b| {
|
||||||
|
b.style(ButtonStyle::Danger)
|
||||||
|
.label("Delete")
|
||||||
|
.emoji(ReactionType::Unicode("\u{1F5D1}".to_string()))
|
||||||
|
.custom_id("delete")
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
#[command]
|
#[command]
|
||||||
pub async fn ls(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
|
pub async fn cls(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
|
||||||
let data_read = ctx.data.read().await;
|
let data_read = ctx.data.read().await;
|
||||||
let db = data_read
|
let db = data_read
|
||||||
.get::<crate::Database>()
|
.get::<crate::Database>()
|
||||||
.expect("Expected Database in TypeMap.")
|
.expect("Expected Database in TypeMap.")
|
||||||
.clone();
|
.clone();
|
||||||
let rows = db.query("select * from words", &[]).await?;
|
let rows = db.query("SELECT * FROM words", &[]).await?;
|
||||||
if rows.is_empty() {
|
if rows.is_empty() {
|
||||||
msg.reply(ctx, "No words stored").await?;
|
msg.reply(ctx, "No words stored").await?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -273,11 +280,11 @@ pub async fn ls(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
|
|||||||
match component.custom_id.as_ref() {
|
match component.custom_id.as_ref() {
|
||||||
"next" => {
|
"next" => {
|
||||||
if cur != groups.len() {
|
if cur != groups.len() {
|
||||||
|
cur += 1;
|
||||||
let _ = interaction
|
let _ = interaction
|
||||||
.create_interaction_response(&ctx, |r| {
|
.create_interaction_response(&ctx, |r| {
|
||||||
r.kind(InteractionResponseType::UpdateMessage)
|
r.kind(InteractionResponseType::UpdateMessage)
|
||||||
.interaction_response_data(|m| {
|
.interaction_response_data(|m| {
|
||||||
cur += 1;
|
|
||||||
m.create_embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
|
m.create_embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
|
||||||
.components(|c| {
|
.components(|c| {
|
||||||
make_terminal_components!(
|
make_terminal_components!(
|
||||||
@@ -296,11 +303,11 @@ pub async fn ls(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
|
|||||||
}
|
}
|
||||||
"prev" => {
|
"prev" => {
|
||||||
if cur != 1 {
|
if cur != 1 {
|
||||||
|
cur -= 1;
|
||||||
let _ = interaction
|
let _ = interaction
|
||||||
.create_interaction_response(&ctx, |r| {
|
.create_interaction_response(&ctx, |r| {
|
||||||
r.kind(InteractionResponseType::UpdateMessage)
|
r.kind(InteractionResponseType::UpdateMessage)
|
||||||
.interaction_response_data(|m| {
|
.interaction_response_data(|m| {
|
||||||
cur -= 1;
|
|
||||||
m.create_embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
|
m.create_embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
|
||||||
.components(|c| {
|
.components(|c| {
|
||||||
make_terminal_components!(
|
make_terminal_components!(
|
||||||
@@ -313,6 +320,10 @@ pub async fn ls(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
|
|||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"delete" => {
|
||||||
|
message.delete(ctx).await?;
|
||||||
|
msg.delete(ctx).await?;
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
pub mod general;
|
|
||||||
pub mod count;
|
pub mod count;
|
||||||
|
pub mod general;
|
||||||
pub mod minigames;
|
pub mod minigames;
|
||||||
|
pub mod tags;
|
||||||
|
325
src/commands/tags.rs
Normal file
325
src/commands/tags.rs
Normal file
@@ -0,0 +1,325 @@
|
|||||||
|
use core::time::Duration;
|
||||||
|
use serenity::{
|
||||||
|
collector::component_interaction_collector::ComponentInteractionCollectorBuilder,
|
||||||
|
framework::standard::{macros::command, Args, CommandResult},
|
||||||
|
futures::StreamExt,
|
||||||
|
model::{
|
||||||
|
channel::ReactionType,
|
||||||
|
interactions::{ButtonStyle, InteractionData},
|
||||||
|
prelude::*,
|
||||||
|
},
|
||||||
|
prelude::*,
|
||||||
|
utils::Colour,
|
||||||
|
};
|
||||||
|
use tokio_postgres::Row;
|
||||||
|
|
||||||
|
#[command]
|
||||||
|
#[aliases("t")]
|
||||||
|
pub async fn tag(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||||
|
let query: String = args.raw().collect::<Vec<&str>>().join("");
|
||||||
|
if query == "" {
|
||||||
|
msg.reply(ctx, "Mention the tag retard").await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
let db = data_read
|
||||||
|
.get::<crate::Database>()
|
||||||
|
.expect("Expected Database in TypeMap.")
|
||||||
|
.clone();
|
||||||
|
|
||||||
|
let query_helper = db
|
||||||
|
.query(
|
||||||
|
format!("SELECT name, value FROM tags WHERE name='{}'", query).as_str(),
|
||||||
|
&[],
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
if query_helper.is_empty() {
|
||||||
|
let leven = db
|
||||||
|
.query(
|
||||||
|
format!(
|
||||||
|
"SELECT name FROM tags WHERE levenshtein(name, '{}') < 2",
|
||||||
|
query
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
&[],
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let l = if leven.is_empty() {
|
||||||
|
"".to_string()
|
||||||
|
} else {
|
||||||
|
let leven_name: String = leven[0].get(0);
|
||||||
|
format!("\nDid you mean `{}`?", leven_name)
|
||||||
|
};
|
||||||
|
|
||||||
|
msg.reply(
|
||||||
|
ctx,
|
||||||
|
format!(
|
||||||
|
"No entry for '{}' found. If you want to add it, run `,tadd {} <value>`{}",
|
||||||
|
query, query, l
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let value: String = query_helper[0].get(1);
|
||||||
|
msg.reply(ctx, value).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[command]
|
||||||
|
pub async fn tadd(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||||
|
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
||||||
|
let queries = query.splitn(2, " ").collect::<Vec<&str>>();
|
||||||
|
if queries.len() != 2 {
|
||||||
|
msg.reply(ctx, "Please use the proper syntax: `,tadd <name> <value>`")
|
||||||
|
.await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
let db = data_read
|
||||||
|
.get::<crate::Database>()
|
||||||
|
.expect("Expected Database in TypeMap.")
|
||||||
|
.clone();
|
||||||
|
let check_existense = db
|
||||||
|
.query(
|
||||||
|
format!("SELECT name FROM tags WHERE name='{}'", queries[0]).as_str(),
|
||||||
|
&[],
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
if check_existense.len() != 0 {
|
||||||
|
msg.reply(ctx, format!("This tag already exists")).await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
db.execute(
|
||||||
|
format!(
|
||||||
|
"INSERT INTO tags(name, value, owner) VALUES('{}','{}', '{}')",
|
||||||
|
queries[0],
|
||||||
|
format!(
|
||||||
|
"{}\n{}",
|
||||||
|
queries[1],
|
||||||
|
msg.attachments
|
||||||
|
.iter()
|
||||||
|
.map(|x| x.url.clone())
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join("\n")
|
||||||
|
),
|
||||||
|
msg.author.id.to_string()
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
&[],
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
msg.reply(ctx, "Added").await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[command]
|
||||||
|
pub async fn trm(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||||
|
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
||||||
|
if query == "" {
|
||||||
|
msg.reply(ctx, "remove what?").await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
let db = data_read
|
||||||
|
.get::<crate::Database>()
|
||||||
|
.expect("Expected Database in TypeMap.")
|
||||||
|
.clone();
|
||||||
|
let owner = db
|
||||||
|
.query(
|
||||||
|
format!("SELECT owner FROM tags WHERE name = '{}'", query).as_str(),
|
||||||
|
&[],
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
if owner.len() == 1 {
|
||||||
|
let owner_id: String = owner[0].get(0);
|
||||||
|
if owner_id != msg.author.id.to_string() {
|
||||||
|
msg.reply(ctx, "You don't even own this tag").await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
db.execute(
|
||||||
|
format!("DELETE FROM tags WHERE name='{}'", query,).as_str(),
|
||||||
|
&[],
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
msg.reply(ctx, "Deleted if it existed").await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[command]
|
||||||
|
pub async fn tedit(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||||
|
let query: String = args.raw().collect::<Vec<&str>>().join(" ");
|
||||||
|
let queries = query.splitn(2, " ").collect::<Vec<&str>>();
|
||||||
|
if queries.len() != 2 {
|
||||||
|
msg.reply(ctx, "Please use the proper syntax\n`,tedit <name> <value>`")
|
||||||
|
.await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
let db = data_read
|
||||||
|
.get::<crate::Database>()
|
||||||
|
.expect("Expected Database in TypeMap.")
|
||||||
|
.clone();
|
||||||
|
let owner = db
|
||||||
|
.query(
|
||||||
|
format!("SELECT owner FROM tags WHERE name = '{}'", queries[0]).as_str(),
|
||||||
|
&[],
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
if owner.len() == 1 {
|
||||||
|
let owner_id: String = owner[0].get(0);
|
||||||
|
if owner_id != msg.author.id.to_string() {
|
||||||
|
msg.reply(ctx, "You don't even own this tag").await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
db.execute(
|
||||||
|
format!(
|
||||||
|
"UPDATE tags SET value='{}' WHERE name='{}'",
|
||||||
|
format!(
|
||||||
|
"{}\n{}",
|
||||||
|
queries[1],
|
||||||
|
msg.attachments
|
||||||
|
.iter()
|
||||||
|
.map(|x| x.url.clone())
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join("\n")
|
||||||
|
),
|
||||||
|
queries[0]
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
&[],
|
||||||
|
).await?;
|
||||||
|
msg.reply(ctx, "Changed the value if it existed").await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! make_embed {
|
||||||
|
($e: expr, $cur: expr, $group: expr) => {{
|
||||||
|
$e = $e
|
||||||
|
.title(format!("List of tags: Page {}", $cur))
|
||||||
|
.color(Colour::FABLED_PINK);
|
||||||
|
for row in $group {
|
||||||
|
let idx: i32 = row.get(0);
|
||||||
|
let name: String = row.get(1);
|
||||||
|
let owner_id: String = row.get(3);
|
||||||
|
$e = $e.field(
|
||||||
|
format!("{}. {}", idx, name),
|
||||||
|
format!(" by <@{}>", owner_id),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$e
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! make_terminal_components {
|
||||||
|
($c: expr, $terminal: expr ) => {{
|
||||||
|
$c.create_action_row(|ar| {
|
||||||
|
ar.create_button(|b| {
|
||||||
|
b.style(ButtonStyle::Primary)
|
||||||
|
.label("Prev")
|
||||||
|
.emoji(ReactionType::Unicode("\u{2B05}".to_string()))
|
||||||
|
.custom_id("prev")
|
||||||
|
.disabled($terminal == "first")
|
||||||
|
})
|
||||||
|
.create_button(|b| {
|
||||||
|
b.style(ButtonStyle::Primary)
|
||||||
|
.label("Next")
|
||||||
|
.emoji(ReactionType::Unicode("\u{27A1}".to_string()))
|
||||||
|
.custom_id("next")
|
||||||
|
.disabled($terminal == "last")
|
||||||
|
})
|
||||||
|
.create_button(|b| {
|
||||||
|
b.style(ButtonStyle::Danger)
|
||||||
|
.label("Delete")
|
||||||
|
.emoji(ReactionType::Unicode("\u{1F5D1}".to_string()))
|
||||||
|
.custom_id("delete")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[command]
|
||||||
|
pub async fn tls(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
|
||||||
|
let data_read = ctx.data.read().await;
|
||||||
|
let db = data_read
|
||||||
|
.get::<crate::Database>()
|
||||||
|
.expect("Expected Database in TypeMap.")
|
||||||
|
.clone();
|
||||||
|
let rows = db.query("SELECT * FROM tags", &[]).await?;
|
||||||
|
if rows.is_empty() {
|
||||||
|
msg.reply(ctx, "No tags stored").await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let groups: Vec<&[Row]> = rows.chunks(5).collect();
|
||||||
|
let mut cur = 1;
|
||||||
|
|
||||||
|
let message = msg
|
||||||
|
.channel_id
|
||||||
|
.send_message(ctx, |m| {
|
||||||
|
m.embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
|
||||||
|
.components(|c| make_terminal_components!(c, "first"))
|
||||||
|
})
|
||||||
|
.await?;
|
||||||
|
let mut collector = ComponentInteractionCollectorBuilder::new(&ctx)
|
||||||
|
.timeout(Duration::from_secs(90))
|
||||||
|
.author_id(msg.author.id)
|
||||||
|
.message_id(message.id)
|
||||||
|
.await;
|
||||||
|
while let Some(interaction) = collector.next().await {
|
||||||
|
if let InteractionData::MessageComponent(component) = interaction.data.as_ref().unwrap() {
|
||||||
|
match component.custom_id.as_ref() {
|
||||||
|
"next" => {
|
||||||
|
if cur != groups.len() {
|
||||||
|
cur += 1;
|
||||||
|
let _ = interaction
|
||||||
|
.create_interaction_response(&ctx, |r| {
|
||||||
|
r.kind(InteractionResponseType::UpdateMessage)
|
||||||
|
.interaction_response_data(|m| {
|
||||||
|
m.create_embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
|
||||||
|
.components(|c| {
|
||||||
|
make_terminal_components!(
|
||||||
|
c,
|
||||||
|
if cur == groups.len() {
|
||||||
|
"last"
|
||||||
|
} else {
|
||||||
|
"mid"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"prev" => {
|
||||||
|
if cur != 1 {
|
||||||
|
cur -= 1;
|
||||||
|
let _ = interaction
|
||||||
|
.create_interaction_response(&ctx, |r| {
|
||||||
|
r.kind(InteractionResponseType::UpdateMessage)
|
||||||
|
.interaction_response_data(|m| {
|
||||||
|
m.create_embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
|
||||||
|
.components(|c| {
|
||||||
|
make_terminal_components!(
|
||||||
|
c,
|
||||||
|
if cur == 1 { "first" } else { "mid" }
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"delete" => {
|
||||||
|
message.delete(ctx).await?;
|
||||||
|
msg.delete(ctx).await?;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
@@ -3,6 +3,7 @@ mod handler;
|
|||||||
use commands::count::*;
|
use commands::count::*;
|
||||||
use commands::general::*;
|
use commands::general::*;
|
||||||
use commands::minigames::*;
|
use commands::minigames::*;
|
||||||
|
use commands::tags::*;
|
||||||
use handler::Handler;
|
use handler::Handler;
|
||||||
use serenity::{
|
use serenity::{
|
||||||
client::bridge::gateway::ShardManager,
|
client::bridge::gateway::ShardManager,
|
||||||
@@ -36,10 +37,13 @@ impl TypeMapKey for Database {
|
|||||||
struct General;
|
struct General;
|
||||||
|
|
||||||
#[group]
|
#[group]
|
||||||
#[prefix = "count"]
|
#[commands(count, cadd, crm, cedit, cls)]
|
||||||
#[commands(kitna, add, rm, change, ls)]
|
|
||||||
struct Count;
|
struct Count;
|
||||||
|
|
||||||
|
#[group]
|
||||||
|
#[commands(tag, tadd, trm, tedit, tls)]
|
||||||
|
pub struct Tags;
|
||||||
|
|
||||||
#[group]
|
#[group]
|
||||||
#[commands(challenge)]
|
#[commands(challenge)]
|
||||||
struct Minigames;
|
struct Minigames;
|
||||||
@@ -82,6 +86,7 @@ async fn main() {
|
|||||||
.help(&MY_HELP)
|
.help(&MY_HELP)
|
||||||
.group(&GENERAL_GROUP)
|
.group(&GENERAL_GROUP)
|
||||||
.group(&COUNT_GROUP)
|
.group(&COUNT_GROUP)
|
||||||
|
.group(&TAGS_GROUP)
|
||||||
.group(&MINIGAMES_GROUP);
|
.group(&MINIGAMES_GROUP);
|
||||||
|
|
||||||
let mut client = Client::builder(&token)
|
let mut client = Client::builder(&token)
|
||||||
|
Reference in New Issue
Block a user