just made a huge fucking mess

added SelectMenu for embeds
removed interactions (for now)
stupid macros
need to organize this shit asap
This commit is contained in:
2022-02-14 23:13:14 +05:30
parent 18b19f0695
commit a7a15dc3b1
7 changed files with 295 additions and 211 deletions

19
Cargo.lock generated
View File

@@ -123,15 +123,14 @@ dependencies = [
"num-integer", "num-integer",
"num-traits", "num-traits",
"serde", "serde",
"time",
"winapi", "winapi",
] ]
[[package]] [[package]]
name = "command_attr" name = "command_attr"
version = "0.3.7" version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a6c3666f685cb1efc0628b8c984dbad9c372d080450736c7732089c385ed81d" checksum = "9e74a021f9d0b577821bf9f5b1a2be88677e95ee05713e5d44fb4236cfa1744c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1057,9 +1056,9 @@ dependencies = [
[[package]] [[package]]
name = "serenity" name = "serenity"
version = "0.10.8" version = "0.10.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b68c1f5dbe25b32516f3f104726a9e8e3a96cf5960a106213241738ffe108f81" checksum = "dde86919535c6047e055d512641c5241320c01cb8fee54f1e5ba77c939a0ec23"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"async-tungstenite", "async-tungstenite",
@@ -1196,16 +1195,6 @@ dependencies = [
"unicode-xid", "unicode-xid",
] ]
[[package]]
name = "time"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
dependencies = [
"libc",
"winapi",
]
[[package]] [[package]]
name = "tinyvec" name = "tinyvec"
version = "1.2.0" version = "1.2.0"

View File

@@ -11,7 +11,7 @@ tokio-postgres = "*"
rand = "*" rand = "*"
[dependencies.serenity] [dependencies.serenity]
version = "0.10.*" version = "0.10.10"
features = ["cache", "framework", "standard_framework", "rustls_backend", "unstable_discord_api", "collector"] features = ["cache", "framework", "standard_framework", "rustls_backend", "unstable_discord_api", "collector"]
[dependencies.tokio] [dependencies.tokio]

View File

@@ -1,3 +1,4 @@
use crate::commands::macros::*;
use core::time::Duration; use core::time::Duration;
use serenity::{ use serenity::{
collector::component_interaction_collector::ComponentInteractionCollectorBuilder, collector::component_interaction_collector::ComponentInteractionCollectorBuilder,
@@ -5,7 +6,7 @@ use serenity::{
futures::StreamExt, futures::StreamExt,
model::{ model::{
channel::ReactionType, channel::ReactionType,
interactions::{ButtonStyle, InteractionData}, interactions::{message_component::ButtonStyle, InteractionResponseType},
prelude::*, prelude::*,
}, },
prelude::*, prelude::*,
@@ -193,43 +194,27 @@ macro_rules! make_embed {
$e = $e.field( $e = $e.field(
format!("{}. {}", idx, name), format!("{}. {}", idx, name),
format!(" by <@{}>", owner_id), format!(" by <@{}>", owner_id),
true, false,
); );
} }
$e $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] #[command]
#[aliases("clist")] #[aliases("cls")]
pub async fn clist(ctx: &Context, msg: &Message, _: Args) -> CommandResult { pub async fn clist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let size = if args.len() > 0 {
args.single::<usize>()?
} else {
5usize
};
if size > 15 {
msg.reply(ctx, "Please input a number less than 15").await?;
()
}
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>()
@@ -245,14 +230,14 @@ pub async fn clist(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
msg.reply(ctx, "No words stored").await?; msg.reply(ctx, "No words stored").await?;
return Ok(()); return Ok(());
} }
let groups: Vec<&[Row]> = rows.chunks(5).collect(); let groups: Vec<&[Row]> = rows.chunks(size).collect();
let mut cur = 1; let mut cur = 1;
let message = msg let message = msg
.channel_id .channel_id
.send_message(ctx, |m| { .send_message(ctx, |m| {
m.embed(|mut e| make_embed!(e, cur, groups[cur - 1])) m.embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
.components(|c| make_terminal_components!(c, "first")) .components(|c| make_terminal_components!(c, "first", groups.len()))
}) })
.await?; .await?;
let mut collector = ComponentInteractionCollectorBuilder::new(&ctx) let mut collector = ComponentInteractionCollectorBuilder::new(&ctx)
@@ -261,56 +246,104 @@ pub async fn clist(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
.message_id(message.id) .message_id(message.id)
.await; .await;
while let Some(interaction) = collector.next().await { while let Some(interaction) = collector.next().await {
if let InteractionData::MessageComponent(component) = interaction.data.as_ref().unwrap() { match interaction.data.custom_id.as_ref() {
match component.custom_id.as_ref() { "next" => {
"next" => { if cur != groups.len() {
if cur != groups.len() { 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| { 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!( c,
c, if cur == groups.len() { "last" } else { "mid" },
if cur == groups.len() { groups.len()
"last" )
} else { })
"mid" })
} })
) .await;
})
})
})
.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?;
}
_ => {}
} }
"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" },
groups.len()
)
})
})
})
.await;
}
}
"first" => {
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, "first", groups.len())
})
})
})
.await;
}
"last" => {
cur = groups.len();
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, "last", groups.len())
})
})
})
.await;
}
"delete" => {
message.delete(ctx).await?;
msg.delete(ctx).await?;
}
"range" => {
cur = interaction.data.values[0].parse().unwrap();
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 if cur == groups.len() {
"last"
} else {
"mid"
},
groups.len()
)
})
})
})
.await;
}
_ => {}
} }
} }
Ok(()) Ok(())

