Skip to content

Commit 92d30a8

Browse files
committed
feat(0.0.7): added updates
there needs to be a HUGE refactor once it's done
1 parent 75c1e4c commit 92d30a8

File tree

7 files changed

+465
-42
lines changed

7 files changed

+465
-42
lines changed

api/index.ts

Lines changed: 188 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ app.set('views', path.join(__dirname, 'views'));
1414

1515
// Create a MySQL connection pool
1616
const pool = mysql.createPool({
17-
host: process.env.MYSQL_ADDRESS,
18-
port: process.env.MYSQL_PORT,
19-
user: process.env.MYSQL_USER,
20-
password: process.env.MYSQL_PASSWORD,
21-
database: process.env.MYSQL_DATABASE,
17+
host: process.env.MYSQL_ADDRESS as string,
18+
port: parseInt(process.env.MYSQL_PORT as string),
19+
user: process.env.MYSQL_USER as string,
20+
password: process.env.MYSQL_PASSWORD as string,
21+
database: process.env.MYSQL_DATABASE as string,
2222
});
2323

2424
// Create the basic information tables
@@ -82,9 +82,9 @@ async function initInfoTables() {
8282

8383
pool.query(createGuildsTable, (err, results) => {
8484
if (err) {
85-
console.error('Error creating excludes table:', err);
85+
console.error('Error creating guilds info table:', err);
8686
} else {
87-
console.log('Excludes table created:', results);
87+
console.log('Guilds info table created:', results);
8888
}
8989
});
9090
}
@@ -168,7 +168,7 @@ app.post('/post/:guild/:user/:auth', (req, res) => {
168168
return res.status(500).json({ message: 'Internal server error' });
169169
}
170170

171-
const getXpQuery = `SELECT xp FROM \`${guild}\` WHERE user_id = ?`;
171+
const getXpQuery = `SELECT xp, user_level FROM \`${guild}\` WHERE user_id = ?`;
172172

173173
pool.query(getXpQuery, [user], (err, results) => {
174174
if (err) {
@@ -177,6 +177,7 @@ app.post('/post/:guild/:user/:auth', (req, res) => {
177177
}
178178

179179
const currentXp = results.length ? results[0].xp : 0;
180+
const currentLevelSaved = results.length ? results[0].user_level : 0;
180181
const newXp = currentXp + xpValue;
181182

182183
const currentLevel = Math.floor(Math.sqrt(newXp / 100));
@@ -202,9 +203,9 @@ app.post('/post/:guild/:user/:auth', (req, res) => {
202203
pool.query(updateQuery, [user, newXp, pfp, name, nickname, currentLevel, xpNeededForNextLevel, progressToNextLevel.toFixed(2)], (err, results) => {
203204
if (err) {
204205
console.error('Error updating XP:', err);
205-
return res.status(500).json({ message: 'Internal server error' });
206+
return res.status(500).json({ success: false, message: 'Internal server error' });
206207
} else {
207-
res.status(200).json(results);
208+
res.status(200).json({ success: true, sendUpdateEvent: currentLevelSaved !== currentLevel, level: currentLevel});
208209
}
209210
});
210211
});
@@ -275,14 +276,16 @@ app.get('/get/:guild', async (req, res) => {
275276
}
276277
});
277278

278-
app.post('/admin/:action/:guild/:target', (req, res) => {
279+
app.post('/admin/:action/:guild/:target', async (req, res) => {
279280
const { guild, action, target } = req.params;
280-
const { auth } = req.body;
281+
const { auth, extraData } = req.body;
281282

282283
if (auth !== process.env.AUTH) {
283284
return res.status(403).json({ message: 'Access denied. Auth token is missing' });
284285
}
285286

287+
let apiSuccess;
288+
286289
switch (action) {
287290
case 'include':
288291
// target: channel id
@@ -293,19 +296,70 @@ app.post('/admin/:action/:guild/:target', (req, res) => {
293296
// run function to exclude target from guild
294297
break;
295298
case 'updates':
296-
if (target !== 'enable') {
299+
if (target !== 'enable' && target !== 'disable' && target !== 'get') {
297300
return res.status(400).json({ message: 'Illegal request' });
298301
}
299-
// targets: get (it will toggle it on the database)
300-
// run function to disable/enable updates for guild
301-
break;
302+
303+
switch (target) {
304+
case 'enable':
305+
if (!extraData || !extraData.channelId) {
306+
return res.status(400).json({ message: 'Illegal request' });
307+
}
308+
try {
309+
const data = await adminUpdatesAdd(guild, extraData.channelId);
310+
return res.status(200).json(data);
311+
} catch (error) {
312+
return res.status(500).json({ message: 'Internal server error' });
313+
}
314+
case 'disable':
315+
try {
316+
const data = await adminUpdatesRemove(guild);
317+
return res.status(200).json(data);
318+
} catch (error) {
319+
return res.status(500).json({ message: 'Internal server error' });
320+
}
321+
default:
322+
try {
323+
const data = await adminUpdatesGet(guild);
324+
return res.status(200).json(data);
325+
} catch (error) {
326+
return res.status(500).json({ message: 'Internal server error' });
327+
}
328+
}
302329
case 'roles':
303-
if (target !== 'add' && target !== 'remove') {
330+
if (target !== 'add' && target !== 'remove' && target !== 'get') {
304331
return res.status(400).json({ message: 'Illegal request' });
305332
}
306-
// targets: add, remove
307-
// run function to add/remove level roles for guild
308-
break;
333+
334+
if ((target === 'add' || target === 'remove') && !extraData) {
335+
return res.status(400).json({ message: 'Illegal request' });
336+
}
337+
338+
switch (target) {
339+
case 'get':
340+
try {
341+
const data = await adminRolesGet(guild);
342+
return res.status(200).json(data);
343+
} catch (error) {
344+
return res.status(500).json({ message: 'Internal server error' });
345+
}
346+
case 'remove':
347+
try {
348+
const data = await adminRolesRemove(guild, extraData.role);
349+
return res.status(200).json(data);
350+
} catch (error) {
351+
return res.status(500).json({ message: 'Internal server error' });
352+
}
353+
case 'add':
354+
try {
355+
const data = await adminRolesAdd(guild, extraData.role, extraData.level);
356+
return res.status(200).json(data);
357+
} catch (error) {
358+
return res.status(500).json({ message: 'Internal server error' });
359+
}
360+
default:
361+
return res.status(500).json({ message: 'Internal server error' });
362+
}
309363
default:
310364
return res.status(400).json({ message: 'Illegal request' });
311365
}
@@ -367,10 +421,123 @@ async function getBotInfo() {
367421

368422
app.get('/', async (req, res) => {
369423
const botInfo = await getBotInfo();
370-
console.log(botInfo)
371424
res.render('index', { botInfo: botInfo });
372425
});
373426

427+
app.get('/invite', (req, res) => {
428+
res.status(308).redirect('https://discord.com/oauth2/authorize?client_id=1245807579624378601&permissions=1099780115520&integration_type=0&scope=bot+applications.commands')
429+
})
430+
374431
app.listen(PORT, () => {
375432
console.log(`Server running on http://localhost:${PORT}`);
376433
});
434+
435+
//#region Admin: Roles
436+
async function adminRolesGet(guild: string) {
437+
const selectRolesQuery = `SELECT role_id, level FROM info_roles WHERE guild_id = ?`;
438+
439+
return new Promise((resolve, reject) => {
440+
pool.query(selectRolesQuery, [guild], (err, results) => {
441+
if (err) {
442+
console.error('Error fetching roles:', err);
443+
reject(err);
444+
} else {
445+
resolve(results);
446+
}
447+
});
448+
});
449+
}
450+
451+
async function adminRolesRemove(guild: string, role: string) {
452+
const deleteRoleQuery = `
453+
DELETE FROM info_roles
454+
WHERE guild_id = ? AND role_id = ?
455+
`;
456+
457+
return new Promise((resolve, reject) => {
458+
pool.query(deleteRoleQuery, [guild, role], (err, results) => {
459+
if (err) {
460+
console.error('Error removing role:', err);
461+
reject(err);
462+
} else {
463+
resolve(results);
464+
}
465+
});
466+
});
467+
}
468+
469+
async function adminRolesAdd(guild: string, role: string, level: number) {
470+
const insertRoleQuery = `
471+
INSERT INTO info_roles (guild_id, role_id, level)
472+
VALUES (?, ?, ?)
473+
`;
474+
475+
return new Promise((resolve, reject) => {
476+
pool.query(insertRoleQuery, [guild, role, level], (err, results) => {
477+
if (err) {
478+
console.error('Error adding role:', err);
479+
reject(err);
480+
} else {
481+
resolve(results);
482+
}
483+
});
484+
});
485+
}
486+
//#endregion
487+
488+
//#region Admin: Updates
489+
async function adminUpdatesGet(guildId: string) {
490+
const selectUpdatesQuery = `SELECT * FROM info_updates WHERE guild_id = ?`;
491+
492+
return new Promise((resolve, reject) => {
493+
pool.query(selectUpdatesQuery, [guildId], (err, results) => {
494+
if (err) {
495+
console.error('Error fetching updates:', err);
496+
reject(err);
497+
} else {
498+
resolve(results);
499+
}
500+
});
501+
});
502+
}
503+
504+
async function adminUpdatesAdd(guildId: string, channelId: string) {
505+
const insertUpdatesQuery = `
506+
INSERT INTO info_updates (guild_id, enabled, channel_id)
507+
VALUES (?, TRUE, ?)
508+
ON DUPLICATE KEY UPDATE
509+
enabled = TRUE,
510+
channel_id = ?
511+
`;
512+
513+
return new Promise((resolve, reject) => {
514+
pool.query(insertUpdatesQuery, [guildId, channelId, channelId], (err, results) => {
515+
if (err) {
516+
console.error('Error enabling updates:', err);
517+
reject(err);
518+
} else {
519+
resolve(results);
520+
}
521+
});
522+
});
523+
}
524+
525+
async function adminUpdatesRemove(guildId: string) {
526+
const deleteUpdatesQuery = `
527+
DELETE FROM info_updates
528+
WHERE guild_id = ?
529+
`;
530+
531+
return new Promise((resolve, reject) => {
532+
pool.query(deleteUpdatesQuery, [guildId], (err, results) => {
533+
if (err) {
534+
console.error('Error disabling updates:', err);
535+
reject(err);
536+
} else {
537+
resolve(results);
538+
}
539+
});
540+
});
541+
}
542+
543+
//#endregion

api/views/leaderboard.ejs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
</h1>
2828
<img class="userImage" src="<%= user.user_pfp %>" alt="User image for <%= user.user_name %>">
2929
<div class="userInfo">
30-
<h2 class="userName">
31-
<%= user.user_nickname %> (@<%= user.user_name %>)
30+
<h2 class="userName" title="@<%= user.user_name %>">
31+
<%= user.user_nickname %>
3232
</h2>
3333
<p class="userXP">XP: <%= user.xp %>
3434
</p>

0 commit comments

Comments
 (0)