silly goober bot
1use crate::types::Context;
2use color_eyre::eyre::Result;
3use poise::serenity_prelude::{OnlineStatus, UserId};
4use rand::Rng;
5
6/// Rolls dice based on given # of sides
7#[poise::command(slash_command)]
8pub async fn roll(
9 ctx: Context<'_>,
10 #[description = "# of sides"] sides: Option<u32>,
11) -> Result<()> {
12 let sides = sides.unwrap_or(6);
13 let roll = rand::rng().random_range(1..=sides);
14 ctx.say(format!("You rolled a **{roll}**")).await?;
15 Ok(())
16}
17
18/// Select a random person to win a raffle
19#[poise::command(slash_command)]
20pub async fn raffle(ctx: Context<'_>) -> Result<()> {
21 let mut memeberid: UserId = UserId::new(1);
22
23 let members = ctx
24 .guild_id()
25 .unwrap()
26 .members(&ctx.http(), None, None)
27 .await?;
28
29 let mut find_member = false;
30 while !find_member {
31 let selected = rand::rng().random_range(1..=members.len());
32 let memeber = &members[selected].user;
33 memeberid = memeber.id;
34
35 if let Some(presence) = ctx.guild().unwrap().presences.get(&memeberid) {
36 find_member = presence.status == OnlineStatus::Online
37 || presence.status == OnlineStatus::Idle
38 && !memeber.bot
39 && memeberid != ctx.author().id;
40 }
41 }
42
43 if Some(memeberid).is_some() && memeberid != UserId::new(1) {
44 ctx.say(format!("<@{memeberid}> has won the raffle"))
45 .await?;
46 }
47
48 Ok(())
49}