aboutsummaryrefslogtreecommitdiff
path: root/src/discord.ts
blob: 7871fa3ef77ce59bcde90c7c51bef411b4592e35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import fetch from 'node-fetch'
import { Agent } from 'https'

const DISCORD_CLIENT_ID = '885347559382605916'

const httpsAgent = new Agent({
	keepAlive: true
})

export interface TokenResponse {
	access_token: string
	expires_in: number
	refresh_token: string
	scope: string
	token_type: string
}

/**
 * The information about the Discord user that's directly returned by the
 * Discord API
 */
export interface DiscordUser {
	id: string
	username: string
	avatar: string
	discriminator: string
	public_flags: number
	flags: number
	locale: string
	mfa_enabled: boolean
}

export async function exchangeCode(redirectUri: string, code: string): Promise<TokenResponse | null> {
	const API_ENDPOINT = 'https://discord.com/api/v6'
	const CLIENT_SECRET = process.env.discord_client_secret
	if (!CLIENT_SECRET) {
		console.error('discord_client_secret isn\'t in env, couldn\'t login with discord')
		return null
	}
	const data = {
		'client_id': DISCORD_CLIENT_ID,
		'client_secret': CLIENT_SECRET,
		'grant_type': 'authorization_code',
		'code': code,
		'redirect_uri': redirectUri,
		'scope': 'identify'
	}
	const fetchResponse = await fetch(
		API_ENDPOINT + '/oauth2/token',
		{
			method: 'POST',
			agent: () => httpsAgent,
			headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
			body: new URLSearchParams(data).toString()
		}
	)
	return await fetchResponse.json() as TokenResponse | null
}


export async function getUser(accessToken: string): Promise<DiscordUser> {
	const API_ENDPOINT = 'https://discord.com/api/v6'
	const response = await fetch(
		API_ENDPOINT + '/users/@me',
		{
			headers: {'Authorization': 'Bearer ' + accessToken},
			agent: () => httpsAgent,
		}
	)
	return await response.json() as DiscordUser
}