summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorseth <[email protected]>2024-01-20 21:19:09 -0500
committergithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>2024-01-21 10:54:13 +0000
commitc6162b77fb113634359acc9dd6b7d6b4191fc5d4 (patch)
tree92e9e75006ed2b7d28197c34c9ca925a97b628dc
parentd903e7760a316d5476e65db0e6058dc5c8698cc2 (diff)
refactor: adjust to poise 0.6.1
-rw-r--r--Cargo.lock2
-rw-r--r--src/commands/general/config.rs9
-rw-r--r--src/commands/general/version.rs19
-rw-r--r--src/commands/optional/copypasta.rs2
-rw-r--r--src/handlers/error.rs33
-rw-r--r--src/handlers/event/mod.rs20
-rw-r--r--src/handlers/event/pinboard.rs15
-rw-r--r--src/handlers/event/reactboard.rs22
-rw-r--r--src/main.rs25
-rw-r--r--src/storage/mod.rs4
-rw-r--r--src/utils.rs38
11 files changed, 101 insertions, 88 deletions
diff --git a/Cargo.lock b/Cargo.lock
index fa54f9d..f84f54e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2099,7 +2099,7 @@ checksum = "36924509726e38224322c8c90ddfbf4317324338327b7c11b7cf8672cb786da1"
dependencies = [
"chrono",
"dashmap",
- "hashbrown 0.14.2",
+ "hashbrown",
"mini-moka",
"parking_lot",
"secrecy",
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<T>(list: &str) -> Vec<T>
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<String> {
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<Mutex<ShardManager>>, reason: &str) {
+async fn handle_shutdown(shard_manager: Arc<serenity::ShardManager>, 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
}