[ci skip] use functions instead of macros

This commit is contained in:
2022-02-15 20:49:50 +05:30
parent a7a15dc3b1
commit d20326a846
11 changed files with 166 additions and 193 deletions

View File

@@ -2,7 +2,7 @@
name = "singh3" name = "singh3"
version = "0.1.0" version = "0.1.0"
authors = [ "Amneesh Singh <natto@weirdnatto.in>" ] authors = [ "Amneesh Singh <natto@weirdnatto.in>" ]
edition = "2018" edition = "2021"
[dependencies] [dependencies]
tracing = "*" tracing = "*"

View File

@@ -55,6 +55,12 @@ jobs:
passed: [configure-self] passed: [configure-self]
- get: rust-latest-image - get: rust-latest-image
trigger: false trigger: false
- task: format
config:
run:
path: cargo
args: ["fmt"]
dir: singh3-bin
- task: build - task: build
image: rust-latest-image image: rust-latest-image
config: config:

View File

@@ -30,7 +30,7 @@
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [
rust-bin.nightly.latest.default rust-bin.nightly.latest.default
]; ];
cargoSha256 = "sha256-0Apd8a9IdQJ8Mj5Xvm1/wM0PSc7PgciIptmz/KGx8XM="; cargoSha256 = "sha256-04yTexSkFpa3KQKVvfi7NM1j4V7m08kHDqw98bxXT5M=";
}; };
} }
); );

View File

@@ -1,14 +1,11 @@
use crate::commands::macros::*; use crate::lib::components::make_terminal_components;
use core::time::Duration; use core::time::Duration;
use serenity::{ use serenity::{
builder::CreateEmbed,
collector::component_interaction_collector::ComponentInteractionCollectorBuilder, collector::component_interaction_collector::ComponentInteractionCollectorBuilder,
framework::standard::{macros::command, Args, CommandResult}, framework::standard::{macros::command, Args, CommandResult},
futures::StreamExt, futures::StreamExt,
model::{ model::{interactions::InteractionResponseType, prelude::*},
channel::ReactionType,
interactions::{message_component::ButtonStyle, InteractionResponseType},
prelude::*,
},
prelude::*, prelude::*,
utils::Colour, utils::Colour,
}; };
@@ -182,23 +179,21 @@ pub async fn cedit(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
Ok(()) Ok(())
} }
macro_rules! make_embed { fn make_list_embed(cur: usize, group: &[Row]) -> CreateEmbed {
($e: expr, $cur: expr, $group: expr) => {{ let mut e = CreateEmbed::default();
$e = $e e.title(format!("List of words: Page {}", cur))
.title(format!("List of words: Page {}", $cur)) .color(Colour::TEAL);
.color(Colour::TEAL); for row in group {
for row in $group { let idx: i64 = row.get(0);
let idx: i64 = row.get(0); let name: String = row.get(1);
let name: String = row.get(1); let owner_id: String = row.get(2);
let owner_id: String = row.get(2); e.field(
$e = $e.field( format!("{}. {}", idx, name),
format!("{}. {}", idx, name), format!(" by <@{}>", owner_id),
format!(" by <@{}>", owner_id), false,
false, );
); }
} e
$e
}};
} }
#[command] #[command]
@@ -236,15 +231,17 @@ pub async fn clist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
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.set_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| make_terminal_components!(c, "first", groups.len())) .set_components(make_terminal_components("first", groups.len()))
}) })
.await?; .await?;
let mut collector = ComponentInteractionCollectorBuilder::new(&ctx) let mut collector = ComponentInteractionCollectorBuilder::new(&ctx)
.timeout(Duration::from_secs(90)) .timeout(Duration::from_secs(90))
.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 {
match interaction.data.custom_id.as_ref() { match interaction.data.custom_id.as_ref() {
"next" => { "next" => {
@@ -254,14 +251,11 @@ pub async fn clist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components(
make_terminal_components!( if cur == groups.len() { "last" } else { "mid" },
c, groups.len(),
if cur == groups.len() { "last" } else { "mid" }, ))
groups.len()
)
})
}) })
}) })
.await; .await;
@@ -274,14 +268,11 @@ pub async fn clist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components(
make_terminal_components!( if cur == 1 { "first" } else { "mid" },
c, groups.len(),
if cur == 1 { "first" } else { "mid" }, ))
groups.len()
)
})
}) })
}) })
.await; .await;
@@ -293,10 +284,8 @@ pub async fn clist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components("first", groups.len()))
make_terminal_components!(c, "first", groups.len())
})
}) })
}) })
.await; .await;
@@ -307,10 +296,8 @@ pub async fn clist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components("last", groups.len()))
make_terminal_components!(c, "last", groups.len())
})
}) })
}) })
.await; .await;
@@ -325,20 +312,17 @@ pub async fn clist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components(
make_terminal_components!( if cur == 1 {
c, "first"
if cur == 1 { } else if cur == groups.len() {
"first" "last"
} else if cur == groups.len() { } else {
"last" "mid"
} else { },
"mid" groups.len(),
}, ))
groups.len()
)
})
}) })
}) })
.await; .await;

View File

