Simpler Discord queries

This commit is contained in:
Jonathan Barrow
2022-07-15 20:48:37 -04:00
parent e9175f491d
commit 6bec0fdc31
6 changed files with 134 additions and 92 deletions

View File

@@ -4,6 +4,8 @@ const DiscordOauth2 = require('discord-oauth2');
const { v4: uuidv4 } = require('uuid');
const AdmZip = require('adm-zip');
const Stripe = require('stripe');
const { REST: DiscordRest } = require('@discordjs/rest');
const { Routes: DiscordRoutes } = require('discord-api-types/v10');
const database = require('../database');
const cache = require('../cache');
const util = require('../util');
@@ -15,13 +17,14 @@ const aesKey = Buffer.from(config.aes_key, 'hex');
const stripe = new Stripe(config.stripe.secret_key);
const router = new Router();
const discordRest = new DiscordRest({ version: '10' }).setToken(config.discord.bot_token);
// Create OAuth client
const discordOAuth = new DiscordOauth2({
clientId: config.discord.client_id,
clientSecret: config.discord.client_secret,
redirectUri: `${config.http.base_url}/account/connect/discord`,
version: 'v9'
version: 'v10'
});
router.get('/', async (request, response) => {
@@ -94,89 +97,10 @@ router.get('/', async (request, response) => {
// Check if a Discord account is linked to the PNID
if (account.connections.discord.id && account.connections.discord.id.trim() !== '') {
// If Discord account is linked, then get user info
try {
renderData.discordUser = await discordOAuth.getUser(account.connections.discord.access_token);
renderData.discordUser = await discordRest.get(DiscordRoutes.user(account.connections.discord.id));
} catch (error) {
// Assume expired, refresh and retry Discord request
let tokens;
try {
tokens = await discordOAuth.tokenRequest({
scope: 'identify guilds',
grantType: 'refresh_token',
refreshToken: account.connections.discord.refresh_token,
});
} catch (error) {
renderData.error = 'Invalid Discord refresh token. Remove account and relink';
return response.render('account/account', renderData);
}
// TODO: Add a dedicated endpoint for updating connections?
apiResponse = await util.apiPostGetRequest('/v1/connections/add/discord', {
'Authorization': `${request.cookies.token_type} ${request.cookies.access_token}`
}, {
data: {
id: account.connections.discord.id,
access_token: tokens.access_token,
refresh_token: tokens.refresh_token,
}
});
if (apiResponse.statusCode !== 200) {
// Assume expired, refresh and retry request
apiResponse = await util.apiPostGetRequest('/v1/login', {}, {
refresh_token: request.cookies.refresh_token,
grant_type: 'refresh_token'
});
if (apiResponse.statusCode !== 200) {
// TODO: Error message
return response.status(apiResponse.statusCode).json({
error: 'Bad'
});
}
const tokens = apiResponse.body;
response.cookie('refresh_token', tokens.refresh_token, { domain : '.pretendo.network' });
response.cookie('access_token', tokens.access_token, { domain : '.pretendo.network' });
response.cookie('token_type', tokens.token_type, { domain : '.pretendo.network' });
apiResponse = await util.apiPostGetRequest('/v1/connections/add/discord', {
'Authorization': `${tokens.token_type} ${tokens.access_token}`
}, {
data: {
id: account.connections.discord.id,
access_token: tokens.access_token,
refresh_token: tokens.refresh_token,
}
});
// If still failed, something went horribly wrong
if (apiResponse.statusCode !== 200) {
// TODO: Error message
return response.status(apiResponse.statusCode).json({
error: 'Bad'
});
}
}
account.connections.discord.access_token = tokens.access_token;
account.connections.discord.refresh_token = tokens.refresh_token;
}
// Get the users Discord roles to check if they are a tester
const { roles } = await discordOAuth.getMemberRolesForGuild({
userId: account.connections.discord.id,
guildId: config.discord.guild_id,
botToken: config.discord.bot_token
});
// Only run this check if not already a tester (edge case)
if (!renderData.isTester) {
// 409116477212459008 = Developer
// 882247322933801030 = Super Mario (Patreon tier)
renderData.isTester = roles.some(role => config.discord.tester_roles.includes(role));
response.cookie('error_message', error.message, { domain: '.pretendo.network' });
}
} else {
// If no Discord account linked, generate an auth URL
@@ -310,9 +234,7 @@ router.get('/connect/discord', async (request, response) => {
'Authorization': `${request.cookies.token_type} ${request.cookies.access_token}`
}, {
data: {
id: user.id,
access_token: tokens.access_token,
refresh_token: tokens.refresh_token,
id: user.id // Only care about user ID. Bot will get details we need
}
});
@@ -340,9 +262,7 @@ router.get('/connect/discord', async (request, response) => {
'Authorization': `${tokens.token_type} ${tokens.access_token}`
}, {
data: {
id: user.id,
access_token: tokens.access_token,
refresh_token: tokens.refresh_token,
id: user.id
}
});
@@ -648,8 +568,8 @@ router.post('/stripe/checkout/:priceId', async (request, response) => {
const pnid = await database.PNID.findOne({ pid });
if (pnid.get('access_level') >= 2) {
response.cookie('error_message', 'Staff members do not need to purchase tiers', { domain: '.pretendo.network' });
return response.redirect('/account');
//response.cookie('error_message', 'Staff members do not need to purchase tiers', { domain: '.pretendo.network' });
//return response.redirect('/account');
}
try {

View File

@@ -9,6 +9,9 @@ const PNIDSchema = new Schema({
server_access_level: String,
access_level: Number,
connections: {
discord: {
id: String
},
stripe: {
customer_id: String,
subscription_id: String,