57
src/commands/macros.rs Normal file
View File

@@ -0,0 +1,57 @@
macro_rules! make_range_select_menu {
($sm:expr, $f: expr, $l: expr) => {{
$sm.custom_id("range")
.placeholder("Page No")
.options(|mut os| {
for x in $f..=$l {
os = os.create_option(|o| o.label(x).value(x));
}
os
})
}};
}
macro_rules! make_terminal_components {
($c: expr, $terminal: expr, $pages: expr ) => {{
$c.create_action_row(|ar| {
ar.create_button(|b| {
b.style(ButtonStyle::Primary)
.label("First")
.emoji(ReactionType::Unicode("\u{23EA}".to_string()))
.custom_id("first")
.disabled($terminal == "first")
})
.create_button(|b| {
b.style(ButtonStyle::Primary)
.label("Prev")
.emoji(ReactionType::Unicode("\u{25C0}".to_string()))
.custom_id("prev")
.disabled($terminal == "first")
})
.create_button(|b| {
b.style(ButtonStyle::Primary)
.label("Next")
.emoji(ReactionType::Unicode("\u{25B6}".to_string()))
.custom_id("next")
.disabled($terminal == "last")
})
.create_button(|b| {
b.style(ButtonStyle::Primary)
.label("Last")
.emoji(ReactionType::Unicode("\u{23E9}".to_string()))
.custom_id("last")
.disabled($terminal == "last")
})
.create_button(|b| {
b.style(ButtonStyle::Danger)
.label("Delete")
.emoji(ReactionType::Unicode("\u{1F5D1}".to_string()))
.custom_id("delete")
})
})
.create_action_row(|ar| ar.create_select_menu(|sm| make_range_select_menu!(sm, 1, $pages)))
}};
}
pub(crate) use make_range_select_menu;
pub(crate) use make_terminal_components;

View File

@@ -2,3 +2,4 @@ pub mod count;
pub mod general; pub mod general;
pub mod minigames; pub mod minigames;
pub mod tags; pub mod tags;
pub mod macros;

View File

