Skip to content

Commit 2f861e9

Browse files
committed
feat(0.0.4): introduced a site
1 parent d1f6a83 commit 2f861e9

File tree

10 files changed

+407
-93
lines changed

10 files changed

+407
-93
lines changed

api/index.ts

Lines changed: 175 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
import express from 'express';
22
import cors from 'cors';
33
import mysql from 'mysql2';
4+
import ejs from 'ejs';
5+
import path from 'path';
46

57
const app = express();
68
const PORT = 18103;
7-
const localhostIps = ['::1', '127.0.0.1', '::ffff:127.0.0.1'];
89

910
app.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
2317
const 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) => {
106190
app.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+
164282
app.listen(PORT, () => {
165283
console.log(`Server running on http://localhost:${PORT}`);
166-
});
284+
});

0 commit comments

Comments
 (0)