@@ -1,9 +1,6 @@
use serenity::prelude::*; use serenity::framework::standard::{macros::command, CommandResult};
use serenity::model::prelude::*; use serenity::model::prelude::*;
use serenity::framework::standard::{ use serenity::prelude::*;
CommandResult,
macros::command
};
#[command] #[command]
pub async fn ping(ctx: &Context, msg: &Message) -> CommandResult { pub async fn ping(ctx: &Context, msg: &Message) -> CommandResult {

View File

@@ -1,57 +0,0 @@
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,4 +2,3 @@ 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,14 +1,11 @@
use crate::commands::macros::*; use crate::lib::components::make_terminal_components;
use core::time::Duration; use core::time::Duration;
use serenity::{ use serenity::{
builder::CreateEmbed,
collector::component_interaction_collector::ComponentInteractionCollectorBuilder, collector::component_interaction_collector::ComponentInteractionCollectorBuilder,
framework::standard::{macros::command, Args, CommandResult}, framework::standard::{macros::command, Args, CommandResult},
futures::StreamExt, futures::StreamExt,
model::{ model::{interactions::InteractionResponseType, prelude::*},
channel::ReactionType,
interactions::{message_component::ButtonStyle, InteractionResponseType},
prelude::*,
},
prelude::*, prelude::*,
utils::Colour, utils::Colour,
}; };
@@ -222,23 +219,21 @@ pub async fn tedit(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
Ok(()) Ok(())
} }
macro_rules! make_embed { fn make_list_embed(cur: usize, group: &[Row]) -> CreateEmbed {
($e: expr, $cur: expr, $group: expr) => {{ let mut e = CreateEmbed::default();
$e = $e e.title(format!("List of tags: Page {}", cur))
.title(format!("List of tags: Page {}", $cur)) .color(Colour::FABLED_PINK);
.color(Colour::FABLED_PINK); for row in group {
for row in $group { let idx: i64 = row.get(0);
let idx: i64 = row.get(0); let name: String = row.get(1);
let name: String = row.get(1); let owner_id: String = row.get(2);
let owner_id: String = row.get(2); e.field(
$e = $e.field( format!("{}. {}", idx, name),
format!("{}. {}", idx, name), format!(" by <@{}>", owner_id),
format!(" by <@{}>", owner_id), false,
false, );
); }
} e
$e
}};
} }
#[command] #[command]
@@ -276,10 +271,11 @@ pub async fn tlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
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.set_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| make_terminal_components!(c, "first", groups.len())) .set_components(make_terminal_components("first", groups.len()))
}) })
.await?; .await?;
let mut collector = ComponentInteractionCollectorBuilder::new(&ctx) let mut collector = ComponentInteractionCollectorBuilder::new(&ctx)
.timeout(Duration::from_secs(90)) .timeout(Duration::from_secs(90))
.author_id(msg.author.id) .author_id(msg.author.id)
@@ -287,8 +283,7 @@ pub async fn tlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.await; .await;
while let Some(interaction) = collector.next().await { while let Some(interaction) = collector.next().await {
let custom_id = interaction.data.custom_id.as_ref(); match interaction.data.custom_id.as_ref() {
match custom_id {
"next" => { "next" => {
if cur != groups.len() { if cur != groups.len() {
cur += 1; cur += 1;
@@ -296,14 +291,11 @@ pub async fn tlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components(
make_terminal_components!( if cur == groups.len() { "last" } else { "mid" },
c, groups.len(),
if cur == groups.len() { "last" } else { "mid" }, ))
groups.len()
)
})
}) })
}) })
.await; .await;
@@ -316,14 +308,11 @@ pub async fn tlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components(
make_terminal_components!( if cur == 1 { "first" } else { "mid" },
c, groups.len(),
if cur == 1 { "first" } else { "mid" }, ))
groups.len()
)
})
}) })
}) })
.await; .await;
@@ -335,10 +324,8 @@ pub async fn tlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components("first", groups.len()))
make_terminal_components!(c, "first", groups.len())
})
}) })
}) })
.await; .await;
@@ -349,10 +336,8 @@ pub async fn tlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components("last", groups.len()))
make_terminal_components!(c, "last", groups.len())
})
}) })
}) })
.await; .await;
@@ -367,20 +352,17 @@ pub async fn tlist(ctx: &Context, msg: &Message, mut args: Args) -> CommandResul
.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.add_embed(make_list_embed(cur, groups[cur - 1]))
.components(|c| { .set_components(make_terminal_components(
make_terminal_components!( if cur == 1 {
c, "first"
if cur == 1 { } else if cur == groups.len() {
"first" "last"
} else if cur == groups.len() { } else {
"last" "mid"
} else { },
"mid" groups.len(),
}, ))
groups.len()
)
})
}) })
}) })
.await; .await;

60
src/lib/components.rs Normal file
View File

@@ -0,0 +1,60 @@
use serenity::{
builder::{CreateComponents, CreateSelectMenu},
model::{channel::ReactionType, interactions::message_component::ButtonStyle},
};
pub fn make_range_select_menu(first: usize, last: usize) -> CreateSelectMenu {
let mut sm = CreateSelectMenu::default();
sm.custom_id("range")
.placeholder("Page No")
.options(|mut os| {
for x in first..=last {
os = os.create_option(|o| o.label(x).value(x));
}
os
});
sm
}
pub fn make_terminal_components(terminal: &str, pages: usize) -> CreateComponents {
let mut c = CreateComponents::default();
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.add_select_menu(make_range_select_menu(1, pages)));
c
}

1
src/lib/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod components;

View File

@@ -1,5 +1,6 @@
mod commands; mod commands;
mod handler; mod handler;
mod lib;
use commands::count::*; use commands::count::*;
use commands::general::*; use commands::general::*;
use commands::minigames::*; use commands::minigames::*;