use serde::Serialize;
use crate::types::{
GuildOnboarding, OnboardingMode, OnboardingPromptType, Snowflake, WelcomeScreen,
WelcomeScreenChannel,
};
use super::{Body, BotClient, Response, Result, Transport, route::routes};
routes! {
GET_GUILD_ONBOARDING = Get "/guilds/{guild_id}/onboarding";
MODIFY_GUILD_ONBOARDING = Put "/guilds/{guild_id}/onboarding";
GET_GUILD_WELCOME_SCREEN = Get "/guilds/{guild_id}/welcome-screen";
MODIFY_GUILD_WELCOME_SCREEN = Patch "/guilds/{guild_id}/welcome-screen";
}
#[derive(Debug, Clone, Copy, Default, Serialize)]
pub struct ModifyOnboarding<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub prompts: Option<&'a [OnboardingPromptFields<'a>]>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_channel_ids: Option<&'a [Snowflake]>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<OnboardingMode>,
#[serde(skip)]
pub reason: Option<&'a str>,
}
#[derive(Debug, Clone, Copy, Serialize)]
pub struct OnboardingPromptFields<'a> {
pub id: Snowflake,
pub title: &'a str,
pub options: &'a [OnboardingPromptOptionFields<'a>],
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub t: Option<OnboardingPromptType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub single_select: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub in_onboarding: Option<bool>,
}
#[derive(Debug, Clone, Copy, Default, Serialize)]
pub struct OnboardingPromptOptionFields<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<Snowflake>,
pub title: &'a str,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role_ids: Option<&'a [Snowflake]>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel_ids: Option<&'a [Snowflake]>,
#[serde(skip_serializing_if = "Option::is_none")]
pub emoji_id: Option<Snowflake>,
#[serde(skip_serializing_if = "Option::is_none")]
pub emoji_name: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub emoji_animated: Option<bool>,
}
#[derive(Debug, Clone, Copy, Default, Serialize)]
pub struct ModifyWelcomeScreen<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<Option<bool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub welcome_channels: Option<Option<&'a [WelcomeScreenChannel]>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<Option<&'a str>>,
#[serde(skip)]
pub reason: Option<&'a str>,
}
impl<T: Transport> BotClient<T> {
pub async fn get_guild_onboarding(
&self,
guild_id: Snowflake,
) -> Result<Response<GuildOnboarding>> {
let url = self.rest.url(GET_GUILD_ONBOARDING, &[&guild_id]);
self.rest
.call(GET_GUILD_ONBOARDING, url, Body::NONE, None)
.await
}
pub async fn modify_guild_onboarding(
&self,
guild_id: Snowflake,
onboarding: &ModifyOnboarding<'_>,
) -> Result<Response<GuildOnboarding>> {
let url = self.rest.url(MODIFY_GUILD_ONBOARDING, &[&guild_id]);
self.rest
.call(
MODIFY_GUILD_ONBOARDING,
url,
Body::Json(onboarding),
onboarding.reason,
)
.await
}
pub async fn get_guild_welcome_screen(
&self,
guild_id: Snowflake,
) -> Result<Response<WelcomeScreen>> {
let url = self.rest.url(GET_GUILD_WELCOME_SCREEN, &[&guild_id]);
self.rest
.call(GET_GUILD_WELCOME_SCREEN, url, Body::NONE, None)
.await
}
pub async fn modify_guild_welcome_screen(
&self,
guild_id: Snowflake,
screen: &ModifyWelcomeScreen<'_>,
) -> Result<Response<WelcomeScreen>> {
let url = self.rest.url(MODIFY_GUILD_WELCOME_SCREEN, &[&guild_id]);
self.rest
.call(
MODIFY_GUILD_WELCOME_SCREEN,
url,
Body::Json(screen),
screen.reason,
)
.await
}
}
#[cfg(test)]
mod tests {
use futures::executor::block_on;
use serde_json::json;
use super::super::{Method::*, testing::MockTransport};
use super::*;
#[test]
fn routes() {
let c = BotClient::new(MockTransport::default(), "t", Snowflake::from_u64(1));
let g = Snowflake::from_u64(5);
let roles = [Snowflake::from_u64(7)];
let options = [OnboardingPromptOptionFields {
title: "Rust",
role_ids: Some(&roles),
emoji_name: Some("🦀"),
..Default::default()
}];
let prompts = [OnboardingPromptFields {
id: Snowflake::from_u64(9),
title: "What do you write?",
options: &options,
t: Some(OnboardingPromptType::Dropdown),
single_select: None,
required: Some(true),
in_onboarding: None,
}];
let onboarding = ModifyOnboarding {
prompts: Some(&prompts),
enabled: Some(true),
..Default::default()
};
let channels = [WelcomeScreenChannel {
channel_id: Snowflake::from_u64(8),
description: "Say hi".into(),
emoji_id: None,
emoji_name: Some("👋".into()),
}];
let screen = ModifyWelcomeScreen {
welcome_channels: Some(Some(&channels)),
description: Some(None),
..Default::default()
};
block_on(c.get_guild_onboarding(g)).unwrap();
block_on(c.modify_guild_onboarding(g, &onboarding)).unwrap();
block_on(c.get_guild_welcome_screen(g)).unwrap();
block_on(c.modify_guild_welcome_screen(g, &screen)).unwrap();
let t = c.transport();
assert_eq!(
t.sent(),
[
(Get, "/guilds/5/onboarding".into()),
(Put, "/guilds/5/onboarding".into()),
(Get, "/guilds/5/welcome-screen".into()),
(Patch, "/guilds/5/welcome-screen".into()),
]
);
assert_eq!(
t.body(1),
json!({
"prompts": [{ "id": "9", "title": "What do you write?", "type": 1, "required": true,
"options": [{ "title": "Rust", "role_ids": ["7"], "emoji_name": "🦀" }] }],
"enabled": true,
})
);
assert_eq!(
t.body(3),
json!({
"welcome_channels": [{ "channel_id": "8", "description": "Say hi", "emoji_id": null, "emoji_name": "👋" }],
"description": null,
})
);
}
}