nanobot/src/verify/mod.rs

128 lines
4.3 KiB
Rust

use crate::{Data, Error};
use poise::serenity_prelude as serenity;
pub(crate) mod login;
pub(crate) use login::*;
pub(crate) mod membership;
pub(crate) use membership::*;
pub(crate) mod manual;
pub(crate) use manual::*;
const INFO_MSG: &str = indoc::indoc! {"
Nano is a Discord bot written with serenity-rs/poise and tokio-rs/axum.
It allows members and Imperial students to automatically verify themselves and gain access to the ICAS Discord server.
If you have any questions, feel free to ping or message <@99217900254035968>
"};
pub(crate) async fn info(
ctx: &serenity::Context,
m: &serenity::MessageComponentInteraction,
) -> Result<(), Error> {
m.create_interaction_response(&ctx.http, |i| {
i.kind(serenity::InteractionResponseType::ChannelMessageWithSource)
.interaction_response_data(|d| d.content(INFO_MSG).ephemeral(true))
})
.await?;
Ok(())
}
pub(crate) async fn unknown(
ctx: &serenity::Context,
m: &serenity::MessageComponentInteraction,
) -> Result<(), Error> {
m.create_interaction_response(&ctx.http, |i| {
i.kind(serenity::InteractionResponseType::ChannelMessageWithSource)
.interaction_response_data(|d| {
d.content("Sorry, something went wrong. Please try again or message <@99217900254035968> for help")
.ephemeral(true)
})
})
.await?;
Ok(())
}
const START_MSG: &str = indoc::indoc! {"
There are 3 available methods for verification.
- 🚀 Automatic verification via Imperial Login (Quickest)
- ✈️ Automatic verification via ICAS Membership (Easiest)
- 🚗 Manual verification, eg. using College ID Card or Acceptance Letter
"};
pub(crate) async fn start(
ctx: &serenity::Context,
m: &serenity::MessageComponentInteraction,
data: &Data,
init: bool,
) -> Result<(), Error> {
// Check if user is already verified
if let Some(member) = crate::db::get_member_by_id(&data.db, m.user.id.into()).await? {
let mut mm = m.member.clone().unwrap();
apply_role(ctx, &mut mm, data.member).await?;
if member.fresher {
apply_role(ctx, &mut mm, data.fresher).await?;
}
m.create_interaction_response(&ctx.http, |i| {
i.kind(serenity::InteractionResponseType::ChannelMessageWithSource)
.interaction_response_data(|d| {
d.content("Welcome, you're already verified, re-applied your roles!")
.ephemeral(true)
})
})
.await?
} else {
m.create_interaction_response(&ctx.http, |i| {
i.kind(if init {
serenity::InteractionResponseType::ChannelMessageWithSource
} else {
serenity::InteractionResponseType::UpdateMessage
})
.interaction_response_data(|d| {
d.content(START_MSG).ephemeral(true).components(|c| {
c.create_action_row(|a| {
a.create_button(|b| {
b.style(serenity::ButtonStyle::Primary)
.emoji('🚀')
.label("Login")
.custom_id("login_1")
})
.create_button(|b| {
b.style(serenity::ButtonStyle::Secondary)
.emoji(serenity::ReactionType::Unicode("✈️".to_string()))
.label("Membership")
.custom_id("membership_1")
})
.create_button(|b| {
b.style(serenity::ButtonStyle::Secondary)
.emoji('🚗')
.label("Manual")
.custom_id("manual_1")
})
})
})
})
})
.await?
};
Ok(())
}
pub(crate) async fn apply_role(
ctx: &serenity::Context,
member: &mut serenity::Member,
role: serenity::RoleId,
) -> Result<(), Error> {
Ok(member.add_role(&ctx.http, role).await?)
}
pub(crate) async fn remove_role(
ctx: &serenity::Context,
member: &mut serenity::Member,
role: serenity::RoleId,
) -> Result<(), Error> {
Ok(member.remove_role(&ctx.http, role).await?)
}