pikadick/commands/
reddit.rs1use 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}