pikadick/commands/
reddit.rs

1use crate::{
2    checks::ENABLED_CHECK,
3    util::LoadingReaction,
4    ClientDataKey,
5};
6use anyhow::Context as _;
7use serenity::{
8    client::Context,
9    framework::standard::{
10        macros::*,
11        Args,
12        CommandResult,
13    },
14    model::prelude::*,
15};
16
17#[command]
18#[description("Get a random post from a subreddit")]
19#[bucket("default")]
20#[min_args(1)]
21#[max_args(1)]
22#[usage("<subreddit_name>")]
23#[example("dogpictures")]
24#[checks(Enabled)]
25async fn reddit(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
26    let data_lock = ctx.data.read().await;
27    let client_data = data_lock
28        .get::<ClientDataKey>()
29        .expect("missing client data");
30    let reddit_embed_data = client_data.reddit_embed_data.clone();
31    drop(data_lock);
32
33    let mut loading = LoadingReaction::new(ctx.http.clone(), msg);
34
35    let subreddit = args.single::<String>().expect("missing arg");
36    match reddit_embed_data
37        .get_random_post(&subreddit)
38        .await
39        .context("failed fetching posts")
40    {
41        Ok(Some(url)) => {
42            msg.channel_id.say(&ctx.http, url).await?;
43            loading.send_ok();
44        }
45        Ok(None) => {
46            msg.channel_id.say(&ctx.http, "No posts found").await?;
47        }
48        Err(e) => {
49            msg.channel_id.say(&ctx.http, format!("{:?}", e)).await?;
50        }
51    }
52
53    Ok(())
54}