From c6162b77fb113634359acc9dd6b7d6b4191fc5d4 Mon Sep 17 00:00:00 2001 From: seth Date: Sat, 20 Jan 2024 21:19:09 -0500 Subject: refactor: adjust to poise 0.6.1 --- src/commands/general/config.rs | 9 ++++++--- src/commands/general/version.rs | 19 ++++++++++--------- src/commands/optional/copypasta.rs | 2 +- src/handlers/error.rs | 33 ++++++++++++++++++--------------- src/handlers/event/mod.rs | 20 +++++++++++++------- src/handlers/event/pinboard.rs | 15 +++++++++------ src/handlers/event/reactboard.rs | 22 +++++++++------------- src/main.rs | 25 +++++++++++++------------ src/storage/mod.rs | 4 ++-- src/utils.rs | 38 +++++++++++++++++++------------------- 10 files changed, 100 insertions(+), 87 deletions(-) (limited to 'src') diff --git a/src/commands/general/config.rs b/src/commands/general/config.rs index bd16f0e..b60683b 100644 --- a/src/commands/general/config.rs +++ b/src/commands/general/config.rs @@ -5,7 +5,8 @@ use storage::{Properties, Settings}; use color_eyre::eyre::{eyre, Result}; use log::debug; -use poise::serenity_prelude::{GuildChannel, ReactionType}; +use poise::serenity_prelude::{CreateEmbed, GuildChannel, ReactionType}; +use poise::{ChoiceParameter, CreateReply}; fn split_argument(list: &str) -> Vec where @@ -152,8 +153,10 @@ pub async fn get( let settings = ctx.data().storage.get_guild_settings(gid).await?; let value = prop_to_val(&setting, &settings); - ctx.send(|m| m.embed(|e| e.field(setting, value, false))) - .await?; + let embed = CreateEmbed::new().field(setting.name(), value, false); + let message = CreateReply::default().embed(embed); + + ctx.send(message).await?; Ok(()) } diff --git a/src/commands/general/version.rs b/src/commands/general/version.rs index 5acd36a..024178c 100644 --- a/src/commands/general/version.rs +++ b/src/commands/general/version.rs @@ -2,6 +2,8 @@ use crate::colors::Colors; use crate::Context; use color_eyre::eyre::Result; +use poise::serenity_prelude::CreateEmbed; +use poise::CreateReply; /// Get version info #[poise::command(slash_command)] @@ -27,15 +29,14 @@ pub async fn version(ctx: Context<'_>) -> Result<()> { ("User Agent:", &crate::api::USER_AGENT, false), ]; - ctx.send(|c| { - c.embed(|e| { - e.title("Version Information") - .description("powered by poise!") - .fields(fields) - .color(Colors::Blue) - }) - }) - .await?; + let embed = CreateEmbed::new() + .title("Version Information") + .description("powered by poise!") + .fields(fields) + .color(Colors::Blue); + let message = CreateReply::default().embed(embed); + + ctx.send(message).await?; Ok(()) } diff --git a/src/commands/optional/copypasta.rs b/src/commands/optional/copypasta.rs index 82ce78f..b7e7365 100644 --- a/src/commands/optional/copypasta.rs +++ b/src/commands/optional/copypasta.rs @@ -56,7 +56,7 @@ fn get_copypasta(name: &Copypastas) -> Result { if files.contains_key(name.as_str()) { Ok(files[name.as_str()].to_string()) } else { - Err(eyre!("Couldnt find copypasta {name}!")) + Err(eyre!("Couldnt find copypasta {}!", name.as_str())) } } diff --git a/src/handlers/error.rs b/src/handlers/error.rs index 034e870..4bca032 100644 --- a/src/handlers/error.rs +++ b/src/handlers/error.rs @@ -3,8 +3,8 @@ use crate::Data; use color_eyre::eyre::Report; use log::error; -use poise::serenity_prelude::Timestamp; -use poise::FrameworkError; +use poise::serenity_prelude::{CreateEmbed, Timestamp}; +use poise::{CreateReply, FrameworkError}; pub async fn handle(error: poise::FrameworkError<'_, Data, Report>) { match error { @@ -12,24 +12,23 @@ pub async fn handle(error: poise::FrameworkError<'_, Data, Report>) { error, framework, .. } => { error!("Error setting up client! Bailing out"); - framework.shard_manager().lock().await.shutdown_all().await; + framework.shard_manager().shutdown_all().await; panic!("{error}") } - FrameworkError::Command { error, ctx } => { + FrameworkError::Command { error, ctx, .. } => { error!("Error in command {}:\n{error}", ctx.command().name); - ctx.send(|c| { - c.embed(|e| { - e.title("Something went wrong!") - .description("oopsie") - .timestamp(Timestamp::now()) - .color(Colors::Orange) - }) - }) - .await - .ok(); + let embed = CreateEmbed::default() + .title("Something went wrong!") + .description("oopsie") + .timestamp(Timestamp::now()) + .color(Colors::Orange); + + let reply = CreateReply::default().embed(embed); + + ctx.send(reply).await.ok(); } FrameworkError::EventHandler { @@ -37,8 +36,12 @@ pub async fn handle(error: poise::FrameworkError<'_, Data, Report>) { ctx: _, event, framework: _, + .. } => { - error!("Error while handling event {}:\n{error}", event.name()); + error!( + "Error while handling event {}:\n{error}", + event.snake_case_name() + ); } error => { diff --git a/src/handlers/event/mod.rs b/src/handlers/event/mod.rs index 5fd3db5..50a19d5 100644 --- a/src/handlers/event/mod.rs +++ b/src/handlers/event/mod.rs @@ -3,7 +3,8 @@ use crate::Data; use color_eyre::eyre::{Report, Result}; use log::info; use poise::serenity_prelude as serenity; -use poise::{Event, FrameworkContext}; +use poise::FrameworkContext; +use serenity::FullEvent; mod guild; mod message; @@ -12,24 +13,29 @@ mod reactboard; pub async fn handle( ctx: &serenity::Context, - event: &Event<'_>, + event: &FullEvent, framework: FrameworkContext<'_, Data, Report>, data: &Data, ) -> Result<()> { match event { - Event::Ready { data_about_bot } => { + FullEvent::Ready { data_about_bot } => { info!("Logged in as {}!", data_about_bot.user.name); } - Event::Message { new_message } => { + FullEvent::Message { new_message } => { message::handle(ctx, framework, new_message, data).await?; pinboard::handle(ctx, new_message, data).await?; } - Event::ReactionAdd { add_reaction } => reactboard::handle(ctx, add_reaction, data).await?, + FullEvent::ReactionAdd { add_reaction } => { + reactboard::handle(ctx, add_reaction, data).await?; + } + + FullEvent::GuildCreate { guild, is_new } => { + guild::handle_create(guild, &is_new.unwrap_or_default(), data).await?; + } - Event::GuildCreate { guild, is_new } => guild::handle_create(guild, is_new, data).await?, - Event::GuildDelete { + FullEvent::GuildDelete { incomplete, full: _, } => guild::handle_delete(incomplete, data).await?, diff --git a/src/handlers/event/pinboard.rs b/src/handlers/event/pinboard.rs index cc67334..1db14b6 100644 --- a/src/handlers/event/pinboard.rs +++ b/src/handlers/event/pinboard.rs @@ -2,7 +2,9 @@ use crate::{utils, Data}; use color_eyre::eyre::{eyre, Context as _, Result}; use log::debug; -use poise::serenity_prelude::{ChannelId, Context, Message, MessageType, User}; +use poise::serenity_prelude::{ + ChannelId, Context, CreateAllowedMentions, CreateMessage, Message, MessageType, User, +}; pub async fn handle(ctx: &Context, message: &Message, data: &Data) -> Result<()> { if message.kind != MessageType::PinsAdd { @@ -59,13 +61,14 @@ pub async fn handle(ctx: &Context, message: &Message, data: &Data) -> Result<()> async fn redirect(ctx: &Context, pin: &Message, pinner: &User, target: ChannelId) -> Result<()> { let embed = utils::resolve_message_to_embed(ctx, pin).await; + let mentions = CreateAllowedMentions::new().empty_roles().empty_users(); + let message = CreateMessage::default() + .allowed_mentions(mentions) + .content(format!("📌'd by {pinner} in {}", pin.link())) + .embed(embed); target - .send_message(&ctx.http, |m| { - m.allowed_mentions(|am| am.empty_parse()) - .content(format!("📌'd by {pinner} in {}", pin.link())) - .set_embed(embed) - }) + .send_message(&ctx.http, message) .await .wrap_err_with(|| "Couldn't redirect message")?; diff --git a/src/handlers/event/reactboard.rs b/src/handlers/event/reactboard.rs index 7341565..17deeb0 100644 --- a/src/handlers/event/reactboard.rs +++ b/src/handlers/event/reactboard.rs @@ -3,7 +3,9 @@ use storage::ReactBoardEntry; use color_eyre::eyre::{eyre, Context as _, Result}; use log::debug; -use poise::serenity_prelude::{Context, GuildId, Message, MessageReaction, Reaction}; +use poise::serenity_prelude::{ + Context, CreateMessage, EditMessage, GuildId, Message, MessageReaction, Reaction, +}; pub async fn handle(ctx: &Context, reaction: &Reaction, data: &Data) -> Result<()> { let msg = reaction @@ -87,11 +89,10 @@ async fn send_to_reactboard( msg.id, old_entry.reaction_count, reaction.count ); + let edited = EditMessage::new().content(content); + ctx.http - .get_message( - *old_entry.posted_channel_id.as_u64(), - *old_entry.posted_message_id.as_u64(), - ) + .get_message(old_entry.posted_channel_id, old_entry.posted_message_id) .await .wrap_err_with(|| { format!( @@ -99,7 +100,7 @@ async fn send_to_reactboard( old_entry.original_message_id ) })? - .edit(ctx, |m| m.content(content)) + .edit(ctx, edited) .await?; // update reaction count in redis @@ -111,14 +112,9 @@ async fn send_to_reactboard( // make new message and add entry to redis otherwise } else { let embed = utils::resolve_message_to_embed(ctx, msg).await; + let message = CreateMessage::default().content(content).embed(embed); - let resp = target - .send_message(ctx, |m| { - m.allowed_mentions(|am| am.empty_parse()) - .content(content) - .set_embed(embed) - }) - .await?; + let resp = target.send_message(ctx, message).await?; let entry = ReactBoardEntry { original_message_id: msg.id, diff --git a/src/main.rs b/src/main.rs index 1cbd2e7..1eef5bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,13 +8,12 @@ use std::time::Duration; use color_eyre::eyre::{eyre, Context as _, Report, Result}; use color_eyre::owo_colors::OwoColorize; use log::{info, warn}; -use poise::serenity_prelude::{self as serenity, ShardManager}; +use poise::serenity_prelude as serenity; use poise::{EditTracker, Framework, FrameworkOptions, PrefixFrameworkOptions}; use redis::ConnectionLike; use storage::Storage; use tokio::signal::ctrl_c; use tokio::signal::unix::{signal, SignalKind}; -use tokio::sync::Mutex; mod api; mod colors; @@ -71,9 +70,9 @@ async fn setup( Ok(data) } -async fn handle_shutdown(shard_manager: Arc>, reason: &str) { +async fn handle_shutdown(shard_manager: Arc, reason: &str) { warn!("{reason}! Shutting down bot..."); - shard_manager.lock().await.shutdown_all().await; + shard_manager.shutdown_all().await; println!("{}", "Everything is shutdown. Goodbye!".green()); } @@ -106,7 +105,9 @@ async fn main() -> Result<()> { prefix_options: PrefixFrameworkOptions { prefix: Some("!".into()), - edit_tracker: Some(EditTracker::for_timespan(Duration::from_secs(3600))), + edit_tracker: Some(Arc::new(EditTracker::for_timespan(Duration::from_secs( + 3600, + )))), ..Default::default() }, @@ -114,19 +115,19 @@ async fn main() -> Result<()> { }; let framework = Framework::builder() - .token(token) - .intents(intents) .options(options) .setup(|ctx, ready, framework| Box::pin(setup(ctx, ready, framework))) - .build() - .await - .wrap_err_with(|| "Failed to build framework!")?; + .build(); - let shard_manager = framework.shard_manager().clone(); + let mut client = serenity::ClientBuilder::new(token, intents) + .framework(framework) + .await?; + + let shard_manager = client.shard_manager.clone(); let mut sigterm = signal(SignalKind::terminate())?; tokio::select! { - result = framework.start() => result.map_err(Report::from), + result = client.start() => result.map_err(Report::from), _ = sigterm.recv() => { handle_shutdown(shard_manager, "Recieved SIGTERM").await; std::process::exit(0); diff --git a/src/storage/mod.rs b/src/storage/mod.rs index a9886e2..8661138 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -132,7 +132,7 @@ impl Storage { self.set_key(&key, &settings).await?; // adding to index since we need to look all of these up sometimes - self.add_to_index(SETTINGS_KEY, *settings.guild_id.as_u64()) + self.add_to_index(SETTINGS_KEY, u64::from(settings.guild_id)) .await?; Ok(()) @@ -151,7 +151,7 @@ impl Storage { let key = format!("{SETTINGS_KEY}:{guild_id}"); self.delete_key(&key).await?; - self.delete_from_index(SETTINGS_KEY, *guild_id.as_u64()) + self.delete_from_index(SETTINGS_KEY, u64::from(*guild_id)) .await?; Ok(()) diff --git a/src/utils.rs b/src/utils.rs index 1a96359..8312b6c 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,7 +1,8 @@ use crate::{colors, Context}; use color_eyre::eyre::{eyre, Result}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{self as serenity, CreateEmbedAuthor, CreateEmbedFooter}; +use poise::CreateReply; use rand::seq::SliceRandom; use serenity::{CreateEmbed, Message}; use url::Url; @@ -44,15 +45,14 @@ pub async fn send_url_as_embed(ctx: Context<'_>, url: String) -> Result<()> { .unwrap_or("image") .replace("%20", " "); - ctx.send(|c| { - c.embed(|e| { - e.title(title) - .image(&url) - .url(url) - .color(colors::Colors::Blue) - }) - }) - .await?; + let embed = CreateEmbed::new() + .title(title) + .image(&url) + .url(url) + .color(colors::Colors::Blue); + let reply = CreateReply::default().embed(embed); + + ctx.send(reply).await?; Ok(()) } @@ -87,29 +87,29 @@ pub async fn resolve_message_to_embed(ctx: &serenity::Context, msg: &Message) -> let attachments_len = msg.attachments.len(); - let mut embed = msg + let embed = msg .embeds .first() .map(|embed| CreateEmbed::from(embed.clone())) .unwrap_or_default(); - embed.author(|author| author.name(&msg.author.name).icon_url(&msg.author.face())); + let author = CreateEmbedAuthor::new(&msg.author.name).icon_url(msg.author.face()); + let mut embed = embed.clone().author(author); if let Some(color) = color { - embed.color(color); + embed = embed.color(color); } if let Some(attachment) = attached_image { - embed.image(attachment); + embed = embed.image(attachment); } if attachments_len > 1 { - embed.footer(|footer| { - // yes it will say '1 attachments' no i do not care - footer.text(format!("{attachments_len} attachments")) - }); + embed = embed.footer(CreateEmbedFooter::new(format!( + "{attachments_len} attachments" + ))); } - embed.description(truncated_content); + embed = embed.description(truncated_content); embed } -- cgit v1.2.3