@@ -14,11 +14,11 @@ app.set('views', path.join(__dirname, 'views'));
1414
1515// Create a MySQL connection pool
1616const 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
368422app . 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+
374431app . 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
0 commit comments