diff --git a/src/index.js b/src/index.js index 3e77733e..c53aa342 100644 --- a/src/index.js +++ b/src/index.js @@ -133,6 +133,7 @@ app.use(async (req, res, next) => { ( req.path === '/api/discord/login' || req.path === '/login' || + req.path === '/blocked' || (config.homePage && req.path === '/home') ) ) { diff --git a/src/routes/discord.js b/src/routes/discord.js index 15349fa8..6a4029b9 100644 --- a/src/routes/discord.js +++ b/src/routes/discord.js @@ -43,6 +43,7 @@ router.get('/callback', catchAsyncErrors(async (req, res) => { req.session.username = `${user.username}#${user.discriminator}`; const perms = await DiscordClient.getPerms(user); req.session.perms = perms; + const blocked = perms.blocked; const valid = perms.map !== false; req.session.valid = valid; req.session.save(); @@ -50,6 +51,11 @@ router.get('/callback', catchAsyncErrors(async (req, res) => { console.log(user.id, 'Authenticated successfully.'); await DiscordClient.sendMessage(config.discord.logChannelId, `${user.username}#${user.discriminator} (${user.id}) Authenticated successfully.`); res.redirect(`/?token=${response.data.access_token}`); + } else if (blocked) { + // User is in blocked Discord server(s) + console.warn(user.id, 'Blocked due to', blocked); + await DiscordClient.sendMessage(config.discord.logChannelId, `${user.username}#${user.discriminator} (${user.id}) Blocked due to ${blocked}.`); + res.redirect('/blocked'); } else { // Not in Discord server(s) and/or have required roles to view map console.warn(user.id, 'Not authorized to access map'); diff --git a/src/routes/ui.js b/src/routes/ui.js index 0e63af2d..e9fc5ed8 100644 --- a/src/routes/ui.js +++ b/src/routes/ui.js @@ -40,6 +40,16 @@ if (config.homePage) { }); } +router.get('/blocked', (req, res) => { + const data = {}; + data.discord_invite = config.discord.invite; + if (req.session.username) { + data.guild_name = req.session.perms.blocked; + data.username = req.session.username; + } + res.render('blocked', data); +}); + // Location endpoints router.get('/@/:lat/:lon', async (req, res) => { res.setHeader('Content-Type', 'text/html'); diff --git a/src/services/discord.js b/src/services/discord.js index f5381812..e1e244fc 100644 --- a/src/services/discord.js +++ b/src/services/discord.js @@ -37,7 +37,7 @@ class DiscordClient { async getGuilds() { const guilds = await oauth.getUserGuilds(this.accessToken); const guildIds = Array.from(guilds, x => BigInt(x.id).toString()); - return guildIds; + return [guildIds, guilds]; } async getUserRoles(guildId, userId) { @@ -74,7 +74,7 @@ class DiscordClient { } async getPerms(user) { - const perms = { + var perms = { map: false, pokemon: false, raids: false, @@ -94,7 +94,7 @@ class DiscordClient { weather: false, devices: false }; - const guilds = await this.getGuilds(); + const [guilds, guildsFull] = await this.getGuilds(); if (config.discord.allowedUsers.includes(user.id)) { Object.keys(perms).forEach((key) => perms[key] = true); console.log(`User ${user.username}#${user.discriminator} (${user.id}) in allowed users list, skipping guild and role check.`); @@ -108,6 +108,7 @@ class DiscordClient { if (guilds.includes(guildId)) { // If so, user is not granted access blocked = true; + perms["blocked"] = guildsFull.find(x => x.id === guildId).name; break; } } diff --git a/src/views/blocked.mustache b/src/views/blocked.mustache new file mode 100644 index 00000000..5cadeead --- /dev/null +++ b/src/views/blocked.mustache @@ -0,0 +1,100 @@ + + +
+ + + + +