Added/remove Discord roles when connecting/removing Discord account

This commit is contained in:
Jonathan Barrow
2022-09-18 01:24:27 -04:00
parent aa69c9fba6
commit e6f9b4fc52
4 changed files with 71 additions and 26 deletions

View File

@@ -147,6 +147,7 @@ router.get('/logout', async(_request, response) => {
});
router.get('/connect/discord', requireLoginMiddleware, async (request, response) => {
const { pnid } = request;
let tokens;
try {
// Attempt to get OAuth2 tokens
@@ -166,8 +167,52 @@ router.get('/connect/discord', requireLoginMiddleware, async (request, response)
try {
await util.updateDiscordConnection(discordUser, request, response);
const priceId = pnid.get('connections.stripe.price_id');
if (priceId && priceId.trim() !== '') {
const price = await stripe.prices.retrieve(priceId);
const product = await stripe.products.retrieve(price.product);
const discordRoleId = product.metadata.discord_role_id;
const discordId = discordUser.id;
await util.assignDiscordMemberSupporterRole(discordId, discordRoleId);
if (product.metadata.beta === 'true') {
await util.assignDiscordMemberTesterRole(discordId);
}
}
response.cookie('success_message', 'Discord account linked successfully', { domain: '.pretendo.network' });
response.redirect('/account');
return response.redirect('/account');
} catch (error) {
response.cookie('error_message', error.message, { domain: '.pretendo.network' });
return response.redirect('/account');
}
});
router.get('/remove/discord', requireLoginMiddleware, async (request, response) => {
const { account, pnid } = request;
try {
await util.removeDiscordConnection(request, response);
const priceId = pnid.get('connections.stripe.price_id');
if (priceId && priceId.trim() !== '') {
const price = await stripe.prices.retrieve(priceId);
const product = await stripe.products.retrieve(price.product);
const discordRoleId = product.metadata.discord_role_id;
const discordId = account.connections.discord.id;
await util.removeDiscordMemberSupporterRole(discordId, discordRoleId);
if (product.metadata.beta === 'true') {
await util.removeDiscordMemberTesterRole(discordId);
}
}
response.cookie('success_message', 'Discord account removed successfully', { domain: '.pretendo.network' });
return response.redirect('/account');
} catch (error) {
response.cookie('error_message', error.message, { domain: '.pretendo.network' });
return response.redirect('/account');

View File

@@ -188,6 +188,22 @@ async function updateDiscordConnection(discordUser, request, response, fromRetry
}
}
async function removeDiscordConnection(request, response, fromRetry = false) {
const apiResponse = await apiDeleteRequest('/v1/connections/remove/discord', {
'Authorization': `${request.cookies.token_type} ${request.cookies.access_token}`
});
if (apiResponse.statusCode !== 200 && fromRetry === true) {
// TODO: Error message
throw new Error('Bad');
}
if (apiResponse.statusCode !== 200) {
await refreshLogin(request, response);
await removeDiscordConnection(request, response, true);
}
}
function nintendoPasswordHash(password, pid) {
const pidBuffer = Buffer.alloc(4);
pidBuffer.writeUInt32LE(pid);
@@ -444,6 +460,11 @@ module.exports = {
refreshLogin,
getUserAccountData,
updateDiscordConnection,
removeDiscordConnection,
nintendoPasswordHash,
handleStripeEvent
handleStripeEvent,
assignDiscordMemberSupporterRole,
assignDiscordMemberTesterRole,
removeDiscordMemberSupporterRole,
removeDiscordMemberTesterRole
};