diff --git a/src/configs/config.example.json b/src/configs/config.example.json index a0f22db9..c9aff702 100644 --- a/src/configs/config.example.json +++ b/src/configs/config.example.json @@ -6,6 +6,13 @@ "locale": "en", "style": "dark", "sessionSecret": "98ki^e72~!@#(85o3kXLI*#c9wu5l!Z", + "homepage": { + "enabled": false, + "title": "Welcome to MapJS", + "descriptionLine1": "The best place to find Pokemon, Raids, Quests, and more!", + "descriptionLine2": "Please login or join our Discord for more info...", + "discordInvite": "https://discord.gg/yourInvite" + }, "map": { "startLat": 0, "startLon": 0, diff --git a/src/configs/default.json b/src/configs/default.json index d4bb2457..befd237c 100644 --- a/src/configs/default.json +++ b/src/configs/default.json @@ -22,6 +22,13 @@ "url": "", "maxScouts": 15 }, + "homepage": { + "enabled": false, + "title": "Welcome to MapJS", + "descriptionLine1": "The best place to find Pokemon, Raids, Quests, and more!", + "descriptionLine2": "Please login or join our Discord for more info...", + "discordInvite": "https://discord.gg/yourInvite" + }, "map": { "startLat": 0, "startLon": 0, diff --git a/src/index.js b/src/index.js index cdf10a1b..52917c85 100644 --- a/src/index.js +++ b/src/index.js @@ -127,7 +127,16 @@ if (config.discord.enabled) { // Login middleware app.use(async (req, res, next) => { - if (config.discord.enabled && (req.path === '/api/discord/login' || req.path === '/login')) { + // If Discord auth enabled and visiting any of the following + // endpoint paths, allow viewing the endpoint + if (config.discord.enabled && + ( + req.path === '/api/discord/login' || + req.path === '/login' || + req.path === '/blocked' || + (config.homepage && req.path === '/home') + ) + ) { return next(); } const healthcheckHeader = req.get('Healthcheck-Secret'); @@ -141,7 +150,11 @@ app.use(async (req, res, next) => { } if (!req.session.valid) { console.error('Invalid user authenticated', req.session.user_id); - res.redirect('/login'); + if (config.homepage) { + res.redirect('/home'); + } else { + res.redirect('/login'); + } return; } const perms = req.session.perms; @@ -149,7 +162,11 @@ app.use(async (req, res, next) => { if (defaultData.hide_map) { // No view map permissions, go to login screen console.error('Invalid view map permissions for user', req.session.user_id); - res.redirect('/login'); + if (config.homepage) { + res.redirect('/home'); + } else { + res.redirect('/login'); + } return; } defaultData.hide_pokemon = !perms.pokemon; @@ -170,7 +187,11 @@ app.use(async (req, res, next) => { defaultData.hide_devices = !perms.devices; return next(); } - res.redirect('/login'); + if (config.homepage) { + res.redirect('/home'); + } else { + res.redirect('/login'); + } }); // UI routes diff --git a/src/routes/discord.js b/src/routes/discord.js index cea72731..7595b0e8 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(); @@ -105,18 +106,25 @@ router.get('/callback', catchAsyncErrors(async (req, res) => { ], timestamp: new Date(), }; - let redirect = '/login'; + let redirect; if (valid) { console.log(user.id, 'Authenticated successfully.'); embed.title = 'Success'; embed.description = 'User Successfully Authenticated'; embed.color = 0x00FF00; redirect = `/?token=${response.data.access_token}`; + } else if (blocked) { + // User is in blocked Discord server(s) + console.warn(user.id, 'Blocked due to', blocked); + embed.title = 'Blocked'; + embed.description = 'User Blocked Due to ' + blocked; + embed.color = 0xFF0000; + 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'); + redirect = config.homepage ? '/home' : '/login'; } - await DiscordClient.sendMessage(config.discord.logChannelId, {embed: embed}); res.redirect(redirect); }).catch(error => { diff --git a/src/routes/ui.js b/src/routes/ui.js index cea443fd..5063b456 100644 --- a/src/routes/ui.js +++ b/src/routes/ui.js @@ -17,8 +17,11 @@ if (config.discord.enabled) { }); router.get('/logout', (req, res) => { - req.session.destroy(); - res.redirect('/login'); + if (config.homepage.enabled) { + res.redirect('/home'); + } else { + res.redirect('/login'); + } }); } @@ -29,6 +32,27 @@ router.get(['/', '/index'], async (req, res) => { res.render('index', data); }); +if (config.homepage.enabled) { + router.get('/home', (req, res) => { + const data = {}; + data.discord_invite = config.homepage.discordInvite; + data.map_title = config.homepage.title; + data.description_1 = config.homepage.descriptionLine1; + data.description_2 = config.homepage.descriptionLine2; + res.render('home', data); + }); +} + +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..9573d022 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..7ae38c96 --- /dev/null +++ b/src/views/blocked.mustache @@ -0,0 +1,112 @@ + + +
+ + + + +