notherbase-fs 1.1.42 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/controllers/authCheck.js +5 -20
- package/controllers/explorer.js +11 -1
- package/controllers/inventory.js +2 -4
- package/controllers/the-front.js +18 -10
- package/controllers/user.js +314 -20
- package/models/index.js +2 -1
- package/models/send-mail.js +26 -0
- package/models/user.js +11 -1
- package/package.json +6 -2
- package/public/styles/account.css +41 -0
- package/public/styles/inventory.css +12 -24
- package/public/styles/main.css +8 -30
- package/public/styles/menu.css +61 -9
- package/public/styles/more.css +3 -0
- package/public/styles/player.css +12 -0
- package/test/coast/tall-beach/nono-cove/local-scripts/nono.js +211 -0
- package/test/coast/tall-beach/nono-cove/styles/index.css +18 -0
- package/test/coast/tall-beach/nono-cove/styles/nono.css +89 -0
- package/test/coast/tall-beach/nono-cove/views/index.ejs +5 -1
- package/test/coast/tall-beach/nono-cove/views/nono-og.ejs +37 -0
- package/test/test-index.js +10 -0
- package/test/views/index.ejs +94 -4
- package/views/account.ejs +161 -0
- package/views/explorer.ejs +7 -1
- package/views/head.ejs +4 -1
- package/views/inventory.ejs +68 -59
- package/views/menu.ejs +51 -14
- package/views/{contact.ejs → more.ejs} +2 -2
- package/views/player.ejs +47 -0
package/controllers/authCheck.js
CHANGED
|
@@ -1,27 +1,12 @@
|
|
|
1
|
-
const {
|
|
1
|
+
const { connectionSuccess } = require("../models");
|
|
2
2
|
|
|
3
3
|
const authCheck = async function authCheck(req, res, next){
|
|
4
4
|
if (connectionSuccess) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const foundAccount = await user.findById(req.session.currentUser);
|
|
8
|
-
|
|
9
|
-
if (foundAccount) {
|
|
10
|
-
req.session.currentUserFull = foundAccount;
|
|
11
|
-
next();
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
req.session.currentUserFull = null;
|
|
15
|
-
res.redirect("/the-front");
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
else{
|
|
19
|
-
res.redirect("/the-front");
|
|
20
|
-
}
|
|
5
|
+
if (req.session.currentUser) {
|
|
6
|
+
next();
|
|
21
7
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
console.log(err);
|
|
8
|
+
else {
|
|
9
|
+
res.redirect("/the-front");
|
|
25
10
|
}
|
|
26
11
|
}
|
|
27
12
|
else {
|
package/controllers/explorer.js
CHANGED
|
@@ -31,6 +31,7 @@ let complete = function complete(explorerBuild) {
|
|
|
31
31
|
externalStyles: [],
|
|
32
32
|
localScripts: [],
|
|
33
33
|
serverScripts: [],
|
|
34
|
+
requiredItems: [],
|
|
34
35
|
needsKey: "",
|
|
35
36
|
dropOff: "",
|
|
36
37
|
...detail.options
|
|
@@ -74,6 +75,13 @@ let complete = function complete(explorerBuild) {
|
|
|
74
75
|
}));
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
let foundItemIDs = [];
|
|
79
|
+
for (let m = 0; m < detail.options.requiredItems.length; m++) {
|
|
80
|
+
let foundItem = await item.findOne({name: detail.options.requiredItems[m]});
|
|
81
|
+
|
|
82
|
+
foundItemIDs.push(foundItem._id);
|
|
83
|
+
}
|
|
84
|
+
|
|
77
85
|
let context = {
|
|
78
86
|
siteTitle: "NotherBase",
|
|
79
87
|
user: req.session.currentUserFull,
|
|
@@ -82,6 +90,7 @@ let complete = function complete(explorerBuild) {
|
|
|
82
90
|
main: detail.options.main,
|
|
83
91
|
localScripts: detail.options.localScripts,
|
|
84
92
|
serverScriptReturns: serverScriptReturns,
|
|
93
|
+
itemIDs: foundItemIDs,
|
|
85
94
|
pov: req.query.pov,
|
|
86
95
|
inventory: foundInventory,
|
|
87
96
|
query: req.query
|
|
@@ -121,8 +130,9 @@ let complete = function complete(explorerBuild) {
|
|
|
121
130
|
user: null,
|
|
122
131
|
styles: [`${dir}/${explorerBuild.void}/styles/void`],
|
|
123
132
|
externalStyles: [],
|
|
124
|
-
|
|
133
|
+
localScripts: [],
|
|
125
134
|
inventory: null,
|
|
135
|
+
itemIDs: [],
|
|
126
136
|
main: `${dir}/${explorerBuild.void}/index`
|
|
127
137
|
});
|
|
128
138
|
});
|
package/controllers/inventory.js
CHANGED
|
@@ -7,7 +7,7 @@ const { inventory, item, connectionSuccess } = require("../models");
|
|
|
7
7
|
router.get("/", async function(req, res) {
|
|
8
8
|
if (connectionSuccess) {
|
|
9
9
|
try {
|
|
10
|
-
if (req.session.
|
|
10
|
+
if (req.session.currentUser) {
|
|
11
11
|
let foundInventory = await inventory.findOne({user: req.session.currentUser}).populate("items.item");
|
|
12
12
|
|
|
13
13
|
res.status(200).send({ foundInventory: foundInventory });
|
|
@@ -74,10 +74,8 @@ router.post("/", async function(req, res) {
|
|
|
74
74
|
|
|
75
75
|
if (!holding) {
|
|
76
76
|
if (req.body.change.amount > 0) {
|
|
77
|
-
let foundItem = await item.findById(req.body.change.item);
|
|
78
|
-
|
|
79
77
|
foundInventory.items.push({
|
|
80
|
-
item:
|
|
78
|
+
item: req.body.change.item,
|
|
81
79
|
amount: req.body.change.amount
|
|
82
80
|
});
|
|
83
81
|
|
package/controllers/the-front.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
const { inventory, connectionSuccess } = require("../models");
|
|
1
|
+
const { user, inventory, connectionSuccess } = require("../models");
|
|
2
2
|
|
|
3
3
|
let router = require("express").Router();
|
|
4
4
|
let dir = "";
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
let front = function front(detail) {
|
|
7
8
|
detail.options = {
|
|
8
9
|
styles: [],
|
|
9
10
|
externalStyles: [],
|
|
10
11
|
localScripts: [],
|
|
12
|
+
requiredItems: [],
|
|
11
13
|
needsKey: "",
|
|
12
14
|
dropOff: "",
|
|
13
15
|
...detail.options
|
|
@@ -28,11 +30,18 @@ let front = function front(detail) {
|
|
|
28
30
|
return script;
|
|
29
31
|
});
|
|
30
32
|
|
|
31
|
-
detail.options.main = "index";
|
|
32
|
-
if (detail.name !== "") detail.options.main = detail.name;
|
|
33
|
-
detail.options.main = `${dir}/views/${detail.options.main}`;
|
|
34
|
-
|
|
35
33
|
router.get(`/${detail.name}`, async function(req, res) {
|
|
34
|
+
detail.options.main = "index";
|
|
35
|
+
if (detail.name !== "") detail.options.main = detail.name;
|
|
36
|
+
detail.options.main = `${dir}/views/${detail.options.main}`;
|
|
37
|
+
|
|
38
|
+
let foundItemIDs = [];
|
|
39
|
+
for (let m = 0; m < detail.options.requiredItems.length; m++) {
|
|
40
|
+
let foundItem = await item.findOne({name: detail.options.requiredItems[m]});
|
|
41
|
+
|
|
42
|
+
foundItemIDs.push(foundItem._id);
|
|
43
|
+
}
|
|
44
|
+
|
|
36
45
|
let context = {
|
|
37
46
|
siteTitle: "NotherBase | The Front",
|
|
38
47
|
user: null,
|
|
@@ -40,18 +49,17 @@ let front = function front(detail) {
|
|
|
40
49
|
externalStyles: detail.options.externalStyles,
|
|
41
50
|
main: detail.options.main,
|
|
42
51
|
localScripts: detail.options.localScripts,
|
|
52
|
+
itemIDs: foundItemIDs,
|
|
43
53
|
inventory: null,
|
|
44
54
|
query: req.query
|
|
45
55
|
}
|
|
46
56
|
|
|
47
57
|
if (connectionSuccess) {
|
|
48
|
-
context.user = req.session.currentUserFull;
|
|
49
|
-
|
|
50
58
|
try {
|
|
51
|
-
|
|
52
|
-
context.inventory =
|
|
59
|
+
context.user = await user.findById(req.session.currentUser);
|
|
60
|
+
context.inventory = await inventory.findOne({ user: req.session.currentUser }).populate("items.item");
|
|
53
61
|
|
|
54
|
-
if (detail.options.needsKey !== "" &&
|
|
62
|
+
if (detail.options.needsKey !== "" && context.inventory) {
|
|
55
63
|
let hasKey = false;
|
|
56
64
|
|
|
57
65
|
for (let i = 0; i < foundInventory.items.length; i++) {
|
package/controllers/user.js
CHANGED
|
@@ -1,15 +1,173 @@
|
|
|
1
1
|
const express = require("express");
|
|
2
2
|
const router = express.Router();
|
|
3
3
|
const bcrypt = require("bcrypt");
|
|
4
|
+
const nodemailer = require("nodemailer");
|
|
4
5
|
|
|
5
6
|
// Import my Data
|
|
6
|
-
const { user, inventory } = require("../models");
|
|
7
|
+
const { user, inventory, sendMail } = require("../models");
|
|
7
8
|
|
|
8
9
|
const authCheck = require("./authCheck");
|
|
9
10
|
|
|
11
|
+
let getAttributes = async function getAttributes(userID) {
|
|
12
|
+
try {
|
|
13
|
+
let foundUser = await user.findById(userID, 'attributes');
|
|
14
|
+
|
|
15
|
+
if (!foundUser.attributes || foundUser.attributes == {}) {
|
|
16
|
+
foundUser.attributes = {
|
|
17
|
+
translation: 0,
|
|
18
|
+
strength: 0,
|
|
19
|
+
agility: 0,
|
|
20
|
+
defense: 0
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
await foundUser.save();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return foundUser;
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.log(err);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
router.get("/basic", async function(req, res) {
|
|
35
|
+
try {
|
|
36
|
+
if (req.session.currentUser) {
|
|
37
|
+
let foundUser = await user.findById(req.session.currentUser, 'username email');
|
|
38
|
+
|
|
39
|
+
res.status(200).send(foundUser);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
res.status(401).send("Please login first!");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch(err) {
|
|
46
|
+
console.log(err);
|
|
47
|
+
res.status(500).end();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
router.get("/logout", authCheck, async function(req, res) {
|
|
52
|
+
try {
|
|
53
|
+
await req.session.destroy();
|
|
54
|
+
|
|
55
|
+
res.redirect(`/`);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
console.log(err);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
router.get("/all", async function(req, res) {
|
|
63
|
+
try {
|
|
64
|
+
let foundUsers = await user.find({}, 'username coin home authLevels location attributes');
|
|
65
|
+
|
|
66
|
+
res.status(200).send({ foundUsers: foundUsers });
|
|
67
|
+
}
|
|
68
|
+
catch(err) {
|
|
69
|
+
res.status(500).end();
|
|
70
|
+
console.log(err);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
router.get("/password-reset", async function(req, res) {
|
|
75
|
+
try {
|
|
76
|
+
let foundUser = await user.findOne({ email: req.query.email });
|
|
77
|
+
|
|
78
|
+
if (foundUser) {
|
|
79
|
+
foundUser.reset.token = Math.floor(Math.random() * 9999);
|
|
80
|
+
foundUser.reset.exp = Date.now() + (1000 * 60 * 30);
|
|
81
|
+
|
|
82
|
+
await foundUser.save();
|
|
83
|
+
|
|
84
|
+
sendMail.passwordReset(req.query.email, foundUser.reset.token);
|
|
85
|
+
|
|
86
|
+
res.status(200).send("Reset link sent!");
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
res.status(401).send("Failed: user not found!");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch(err) {
|
|
93
|
+
console.log(err);
|
|
94
|
+
|
|
95
|
+
res.status(500).send("Update Failed: Database error!");
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
router.post("/password-reset/:token", async function(req, res) {
|
|
100
|
+
try {
|
|
101
|
+
const foundUser = await user.findOne({ "reset.token": req.params.token });
|
|
102
|
+
|
|
103
|
+
if (foundUser) {
|
|
104
|
+
if (foundUser.reset.exp > Date.now()) {
|
|
105
|
+
if (req.body.password !== req.body.confirmation) res.status(400).send("Passwords must match!");
|
|
106
|
+
else {
|
|
107
|
+
foundUser.reset = {};
|
|
108
|
+
|
|
109
|
+
const salt = await bcrypt.genSalt(10);
|
|
110
|
+
const hash = await bcrypt.hash(req.body.password, salt);
|
|
111
|
+
|
|
112
|
+
foundUser.password = hash;
|
|
113
|
+
await foundUser.save();
|
|
114
|
+
|
|
115
|
+
res.status(200).send("Password changed successfully!");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else res.status(498).send("Reset token expired!");
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
res.status(404).send("Reset token not valid!");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch(err) {
|
|
125
|
+
console.log(err);
|
|
126
|
+
|
|
127
|
+
res.status(500).send("Internal Server Error!");
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
router.get("/attributes", async function(req, res) {
|
|
132
|
+
try {
|
|
133
|
+
if (req.session.currentUser) {
|
|
134
|
+
let foundUser = await getAttributes(req.session.currentUser);
|
|
135
|
+
|
|
136
|
+
res.status(200).send(foundUser.attributes);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
res.status(401).send("Please login first!");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch(err) {
|
|
143
|
+
res.status(500).end();
|
|
144
|
+
console.log(err);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
router.get("/attributes/check", authCheck, async function(req, res) {
|
|
149
|
+
try {
|
|
150
|
+
if (req.session.currentUser) {
|
|
151
|
+
let foundUser = await getAttributes(req.session.currentUser);
|
|
152
|
+
|
|
153
|
+
if (foundUser.attributes[req.query.check] >= parseInt(req.query.against)) {
|
|
154
|
+
res.status(200).send("Pass");
|
|
155
|
+
}
|
|
156
|
+
else res.status(200).send("Fail");
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
res.status(401).send("Please login first!");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch(err) {
|
|
163
|
+
res.status(500).end();
|
|
164
|
+
console.log(err);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
|
|
10
168
|
router.post("/register", async function(req, res) {
|
|
11
169
|
try {
|
|
12
|
-
|
|
170
|
+
let foundAccount = await user.findOne({ username: req.body.username });
|
|
13
171
|
|
|
14
172
|
if (!foundAccount) {
|
|
15
173
|
const salt = await bcrypt.genSalt(10);
|
|
@@ -18,10 +176,17 @@ router.post("/register", async function(req, res) {
|
|
|
18
176
|
let qAuth = await user.create({
|
|
19
177
|
username: req.body.username,
|
|
20
178
|
password: hash,
|
|
21
|
-
email:
|
|
179
|
+
email: req.body.email,
|
|
22
180
|
coin: 0,
|
|
23
181
|
home: "/",
|
|
24
|
-
authLevels: [ "Basic" ]
|
|
182
|
+
authLevels: [ "Basic" ],
|
|
183
|
+
location: "/the-front",
|
|
184
|
+
attributes: {
|
|
185
|
+
translation: 0,
|
|
186
|
+
strength: 0,
|
|
187
|
+
agility: 0,
|
|
188
|
+
defense: 0
|
|
189
|
+
}
|
|
25
190
|
});
|
|
26
191
|
|
|
27
192
|
await inventory.create({
|
|
@@ -44,12 +209,11 @@ router.post("/register", async function(req, res) {
|
|
|
44
209
|
|
|
45
210
|
router.post("/login", async function(req, res) {
|
|
46
211
|
try {
|
|
47
|
-
const foundAccount = await user.findOne({
|
|
212
|
+
const foundAccount = await user.findOne({ email: req.body.email });
|
|
48
213
|
|
|
49
214
|
if (foundAccount) {
|
|
50
215
|
if (await bcrypt.compare(req.body.password, foundAccount.password)) {
|
|
51
216
|
req.session.currentUser = foundAccount._id;
|
|
52
|
-
req.session.currentUserFull = foundAccount;
|
|
53
217
|
|
|
54
218
|
res.status(200).send("Login successful!");
|
|
55
219
|
}
|
|
@@ -58,7 +222,7 @@ router.post("/login", async function(req, res) {
|
|
|
58
222
|
}
|
|
59
223
|
}
|
|
60
224
|
else {
|
|
61
|
-
res.status(401).send("Login Failed:
|
|
225
|
+
res.status(401).send("Login Failed: Email not found!");
|
|
62
226
|
}
|
|
63
227
|
}
|
|
64
228
|
catch(err) {
|
|
@@ -68,41 +232,171 @@ router.post("/login", async function(req, res) {
|
|
|
68
232
|
}
|
|
69
233
|
});
|
|
70
234
|
|
|
71
|
-
router.
|
|
235
|
+
router.post("/email", async function(req, res) {
|
|
72
236
|
try {
|
|
73
|
-
|
|
237
|
+
if (req.session.currentUser) {
|
|
238
|
+
let foundAccount = await user.findOne({ email: req.body.email });
|
|
74
239
|
|
|
75
|
-
|
|
240
|
+
if (!foundAccount) {
|
|
241
|
+
let foundUser = await user.findById(req.session.currentUser);
|
|
242
|
+
|
|
243
|
+
if (foundUser) {
|
|
244
|
+
foundUser.email = req.body.email;
|
|
245
|
+
await foundUser.save();
|
|
246
|
+
|
|
247
|
+
res.status(200).send("Update successful!");
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
res.status(401).send("Update Failed: user not found!");
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
res.status(401).send("Update Failed: email already in use!");
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
res.status(401).send("Please login first!");
|
|
259
|
+
}
|
|
76
260
|
}
|
|
77
|
-
catch {
|
|
261
|
+
catch(err) {
|
|
78
262
|
console.log(err);
|
|
263
|
+
|
|
264
|
+
res.status(500).send("Update Failed: Database error!");
|
|
79
265
|
}
|
|
80
266
|
});
|
|
81
267
|
|
|
82
|
-
router.
|
|
268
|
+
router.post("/username", async function(req, res) {
|
|
83
269
|
try {
|
|
84
|
-
|
|
270
|
+
if (req.session.currentUser) {
|
|
271
|
+
let foundAccount = await user.findOne({ username: req.body.username });
|
|
85
272
|
|
|
86
|
-
|
|
273
|
+
if (!foundAccount) {
|
|
274
|
+
let foundUser = await user.findById(req.session.currentUser);
|
|
275
|
+
|
|
276
|
+
if (foundUser) {
|
|
277
|
+
foundUser.username = req.body.username;
|
|
278
|
+
await foundUser.save();
|
|
279
|
+
|
|
280
|
+
res.status(200).send("Update successful!");
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
res.status(401).send("Update Failed: user not found!");
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
res.status(401).send("Update Failed: username taken!");
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
res.status(401).send("Please login first!");
|
|
292
|
+
}
|
|
87
293
|
}
|
|
88
294
|
catch(err) {
|
|
89
|
-
res.status(500).end();
|
|
90
295
|
console.log(err);
|
|
296
|
+
|
|
297
|
+
res.status(500).send("Update Failed: Database error!");
|
|
91
298
|
}
|
|
92
299
|
});
|
|
93
300
|
|
|
94
|
-
router.
|
|
301
|
+
router.post("/password", async function(req, res) {
|
|
302
|
+
try {
|
|
303
|
+
if (req.session.currentUser) {
|
|
304
|
+
let foundUser = await user.findById(req.session.currentUser);
|
|
305
|
+
|
|
306
|
+
if (foundUser) {
|
|
307
|
+
const salt = await bcrypt.genSalt(10);
|
|
308
|
+
const hash = await bcrypt.hash(req.body.password, salt);
|
|
309
|
+
foundUser.password = hash;
|
|
310
|
+
await foundUser.save();
|
|
311
|
+
|
|
312
|
+
res.status(200).send("Update successful!");
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
res.status(401).send("Update Failed: user not found!");
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
res.status(401).send("Please login first!");
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch(err) {
|
|
323
|
+
console.log(err);
|
|
324
|
+
|
|
325
|
+
res.status(500).send("Update Failed: Database error!");
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
router.post("/attributes", async function(req, res) {
|
|
95
330
|
try {
|
|
96
|
-
|
|
331
|
+
if (req.session.currentUser) {
|
|
332
|
+
let foundUser = await getAttributes(req.session.currentUser);
|
|
97
333
|
|
|
98
|
-
|
|
334
|
+
if (foundUser) {
|
|
335
|
+
foundUser.attributes[req.body.change] = parseInt(req.body.to);
|
|
336
|
+
await foundUser.save();
|
|
99
337
|
|
|
100
|
-
|
|
338
|
+
res.status(200).send("AttUp successful!");
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
res.status(401).send("AttUp Failed: user not found!");
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
res.status(401).send("Please login first!");
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch(err) {
|
|
349
|
+
console.log(err);
|
|
350
|
+
|
|
351
|
+
res.status(500).send("AttUp Failed: Database error!");
|
|
352
|
+
}
|
|
353
|
+
});
|
|
101
354
|
|
|
102
|
-
|
|
355
|
+
router.post("/attributes/increment", async function(req, res) {
|
|
356
|
+
try {
|
|
357
|
+
if (req.session.currentUser) {
|
|
358
|
+
let foundUser = await getAttributes(req.session.currentUser);
|
|
359
|
+
|
|
360
|
+
if (foundUser) {
|
|
361
|
+
if (foundUser.attributes[req.body.change] < req.body.max) {
|
|
362
|
+
foundUser.attributes[req.body.change]++;
|
|
363
|
+
await foundUser.save();
|
|
364
|
+
res.status(200).send({ newLevel: foundUser.attributes[req.body.change] });
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
res.status(304).send({ newLevel: foundUser.attributes[req.body.change] });
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
res.status(401).send("AttUp Failed: user not found!");
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
res.status(401).send("Please login first!");
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
catch(err) {
|
|
379
|
+
console.log(err);
|
|
380
|
+
|
|
381
|
+
res.status(500).send("AttUp Failed: Database error!");
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
router.delete("/", authCheck, async function(req, res) {
|
|
386
|
+
try {
|
|
387
|
+
if (req.session.currentUser) {
|
|
388
|
+
await user.findByIdAndDelete(req.session.currentUser);
|
|
389
|
+
await req.session.destroy();
|
|
390
|
+
|
|
391
|
+
res.redirect("/");
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
res.status(401).send("Please login first!");
|
|
395
|
+
}
|
|
103
396
|
}
|
|
104
397
|
catch {
|
|
105
398
|
console.log(err);
|
|
399
|
+
res.status(500).send("Delete Failed: Database error!");
|
|
106
400
|
}
|
|
107
401
|
});
|
|
108
402
|
|
package/models/index.js
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const nodemailer = require("nodemailer");
|
|
2
|
+
|
|
3
|
+
const passwordReset = async (toEmail, resetToken) => {
|
|
4
|
+
var transporter = nodemailer.createTransport({
|
|
5
|
+
service: 'gmail',
|
|
6
|
+
auth: {
|
|
7
|
+
user: process.env.NOREPLY,
|
|
8
|
+
pass: process.env.NOREPLYPW
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
var mailOptions = {
|
|
13
|
+
from: process.env.NOREPLY,
|
|
14
|
+
to: toEmail,
|
|
15
|
+
subject: 'Password Reset for NotherBase',
|
|
16
|
+
html: `<h1>Your One-Time Password Reset Code: ${resetToken}<h1>`
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
transporter.sendMail(mailOptions, function(error, info){
|
|
20
|
+
if (error) console.log(error);
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
module.exports = {
|
|
25
|
+
passwordReset: passwordReset
|
|
26
|
+
};
|
package/models/user.js
CHANGED
|
@@ -9,7 +9,17 @@ const user = mongoose.model('users',
|
|
|
9
9
|
coin: Number,
|
|
10
10
|
home: String,
|
|
11
11
|
authLevels: [ String ],
|
|
12
|
-
location: String
|
|
12
|
+
location: String,
|
|
13
|
+
attributes: {
|
|
14
|
+
translation: Number,
|
|
15
|
+
strength: Number,
|
|
16
|
+
agility: Number,
|
|
17
|
+
defense: Number
|
|
18
|
+
},
|
|
19
|
+
reset: {
|
|
20
|
+
token: Number,
|
|
21
|
+
exp: Number
|
|
22
|
+
}
|
|
13
23
|
})
|
|
14
24
|
);
|
|
15
25
|
|
package/package.json
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "notherbase-fs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "Functions to help make developing for NotherBase easier.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "nodemon test.js"
|
|
7
|
+
"test": "nodemon test.js",
|
|
8
|
+
"gmail-auth": "node gmail-auth.js",
|
|
9
|
+
"gmail-token": "node gmail-token.js"
|
|
8
10
|
},
|
|
9
11
|
"repository": {
|
|
10
12
|
"type": "git",
|
|
@@ -23,8 +25,10 @@
|
|
|
23
25
|
"ejs": "^3.1.6",
|
|
24
26
|
"express": "^4.17.1",
|
|
25
27
|
"express-session": "^1.17.2",
|
|
28
|
+
"googleapis": "^100.0.0",
|
|
26
29
|
"method-override": "^3.0.0",
|
|
27
30
|
"mongoose": "^6.1.7",
|
|
31
|
+
"nodemailer": "^6.7.5",
|
|
28
32
|
"serve-favicon": "^2.5.0",
|
|
29
33
|
"socket.io": "^4.4.1"
|
|
30
34
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
.content#account {
|
|
2
|
+
padding: 10px;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.content#account hr {
|
|
6
|
+
margin: 10px 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.content#account #info {
|
|
10
|
+
text-align: center;
|
|
11
|
+
width: 100%;
|
|
12
|
+
margin-top: 40px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.content#account .setting {
|
|
16
|
+
background: var(--darkBgColor);
|
|
17
|
+
padding: 25px;
|
|
18
|
+
border-radius: 5px;
|
|
19
|
+
display: flex;
|
|
20
|
+
justify-content: center;
|
|
21
|
+
text-align: center;
|
|
22
|
+
flex-wrap: wrap;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.content#account p {
|
|
26
|
+
width: 100%;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.content#account button {
|
|
30
|
+
width: 40%;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.content#account .edit {
|
|
34
|
+
background: var(--darkWoodColor);
|
|
35
|
+
padding: 25px;
|
|
36
|
+
border-radius: 5px;
|
|
37
|
+
display: flex;
|
|
38
|
+
justify-content: center;
|
|
39
|
+
text-align: center;
|
|
40
|
+
flex-wrap: wrap;
|
|
41
|
+
}
|