@@ -1,3 +1,4 @@
use crate::commands::macros::*;
use core::time::Duration; use core::time::Duration;
use serenity::{ use serenity::{
collector::component_interaction_collector::ComponentInteractionCollectorBuilder, collector::component_interaction_collector::ComponentInteractionCollectorBuilder,
@@ -5,7 +6,7 @@ use serenity::{
futures::StreamExt, futures::StreamExt,
model::{ model::{
channel::ReactionType, channel::ReactionType,
interactions::{ButtonStyle, InteractionData}, interactions::{message_component::ButtonStyle, InteractionResponseType},
prelude::*, prelude::*,
}, },
prelude::*, prelude::*,
@@ -233,43 +234,27 @@ macro_rules! make_embed {
$e = $e.field( $e = $e.field(
format!("{}. {}", idx, name), format!("{}. {}", idx, name),
format!(" by <@{}>", owner_id), format!(" by <@{}>", owner_id),
true, false,
); );
} }
$e $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] #[command]
#[aliases("tls")] #[aliases("tls")]
pub async fn tlist(ctx: &Context, msg: &Message, _: Args) -> CommandResult { pub async fn tlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let size = if args.len() > 0 {
args.single::<usize>()?
} else {
5usize
};
if size > 15 {
msg.reply(ctx, "Please input a number less than 15").await?;
()
}
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>()
@@ -285,14 +270,14 @@ pub async fn tlist(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
msg.reply(ctx, "No tags stored").await?; msg.reply(ctx, "No tags stored").await?;
return Ok(()); return Ok(());
} }
let groups: Vec<&[Row]> = rows.chunks(5).collect(); let groups: Vec<&[Row]> = rows.chunks(size).collect();
let mut cur = 1; let mut cur = 1;
let message = msg let message = msg
.channel_id .channel_id
.send_message(ctx, |m| { .send_message(ctx, |m| {
m.embed(|mut e| make_embed!(e, cur, groups[cur - 1])) m.embed(|mut e| make_embed!(e, cur, groups[cur - 1]))
.components(|c| make_terminal_components!(c, "first")) .components(|c| make_terminal_components!(c, "first", groups.len()))
}) })
.await?; .await?;
let mut collector = ComponentInteractionCollectorBuilder::new(&ctx) let mut collector = ComponentInteractionCollectorBuilder::new(&ctx)
@@ -300,57 +285,107 @@ pub async fn tlist(ctx: &Context, msg: &Message, _: Args) -> CommandResult {
.author_id(msg.author.id) .author_id(msg.author.id)
.message_id(message.id) .message_id(message.id)
.await; .await;
while let Some(interaction) = collector.next().await { while let Some(interaction) = collector.next().await {
if let InteractionData::MessageComponent(component) = interaction.data.as_ref().unwrap() { let custom_id = interaction.data.custom_id.as_ref();
match component.custom_id.as_ref() { match custom_id {
"next" => { "next" => {
if cur != groups.len() { if cur != groups.len() {
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| {
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!(
c, c,
if cur == groups.len() { if cur == groups.len() { "last" } else { "mid" },
"last" groups.len()
} else { )
"mid" })
} })
) })
}) .await;
})
})
.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?;
}
_ => {}
} }
"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" },
groups.len()
)
})
})
})
.await;
}
}
"first" => {
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, "first", groups.len())
})
})
})
.await;
}
"last" => {
cur = groups.len();
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, "last", groups.len())
})
})
})
.await;
}
"delete" => {
message.delete(ctx).await?;
msg.delete(ctx).await?;
}
"range" => {
cur = interaction.data.values[0].parse().unwrap();
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 if cur == groups.len() {
"last"
} else {
"mid"
},
groups.len()
)
})
})
})
.await;
}
_ => {}
} }
} }
Ok(()) Ok(())

View File

@@ -2,15 +2,7 @@ mod count;
mod interactions; mod interactions;
use serenity::{ use serenity::{
async_trait, async_trait,
model::{ model::{channel::Message, event::ResumedEvent, gateway::Ready},
channel::Message,
event::ResumedEvent,
gateway::Ready,
interactions::{
ApplicationCommand, Interaction, InteractionData, InteractionResponseType,
InteractionType,
},
},
prelude::*, prelude::*,
}; };
use tracing::info; use tracing::info;
@@ -19,12 +11,8 @@ pub struct Handler;
#[async_trait] #[async_trait]
impl EventHandler for Handler { impl EventHandler for Handler {
async fn ready(&self, ctx: Context, ready: Ready) { async fn ready(&self, _: Context, ready: Ready) {
info!("{} connected bhay", ready.user.name); println!("{} connected bhay", ready.user.name);
let _ = ApplicationCommand::create_global_application_commands(&ctx.http, |commands| {
commands.set_application_commands(interactions::general())
})
.await;
} }
async fn resume(&self, _: Context, _: ResumedEvent) { async fn resume(&self, _: Context, _: ResumedEvent) {
info!("how th when the"); info!("how th when the");
@@ -37,23 +25,4 @@ impl EventHandler for Handler {
.clone(); .clone();
count::count(msg, db_client).await; count::count(msg, db_client).await;
} }
async fn interaction_create(&self, ctx: Context, interaction: Interaction) {
if interaction.kind == InteractionType::ApplicationCommand {
if let Some(InteractionData::ApplicationCommand(data)) = interaction.data.as_ref() {
if let Err(why) = interaction
.create_interaction_response(&ctx.http, |response| {
response
.kind(InteractionResponseType::ChannelMessageWithSource)
.interaction_response_data(|message| {
interactions::responses(data.name.to_string(), message)
})
})
.await
{
println!("Cannot respond to slash command: {}", why);
}
}
}
}
} }