11import express from 'express' ;
22import cors from 'cors' ;
33import mysql from 'mysql2' ;
4+ import ejs from 'ejs' ;
5+ import path from 'path' ;
46
57const app = express ( ) ;
68const PORT = 18103 ;
7- const localhostIps = [ '::1' , '127.0.0.1' , '::ffff:127.0.0.1' ] ;
89
910app . use ( cors ( ) ) ;
10-
11- // Middleware to restrict access to localhost for POST requests
12- function restrictToLocalhost ( req , res , next ) {
13- const clientIp = req . connection . remoteAddress ;
14- if ( localhostIps . includes ( clientIp ) ) {
15- next ( ) ;
16- }
17- else {
18- return res . status ( 403 ) . json ( { message : 'Access denied. Your IP address is blocked from this endpoint' } ) ;
19- }
20- }
11+ app . use ( express . json ( ) ) ;
12+ app . use ( express . static ( path . join ( __dirname , 'public' ) ) ) ;
13+ app . set ( 'view engine' , 'ejs' ) ;
14+ app . set ( 'views' , path . join ( __dirname , 'views' ) ) ;
2115
2216// Create a MySQL connection pool
2317const pool = mysql . createPool ( {
@@ -28,13 +22,86 @@ const pool = mysql.createPool({
2822 database : process . env . MYSQL_DATABASE ,
2923} ) ;
3024
25+ // Create the basic information tables
26+ async function initInfoTables ( ) {
27+ const createUpdatesTable = `
28+ CREATE TABLE IF NOT EXISTS info_updates (
29+ guild_id VARCHAR(255) NOT NULL,
30+ enabled BOOLEAN DEFAULT FALSE,
31+ channel_id VARCHAR(255),
32+ PRIMARY KEY (guild_id)
33+ )
34+ ` ;
35+ const createRolesTable = `
36+ CREATE TABLE IF NOT EXISTS info_roles (
37+ guild_id VARCHAR(255) NOT NULL,
38+ role_id VARCHAR(255) NOT NULL,
39+ level INT NOT NULL,
40+ PRIMARY KEY (role_id)
41+ )
42+ ` ;
43+ const createExcludesTable = `
44+ CREATE TABLE IF NOT EXISTS info_excludes (
45+ channel_id VARCHAR(255) NOT NULL,
46+ guild_id VARCHAR(255) NOT NULL,
47+ PRIMARY KEY (channel_id)
48+ )
49+ ` ;
50+ const createGuildsTable = `
51+ CREATE TABLE IF NOT EXISTS info_guilds (
52+ guild_id VARCHAR(255) NOT NULL,
53+ guild_name VARCHAR(255),
54+ guild_icon VARCHAR(255),
55+ guild_members INT,
56+ PRIMARY KEY (guild_id)
57+ )
58+ ` ;
59+
60+ pool . query ( createUpdatesTable , ( err , results ) => {
61+ if ( err ) {
62+ console . error ( 'Error creating updates table:' , err ) ;
63+ } else {
64+ console . log ( 'Updates table created:' , results ) ;
65+ }
66+ } ) ;
67+
68+ pool . query ( createRolesTable , ( err , results ) => {
69+ if ( err ) {
70+ console . error ( 'Error creating roles table:' , err ) ;
71+ } else {
72+ console . log ( 'Roles table created:' , results ) ;
73+ }
74+ } ) ;
75+
76+ pool . query ( createExcludesTable , ( err , results ) => {
77+ if ( err ) {
78+ console . error ( 'Error creating excludes table:' , err ) ;
79+ } else {
80+ console . log ( 'Excludes table created:' , results ) ;
81+ }
82+ } ) ;
83+
84+ pool . query ( createGuildsTable , ( err , results ) => {
85+ if ( err ) {
86+ console . error ( 'Error creating excludes table:' , err ) ;
87+ } else {
88+ console . log ( 'Excludes table created:' , results ) ;
89+ }
90+ } ) ;
91+ }
92+ console . log ( 'Initializing info tables...' ) ;
93+ await initInfoTables ( ) ;
94+ console . log ( 'Info tables initialized' ) ;
95+
3196// Ensure the table for a specific guild exists
32- function ensureGuildTableExists ( guild , callback ) {
33- const tableName = `${ guild } ` ;
97+ async function ensureGuildTableExists ( guild , callback ) {
3498 const createTableQuery = `
35- CREATE TABLE IF NOT EXISTS \`${ tableName } \` (
99+ CREATE TABLE IF NOT EXISTS \`${ guild } \` (
36100 user_id VARCHAR(255) NOT NULL,
37101 xp INT DEFAULT 0,
102+ user_pfp TINYTEXT,
103+ user_name TINYTEXT,
104+ user_nickname TINYTEXT,
38105 PRIMARY KEY (user_id)
39106 )
40107 ` ;
@@ -50,29 +117,44 @@ function ensureGuildTableExists(guild, callback) {
50117 } ) ;
51118}
52119
53- function ensureGuildRolesTableExists ( guild , callback ) {
54- const tableName = `${ guild } _roles` ;
55- const createTableQuery = `
56- CREATE TABLE IF NOT EXISTS \` ${ tableName } \` (
57- level INT NOT NULL,
58- role_id INT ,
59- PRIMARY KEY (role_id)
60- )
120+ async function updateGuildInfo ( guild , name , icon , members , callback ) {
121+ const insertOrUpdateQuery = `
122+ INSERT INTO info_guilds (guild_id, guild_name, guild_icon, guild_members)
123+ VALUES (?, ?, ?, ?)
124+ ON DUPLICATE KEY UPDATE
125+ guild_name = VALUES(guild_name) ,
126+ guild_icon = VALUES(guild_icon),
127+ guild_members = VALUES(guild_members )
61128 ` ;
62- pool . query ( createTableQuery , ( err , results ) => {
129+ pool . query ( insertOrUpdateQuery , [ guild , name , icon , members ] , ( err , results ) => {
63130 if ( err ) {
64- console . error ( ` Error creating roles table for guild ${ guild } :` , err ) ;
65- callback ( err ) ;
131+ console . error ( ' Error updating guild info:' , err ) ;
132+ callback ( err , null ) ;
66133 }
67134 else {
68- console . log ( `Roles table for guild ${ guild } ensured:` , results ) ;
69- callback ( null ) ;
135+ console . log ( 'Guild info updated:' , results ) ;
136+ callback ( null , results ) ;
70137 }
71138 } ) ;
72139}
73140
74- app . post ( '/post/:guild/:user/:xp/:auth' , restrictToLocalhost , ( req , res ) => {
75- const { guild, user, xp, auth } = req . params ;
141+ app . post ( '/post/:guild/' , async ( req , res ) => {
142+ const { guild } = req . params ;
143+ const { name, icon, members } = req . body ;
144+
145+ updateGuildInfo ( guild , name , icon , members , ( err , results ) => {
146+ if ( err ) {
147+ res . status ( 500 ) . json ( { message : 'Internal server error' } ) ;
148+ } else {
149+ res . status ( 200 ) . json ( results ) ;
150+ }
151+ } ) ;
152+ } ) ;
153+
154+ app . post ( '/post/:guild/:user/:auth' , ( req , res ) => {
155+ const { guild, user, auth } = req . params ;
156+ const { name, pfp, xp, nickname } = req . body ;
157+ console . log ( req . body ) ;
76158 const xpValue = parseInt ( xp ) ;
77159
78160 if ( auth !== process . env . AUTH ) {
@@ -84,20 +166,22 @@ app.post('/post/:guild/:user/:xp/:auth', restrictToLocalhost, (req, res) => {
84166 return res . status ( 500 ) . json ( { message : 'Internal server error' } ) ;
85167 }
86168
87- const tableName = `${ guild } ` ;
88169 const insertOrUpdateQuery = `
89- INSERT INTO \`${ tableName } \` (user_id, xp)
90- VALUES (?, ?)
91- ON DUPLICATE KEY UPDATE
92- xp = xp + VALUES(xp)
93- ` ;
94- pool . query ( insertOrUpdateQuery , [ user , xpValue ] , ( err ) => {
170+ INSERT INTO \`${ guild } \` (user_id, xp, user_pfp, user_name, user_nickname)
171+ VALUES (?, ?, ?, ?, ?)
172+ ON DUPLICATE KEY UPDATE
173+ xp = xp + VALUES(xp),
174+ user_pfp = VALUES(user_pfp),
175+ user_name = VALUES(user_name),
176+ user_nickname = VALUES(user_nickname)
177+ ` ;
178+ pool . query ( insertOrUpdateQuery , [ user , xpValue , pfp , name , nickname ] , ( err , results ) => {
95179 if ( err ) {
96180 console . error ( 'Error updating XP:' , err ) ;
97181 res . status ( 500 ) . json ( { message : 'Internal server error' } ) ;
98182 }
99183 else {
100- res . status ( 200 ) . json ( { guildId : guild , userId : user } ) ;
184+ res . status ( 200 ) . json ( results ) ;
101185 }
102186 } ) ;
103187 } ) ;
@@ -106,44 +190,68 @@ app.post('/post/:guild/:user/:xp/:auth', restrictToLocalhost, (req, res) => {
106190app . get ( '/get/:guild/:user' , ( req , res ) => {
107191 const { guild, user } = req . params ;
108192
109- const tableName = `${ guild } ` ;
110193 const selectQuery = `
111- SELECT xp FROM \`${ tableName } \` WHERE user_id = ?
194+ SELECT * FROM \`${ guild } \` WHERE user_id = ?
112195 ` ;
113196 pool . query ( selectQuery , [ user ] , ( err , results ) => {
114197 if ( err ) {
115198 console . error ( 'Error fetching XP:' , err ) ;
116199 res . status ( 500 ) . json ( { message : 'Internal server error' } ) ;
117200 }
118201 else if ( results . length > 0 ) {
119- res . status ( 200 ) . json ( { guildId : guild , userId : user , xp : results [ 0 ] . xp } ) ;
202+ res . status ( 200 ) . json ( results [ 0 ] ) ;
120203 }
121204 else {
122205 res . status ( 404 ) . json ( { message : 'User not found' } ) ;
123206 }
124207 } ) ;
125208} ) ;
126209
127- app . get ( '/leaderboard /:guild' , ( req , res ) => {
210+ app . get ( '/get /:guild' , async ( req , res ) => {
128211 const { guild } = req . params ;
212+ const returnData = { "guild" : { } , "leaderboard" : [ ] } ;
129213
130- const tableName = `${ guild } ` ;
131214 const selectQuery = `
132- SELECT user_id, xp FROM \`${ tableName } \`
133- ORDER BY xp DESC
134- ` ;
135- pool . query ( selectQuery , ( err , results ) => {
136- if ( err ) {
137- console . error ( 'Error fetching leaderboard:' , err ) ;
138- res . status ( 500 ) . json ( { message : 'Internal server error' } ) ;
139- }
140- else {
141- res . status ( 200 ) . json ( results ) ;
142- }
143- } ) ;
215+ SELECT * FROM \`${ guild } \` ORDER BY xp DESC;
216+ ` ;
217+ const selectQuery2 = `
218+ SELECT * FROM info_guilds WHERE guild_id = ${ guild } ;
219+ ` ;
220+
221+ try {
222+ const results1 = await new Promise ( ( resolve , reject ) => {
223+ pool . query ( selectQuery , ( err , results ) => {
224+ if ( err ) {
225+ console . error ( 'Error fetching XP:' , err ) ;
226+ reject ( err ) ;
227+ } else {
228+ resolve ( results ) ;
229+ }
230+ } ) ;
231+ } ) ;
232+
233+ const results2 = await new Promise ( ( resolve , reject ) => {
234+ pool . query ( selectQuery2 , ( err , results ) => {
235+ if ( err ) {
236+ console . error ( 'Error fetching XP:' , err ) ;
237+ reject ( err ) ;
238+ } else {
239+ resolve ( results ) ;
240+ }
241+ } ) ;
242+ } ) ;
243+
244+ returnData . leaderboard = results1 ;
245+ returnData . guild = results2 [ 0 ] ;
246+
247+ return res . status ( 200 ) . json ( returnData ) ;
248+ } catch ( error ) {
249+ console . error ( 'Error fetching XP:' , error ) ;
250+ return res . status ( 500 ) . json ( { message : 'Internal server error' } ) ;
251+ }
144252} ) ;
145253
146- app . post ( '/admin/:guild/:action /:target' , restrictToLocalhost , ( req , res ) => {
254+ app . post ( '/admin/:action/:guild /:target' , ( req , res ) => {
147255 const { guild, action, target } = req . params ;
148256 if ( action === 'include' ) {
149257 // run function to include target to guild
@@ -161,6 +269,16 @@ app.post('/admin/:guild/:action/:target', restrictToLocalhost, (req, res) => {
161269 }
162270} ) ;
163271
272+ app . get ( '/leaderboard/:guild' , async ( req , res ) => {
273+ const { guild } = req . params ;
274+ const response = await fetch ( `http://localhost:18103/get/${ guild } /` ) ;
275+ if ( ! response . ok ) {
276+ return res . status ( 404 ) . json ( { message : 'No guild was found with this ID' } ) ;
277+ }
278+ const data = await response . json ( ) ;
279+ res . render ( 'leaderboard' , { guild : data . guild , leaderboard : data . leaderboard } ) ;
280+ } ) ;
281+
164282app . listen ( PORT , ( ) => {
165283 console . log ( `Server running on http://localhost:${ PORT } ` ) ;
166- } ) ;
284+ } ) ;
0 commit comments