|
1 | 1 | import express from 'express'; |
2 | 2 | import cors from 'cors'; |
3 | 3 | import mysql from 'mysql2'; |
4 | | -import ejs from 'ejs'; |
5 | 4 | import path from 'path'; |
6 | 5 |
|
7 | 6 | const app = express(); |
@@ -102,6 +101,9 @@ async function ensureGuildTableExists(guild, callback) { |
102 | 101 | user_pfp TINYTEXT, |
103 | 102 | user_name TINYTEXT, |
104 | 103 | user_nickname TINYTEXT, |
| 104 | + user_level INT DEFAULT 0, |
| 105 | + user_xp_needed_next_level INT, |
| 106 | + user_progress_next_level DECIMAL(6, 2), |
105 | 107 | PRIMARY KEY (user_id) |
106 | 108 | ) |
107 | 109 | `; |
@@ -166,23 +168,45 @@ app.post('/post/:guild/:user/:auth', (req, res) => { |
166 | 168 | return res.status(500).json({ message: 'Internal server error' }); |
167 | 169 | } |
168 | 170 |
|
169 | | - const insertOrUpdateQuery = ` |
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) => { |
| 171 | + const getXpQuery = `SELECT xp FROM \`${guild}\` WHERE user_id = ?`; |
| 172 | + |
| 173 | + pool.query(getXpQuery, [user], (err, results) => { |
179 | 174 | if (err) { |
180 | | - console.error('Error updating XP:', err); |
181 | | - res.status(500).json({ message: 'Internal server error' }); |
182 | | - } |
183 | | - else { |
184 | | - res.status(200).json(results); |
| 175 | + console.error('Error fetching XP:', err); |
| 176 | + return res.status(500).json({ message: 'Internal server error' }); |
185 | 177 | } |
| 178 | + |
| 179 | + const currentXp = results.length ? results[0].xp : 0; |
| 180 | + const newXp = currentXp + xpValue; |
| 181 | + |
| 182 | + const currentLevel = Math.floor(Math.sqrt(newXp / 100)); |
| 183 | + const nextLevel = currentLevel + 1; |
| 184 | + const nextLevelXp = Math.pow(nextLevel, 2) * 100; |
| 185 | + const xpNeededForNextLevel = nextLevelXp - newXp; |
| 186 | + const currentLevelXp = Math.pow(currentLevel, 2) * 100; |
| 187 | + const progressToNextLevel = ((newXp - currentLevelXp) / (nextLevelXp - currentLevelXp)) * 100; |
| 188 | + |
| 189 | + const updateQuery = ` |
| 190 | + INSERT INTO \`${guild}\` (user_id, xp, user_pfp, user_name, user_nickname, user_level, user_xp_needed_next_level, user_progress_next_level) |
| 191 | + VALUES (?, ?, ?, ?, ?, ?, ?, ?) |
| 192 | + ON DUPLICATE KEY UPDATE |
| 193 | + xp = VALUES(xp), |
| 194 | + user_pfp = VALUES(user_pfp), |
| 195 | + user_name = VALUES(user_name), |
| 196 | + user_nickname = VALUES(user_nickname), |
| 197 | + user_level = VALUES(user_level), |
| 198 | + user_xp_needed_next_level = VALUES(user_xp_needed_next_level), |
| 199 | + user_progress_next_level = VALUES(user_progress_next_level) |
| 200 | + `; |
| 201 | + |
| 202 | + pool.query(updateQuery, [user, newXp, pfp, name, nickname, currentLevel, xpNeededForNextLevel, progressToNextLevel.toFixed(2)], (err, results) => { |
| 203 | + if (err) { |
| 204 | + console.error('Error updating XP:', err); |
| 205 | + return res.status(500).json({ message: 'Internal server error' }); |
| 206 | + } else { |
| 207 | + res.status(200).json(results); |
| 208 | + } |
| 209 | + }); |
186 | 210 | }); |
187 | 211 | }); |
188 | 212 | }); |
@@ -276,7 +300,7 @@ app.get('/leaderboard/:guild', async (req, res) => { |
276 | 300 | return res.status(404).json({ message: 'No guild was found with this ID' }); |
277 | 301 | } |
278 | 302 | const data = await response.json(); |
279 | | - res.render('leaderboard', { guild: data.guild, leaderboard: data.leaderboard}); |
| 303 | + res.render('leaderboard', { guild: data.guild, leaderboard: data.leaderboard }); |
280 | 304 | }); |
281 | 305 |
|
282 | 306 | app.listen(PORT, () => { |
|
0 commit comments