Skip to content

Commit ce8cdd6

Browse files
authored
Merge pull request #167 from WatWowMap/landing-page
Landing/Home Page
2 parents fdef08a + 6e77e48 commit ce8cdd6

File tree

10 files changed

+301
-11
lines changed

10 files changed

+301
-11
lines changed

src/configs/config.example.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
"locale": "en",
77
"style": "dark",
88
"sessionSecret": "98ki^e72~!@#(85o3kXLI*#c9wu5l!Z",
9+
"homepage": {
10+
"enabled": false,
11+
"title": "Welcome to MapJS",
12+
"descriptionLine1": "The best place to find Pokemon, Raids, Quests, and more!",
13+
"descriptionLine2": "Please login or join our Discord for more info...",
14+
"discordInvite": "https://discord.gg/yourInvite"
15+
},
916
"map": {
1017
"startLat": 0,
1118
"startLon": 0,

src/configs/default.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222
"url": "",
2323
"maxScouts": 15
2424
},
25+
"homepage": {
26+
"enabled": false,
27+
"title": "Welcome to MapJS",
28+
"descriptionLine1": "The best place to find Pokemon, Raids, Quests, and more!",
29+
"descriptionLine2": "Please login or join our Discord for more info...",
30+
"discordInvite": "https://discord.gg/yourInvite"
31+
},
2532
"map": {
2633
"startLat": 0,
2734
"startLon": 0,

src/index.js

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,16 @@ if (config.discord.enabled) {
127127

128128
// Login middleware
129129
app.use(async (req, res, next) => {
130-
if (config.discord.enabled && (req.path === '/api/discord/login' || req.path === '/login')) {
130+
// If Discord auth enabled and visiting any of the following
131+
// endpoint paths, allow viewing the endpoint
132+
if (config.discord.enabled &&
133+
(
134+
req.path === '/api/discord/login' ||
135+
req.path === '/login' ||
136+
req.path === '/blocked' ||
137+
(config.homepage && req.path === '/home')
138+
)
139+
) {
131140
return next();
132141
}
133142
const healthcheckHeader = req.get('Healthcheck-Secret');
@@ -141,15 +150,23 @@ app.use(async (req, res, next) => {
141150
}
142151
if (!req.session.valid) {
143152
console.error('Invalid user authenticated', req.session.user_id);
144-
res.redirect('/login');
153+
if (config.homepage) {
154+
res.redirect('/home');
155+
} else {
156+
res.redirect('/login');
157+
}
145158
return;
146159
}
147160
const perms = req.session.perms;
148161
defaultData.hide_map = !perms.map;
149162
if (defaultData.hide_map) {
150163
// No view map permissions, go to login screen
151164
console.error('Invalid view map permissions for user', req.session.user_id);
152-
res.redirect('/login');
165+
if (config.homepage) {
166+
res.redirect('/home');
167+
} else {
168+
res.redirect('/login');
169+
}
153170
return;
154171
}
155172
defaultData.hide_pokemon = !perms.pokemon;
@@ -170,7 +187,11 @@ app.use(async (req, res, next) => {
170187
defaultData.hide_devices = !perms.devices;
171188
return next();
172189
}
173-
res.redirect('/login');
190+
if (config.homepage) {
191+
res.redirect('/home');
192+
} else {
193+
res.redirect('/login');
194+
}
174195
});
175196

176197
// UI routes

src/routes/discord.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ router.get('/callback', catchAsyncErrors(async (req, res) => {
4343
req.session.username = `${user.username}#${user.discriminator}`;
4444
const perms = await DiscordClient.getPerms(user);
4545
req.session.perms = perms;
46+
const blocked = perms.blocked;
4647
const valid = perms.map !== false;
4748
req.session.valid = valid;
4849
req.session.save();
@@ -105,18 +106,25 @@ router.get('/callback', catchAsyncErrors(async (req, res) => {
105106
],
106107
timestamp: new Date(),
107108
};
108-
let redirect = '/login';
109+
let redirect;
109110
if (valid) {
110111
console.log(user.id, 'Authenticated successfully.');
111112
embed.title = 'Success';
112113
embed.description = 'User Successfully Authenticated';
113114
embed.color = 0x00FF00;
114115
redirect = `/?token=${response.data.access_token}`;
116+
} else if (blocked) {
117+
// User is in blocked Discord server(s)
118+
console.warn(user.id, 'Blocked due to', blocked);
119+
embed.title = 'Blocked';
120+
embed.description = 'User Blocked Due to ' + blocked;
121+
embed.color = 0xFF0000;
122+
redirect = '/blocked';
115123
} else {
116124
// Not in Discord server(s) and/or have required roles to view map
117125
console.warn(user.id, 'Not authorized to access map');
126+
redirect = config.homepage ? '/home' : '/login';
118127
}
119-
120128
await DiscordClient.sendMessage(config.discord.logChannelId, {embed: embed});
121129
res.redirect(redirect);
122130
}).catch(error => {

src/routes/ui.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ if (config.discord.enabled) {
1717
});
1818

1919
router.get('/logout', (req, res) => {
20-
req.session.destroy();
21-
res.redirect('/login');
20+
if (config.homepage.enabled) {
21+
res.redirect('/home');
22+
} else {
23+
res.redirect('/login');
24+
}
2225
});
2326
}
2427

@@ -29,6 +32,27 @@ router.get(['/', '/index'], async (req, res) => {
2932
res.render('index', data);
3033
});
3134

35+
if (config.homepage.enabled) {
36+
router.get('/home', (req, res) => {
37+
const data = {};
38+
data.discord_invite = config.homepage.discordInvite;
39+
data.map_title = config.homepage.title;
40+
data.description_1 = config.homepage.descriptionLine1;
41+
data.description_2 = config.homepage.descriptionLine2;
42+
res.render('home', data);
43+
});
44+
}
45+
46+
router.get('/blocked', (req, res) => {
47+
const data = {};
48+
data.discord_invite = config.discord.invite;
49+
if (req.session.username) {
50+
data.guild_name = req.session.perms.blocked;
51+
data.username = req.session.username;
52+
}
53+
res.render('blocked', data);
54+
});
55+
3256
// Location endpoints
3357
router.get('/@/:lat/:lon', async (req, res) => {
3458
res.setHeader('Content-Type', 'text/html');

src/services/discord.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class DiscordClient {
3737
async getGuilds() {
3838
const guilds = await oauth.getUserGuilds(this.accessToken);
3939
const guildIds = Array.from(guilds, x => BigInt(x.id).toString());
40-
return guildIds;
40+
return [guildIds, guilds];
4141
}
4242

4343
async getUserRoles(guildId, userId) {
@@ -74,7 +74,7 @@ class DiscordClient {
7474
}
7575

7676
async getPerms(user) {
77-
const perms = {
77+
var perms = {
7878
map: false,
7979
pokemon: false,
8080
raids: false,
@@ -94,7 +94,7 @@ class DiscordClient {
9494
weather: false,
9595
devices: false
9696
};
97-
const guilds = await this.getGuilds();
97+
const [guilds, guildsFull] = await this.getGuilds();
9898
if (config.discord.allowedUsers.includes(user.id)) {
9999
Object.keys(perms).forEach((key) => perms[key] = true);
100100
console.log(`User ${user.username}#${user.discriminator} (${user.id}) in allowed users list, skipping guild and role check.`);
@@ -108,6 +108,7 @@ class DiscordClient {
108108
if (guilds.includes(guildId)) {
109109
// If so, user is not granted access
110110
blocked = true;
111+
perms['blocked'] = guildsFull.find(x => x.id === guildId).name;
111112
break;
112113
}
113114
}

src/views/blocked.mustache

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta name="viewport" content="width=device-width, initial-scale=1">
5+
<style>
6+
html,
7+
body {
8+
height: 85%;
9+
width: 100%;
10+
margin: 0px;
11+
background-color: #2c2f33;
12+
background-image: url('/img/discord.png');
13+
}
14+
15+
.background {
16+
background-image:url("/img/landing.png");
17+
background-position: center;
18+
background-repeat: no-repeat;
19+
background-size: cover;
20+
height: 95%;
21+
border: 2px solid #7289da;
22+
display: block;
23+
margin-left: auto;
24+
margin-right: auto;
25+
}
26+
27+
#transbox {
28+
background-color:rgba(255,255,255,0.8);
29+
padding:20px;
30+
border-radius: 20px;
31+
}
32+
33+
.title {
34+
text-align:center;
35+
font-size: 2em;
36+
color: #3C5FA3;
37+
font-weight: bold;
38+
font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
39+
}
40+
41+
.container {
42+
width: 90%;
43+
margin: 0 auto;
44+
padding: 30px;
45+
border-radius: 10px;
46+
}
47+
48+
.clearfix:after {
49+
visibility:hidden;
50+
display:block;
51+
content:"";
52+
clear:both;
53+
height:0;
54+
}
55+
56+
.description {
57+
text-align:center;
58+
opacity: 0.5;
59+
color: #000000;
60+
margin-left: 10px;
61+
margin-bottom: 10px;
62+
white-space: pre-wrap;
63+
font-weight: bold;
64+
font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
65+
}
66+
67+
.make-center {
68+
text-align: center;
69+
padding: 20px 0;
70+
}
71+
72+
.square_btn{
73+
display: inline-block;
74+
padding: 7px 20px;
75+
border: solid 3px black;
76+
border-radius: 25px;
77+
text-decoration: none;
78+
color: #FFF;
79+
background-image: -webkit-linear-gradient(45deg, #7289da 0%, #4d6cdb 100%);
80+
background-image: linear-gradient(45deg, #7289da 0%, #4d6cdb 100%);
81+
transition: .4s;
82+
}
83+
84+
.square_btn:hover {
85+
background-image: -webkit-linear-gradient(45deg, #7289da 0%, #3659d8 100%);
86+
background-image: linear-gradient(45deg, #7289da 0%, #3659d8 100%);
87+
}
88+
89+
a {
90+
font-weight: bold;
91+
font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
92+
}
93+
</style>
94+
</head>
95+
<body>
96+
<div class="container clearfix background">
97+
<div id="transbox">
98+
<title>Access denied</title>
99+
<div class="title">Access denied!</div><br>
100+
<div class="description">{{username}} has been blocked for being a member of {{guild_name}}.
101+
Please join our discord for more info.</div>
102+
<div class="make-center">
103+
<a href="/login" class="square_btn">Login</a>&nbsp;&nbsp;<a href="{{discord_invite}}" class="square_btn">Join Our Discord</a>
104+
</div>
105+
</div>
106+
</div>
107+
</body>
108+
</body>
109+
</html>
110+
111+
<!--created by anonymous All images are copyright and belong to their respective owners,
112+
this document is for educational purpose-->

0 commit comments

Comments
 (0)