silly goober bot
1use color_eyre::eyre::{eyre, Result};
2use poise::serenity_prelude::{Context, FullEvent};
3use serenity::all::{ChannelId, Member, RoleId, UserId};
4
5use crate::types::Data;
6
7pub async fn handle(ctx: &Context, event: &FullEvent, _data: &Data) -> Result<()> {
8 if let FullEvent::GuildMemberAddition { new_member } = event {
9 if new_member.guild_id != 1095080242219073606 {
10 return Ok(());
11 }
12
13 if new_member.user.bot {
14 return Ok(());
15 }
16
17 warn_onboarding(ctx, &new_member.user.id).await?;
18 }
19
20 if let FullEvent::GuildMemberUpdate {
21 old_if_available: _,
22 new: Some(member),
23 event: _,
24 } = event
25 {
26 if member.user.bot {
27 return Ok(());
28 }
29
30 // check if the user does not have the kitten role
31 if !member.roles.iter().any(|role| *role == 1249814690486423612) {
32 // check if the user has the pronouns role
33 if member
34 .roles
35 .iter()
36 .filter(|role| is_pronouns_role(**role))
37 .count()
38 > 0
39 {
40 add_kitten_role(ctx, member).await?;
41 }
42 }
43 }
44
45 Ok(())
46}
47
48async fn warn_onboarding(ctx: &Context, user_id: &UserId) -> Result<(), color_eyre::eyre::Error> {
49 ChannelId::new(1095084404168200302)
50 .say(
51 ctx,
52 format!(
53 "Welcome to the server, <@{user_id}>!\nPlease select your roles and pronouns from onboarding to get started."
54 ),
55 )
56 .await?;
57
58 Ok(())
59}
60
61async fn add_kitten_role(ctx: &Context, member: &Member) -> Result<()> {
62 member
63 .add_role(ctx, RoleId::new(1249814690486423612))
64 .await
65 .map_err(|e| eyre!("Failed to add role: {}", e))
66}
67
68fn is_pronouns_role(role: RoleId) -> bool {
69 role == 1095084950107209728 // she/her
70 || role == 1095085000241709217 // he/him
71 || role == 1095085169381232770 // they/them
72 || role == 1095085419265269922 // ask for pronouns
73}