simple_oauth/common/
discord.rs1use serde::Deserialize;
2
3use crate::{SimpleOAuthProvider, types::UserInfo};
4
5#[derive(Debug, Clone)]
6pub struct Discord;
7
8#[derive(Debug, Deserialize)]
10struct DiscordUserInfo {
11 id: String,
12 username: String,
13 global_name: Option<String>,
14 email: Option<String>,
15 verified: Option<bool>,
16 avatar: Option<String>,
17}
18
19impl SimpleOAuthProvider for Discord {
20 fn authorize_url(&self) -> &str {
21 "https://discord.com/oauth2/authorize"
22 }
23
24 fn token_url(&self) -> &str {
25 "https://discord.com/api/oauth2/token"
26 }
27
28 fn default_scopes(&self) -> &'static [&'static str] {
29 &["identify"]
30 }
31
32 fn user_info_url(&self) -> &str {
33 "https://discord.com/api/v9/users/@me"
34 }
35
36 fn extract_user_info(&self, val: serde_json::Value) -> Result<UserInfo, serde_json::Error> {
37 let user_info: DiscordUserInfo = serde_json::from_value(val)?;
38 let avatar_url = user_info.avatar.as_ref().map(|avatar| {
39 format!(
40 "https://cdn.discordapp.com/avatars/{}/{}.png",
41 user_info.id, avatar
42 )
43 });
44
45 Ok(UserInfo {
46 id: user_info.id,
47 email: user_info.email,
48 email_verified: user_info.verified,
49 name: user_info.global_name,
50 username: Some(user_info.username),
51 avatar_url,
52 ..Default::default()
53 })
54 }
55}