···11use crate::Context;
22use color_eyre::eyre::Result;
33-use poise::{serenity_prelude as serenity, CreateReply};
33+use poise::{serenity_prelude::CreateEmbed, CreateReply};
44use std::env;
5566/// Displays information about the bot
···99 let rev = env::var("BUILD_REV").unwrap_or("unknown".to_string());
10101111 let embed = CreateReply::default().embed(
1212- serenity::CreateEmbed::default()
1212+ CreateEmbed::default()
1313 .title("Bot Info")
1414 //.thumbnail(bot.avatar_url().expect("avatar failed"))
1515 .color(0x00ff_ffff)
+13-13
src/commands/fun/bottom.rs
···1515/// Translate your words for the tops and normies to understand
1616#[poise::command(slash_command, guild_only)]
1717pub async fn topify(ctx: Context<'_>, #[description = "text"] input: String) -> Result<()> {
1818- const MAX_LEN: usize = 1994;
1919- const WRAP: &'static str = "```";
1818+ const MAX_LEN: usize = 1994;
1919+ const WRAP: &'static str = "```";
2020 let out = bottom::decode_string(&input);
21212222- if let Ok(out) = out {
2323- let mut out = out.as_str();
2424- let len = out.len();
2525- for _ in 0..(len / MAX_LEN) {
2626- let (x, xs) = out.split_at(MAX_LEN);
2727- ctx.say(format!("{WRAP}{x}{WRAP}")).await?;
2828- out = xs;
2929- }
3030- if len % MAX_LEN != 0 {
3131- ctx.say(format!("{WRAP}{out}{WRAP}")).await?;
3232- }
2222+ if let Ok(out) = out {
2323+ let mut out = out.as_str();
2424+ let len = out.len();
2525+ for _ in 0..(len / MAX_LEN) {
2626+ let (x, xs) = out.split_at(MAX_LEN);
2727+ ctx.say(format!("{WRAP}{x}{WRAP}")).await?;
2828+ out = xs;
2929+ }
3030+ if len % MAX_LEN != 0 {
3131+ ctx.say(format!("{WRAP}{out}{WRAP}")).await?;
3232+ }
3333 } else {
3434 ctx.say("I couldn't decode that message.").await?;
3535 }
+3-3
src/commands/misc/nixpkgs.rs
···11use color_eyre::eyre::Result;
22use git_tracker::Tracker;
33-use poise::{serenity_prelude as serenity, CreateReply};
33+use poise::{serenity_prelude::CreateEmbed, CreateReply};
44use serde::Deserialize;
55use std::env;
66···2222 let github_token = env::var("GITHUB_TOKEN").expect("GITHUB_TOKEN not set");
2323 let tracker = Tracker::from_path(&nixpkgs_path)?;
24242525- let client = &ctx.data().client;
2525+ let client = &ctx.data().client;
26262727 // find out what commit our PR was merged in
2828 let Some(commit_sha) = ({
···7272 };
73737474 let embed = CreateReply::default().embed(
7575- serenity::CreateEmbed::new()
7575+ CreateEmbed::new()
7676 .title(format!("Nixpkgs PR #{pr} Status"))
7777 .url(format!("{NIXPKGS_URL}/pull/{pr}"))
7878 .description(embed_description),
+2-2
src/commands/user/avatar.rs
···11use crate::Context;
22use color_eyre::eyre::Result;
33-use poise::serenity_prelude as serenity;
33+use poise::serenity_prelude::User;
4455/// Displays your or another user's avatar
66#[poise::command(slash_command)]
77pub async fn avatar(
88 ctx: Context<'_>,
99- #[description = "Selected user"] user: Option<serenity::User>,
99+ #[description = "Selected user"] user: Option<User>,
1010) -> Result<()> {
1111 let user = user.as_ref().unwrap_or_else(|| ctx.author());
1212 let avatar = user.avatar_url().expect("Could not get avatar URL");
+6-3
src/commands/user/whois.rs
···11use crate::Context;
22use color_eyre::eyre::Result;
33-use poise::{serenity_prelude as serenity, CreateReply};
33+use poise::{
44+ serenity_prelude::{CreateEmbed, User},
55+ CreateReply,
66+};
4758/// Displays your or another user's info
69#[poise::command(slash_command)]
710pub async fn whois(
811 ctx: Context<'_>,
99- #[description = "Selected user"] user: Option<serenity::User>,
1212+ #[description = "Selected user"] user: Option<User>,
1013) -> Result<()> {
1114 let user = user.as_ref().unwrap_or_else(|| ctx.author());
1215 let membership = ctx.guild_id().unwrap().member(ctx.http(), user.id).await?;
···1518 let joined_at = membership.joined_at.unwrap().unix_timestamp();
16191720 let embed = CreateReply::default().embed(
1818- serenity::CreateEmbed::default()
2121+ CreateEmbed::default()
1922 .title(&user.name)
2023 .thumbnail(user.avatar_url().expect("avatar failed"))
2124 .color(0x00ff_ffff)
+16-7
src/event_handler/code_expantion.rs
···11// the logic here is pretty much ripped from https://github.com/uncenter/discord-forum-bot/blob/main/src/modules/expandGitHubLinks.ts
22// with some modifications so I can make it work on diffrent git hosts
3344-use color_eyre::eyre::{self, Result};
44+use color_eyre::eyre::{eyre, Result};
55use poise::serenity_prelude::{Context, FullEvent};
66use regex::Regex;
77use reqwest::Client;
8899-pub async fn handle(ctx: &Context, event: &FullEvent) -> Result<()> {
99+pub async fn handle(ctx: &Context, event: &FullEvent, client: &Client) -> Result<()> {
1010 if let FullEvent::Message { new_message } = event {
1111- let code_blocks = extract_code_blocks(new_message.content.clone()).await?;
1111+ let code_blocks = extract_code_blocks(new_message.content.clone(), client).await?;
12121313 if !code_blocks.is_empty() {
1414 new_message
···2121 Ok(())
2222}
23232424-async fn extract_code_blocks(msg: String) -> Result<Vec<String>> {
2424+async fn extract_code_blocks(msg: String, client: &Client) -> Result<Vec<String>> {
2525 let re = Regex::new(
2626- r"https?://(?P<host>(git.*|codeberg\.org))/(?P<repo>[\w-]+/[\w.-]+)/(blob|(src/(commit|branch)))?/(?P<reference>\S+?)/(?P<file>\S+)#L(?P<start>\d+)(?:[~-]L?(?P<end>\d+)?)?",
2626+ r#"(?x)
2727+ https?://
2828+ (?P<host>
2929+ (git.*|codeberg\.org)) /
3030+ (?P<repo> [\w-]+/[\w.-]+) /
3131+ (blob|(src/(commit|branch)))? /
3232+ (?P<reference> \S+?) /
3333+ (?P<file> \S+) #L
3434+ (?P<start> \d+)
3535+ (?:[~-]L?(?P<end>\d+)?)?
3636+ "#,
2737 )?;
28382939 let mut blocks: Vec<String> = Vec::new();
3030- let client = Client::new();
31403241 for caps in re.captures_iter(&msg) {
3342 let (host, repo, reference, file, start, end) = extract_url_components(&caps)?;
···7988) -> Result<String> {
8089 let response = client.get(raw_url).send().await?;
8190 if !response.status().is_success() {
8282- return Err(eyre::eyre!("Failed to fetch content from {}", raw_url));
9191+ return Err(eyre!("Failed to fetch content from {}", raw_url));
8392 }
84938594 let text = response.text().await?;
+2-2
src/event_handler/mod.rs
···1111 println!("Logged in as {}", data_about_bot.user.name);
1212 }
13131414- code_expantion::handle(ctx, event).await?;
1414+ let client = &_data.client;
15151616- Ok(())
1616+ code_expantion::handle(ctx, event, client).await
1717}
+12-11
src/main.rs
···66use std::env;
7788use color_eyre::eyre::{Report, Result};
99-use poise::serenity_prelude::{self as serenity, ActivityData, GatewayIntents};
99+use poise::serenity_prelude::{ActivityData, ClientBuilder, GatewayIntents};
10101111#[derive(Debug)]
1212-pub struct Data { // User data, which is stored and accessible in all command invocations
1313- client: Client,
1414-}
1212+// User data, which is stored and accessible in all command invocations
1313+pub struct Data {
1414+ client: Client,
1515+}
15161617pub type Context<'a> = poise::Context<'a, Data, Report>;
1718···4849 commands::fun::bottom::topify(),
4950 commands::fun::bottom::bottomify(),
5051 ],
5151- event_handler: |ctx, event, _, data| Box::pin(crate::event_handler::event_handler(ctx, event, data)),
5252+ event_handler: |ctx, event, _, data| {
5353+ Box::pin(crate::event_handler::event_handler(ctx, event, data))
5454+ },
5255 ..Default::default()
5356 };
5457···5760 Box::pin(async move {
5861 ctx.set_activity(Some(ActivityData::custom("new bot, who dis?")));
59626060- poise::builtins::register_globally(ctx, &framework.options().commands).await?;
6363+ poise::builtins::register_globally(ctx, &framework.options().commands).await?;
61646265 Ok(Data {
6363- client: Client::builder()
6464- .user_agent("blahaj")
6565- .build()?,
6666- })
6666+ client: Client::builder().user_agent("blahaj").build()?,
6767+ })
6768 })
6869 })
6970 .options(opts)
7071 .build();
71727272- let client = serenity::ClientBuilder::new(token, intents)
7373+ let client = ClientBuilder::new(token, intents)
7374 .framework(framework)
7475 .await;
7576