diff --git a/core/carousel/carousel.js b/core/carousel/carousel.js index 92be1b7..b495b34 100644 --- a/core/carousel/carousel.js +++ b/core/carousel/carousel.js @@ -8,6 +8,7 @@ const cClass = require("./classList.json"); const settings = require('../../settings.json'); const SongService = require('../services/SongService'); const MostPlayedService = require('../services/MostPlayedService'); +const AccountService = require('../services/AccountService'); // Import AccountService let carousel = {}; //avoid list cached @@ -92,17 +93,122 @@ function addJDVersion(songMapNames, type = "partyMap") { addCategories(generateCategories("Unplayable Songs", SongService.filterSongsByJDVersion(songMapNames, 404))); } -exports.generateCarousel = async (search, type = "partyMap") => { +exports.generateCarousel = async (search, type = "partyMap", profileId = null) => { carousel = {}; carousel = CloneObject(cClass.rootClass); carousel.actionLists = cClass.actionListsClass; const allSongMapNames = SongService.getAllMapNames(); // Dynamic Carousel System - addCategories(generateCategories(settings.server.modName, allSongMapNames, type)); - addCategories(generateCategories("Recommended For You", CloneObject(shuffleArray(allSongMapNames), type))); + addCategories(generateCategories(settings.server.modName, CloneObject(shuffleArray(allSongMapNames)), type)); // Shuffle main category + + let userProfile = null; + if (profileId) { + userProfile = await AccountService.getUserData(profileId); + } + + const allSongsData = SongService.getAllSongs(); // Get all song details once + + if (userProfile) { + let recommendedSongs = []; + // 1. "Recommended For You (Based on Your Plays)" + if (userProfile.history && Object.keys(userProfile.history).length > 0) { + recommendedSongs = Object.entries(userProfile.history) + .sort(([, countA], [, countB]) => countB - countA) // Sort by play count desc + .map(([mapName]) => mapName) + .slice(0, 24); + } else if (userProfile.scores && Object.keys(userProfile.scores).length > 0) { + // Fallback to scores if history is not available or empty + recommendedSongs = Object.entries(userProfile.scores) + .filter(([, scoreData]) => scoreData && typeof scoreData.timesPlayed === 'number') + .sort(([, scoreA], [, scoreB]) => scoreB.timesPlayed - scoreA.timesPlayed) + .map(([mapName]) => mapName) + .slice(0, 24); + } + + if (recommendedSongs.length > 0) { + addCategories(generateCategories("Recommended For You", CloneObject(recommendedSongs), type)); + } else { + // Fallback if no play history or scores with timesPlayed + addCategories(generateCategories("Recommended For You", CloneObject(shuffleArray(allSongMapNames)), type)); + } + + // 2. "More from Artists You Enjoy" + const artistCounts = {}; + const playedAndFavoritedSongs = new Set([ + ...(userProfile.history ? Object.keys(userProfile.history) : []), + ...(userProfile.favorites ? Object.keys(userProfile.favorites) : []) + ]); + + playedAndFavoritedSongs.forEach(mapName => { + const song = allSongsData[mapName]; + if (song && song.artist) { + artistCounts[song.artist] = (artistCounts[song.artist] || 0) + + (userProfile.history?.[mapName] || 1); // Weight by play count or 1 for favorite + } + }); + + const topArtists = Object.entries(artistCounts) + .sort(([, countA], [, countB]) => countB - countA) + .slice(0, 3) // Get top 3 artists + .map(([artist]) => artist); + + topArtists.forEach(artistName => { + const artistSongs = allSongMapNames.filter(mapName => { + const song = allSongsData[mapName]; + return song && song.artist === artistName && !playedAndFavoritedSongs.has(mapName); // Exclude already prominent songs + }); + if (artistSongs.length > 0) { + addCategories(generateCategories(`[icon:ARTIST] More from ${artistName}`, CloneObject(shuffleArray(artistSongs)).slice(0,12), type)); + } + }); + + // 3. "Because You Liked..." + const favoriteMaps = Object.keys(userProfile.favorites || {}); + if (favoriteMaps.length > 0) { + const shuffledFavorites = shuffleArray(favoriteMaps); + const numBecauseYouLiked = Math.min(shuffledFavorites.length, 2); // Max 2 "Because you liked" categories + + for (let i = 0; i < numBecauseYouLiked; i++) { + const favMapName = shuffledFavorites[i]; + const favSong = allSongsData[favMapName]; + if (!favSong) continue; + + let relatedSongs = []; + // Related by artist + allSongMapNames.forEach(mapName => { + const song = allSongsData[mapName]; + if (song && song.artist === favSong.artist && mapName !== favMapName && !favoriteMaps.includes(mapName)) { + relatedSongs.push(mapName); + } + }); + // Related by original JD version + allSongMapNames.forEach(mapName => { + const song = allSongsData[mapName]; + if (song && song.originalJDVersion === favSong.originalJDVersion && mapName !== favMapName && !favoriteMaps.includes(mapName) && !relatedSongs.includes(mapName)) { + relatedSongs.push(mapName); + } + }); + + if (relatedSongs.length > 0) { + addCategories(generateCategories(`[icon:HEART] Because You Liked ${favSong.title}`, CloneObject(shuffleArray(relatedSongs)).slice(0, 10), type)); + } + } + // Original "Your Favorites" category + addCategories(generateCategories("[icon:FAVORITE] Your Favorites", CloneObject(favoriteMaps), type)); + } + + // Your Recently Played + const recentlyPlayedMaps = (userProfile.songsPlayed || []).slice(-24).reverse(); // Get last 24 played, most recent first + if (recentlyPlayedMaps.length > 0) { + addCategories(generateCategories("[icon:HISTORY] Your Recently Played", CloneObject(recentlyPlayedMaps), type)); + } + } else { + // Fallback for non-logged in users or no profileId + addCategories(generateCategories("Recommended For You", CloneObject(shuffleArray(allSongMapNames)), type)); + } + addCategories(generateCategories("[icon:PLAYLIST]Recently Added!", CloneObject(SongService.filterSongsByTags(allSongMapNames, 'NEW')), type)); -const path = require('path'); await generateWeeklyRecommendedSong(loadJsonFile('carousel/playlist.json', '../database/data/carousel/playlist.json'), type); processPlaylists(loadJsonFile('carousel/playlist.json', '../database/data/carousel/playlist.json'), type); addJDVersion(allSongMapNames, type); diff --git a/core/classes/Core.js b/core/classes/Core.js index 2d69662..f4a3039 100644 --- a/core/classes/Core.js +++ b/core/classes/Core.js @@ -7,7 +7,7 @@ const { resolvePath } = require('../helper'); const PluginManager = require('./PluginManager'); const Router = require('./Router'); const ErrorHandler = require('./ErrorHandler'); -const bodyParser = require('body-parser'); +const express = require('express'); // bodyParser is part of express now const requestIp = require('../lib/ipResolver.js'); const Logger = require('../utils/logger'); @@ -20,6 +20,7 @@ class Core { this.settings = settings; this.pluginManager = new PluginManager(); this.router = new Router(); + this.appInstance = null; // To store app instance for plugins if needed this.logger = new Logger('CORE'); } @@ -31,6 +32,7 @@ class Core { */ async init(app, express, server) { this.logger.info('Initializing core...'); + this.appInstance = app; // Store app instance // Initialize the database const { initializeDatabase } = require('../database/sqlite'); @@ -42,8 +44,11 @@ class Core { process.exit(1); // Exit if database cannot be initialized } + // Set pluginManager on the app instance so plugins can access it + app.set('pluginManager', this.pluginManager); + // Configure middleware - this.configureMiddleware(app, express); + this.configureMiddleware(app); // express module not needed here anymore // Load plugins this.pluginManager.loadPlugins(this.settings.modules); @@ -68,9 +73,10 @@ class Core { * @param {Express} app - The Express application instance * @param {Express} express - The Express module */ - configureMiddleware(app, express) { + configureMiddleware(app) { app.use(express.json()); - app.use(bodyParser.raw()); + app.use(express.urlencoded({ extended: true })); // Added for form data + // app.use(express.raw()); // If you need raw body parsing, uncomment this and ensure AdminPanelPlugin doesn't re-add it. app.use(requestIp.mw()); // Use centralized error handler diff --git a/core/classes/Plugin.js b/core/classes/Plugin.js index 2f743b4..c12212f 100644 --- a/core/classes/Plugin.js +++ b/core/classes/Plugin.js @@ -14,7 +14,8 @@ class Plugin { this.name = name; this.description = description; this.enabled = true; - this.logger = new Logger(name); // Use plugin name as module name for logger + this.logger = new Logger(name); // Use name as module name for logger + this.manifest = null; // To store manifest data } /** diff --git a/core/classes/PluginManager.js b/core/classes/PluginManager.js index 20a34ef..11cdf49 100644 --- a/core/classes/PluginManager.js +++ b/core/classes/PluginManager.js @@ -4,8 +4,7 @@ */ const fs = require('fs'); const path = require('path'); -const Plugin = require('./Plugin'); // This is the Plugin class PluginManager uses for comparison -const { resolvePath } = require('../helper'); +const Plugin = require('./Plugin'); const Logger = require('../utils/logger'); class PluginManager { @@ -19,37 +18,86 @@ class PluginManager { /** * Load plugins from settings - * @param {Object} modules - The modules configuration from settings.json * @returns {Map} The loaded plugins */ - loadPlugins(modules) { - this.logger.info('Loading plugins...'); - - // Log the Plugin class that PluginManager is using for comparison - this.logger.info('Plugin class used for comparison:', Plugin.name); + loadPlugins() { + this.logger.info('Loading plugins from plugins directory...'); + this.plugins.clear(); // Clear existing plugins before reloading + + const pluginsDir = path.resolve(__dirname, '../../plugins'); + + if (!fs.existsSync(pluginsDir)) { + this.logger.warn(`Plugins directory not found: ${pluginsDir}`); + return this.plugins; + } + + const pluginFolders = fs.readdirSync(pluginsDir, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .map(dirent => dirent.name); + + pluginFolders.forEach(folderName => { + const pluginFolderPath = path.join(pluginsDir, folderName); + const manifestPath = path.join(pluginFolderPath, 'manifest.json'); + + if (!fs.existsSync(manifestPath)) { + this.logger.warn(`Manifest.json not found in plugin folder: ${folderName}. Skipping.`); + return; + } - modules.forEach((item) => { try { - const plugin = require(resolvePath(item.path)); - - // Log the Plugin class that the loaded plugin is extending - this.logger.info(`Loaded plugin '${item.path}' extends:`, Object.getPrototypeOf(plugin.constructor).name); + const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')); - // Verify that the plugin extends the Plugin class - if (plugin instanceof Plugin) { - this.plugins.set(plugin.name, plugin); - this.logger.info(`Loaded plugin: ${plugin.name}`); + if (!manifest.name || !manifest.main || !manifest.execution) { + this.logger.error(`Invalid manifest.json in ${folderName}: Missing name, main, or execution. Skipping.`); + return; + } + + const mainPluginFile = path.join(pluginFolderPath, manifest.main); + if (!fs.existsSync(mainPluginFile)) { + this.logger.error(`Main plugin file '${manifest.main}' not found in ${folderName} at ${mainPluginFile}. Skipping.`); + return; + } + + const pluginInstance = require(mainPluginFile); + + if (pluginInstance instanceof Plugin) { + const originalPluginName = pluginInstance.name; + pluginInstance.manifest = manifest; + pluginInstance.name = manifest.name; // Override name from manifest + pluginInstance.description = manifest.description || pluginInstance.description; // Override description + + // If the name was overridden by the manifest, update the logger instance to use the new name + if (pluginInstance.logger.moduleName !== manifest.name) { + this.logger.info(`Plugin class-defined name ('${originalPluginName}') differs from manifest ('${manifest.name}') for plugin in folder '${folderName}'. Updating logger to use manifest name '${manifest.name}'.`); + pluginInstance.logger = new Logger(manifest.name); // Re-initialize logger with manifest name + } + + this.plugins.set(manifest.name, pluginInstance); + this.logger.info(`Loaded plugin: ${manifest.name} (v${manifest.version || 'N/A'}) from ${folderName}`); } else { - this.logger.error(`Error: ${item.path} is not a valid plugin. It does not extend the expected 'Plugin' class.`); - // Provide more detail if the instanceof check fails - this.logger.error(`Expected Plugin constructor:`, Plugin); - this.logger.error(`Actual plugin's prototype chain constructor:`, Object.getPrototypeOf(plugin.constructor)); + this.logger.error(`Error: ${mainPluginFile} from ${folderName} is not a valid plugin. It does not extend the 'Plugin' class.`); } } catch (error) { - this.logger.error(`Error loading plugin ${item.path}: ${error.message}`); + this.logger.error(`Error loading plugin from ${folderName}: ${error.message}\n${error.stack}`); + } + }); + + // Process overrides + const pluginsToOverride = new Set(); + this.plugins.forEach(pInstance => { + if (pInstance.manifest && Array.isArray(pInstance.manifest.override)) { + pInstance.manifest.override.forEach(pluginNameToOverride => { + pluginsToOverride.add(pluginNameToOverride); + }); + } + }); + + pluginsToOverride.forEach(pluginNameToOverride => { + if (this.plugins.has(pluginNameToOverride) && this.plugins.get(pluginNameToOverride).isEnabled()) { + this.logger.info(`Plugin '${pluginNameToOverride}' is being overridden and will be disabled by another plugin.`); + this.plugins.get(pluginNameToOverride).disable(); } }); - return this.plugins; } @@ -61,23 +109,21 @@ class PluginManager { initializePlugins(app, executionType) { this.logger.info(`Initializing ${executionType} plugins...`); - this.plugins.forEach((plugin) => { - // Assuming isEnabled() exists on the Plugin base class or is handled otherwise - if (plugin.isEnabled && plugin.isEnabled()) { + this.plugins.forEach((pluginInstance) => { + if (pluginInstance.manifest && pluginInstance.isEnabled && pluginInstance.isEnabled()) { try { - // Get the plugin's configuration from settings.json - const pluginConfig = this.getPluginConfig(plugin.name); - if (pluginConfig && pluginConfig.execution === executionType) { - this.logger.info(`Calling initroute for plugin: ${plugin.name} (Execution Type: ${executionType})`); - plugin.initroute(app); + if (pluginInstance.manifest.execution === executionType) { + this.logger.info(`Calling initroute for plugin: ${pluginInstance.name} (Execution Type: ${executionType})`); + pluginInstance.initroute(app); } else { - this.logger.info(`Skipping plugin ${plugin.name}: Execution type mismatch or no config.`); + // This log can be verbose, uncomment if needed for debugging + // this.logger.info(`Skipping plugin ${pluginInstance.name}: Execution type mismatch (Plugin: ${pluginInstance.manifest.execution}, Required: ${executionType}).`); } } catch (error) { - this.logger.error(`Error initializing plugin ${plugin.name}: ${error.message}`); + this.logger.error(`Error initializing plugin ${pluginInstance.name}: ${error.message}\n${error.stack}`); } - } else { - this.logger.info(`Skipping disabled plugin: ${plugin.name}`); + } else if (pluginInstance.manifest && (!pluginInstance.isEnabled || !pluginInstance.isEnabled())) { + this.logger.info(`Skipping disabled plugin: ${pluginInstance.name}`); } }); } @@ -98,24 +144,6 @@ class PluginManager { getPlugins() { return this.plugins; } - - /** - * Get the configuration for a plugin from settings.json - * @param {string} name - The name of the plugin - * @returns {Object|null} The plugin configuration or null if not found - */ - getPluginConfig(name) { - // IMPORTANT: Adjust this path if your settings.json is not located relative to PluginManager.js - // For example, if PluginManager is in 'core/classes' and settings.json is in the root, - // '../../settings.json' is likely correct. - try { - const settings = require('../../settings.json'); - return settings.modules.find(module => module.name === name) || null; - } catch (error) { - this.logger.error(`Error loading settings.json: ${error.message}`); - return null; - } - } } module.exports = PluginManager; diff --git a/core/classes/routes/AccountRouteHandler.js b/core/classes/routes/AccountRouteHandler.js index 53f9f9e..3435d7a 100644 --- a/core/classes/routes/AccountRouteHandler.js +++ b/core/classes/routes/AccountRouteHandler.js @@ -4,10 +4,11 @@ */ const axios = require('axios'); const RouteHandler = require('./RouteHandler'); // Assuming RouteHandler is in the same directory -const { updateMostPlayed } = require('../../carousel/carousel'); // Adjust path as needed +const MostPlayedService = require('../../services/MostPlayedService'); const AccountService = require('../../services/AccountService'); // Import the AccountService const { getDb } = require('../../database/sqlite'); const Logger = require('../../utils/logger'); +const { v4: uuidv4 } = require('uuid'); // Import uuid for generating new profile IDs class AccountRouteHandler extends RouteHandler { /** @@ -122,6 +123,66 @@ class AccountRouteHandler extends RouteHandler { return AccountService.getUserData(profileId); } + /** + * Helper: Read the last reset week from the database. + * @returns {Promise} The last reset week number. + * @private + */ + async readLastResetWeek() { + const db = getDb(); + return new Promise((resolve, reject) => { + db.get('SELECT value FROM config WHERE key = ?', ['last_reset_week'], (err, row) => { + if (err) { + this.logger.error(`Error reading last_reset_week from DB: ${err.message}`); + reject(err); + } else { + resolve(row ? parseInt(row.value, 10) : 0); // Default to 0 if not found + } + }); + }); + } + + /** + * Helper: Write the current week to the database. + * @param {number} weekNumber - The current week number. + * @returns {Promise} + * @private + */ + async writeLastResetWeek(weekNumber) { + const db = getDb(); + return new Promise((resolve, reject) => { + db.run('INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)', ['last_reset_week', weekNumber.toString()], (err) => { + if (err) { + this.logger.error(`Error writing last_reset_week to DB: ${err.message}`); + reject(err); + } else { + this.logger.info(`Updated last_reset_week in DB to week ${weekNumber}`); + resolve(); + } + }); + }); + } + + /** + * Helper: Clear all entries from the main leaderboard table. + * @returns {Promise} A promise that resolves when the table is cleared. + * @private + */ + async clearLeaderboard() { + const db = getDb(); + return new Promise((resolve, reject) => { + db.run('DELETE FROM leaderboard', [], (err) => { + if (err) { + this.logger.error(`Error clearing leaderboard table:`, err.message); + reject(err); + } else { + this.logger.info(`Cleared leaderboard table.`); + resolve(); + } + }); + }); + } + /** * Helper: Read leaderboard data from SQLite. * @param {boolean} isDotw - True if reading Dancer of the Week leaderboard. @@ -147,11 +208,14 @@ class AccountRouteHandler extends RouteHandler { data[row.mapName].push(row); }); } else { - // For DOTW, assume a single entry per week or handle as needed - // For now, just return the rows as an array, or the first row if only one is expected + // For DOTW, return the week number of the first entry if available + // and all entries. if (rows.length > 0) { - data.week = this.getWeekNumber(); // Assuming 'week' property is used to check current week + data.week = rows[0].weekNumber; // Assuming weekNumber is stored in the row data.entries = rows; + } else { + data.week = null; + data.entries = []; } } resolve(data); @@ -160,6 +224,26 @@ class AccountRouteHandler extends RouteHandler { }); } + /** + * Helper: Clear all entries from the dotw leaderboard table. + * @returns {Promise} A promise that resolves when the table is cleared. + * @private + */ + async clearDotwLeaderboard() { + const db = getDb(); + return new Promise((resolve, reject) => { + db.run('DELETE FROM dotw', [], (err) => { + if (err) { + this.logger.error(`Error clearing dotw table:`, err.message); + reject(err); + } else { + this.logger.info(`Cleared dotw table.`); + resolve(); + } + }); + }); + } + /** * Helper: Generate a leaderboard object from user data. * This method is now primarily for transforming user data into a format suitable for leaderboard entries, @@ -218,7 +302,11 @@ class AccountRouteHandler extends RouteHandler { if (isDotw) { stmt = db.prepare(`INSERT OR REPLACE INTO ${tableName} (mapName, profileId, username, score, timestamp, gameVersion, rank, name, avatar, country, platformId, alias, aliasGender, jdPoints, portraitBorder, weekNumber) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`); } else { - stmt = db.prepare(`INSERT OR REPLACE INTO ${tableName} (mapName, profileId, username, score, timestamp) VALUES (?, ?, ?, ?, ?)`); + stmt = db.prepare(`INSERT OR REPLACE INTO ${tableName} ( + mapName, profileId, username, score, timestamp, name, + gameVersion, rank, avatar, country, platformId, + alias, aliasGender, jdPoints, portraitBorder + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`); } const promises = leaderboardEntries.map(entry => { @@ -253,6 +341,16 @@ class AccountRouteHandler extends RouteHandler { entry.username, entry.score, entry.timestamp, + entry.name, + entry.gameVersion, + entry.rank, + entry.avatar, + entry.country, + entry.platformId, + entry.alias, + entry.aliasGender, + entry.jdPoints, + entry.portraitBorder, (err) => { if (err) rejectRun(err); else resolveRun(); @@ -297,44 +395,42 @@ class AccountRouteHandler extends RouteHandler { * @param {Response} res - The response object */ async handlePostProfiles(req, res) { - const profileId = req.body?.profileId || req.body?.userId; - - if (!profileId) { - return res.status(400).send({ message: "Missing profileId or userId" }); + const authHeader = req.header('Authorization'); + const ticket = authHeader ? authHeader : null; // Keep the full header as ticket + + if (!ticket) { + this.logger.warn(`POST /profile/v2/profiles: Missing Authorization header (ticket).`); + return res.status(400).send({ message: "Missing Authorization header (ticket)." }); } - - const userData = await AccountService.getUserData(profileId); // Await getUserData - + + const profileId = await AccountService.findUserFromTicket(ticket); + + if (!profileId) { + this.logger.warn(`POST /profile/v2/profiles: Profile not found for provided ticket.`); + return res.status(400).send({ message: "Profile not found for provided ticket." }); + } + + let userData = await AccountService.getUserData(profileId); + if (userData) { this.logger.info(`Updating existing profile ${profileId}`); // Update only the fields present in the request body, preserving other fields - const updatedProfile = await AccountService.updateUser(profileId, req.body); // Await updateUser + // Ensure the ticket is updated if present in the header + const updateData = { ...req.body }; + updateData.ticket = ticket; // Always update ticket from header + const updatedProfile = await AccountService.updateUser(profileId, updateData); return res.send({ __class: "UserProfile", - ...updatedProfile.toJSON() + ...updatedProfile.toPublicJSON() }); } else { - this.logger.info(`Creating new profile ${profileId}`); - - // Create a new profile with default values and request body values - const newProfile = await AccountService.updateUser(profileId, { // Await updateUser - ...req.body, - name: req.body.name || "Player", - alias: req.body.alias || "default", - aliasGender: req.body.aliasGender || 2, - scores: req.body.scores || {}, - songsPlayed: req.body.songsPlayed || [], - avatar: req.body.avatar || "UI/menu_avatar/base/light.png", - country: req.body.country || "US", - createdAt: new Date().toISOString() - }); - - return res.send({ - __class: "UserProfile", - ...newProfile.toJSON() - }); + // This case should ideally not be reached if profileId is always found via ticket + // However, if it is, it means a ticket was provided but no profile exists for it. + // As per previous instruction, we should not create a new profile here. + this.logger.error(`POST /profile/v2/profiles: Unexpected state - profileId found via ticket but no existing user data.`); + return res.status(400).send({ message: "Profile not found for provided ticket." }); } } @@ -344,51 +440,51 @@ class AccountRouteHandler extends RouteHandler { * @param {Response} res - The response object */ async handleGetProfiles(req, res) { - // Get the profileId from query parameters or authorization header - const profileId = req.query.profileId || await this.findUserFromTicket(req.header('Authorization')); // Await findUserFromTicket - + const profileIdsParam = req.query.profileIds; + + if (profileIdsParam) { + try { + const requestedProfileIds = profileIdsParam.split(','); + const profiles = []; + + for (const reqProfileId of requestedProfileIds) { + const profile = await AccountService.getUserData(reqProfileId); + if (profile) { + profiles.push({ + __class: "UserProfile", + ...profile.toPublicJSON() + }); + } else { + profiles.push({ + profileId: reqProfileId, + isExisting: false + }); + } + } + return res.send(profiles); + } catch (error) { + this.logger.error('Error processing profileIds:', error); + return res.status(400).send({ message: "Invalid profileIds format" }); + } + } + + // Fallback for single profile request or if profileIds is not present + const profileId = req.query.profileId || await this.findUserFromTicket(req.header('Authorization')); + if (!profileId) { return res.status(400).send({ message: "Missing profileId" }); } - - const userProfile = await AccountService.getUserData(profileId); // Await getUserData - + + const userProfile = await AccountService.getUserData(profileId); + if (!userProfile) { this.logger.info(`Profile ${profileId} not found`); return res.status(404).send({ message: "Profile not found" }); } - - // If query contains specific profile requests by IDs - if (req.query.requestedProfiles) { - try { - const requestedProfiles = JSON.parse(req.query.requestedProfiles); - const profiles = {}; - - // Get each requested profile - for (const reqProfileId of requestedProfiles) { - const profile = await AccountService.getUserData(reqProfileId); // Await getUserData - if (profile) { - profiles[reqProfileId] = { - __class: "UserProfile", - ...profile.toJSON() - }; - } - } - - return res.send({ - __class: "ProfilesContainer", - profiles: profiles - }); - } catch (error) { - this.logger.error('Error parsing requestedProfiles:', error); - return res.status(400).send({ message: "Invalid requestedProfiles format" }); - } - } - - // Return single profile + return res.send({ __class: "UserProfile", - ...userProfile.toJSON() + ...userProfile.toPublicJSON() }); } @@ -399,7 +495,7 @@ class AccountRouteHandler extends RouteHandler { */ async handleMapEnded(req, res) { const { mapName, score } = req.body; - const profileId = req.query.profileId || await this.findUserFromTicket(req.header('Authorization')); // Await findUserFromTicket + const profileId = req.query.profileId || await this.findUserFromTicket(req.header('Authorization')); if (!profileId) { return res.status(400).send({ message: "Missing profileId" }); @@ -409,21 +505,32 @@ class AccountRouteHandler extends RouteHandler { return res.status(400).send({ message: "Missing mapName or score" }); } - const userProfile = await AccountService.getUserData(profileId); // Await getUserData + const userProfile = await AccountService.getUserData(profileId); if (!userProfile) { this.logger.info(`Profile ${profileId} not found`); return res.status(404).send({ message: "Profile not found" }); } + // Perform weekly leaderboard reset check + const currentWeek = this.getWeekNumber(); + const lastResetWeek = await this.readLastResetWeek(); + + if (currentWeek !== lastResetWeek) { + this.logger.info(`New week detected: ${currentWeek}. Resetting all leaderboards.`); + await this.clearLeaderboard(); // Clear main leaderboard + await this.clearDotwLeaderboard(); // Clear DOTW leaderboard + await this.writeLastResetWeek(currentWeek); // Update last reset week + } + // Update most played maps - updateMostPlayed(mapName); + await MostPlayedService.updateMostPlayed(mapName); // Update user's score for this map const currentScore = userProfile.scores?.[mapName]?.highest || 0; const newHighest = Math.max(currentScore, score); - await AccountService.updateUserScore(profileId, mapName, { // Await updateUserScore + await AccountService.updateUserScore(profileId, mapName, { highest: newHighest, lastPlayed: new Date().toISOString(), history: [ @@ -437,24 +544,36 @@ class AccountRouteHandler extends RouteHandler { // Add to songsPlayed array if not already present if (!userProfile.songsPlayed?.includes(mapName)) { - await AccountService.updateUser(profileId, { // Await updateUser + await AccountService.updateUser(profileId, { songsPlayed: [...(userProfile.songsPlayed || []), mapName] }); } - // Update leaderboards + // Update leaderboards (main and DOTW) const allAccounts = await AccountService.getAllAccounts(); const leaderboardEntries = this.generateLeaderboard(allAccounts, req); - await this.saveLeaderboard(leaderboardEntries); + await this.saveLeaderboard(leaderboardEntries); // Save to main leaderboard - // Update DOTW (Dancer of the Week) leaderboard if it's a new week - const currentWeek = this.getWeekNumber(); - const dotwData = await this.readLeaderboard(true); - - if (!dotwData.week || dotwData.week !== currentWeek) { - this.logger.info(`New week detected: ${currentWeek}, resetting DOTW`); - await this.saveLeaderboard([], true); - } + // Save current map's score to DOTW + await this.saveLeaderboard([ + { + mapName: mapName, + profileId: profileId, + username: userProfile.name, + score: newHighest, + timestamp: new Date().toISOString(), + gameVersion: this.getGameVersion(req), + rank: userProfile.rank, + name: userProfile.name, + avatar: userProfile.avatar, + country: userProfile.country, + platformId: userProfile.platformId, + alias: userProfile.alias, + aliasGender: userProfile.aliasGender, + jdPoints: userProfile.jdPoints, + portraitBorder: userProfile.portraitBorder + } + ], true); // Save to DOTW leaderboard return res.send({ __class: "MapEndResult", @@ -504,9 +623,42 @@ class AccountRouteHandler extends RouteHandler { return res.status(404).send({ message: "Profile not found" }); } + const clientIp = req.ip; // Get client IP + const authHeader = req.header('Authorization'); + const ticket = authHeader ? authHeader.split(' ')[1] : null; // Extract ticket from "Ubi_v1 " + + // Determine platformType from X-SkuId + const skuId = req.header('X-SkuId') || ''; + let platformType = 'pc'; // Default + if (skuId.includes('nx')) { + platformType = 'switch'; + } else if (skuId.includes('ps4') || skuId.includes('orbis')) { + platformType = 'ps4'; + } else if (skuId.includes('xboxone') || skuId.includes('durango')) { + platformType = 'xboxone'; + } else if (skuId.includes('wiiu')) { + platformType = 'wiiu'; + } + + const serverTime = new Date().toISOString(); + const expiration = new Date(Date.now() + 3600 * 1000).toISOString(); // Expires in 1 hour + return res.send({ - sessionId: profileId, - trackingEnabled: false + platformType: platformType, + ticket: ticket, + twoFactorAuthenticationTicket: null, + profileId: userProfile.profileId, + userId: userProfile.userId, // Assuming userId is stored in Account model + nameOnPlatform: userProfile.name || userProfile.nickname, + environment: "Prod", // Static for now + expiration: expiration, + spaceId: "cd052712-ba1d-453a-89b9-08778888d380", // Static from example + clientIp: clientIp, + clientIpCountry: "US", // Static for now, requires IP lookup for dynamic + serverTime: serverTime, + sessionId: userProfile.profileId, // Keeping profileId as sessionId as per current implementation + sessionKey: "KJNTFMD24XOPTmpgGU3MXPuhAx3IMYSYG4YgyhPJ8rVkQDHzK1MmiOtHKrQiyL/HCOsJNCfX63oRAsyGe9CDiQ==", // Placeholder + rememberMeTicket: null }); } diff --git a/core/classes/routes/CarouselRouteHandler.js b/core/classes/routes/CarouselRouteHandler.js index 1ebb0a2..8920bf0 100644 --- a/core/classes/routes/CarouselRouteHandler.js +++ b/core/classes/routes/CarouselRouteHandler.js @@ -6,6 +6,7 @@ const RouteHandler = require('./RouteHandler'); const CarouselService = require('../../services/CarouselService'); const coreMain = require('../../var').main; // Assuming core.main is needed for various carousel data const Logger = require('../../utils/logger'); +const AccountService = require('../../services/AccountService'); // Import AccountService to get profileId class CarouselRouteHandler extends RouteHandler { constructor() { @@ -76,6 +77,9 @@ class CarouselRouteHandler extends RouteHandler { search = req.body.searchTags[0]; } + // Get profileId for personalization + const profileId = req.query.profileId || await AccountService.findUserFromTicket(req.header('Authorization')); + let action = null; let isPlaylist = false; @@ -100,11 +104,13 @@ class CarouselRouteHandler extends RouteHandler { if (isPlaylist) { // Assuming core.generatePlaylist is still needed for playlist categories + // TODO: Potentially personalize playlists as well if needed in the future return res.json(require('../../lib/playlist').generatePlaylist().playlistcategory); } if (action != null) { - return res.send(await CarouselService.generateCarousel(search, action)); + // Pass profileId to generateCarousel for personalization + return res.send(await CarouselService.generateCarousel(search, action, profileId)); } return res.json({}); diff --git a/core/classes/routes/UbiservicesRouteHandler.js b/core/classes/routes/UbiservicesRouteHandler.js index 5424406..1a0fcb2 100644 --- a/core/classes/routes/UbiservicesRouteHandler.js +++ b/core/classes/routes/UbiservicesRouteHandler.js @@ -75,13 +75,20 @@ class UbiservicesRouteHandler extends RouteHandler { // Serve application parameters for JD22 this.registerGet(app, '/v1/applications/34ad0f04-b141-4793-bdd4-985a9175e70d/parameters', this.handleGetParametersJD22); + // Serve application parameters for JD21 + this.registerGet(app, '/v1/applications/c8cfd4b7-91b0-446b-8e3b-7edfa393c946/parameters', this.handleGetParametersJD21); + // Serve application parameters for JD18 this.registerGet(app, '/v1/spaces/041c03fa-1735-4ea7-b5fc-c16546d092ca/parameters', this.handleGetParametersJD18); // Handle user-related requests (stubbed for now) + this.registerGet(app, '/v3/policies/:langID', this.handleGetPolicies); // New policies route + this.registerPost(app, '/v3/users', this.handlePostUsersNew); // New POST /v3/users route this.registerPost(app, '/v3/users/:user', this.handlePostUsers); this.registerGet(app, '/v3/users/:user', this.handleGetUsers); + + console.log(`[ROUTE] ${this.name} routes initialized`); } @@ -234,6 +241,20 @@ class UbiservicesRouteHandler extends RouteHandler { res.send(this.replaceDomainPlaceholder(require("../../database/config/v1/parameters.json"), this.settings.server.domain)); } + /** + * Serve application parameters for JD18 + * @param {Request} req - The request object + * @param {Response} res - The response object + */ + /** + * Serve application parameters for JD21 + * @param {Request} req - The request object + * @param {Response} res - The response object + */ + handleGetParametersJD21(req, res) { + res.send(this.replaceDomainPlaceholder(require("../../database/config/v1/jd21/parameters.json"), this.settings.server.domain)); + } + /** * Serve application parameters for JD18 * @param {Request} req - The request object @@ -243,6 +264,60 @@ class UbiservicesRouteHandler extends RouteHandler { res.send(this.replaceDomainPlaceholder(require("../../database/config/v1/parameters2.json"), this.settings.server.domain)); } + /** + * Handle user-related requests (stubbed for now) + * @param {Request} req - The request object + * @param {Response} res - The response object + */ + /** + * Handle GET /v3/policies/:langID + * @param {Request} req - The request object + * @param {Response} res - The response object + */ + handleGetPolicies(req, res) { + res.send({ + "termOfSaleContent": "", + "policyAcceptance": "I accept Ubisoft's Terms of Use, Terms of Sale and Privacy Policy.", + "policyAcceptanceIsRequired": true, + "policyAcceptanceDefaultValue": false, + "policyLocaleCode": "en-US", + "minorAccount": { + "ageRequired": 7, + "isDigitalSignatureRequiredForAccountCreation": true, + "privacyPolicyContent": "Basically We Need Ur Ticket and IP for assigning cracked user only. We dont care about your data." + }, + "adultAccount": { + "ageRequired": 18 + }, + "legalOptinsKey": "eyJ2dG91IjoiNC4wIiwidnBwIjoiNC4xIiwidnRvcyI6IjIuMSIsImx0b3UiOiJlbi1VUyIsImxwcCI6ImVuLVVTIiwibHRvcyI6ImVuLVVTIn0", + "ageRequired": 13, + "communicationOptInDefaultValue": true, + "privacyPolicyContent": "Who Need Those", + "termOfUseContent": "Who Need Those" + }); + } + + /** + * Handle POST /v3/users + * @param {Request} req - The request object + * @param {Response} res - The response object + */ + handlePostUsersNew(req, res) { + res.send({ + country: 'US', + ageGroup: 'Adult', + email: 'MFADAMO_JD2016@ubisoft.com', + legalOptinsKey: 'eyJ2dG91IjoiNC4wIiwidnBwIjoiNC4xIiwidnRvcyI6IjIuMSIsImx0b3UiOiJlbi1VUyIsImxwcCI6ImVuLVVTIiwibHRvcyI6ImVuLVVTIn0', + password: '#JD2016ubi42', + gender: 'NOT_DEFINED', + preferredLanguage: 'FR', + nameOnPlatform: 'MFADAMO_J_JD2016', + accountType: 'Ubisoft', + profileId: "f7d85441-265d-4c9c-b1e3-25af3182091a", + userId: "4f7fc740-da32-4f2d-a81e-18faf7a1262d" + }); + } + /** * Handle user-related requests (stubbed for now) * @param {Request} req - The request object diff --git a/core/database/DatabaseManager.js b/core/database/DatabaseManager.js index 881a4c4..2b9ec37 100644 --- a/core/database/DatabaseManager.js +++ b/core/database/DatabaseManager.js @@ -97,20 +97,45 @@ class DatabaseManager { // Create user_profiles table this._db.run(`CREATE TABLE IF NOT EXISTS user_profiles ( profileId TEXT PRIMARY KEY, + userId TEXT, -- Already present + username TEXT, + nickname TEXT, name TEXT, + email TEXT, + password TEXT, -- Consider hashing if storing sensitive passwords + ticket TEXT, alias TEXT, aliasGender INTEGER, avatar TEXT, country TEXT, - createdAt TEXT, - ticket TEXT, platformId TEXT, jdPoints INTEGER, portraitBorder TEXT, - -- Store scores and songsPlayed as JSON strings - scores TEXT, - songsPlayed TEXT, - favorites TEXT + rank INTEGER, + scores TEXT, -- JSON stored as TEXT + favorites TEXT, -- JSON stored as TEXT + songsPlayed TEXT, -- JSON array stored as TEXT + progression TEXT, -- JSON stored as TEXT + history TEXT, -- JSON stored as TEXT + skin TEXT, + diamondPoints INTEGER, + unlockedAvatars TEXT, -- JSON array stored as TEXT + unlockedSkins TEXT, -- JSON array stored as TEXT + unlockedAliases TEXT, -- JSON array stored as TEXT + unlockedPortraitBorders TEXT, -- JSON array stored as TEXT + wdfRank INTEGER, + stars INTEGER, + unlocks INTEGER, + populations TEXT, -- JSON array stored as TEXT + inProgressAliases TEXT, -- JSON array stored as TEXT + language TEXT, + firstPartyEnv TEXT, + syncVersions TEXT, -- JSON stored as TEXT + otherPids TEXT, -- JSON array stored as TEXT + stats TEXT, -- JSON stored as TEXT + mapHistory TEXT, -- JSON stored as TEXT + createdAt TEXT, + updatedAt TEXT )`, (err) => { if (err) { this.logger.error('Error creating user_profiles table:', err.message); diff --git a/core/database/data/tmp/logs.txt b/core/database/data/tmp/logs.txt new file mode 100644 index 0000000..a1e7de4 --- /dev/null +++ b/core/database/data/tmp/logs.txt @@ -0,0 +1,1600 @@ +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-02T08:30:51.081Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-02T08:30:51.103Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-02T08:30:51.439Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-02T08:30:51.465Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-02T08:30:51.553Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-02T08:30:51.576Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-02T08:30:51.849Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-02T08:30:54.072Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...\n[DatabaseManager] Connected to the SQLite database. this._db is now set.\n[DatabaseManager] All tables created. Resolving initialize promise.\n[CORE] Database initialized successfully.\n[PluginManager] Loading plugins...\n[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-02T08:30:54.109Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-02T08:30:54.114Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-02T08:30:54.130Z"} +{"level":"ERROR","message":"[PluginManager] Error loading plugin {dirname}/plugins/AdminPanelPlugin.js: Cannot find module 'express-session'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js","timestamp":"2025-06-02T08:30:54.155Z"} +{"level":"INFO","message":"[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T08:30:54.156Z"} +{"level":"INFO","message":"[ROUTER] Loading all route handlers...","timestamp":"2025-06-02T08:30:54.158Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-02T08:30:54.507Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-02T08:30:54.544Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-02T08:30:54.605Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-02T08:30:54.607Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-02T08:30:54.875Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-02T08:30:54.876Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-02T08:30:54.877Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-02T08:30:54.878Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized","timestamp":"2025-06-02T08:30:54.879Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...","timestamp":"2025-06-02T08:30:54.879Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-02T08:30:54.880Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-02T08:30:54.881Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-02T08:40:13.050Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-02T08:40:13.125Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-02T08:40:13.380Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-02T08:40:13.383Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-02T08:40:13.444Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-02T08:40:13.449Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-02T08:40:13.491Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-02T08:40:13.652Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-02T08:40:13.654Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-02T08:40:13.764Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-02T08:40:13.772Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-02T08:40:13.773Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-02T08:40:13.776Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-02T08:40:13.777Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-02T08:40:13.847Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-02T08:40:13.848Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin","timestamp":"2025-06-02T08:40:13.864Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-02T08:40:13.865Z"} +{"level":"ERROR","message":"[PluginManager] Error loading plugin {dirname}/plugins/AdminPanelPlugin.js: Cannot find module 'express-session'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js","timestamp":"2025-06-02T08:40:13.879Z"} +{"level":"INFO","message":"[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T08:40:13.881Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-02T08:40:13.882Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-02T08:40:14.141Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-02T08:40:14.179Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-02T08:40:14.227Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-02T08:40:14.227Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-02T08:40:14.429Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-02T08:40:14.430Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-02T08:40:14.431Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-02T08:40:14.432Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-02T08:40:14.433Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers","timestamp":"2025-06-02T08:40:14.434Z"} +{"level":"INFO","message":"[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-02T08:40:14.434Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized","timestamp":"2025-06-02T08:40:14.435Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-02T08:40:14.436Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-02T08:42:51.536Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-02T08:42:51.552Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-02T08:42:51.871Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-02T08:42:51.892Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-02T08:42:51.952Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-02T08:42:51.954Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-02T08:42:52.057Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-02T08:42:52.406Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-02T08:42:52.408Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-02T08:42:52.412Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-02T08:42:52.420Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-02T08:42:52.421Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-02T08:42:52.426Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-02T08:42:52.427Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-02T08:42:52.445Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-02T08:42:52.446Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin","timestamp":"2025-06-02T08:42:52.460Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-02T08:42:52.461Z"} +{"level":"ERROR","message":"[PluginManager] Error loading plugin {dirname}/plugins/AdminPanelPlugin.js: Cannot find module 'bcrypt'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js","timestamp":"2025-06-02T08:42:52.501Z"} +{"level":"INFO","message":"[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T08:42:52.502Z"} +{"level":"INFO","message":"[ROUTER] Loading all route handlers...","timestamp":"2025-06-02T08:42:52.503Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-02T08:42:52.670Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-02T08:42:52.717Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-02T08:42:52.745Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-02T08:42:52.746Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-02T08:42:52.903Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-02T08:42:52.904Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized\n[AccountRouteHandler] Initializing routes...","timestamp":"2025-06-02T08:42:52.905Z"} +{"level":"INFO","message":"[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...","timestamp":"2025-06-02T08:42:52.906Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...","timestamp":"2025-06-02T08:42:52.907Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-02T08:42:52.907Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs","timestamp":"2025-06-02T08:42:52.908Z"} +{"level":"INFO","message":"[SERVER] Running in development mode","timestamp":"2025-06-02T08:42:52.909Z"} +{"level":"INFO","message":"[SERVER] Stopping server...","timestamp":"2025-06-02T08:42:56.916Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-02T08:44:55.062Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-02T08:44:55.076Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-02T08:44:55.207Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-02T08:44:55.210Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-02T08:44:55.219Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-02T08:44:55.222Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-02T08:44:55.262Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-02T08:44:55.283Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-02T08:44:55.285Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-02T08:44:55.296Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-02T08:44:55.316Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-02T08:44:55.317Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-02T08:44:55.319Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-02T08:44:55.320Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-02T08:44:55.325Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-02T08:44:55.327Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin","timestamp":"2025-06-02T08:44:55.330Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-02T08:44:55.330Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin","timestamp":"2025-06-02T08:44:55.378Z"} +{"level":"INFO","message":"[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T08:44:55.379Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-02T08:44:55.380Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-02T08:44:55.415Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-02T08:44:55.427Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-02T08:44:55.434Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-02T08:44:55.436Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully","timestamp":"2025-06-02T08:44:55.495Z"} +{"level":"INFO","message":"[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-02T08:44:55.496Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-02T08:44:55.498Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-02T08:44:55.499Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...","timestamp":"2025-06-02T08:44:55.500Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...","timestamp":"2025-06-02T08:44:55.501Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-02T08:44:55.502Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized","timestamp":"2025-06-02T08:44:55.505Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)","timestamp":"2025-06-02T08:44:55.507Z"} +{"level":"INFO","message":"[HelloWorldPlugin] Initializing routes...","timestamp":"2025-06-02T08:44:55.508Z"} +{"level":"INFO","message":"[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-02T08:44:55.508Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-02T08:44:55.515Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-02T08:44:55.517Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-02T08:44:55.518Z"} +{"level":"ERROR","message":"D:\\ibra\\OpenParty\\node_modules\\bcrypt\\bcrypt.js:204\r\n error = new Error('data and hash arguments required');\r\n ^\r\n\r\nError: data and hash arguments required\r\n at Object.compare (D:\\ibra\\OpenParty\\node_modules\\bcrypt\\bcrypt.js:204:17)\r\n at D:\\ibra\\OpenParty\\node_modules\\bcrypt\\promises.js:26:12\r\n at new Promise ()\r\n at Object.promise (D:\\ibra\\OpenParty\\node_modules\\bcrypt\\promises.js:17:12)\r\n at Object.compare (D:\\ibra\\OpenParty\\node_modules\\bcrypt\\bcrypt.js:200:25)\r\n at D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:53:30\r\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\r\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\r\n at Route.dispatch (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:119:3)\r\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)","timestamp":"2025-06-02T08:45:39.107Z"} +{"level":"ERROR","message":"Node.js v22.15.1","timestamp":"2025-06-02T08:45:39.108Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-02T08:48:53.829Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-02T08:48:53.853Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-02T08:48:54.117Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-02T08:48:54.121Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-02T08:48:54.190Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-02T08:48:54.192Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-02T08:48:54.268Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-02T08:48:54.457Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-02T08:48:54.459Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-02T08:48:54.466Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-02T08:48:54.473Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-02T08:48:54.474Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-02T08:48:54.477Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-02T08:48:54.478Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-02T08:48:54.492Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin","timestamp":"2025-06-02T08:48:54.509Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-02T08:48:54.510Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin","timestamp":"2025-06-02T08:48:54.793Z"} +{"level":"INFO","message":"[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-02T08:48:54.794Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T08:48:54.795Z"} +{"level":"INFO","message":"[ROUTER] Loading all route handlers...","timestamp":"2025-06-02T08:48:54.796Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-02T08:48:55.030Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-02T08:48:55.067Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-02T08:48:55.108Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-02T08:48:55.111Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-02T08:48:55.318Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-02T08:48:55.319Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-02T08:48:55.320Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-02T08:48:55.321Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...","timestamp":"2025-06-02T08:48:55.321Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-02T08:48:55.322Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)","timestamp":"2025-06-02T08:48:55.323Z"} +{"level":"INFO","message":"[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-02T08:48:55.323Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-02T08:48:55.324Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-02T08:48:55.325Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-02T08:48:55.326Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-02T08:56:32.657Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-02T08:56:32.693Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-02T08:56:32.974Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-02T08:56:32.978Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-02T08:56:33.046Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-02T08:56:33.048Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-02T08:56:33.089Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-02T08:56:33.243Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-02T08:56:33.244Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-02T08:56:33.285Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-02T08:56:33.294Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-02T08:56:33.295Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-02T08:56:33.298Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-02T08:56:33.299Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-02T08:56:33.317Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-02T08:56:33.318Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-02T08:56:33.332Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...","timestamp":"2025-06-02T08:56:33.578Z"} +{"level":"INFO","message":"[AdminPanel] Using default password: true","timestamp":"2025-06-02T08:56:33.580Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-02T08:56:33.701Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-02T08:56:33.702Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T08:56:33.703Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T08:56:33.704Z"} +{"level":"INFO","message":"[ROUTER] Loading all route handlers...","timestamp":"2025-06-02T08:56:33.704Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-02T08:56:33.953Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-02T08:56:33.988Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-02T08:56:34.018Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-02T08:56:34.019Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler","timestamp":"2025-06-02T08:56:34.231Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-02T08:56:34.232Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-02T08:56:34.233Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-02T08:56:34.234Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...","timestamp":"2025-06-02T08:56:34.235Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...","timestamp":"2025-06-02T08:56:34.236Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-02T08:56:34.237Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized","timestamp":"2025-06-02T08:56:34.237Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-02T08:56:34.238Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-02T08:56:34.239Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-02T08:56:34.243Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-02T08:56:34.244Z"} +{"level":"INFO","message":"[AdminPanel] Login attempt received\n[AdminPanel] Request body: [object Object]\n[AdminPanel] Comparing passwords...","timestamp":"2025-06-02T08:57:24.133Z"} +{"level":"INFO","message":"[AdminPanel] Password match result: true","timestamp":"2025-06-02T08:57:24.235Z"} +{"level":"INFO","message":"[AdminPanel] Login successful","timestamp":"2025-06-02T08:57:24.236Z"} +{"level":"ERROR","message":"Error: Cannot find module '../../settings.json'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js\n at Function._resolveFilename (node:internal/modules/cjs/loader:1401:15)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)\n at D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:202:30\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)","timestamp":"2025-06-02T08:57:36.091Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-02T09:08:09.251Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-02T09:08:09.283Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-02T09:08:09.563Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-02T09:08:09.565Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-02T09:08:09.623Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-02T09:08:09.627Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-02T09:08:09.671Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-02T09:08:09.862Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-02T09:08:09.863Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-02T09:08:09.902Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-02T09:08:09.911Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-02T09:08:09.912Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-02T09:08:09.914Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-02T09:08:09.915Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-02T09:08:09.937Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin","timestamp":"2025-06-02T09:08:09.953Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-02T09:08:09.954Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...","timestamp":"2025-06-02T09:08:10.147Z"} +{"level":"INFO","message":"[AdminPanel] Using default password: true","timestamp":"2025-06-02T09:08:10.148Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-02T09:08:10.229Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-02T09:08:10.230Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T09:08:10.231Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.","timestamp":"2025-06-02T09:08:10.232Z"} +{"level":"INFO","message":"[ROUTER] Loading all route handlers...","timestamp":"2025-06-02T09:08:10.233Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-02T09:08:10.455Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-02T09:08:10.501Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-02T09:08:10.535Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-02T09:08:10.537Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-02T09:08:10.821Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-02T09:08:10.822Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized\n[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...\n[WDFPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)\n[AdminPanel] Initializing admin panel routes...\n[AdminPanel] Admin panel routes initialized\n[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-02T09:08:10.836Z"} +{"level":"INFO","message":"[AdminPanel] Login attempt received\n[AdminPanel] Request body: [object Object]\n[AdminPanel] Comparing passwords...","timestamp":"2025-06-02T09:08:22.134Z"} +{"level":"INFO","message":"[AdminPanel] Password match result: true","timestamp":"2025-06-02T09:08:22.222Z"} +{"level":"INFO","message":"[AdminPanel] Login successful","timestamp":"2025-06-02T09:08:22.223Z"} +{"level":"ERROR","message":"Error: Cannot find module '../../settings.json'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js\n at Function._resolveFilename (node:internal/modules/cjs/loader:1401:15)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)\n at D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:148:30\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)","timestamp":"2025-06-02T09:08:24.320Z"} +{"level":"ERROR","message":"TypeError: Cannot read properties of undefined (reading 'getPlugins')\n at D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:120:43\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\n at requireAuth (D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:71:17)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\n at Route.dispatch (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:119:3)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:284:15\n at Function.process_params (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:346:12)","timestamp":"2025-06-02T09:08:24.889Z"} +{"level":"ERROR","message":"TypeError: Cannot read properties of undefined (reading 'getPlugins')\n at D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:120:43\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\n at requireAuth (D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:71:17)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\n at Route.dispatch (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:119:3)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:284:15\n at Function.process_params (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:346:12)","timestamp":"2025-06-02T09:08:27.409Z"} +{"level":"ERROR","message":"Error: Cannot find module '../../settings.json'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js\n at Function._resolveFilename (node:internal/modules/cjs/loader:1401:15)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)\n at D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:148:30\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)","timestamp":"2025-06-02T09:08:28.129Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-06T15:29:18.520Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-06T15:29:18.540Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-06T15:29:18.828Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-06T15:29:18.831Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-06T15:29:18.893Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-06T15:29:18.895Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-06T15:29:18.954Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-06T15:29:20.229Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-06T15:29:20.231Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-06T15:29:20.237Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-06T15:29:20.243Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-06T15:29:20.244Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-06T15:29:20.246Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-06T15:29:20.247Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-06T15:29:20.270Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-06T15:29:20.271Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-06T15:29:20.279Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...\n[AdminPanel] Using default password: true","timestamp":"2025-06-06T15:29:22.064Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-06T15:29:22.151Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-06T15:29:22.152Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-06T15:29:22.153Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-06T15:29:22.411Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-06T15:29:22.591Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-06T15:29:22.606Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-06T15:29:22.606Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-06T15:29:22.672Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-06T15:29:22.673Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-06T15:29:22.674Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-06T15:29:22.674Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-06T15:29:22.675Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...","timestamp":"2025-06-06T15:29:22.675Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-06T15:29:22.676Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized","timestamp":"2025-06-06T15:29:22.677Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized","timestamp":"2025-06-06T15:29:22.678Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-06T15:29:22.679Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-06T15:29:22.680Z"} +{"level":"INFO","message":"[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public","timestamp":"2025-06-06T15:29:22.682Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-06T15:29:22.684Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-06T15:29:22.685Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:31:31.814Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:31:37.190Z"} +{"level":"INFO","message":"[ACC] Generating Fake Session for 3a800cca-f39d-4f48-adb8-015582bc41ca","timestamp":"2025-06-06T15:31:37.191Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:31:47.685Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:31:52.323Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:32:02.742Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:32:05.368Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:32:05.370Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:32:15.882Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:32:20.307Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:32:30.965Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:32:34.872Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:32:45.297Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:32:46.306Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:32:46.308Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:32:56.747Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:32:57.531Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:32:57.532Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:33:07.897Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:33:08.701Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:33:08.704Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:33:19.072Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:33:20.060Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:33:20.061Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:33:30.703Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:33:31.505Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:33:31.506Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-06T15:35:13.192Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-06T15:35:13.206Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-06T15:35:13.477Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-06T15:35:13.478Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-06T15:35:13.545Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-06T15:35:13.547Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-06T15:35:13.594Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-06T15:35:13.732Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-06T15:35:13.734Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-06T15:35:13.763Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-06T15:35:13.770Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-06T15:35:13.771Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-06T15:35:13.774Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-06T15:35:13.776Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-06T15:35:13.800Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-06T15:35:13.801Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-06T15:35:13.810Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...\n[AdminPanel] Using default password: true","timestamp":"2025-06-06T15:35:13.998Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-06T15:35:14.076Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.","timestamp":"2025-06-06T15:35:14.077Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-06T15:35:14.078Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-06T15:35:14.287Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-06T15:35:14.431Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-06T15:35:14.458Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-06T15:35:14.459Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-06T15:35:14.531Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-06T15:35:14.533Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized\n[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized","timestamp":"2025-06-06T15:35:14.533Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized","timestamp":"2025-06-06T15:35:14.534Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-06T15:35:14.535Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)","timestamp":"2025-06-06T15:35:14.536Z"} +{"level":"INFO","message":"[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-06T15:35:14.536Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-06T15:35:14.537Z"} +{"level":"INFO","message":"[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public","timestamp":"2025-06-06T15:35:14.539Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-06T15:35:14.540Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-06T15:35:14.541Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:35:34.309Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:35:39.438Z"} +{"level":"INFO","message":"[ACC] Generating Fake Session for d65680bd-1183-4d34-9aaf-a6d4ae03fb77","timestamp":"2025-06-06T15:35:39.441Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:35:50.106Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:35:50.969Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:36:01.362Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:36:04.293Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:36:04.295Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:36:14.698Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:36:18.503Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:36:18.504Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:36:28.991Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:36:29.818Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:36:29.820Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:36:40.277Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:36:41.275Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:36:41.276Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:36:51.666Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:36:52.500Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:36:52.501Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:37:02.875Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:37:03.656Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:37:03.658Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:37:14.093Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:37:18.276Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:37:18.277Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:37:28.648Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:37:34.236Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:37:34.238Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:37:44.657Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:37:47.372Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:37:47.373Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:37:57.801Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:38:00.371Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:38:00.372Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:38:10.777Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-06T15:38:16.292Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-06T15:38:16.299Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-06T15:38:16.650Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-06T15:38:16.654Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-06T15:38:16.731Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-06T15:38:16.733Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-06T15:38:16.776Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-06T15:38:16.859Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-06T15:38:16.861Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-06T15:38:16.866Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-06T15:38:16.875Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-06T15:38:16.876Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-06T15:38:16.878Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-06T15:38:16.879Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-06T15:38:16.900Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-06T15:38:16.917Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...\n[AdminPanel] Using default password: true","timestamp":"2025-06-06T15:38:17.091Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-06T15:38:17.172Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-06T15:38:17.173Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.","timestamp":"2025-06-06T15:38:17.174Z"} +{"level":"INFO","message":"[ROUTER] Loading all route handlers...","timestamp":"2025-06-06T15:38:17.175Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-06T15:38:17.338Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-06T15:38:17.474Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-06T15:38:17.491Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-06T15:38:17.492Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-06T15:38:17.572Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-06T15:38:17.574Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized\n[AccountRouteHandler] Initializing routes...","timestamp":"2025-06-06T15:38:17.575Z"} +{"level":"INFO","message":"[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized","timestamp":"2025-06-06T15:38:17.576Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized","timestamp":"2025-06-06T15:38:17.577Z"} +{"level":"INFO","message":"[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-06T15:38:17.578Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized","timestamp":"2025-06-06T15:38:17.580Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-06T15:38:17.581Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-06T15:38:17.581Z"} +{"level":"INFO","message":"[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public","timestamp":"2025-06-06T15:38:17.582Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-06T15:38:17.583Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-06T15:38:17.584Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:38:26.823Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:38:27.933Z"} +{"level":"INFO","message":"[ACC] Generating Fake Session for 70de7a58-3d4d-48f7-8075-92d5b8e5958d","timestamp":"2025-06-06T15:38:27.942Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:38:38.322Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:38:39.067Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:38:39.068Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:38:49.359Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:38:56.266Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:38:56.267Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:39:06.584Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:39:09.733Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:39:09.734Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:39:20.067Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:39:21.072Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:39:31.378Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:39:35.906Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:39:35.907Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:39:46.276Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:39:47.050Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:39:47.051Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:39:57.396Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:40:02.612Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:40:13.306Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:40:19.112Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:40:30.247Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:40:38.336Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:40:48.768Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:40:49.735Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:40:49.738Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:41:00.247Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:41:01.107Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:41:12.102Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:41:12.955Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:41:23.287Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:41:24.036Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:41:24.038Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:41:34.378Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:41:39.153Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:41:50.347Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:41:53.376Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:42:03.727Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:42:06.274Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:42:16.594Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:42:20.385Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:42:20.386Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:42:30.691Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:42:31.509Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:42:31.510Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:42:41.776Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:42:42.600Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:42:52.918Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:42:53.716Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:43:04.006Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:43:06.726Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:43:06.730Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:43:17.010Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:43:17.819Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:43:17.821Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:43:28.144Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:43:28.923Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:43:28.924Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:43:39.250Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:43:43.238Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:43:43.240Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:43:53.586Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:43:57.108Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:43:57.110Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:44:07.474Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:44:12.463Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:44:12.464Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:44:22.867Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:44:23.837Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:44:23.838Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:44:34.123Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:44:38.035Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:44:38.111Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:44:48.422Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:44:50.926Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:44:50.927Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:45:01.267Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:45:06.866Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:45:06.867Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:45:17.269Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:45:21.317Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:45:31.673Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:45:32.520Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:45:32.522Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:45:42.824Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:45:43.713Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:45:54.256Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:45:55.147Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:46:05.541Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:46:11.548Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:46:22.497Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:46:27.586Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:46:27.589Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:46:37.856Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:46:38.686Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:46:38.689Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:46:49.063Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:46:49.894Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:46:49.896Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:47:00.220Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:47:01.048Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:47:11.481Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:47:12.223Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:47:12.224Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:47:22.494Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:47:23.287Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:47:23.288Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:47:33.721Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:47:34.692Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:47:45.075Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:47:45.888Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:47:45.890Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:47:56.247Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:47:56.986Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:47:56.988Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:48:07.327Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:48:08.220Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:48:18.568Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:48:19.329Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:48:19.331Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:48:29.587Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:48:30.580Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:48:30.581Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:48:40.894Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:48:44.701Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:48:44.702Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:48:55.024Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:48:57.688Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:48:57.690Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:49:08.011Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:49:08.799Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:49:08.801Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:49:19.202Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:49:23.319Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:49:23.321Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:49:33.642Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:49:36.535Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:49:36.536Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:49:46.820Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:49:53.242Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:50:04.965Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:50:08.096Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:50:18.691Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:50:22.853Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:50:22.854Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:50:33.254Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:50:34.029Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:50:34.030Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:50:44.342Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:50:45.106Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:50:45.107Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:50:55.448Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:50:58.150Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:51:08.476Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:51:09.321Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:51:19.639Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:51:20.393Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:51:30.854Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:51:31.685Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:51:42.054Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:51:42.839Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:51:53.149Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:51:53.935Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:52:04.256Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:52:08.476Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:52:18.921Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:52:21.867Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:52:21.869Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:52:32.161Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:52:34.826Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:52:45.118Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:52:48.593Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:52:58.880Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:53:01.733Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:53:01.736Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:53:12.062Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:53:15.512Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:53:25.828Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:53:26.653Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:53:37.000Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:53:39.852Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:53:50.198Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:53:52.817Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:53:52.818Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:54:03.134Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:54:07.336Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:54:17.605Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:54:20.654Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:54:30.942Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:54:31.815Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:54:42.146Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:54:42.959Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:54:53.266Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:54:54.079Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:54:54.079Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:55:04.425Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:55:05.239Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:55:15.531Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:55:16.350Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:55:16.356Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:55:26.665Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:55:29.883Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:55:29.886Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:55:40.205Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:55:44.321Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:55:44.323Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:55:54.618Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:55:58.056Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:56:08.327Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:56:09.352Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:56:19.702Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:56:22.403Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:56:32.837Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:56:33.872Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:56:44.295Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:56:45.172Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:56:45.176Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:56:55.591Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:56:56.346Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:56:56.347Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:57:06.734Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:57:09.373Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:57:19.805Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:57:20.577Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:57:30.993Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:57:31.814Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:57:42.135Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:57:42.916Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:57:53.234Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:57:54.010Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:57:54.011Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:58:04.406Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:58:08.359Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:58:08.360Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:58:18.629Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:58:21.939Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:58:32.258Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:58:35.196Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:58:45.489Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:58:48.924Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:58:59.230Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T15:59:01.809Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:59:01.810Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:59:12.115Z"} +{"level":"ERROR","message":"[ErrorHandler] [UbiservicesRouteHandler] Cannot read properties of undefined (reading 'replaceDomainPlaceholder')\n[ErrorHandler] TypeError: Cannot read properties of undefined (reading 'replaceDomainPlaceholder')\n at handleGetParametersJD21 (D:\\ibra\\OpenParty\\core\\classes\\routes\\UbiservicesRouteHandler.js:255:23)\n at D:\\ibra\\OpenParty\\core\\classes\\routes\\RouteHandler.js:76:15\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\n at Route.dispatch (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:119:3)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:284:15\n at Function.process_params (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:346:12)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:280:10)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:91:12)","timestamp":"2025-06-06T15:59:27.309Z"} +{"level":"ERROR","message":"TypeError: Cannot read properties of undefined (reading 'replaceDomainPlaceholder')\n at handleGetParametersJD21 (D:\\ibra\\OpenParty\\core\\classes\\routes\\UbiservicesRouteHandler.js:255:23)\n at D:\\ibra\\OpenParty\\core\\classes\\routes\\RouteHandler.js:76:15\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\n at Route.dispatch (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:119:3)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:284:15\n at Function.process_params (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:346:12)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:280:10)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:91:12)","timestamp":"2025-06-06T15:59:27.323Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services \n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:59:33.444Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:59:37.508Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services getaddrinfo ENOTFOUND public-ubiservices.ubi.com\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:59:37.513Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:59:47.793Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services getaddrinfo ENOTFOUND public-ubiservices.ubi.com\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:59:47.795Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T15:59:58.083Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services getaddrinfo ENOTFOUND public-ubiservices.ubi.com","timestamp":"2025-06-06T15:59:58.091Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T15:59:58.094Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:00:08.447Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:00:11.979Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:00:22.479Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T16:00:25.213Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:00:25.214Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:00:35.531Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T16:00:36.386Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:00:36.387Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:00:46.664Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:00:49.406Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:00:59.679Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:01:00.471Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:01:10.770Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T16:01:11.554Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:01:11.555Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:01:21.859Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:01:22.610Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:01:32.909Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T16:01:33.680Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:01:33.681Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:01:43.995Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:01:44.802Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:01:55.139Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate","timestamp":"2025-06-06T16:01:55.886Z"} +{"level":"INFO","message":"[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:01:55.887Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:02:06.176Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:02:06.974Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:02:17.319Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services unable to verify the first certificate\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:02:20.643Z"} +{"level":"INFO","message":"[ACC] Fetching Ticket From Official Server","timestamp":"2025-06-06T16:02:30.956Z"} +{"level":"INFO","message":"[ACC] Error fetching from Ubisoft services socket hang up\n[ACC] Returning cached session for IP 127.0.0.1","timestamp":"2025-06-06T16:02:39.701Z"} +{"level":"INFO","message":"[ACC] CustomAuth detected, verifying...","timestamp":"2025-06-06T16:05:20.167Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:05:20.214Z"} +{"level":"INFO","message":"[ACC] CustomAuth register: Ibruh","timestamp":"2025-06-06T16:05:20.350Z"} +{"level":"INFO","message":"[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:05:20.357Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:05:20.358Z"} +{"level":"INFO","message":"[AccountService] Updated existing user 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:05:20.430Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:05:20.431Z"} +{"level":"INFO","message":"[AccountRepository] Saved account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB.","timestamp":"2025-06-06T16:05:20.473Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-06T16:05:27.677Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:05:27.698Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:06:09.107Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-06T16:15:04.121Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-06T16:15:04.163Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-06T16:15:04.246Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-06T16:15:04.248Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-06T16:15:04.293Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-06T16:15:04.296Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-06T16:15:04.344Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-06T16:15:04.632Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-06T16:15:04.634Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-06T16:15:04.640Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-06T16:15:04.645Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-06T16:15:04.646Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-06T16:15:04.649Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-06T16:15:04.649Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-06T16:15:04.688Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-06T16:15:04.689Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-06T16:15:04.701Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...","timestamp":"2025-06-06T16:15:04.864Z"} +{"level":"INFO","message":"[AdminPanel] Using default password: true","timestamp":"2025-06-06T16:15:04.865Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-06T16:15:04.948Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-06T16:15:04.949Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.","timestamp":"2025-06-06T16:15:04.950Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-06T16:15:04.951Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-06T16:15:05.167Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-06T16:15:05.362Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-06T16:15:05.366Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-06T16:15:05.366Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-06T16:15:05.444Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-06T16:15:05.445Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized\n[AccountRouteHandler] Initializing routes...","timestamp":"2025-06-06T16:15:05.446Z"} +{"level":"INFO","message":"[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-06T16:15:05.447Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...","timestamp":"2025-06-06T16:15:05.447Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...","timestamp":"2025-06-06T16:15:05.448Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)","timestamp":"2025-06-06T16:15:05.449Z"} +{"level":"INFO","message":"[WDFPlugin] Initializing routes...\n[WDFPlugin] Routes initialized","timestamp":"2025-06-06T16:15:05.449Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-06T16:15:05.450Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-06T16:15:05.451Z"} +{"level":"INFO","message":"[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public","timestamp":"2025-06-06T16:15:05.453Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized\n[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-06T16:15:05.461Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-06T16:15:09.729Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:15:09.731Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:15:09.733Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:15:09.734Z"} +{"level":"INFO","message":"[AccountRouteHandler] Updating existing profile 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:15:09.735Z"} +{"level":"INFO","message":"[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:15:09.735Z"} +{"level":"INFO","message":"[AccountService] Updated existing user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:15:09.739Z"} +{"level":"INFO","message":"[AccountRepository] Saved account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB.","timestamp":"2025-06-06T16:15:09.808Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:15:09.895Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:15:09.896Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:15:29.663Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set\n[AccountRouteHandler] Updating existing profile 2194214a-c1b9-4361-b83b-ea5d53715448\n[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set\n[AccountService] Updated existing user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:15:29.683Z"} +{"level":"INFO","message":"[AccountRepository] Saved account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB.","timestamp":"2025-06-06T16:15:29.773Z"} +{"level":"INFO","message":"[SERVER] Stopping server...","timestamp":"2025-06-06T16:16:24.661Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-06T16:16:58.216Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-06T16:16:58.239Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-06T16:16:58.494Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-06T16:16:58.500Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-06T16:16:58.569Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-06T16:16:58.571Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-06T16:16:58.609Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-06T16:16:58.683Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-06T16:16:58.684Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-06T16:16:58.685Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-06T16:16:58.690Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-06T16:16:58.691Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-06T16:16:58.693Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-06T16:16:58.694Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-06T16:16:58.715Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-06T16:16:58.716Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-06T16:16:58.733Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...\n[AdminPanel] Using default password: true","timestamp":"2025-06-06T16:16:58.859Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-06T16:16:58.940Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-06T16:16:58.941Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.","timestamp":"2025-06-06T16:16:58.941Z"} +{"level":"INFO","message":"[ROUTER] Loading all route handlers...","timestamp":"2025-06-06T16:16:58.942Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-06T16:16:59.122Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-06T16:16:59.271Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-06T16:16:59.295Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-06T16:16:59.296Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-06T16:16:59.343Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-06T16:16:59.344Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-06T16:16:59.345Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized","timestamp":"2025-06-06T16:16:59.346Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-06T16:16:59.347Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized","timestamp":"2025-06-06T16:16:59.347Z"} +{"level":"INFO","message":"[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-06T16:16:59.348Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...","timestamp":"2025-06-06T16:16:59.349Z"} +{"level":"INFO","message":"[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-06T16:16:59.350Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...\n[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public\n[AdminPanel] Admin panel routes initialized\n[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-06T16:16:59.357Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-06T16:17:24.782Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:17:24.783Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:17:24.784Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:17:24.785Z"} +{"level":"INFO","message":"[MostPlayedRepository] Loading most played data from DB...","timestamp":"2025-06-06T16:17:24.788Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:17:24.789Z"} +{"level":"INFO","message":"[MostPlayedRepository] Most played data loaded from DB.","timestamp":"2025-06-06T16:17:24.804Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:18:09.891Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:18:09.892Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:18:29.663Z"} +{"level":"ERROR","message":"[LEADERBOARD] Error in handleRegularLeaderboard: SQLITE_ERROR: no such column: name","timestamp":"2025-06-06T16:18:29.672Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-06T16:18:46.821Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set\n[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:18:46.822Z"} +{"level":"INFO","message":"[MostPlayedRepository] Loading most played data from DB...","timestamp":"2025-06-06T16:18:46.823Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:18:46.824Z"} +{"level":"INFO","message":"[MostPlayedRepository] Most played data loaded from DB.","timestamp":"2025-06-06T16:18:46.825Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:21:09.931Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:21:09.950Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-06T16:23:31.111Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set\n[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set\n[AccountRouteHandler] Updating existing profile 2194214a-c1b9-4361-b83b-ea5d53715448\n[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set\n[AccountService] Updated existing user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:23:31.127Z"} +{"level":"INFO","message":"[AccountRepository] Saved account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB.","timestamp":"2025-06-06T16:23:31.160Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:24:09.941Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:24:09.943Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:24:14.522Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:24:14.523Z"} +{"level":"INFO","message":"[MostPlayedRepository] Loading most played data from DB...","timestamp":"2025-06-06T16:24:14.524Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set\n[MostPlayedRepository] Most played data loaded from DB.","timestamp":"2025-06-06T16:24:14.525Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-06T16:24:55.208Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set\n[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set\n[AccountRouteHandler] Updating existing profile 2194214a-c1b9-4361-b83b-ea5d53715448\n[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:24:55.210Z"} +{"level":"INFO","message":"[AccountService] Updated existing user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:24:55.211Z"} +{"level":"INFO","message":"[AccountRepository] Saved account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB.","timestamp":"2025-06-06T16:24:55.217Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-06T16:25:26.628Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set\n[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:25:26.630Z"} +{"level":"INFO","message":"[MostPlayedRepository] Loading most played data from DB...\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:25:26.631Z"} +{"level":"INFO","message":"[MostPlayedRepository] Most played data loaded from DB.","timestamp":"2025-06-06T16:25:26.632Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:26:31.411Z"} +{"level":"ERROR","message":"[LEADERBOARD] Error in handleRegularLeaderboard: SQLITE_ERROR: no such column: name","timestamp":"2025-06-06T16:26:31.415Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:26:34.687Z"} +{"level":"ERROR","message":"[LEADERBOARD] Error in handleRegularLeaderboard: SQLITE_ERROR: no such column: name","timestamp":"2025-06-06T16:26:34.688Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:26:39.735Z"} +{"level":"ERROR","message":"[LEADERBOARD] Error in handleRegularLeaderboard: SQLITE_ERROR: no such column: name","timestamp":"2025-06-06T16:26:39.736Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:27:09.925Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:27:37.641Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-06T16:27:37.644Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:27:37.645Z"} +{"level":"INFO","message":"[MostPlayedRepository] Loading most played data from DB...\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:27:37.645Z"} +{"level":"INFO","message":"[MostPlayedRepository] Most played data loaded from DB.","timestamp":"2025-06-06T16:27:37.646Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-06T16:30:09.946Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T04:37:48.772Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T04:37:48.792Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T04:37:48.883Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T04:37:48.892Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T04:37:48.947Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T04:37:48.949Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T04:37:48.997Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T04:37:51.806Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T04:37:51.808Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T04:37:51.812Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T04:37:51.823Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T04:37:51.825Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-07T04:37:51.828Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-07T04:37:51.829Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-07T04:37:51.873Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-07T04:37:51.874Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin","timestamp":"2025-06-07T04:37:51.889Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-07T04:37:51.890Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...\n[AdminPanel] Using default password: true","timestamp":"2025-06-07T04:37:52.082Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-07T04:37:52.160Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-07T04:37:52.162Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T04:37:52.162Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T04:37:52.439Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T04:37:52.675Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T04:37:52.686Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T04:37:52.687Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-07T04:37:52.764Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T04:37:52.765Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T04:37:52.765Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized","timestamp":"2025-06-07T04:37:52.766Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized","timestamp":"2025-06-07T04:37:52.767Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...","timestamp":"2025-06-07T04:37:52.767Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...","timestamp":"2025-06-07T04:37:52.768Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized","timestamp":"2025-06-07T04:37:52.769Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-07T04:37:52.770Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-07T04:37:52.771Z"} +{"level":"INFO","message":"[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public","timestamp":"2025-06-07T04:37:52.774Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-07T04:37:52.775Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T04:37:52.776Z"} +{"level":"INFO","message":"[ACC] CustomAuth detected, verifying...\n[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:41:06.941Z"} +{"level":"INFO","message":"[ACC] CustomAuth register: Ibruh","timestamp":"2025-06-07T04:41:06.979Z"} +{"level":"INFO","message":"[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:41:06.980Z"} +{"level":"INFO","message":"[AccountService] Updated existing user 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-07T04:41:07.853Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:41:07.855Z"} +{"level":"ERROR","message":"[AccountRepository] Error saving account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB: SQLITE_ERROR: table user_profiles has no column named userId","timestamp":"2025-06-07T04:41:07.899Z"} +{"level":"ERROR","message":"node:internal/process/promises:394\r\n triggerUncaughtException(err, true /* fromPromise */);\r\n ^\r\n\r\n[Error: SQLITE_ERROR: table user_profiles has no column named userId] {\r\n errno: 1,\r\n code: 'SQLITE_ERROR'\r\n}","timestamp":"2025-06-07T04:41:07.902Z"} +{"level":"ERROR","message":"Node.js v22.15.1","timestamp":"2025-06-07T04:41:07.904Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T04:42:45.669Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T04:42:45.693Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T04:42:45.970Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T04:42:45.972Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T04:42:46.018Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T04:42:46.021Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T04:42:46.079Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T04:42:46.302Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T04:42:46.303Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T04:42:46.309Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T04:42:46.317Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T04:42:46.318Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-07T04:42:46.321Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-07T04:42:46.322Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-07T04:42:46.349Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-07T04:42:46.350Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin","timestamp":"2025-06-07T04:42:46.361Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-07T04:42:46.363Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...\n[AdminPanel] Using default password: true","timestamp":"2025-06-07T04:42:48.172Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-07T04:42:48.257Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-07T04:42:48.258Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.","timestamp":"2025-06-07T04:42:48.260Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T04:42:48.261Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T04:42:48.514Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T04:42:48.756Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T04:42:48.761Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T04:42:48.762Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-07T04:42:48.939Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...\n[ROUTE] DefaultRouteHandler routes initialized\n[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T04:42:48.942Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)\n[WDFPlugin] Initializing routes...\n[WDFPlugin] Routes initialized","timestamp":"2025-06-07T04:42:48.943Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-07T04:42:48.944Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-07T04:42:48.945Z"} +{"level":"INFO","message":"[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public","timestamp":"2025-06-07T04:42:48.946Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-07T04:42:48.946Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T04:42:48.951Z"} +{"level":"INFO","message":"[ACC] CustomAuth detected, verifying...","timestamp":"2025-06-07T04:42:49.299Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:42:49.300Z"} +{"level":"INFO","message":"[ACC] CustomAuth register: Ibruh\n[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:42:49.301Z"} +{"level":"INFO","message":"[AccountService] Updated existing user 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-07T04:42:49.316Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:42:49.317Z"} +{"level":"ERROR","message":"[AccountRepository] Error saving account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB: SQLITE_ERROR: table user_profiles has no column named userId","timestamp":"2025-06-07T04:42:49.320Z"} +{"level":"ERROR","message":"node:internal/process/promises:394\r\n triggerUncaughtException(err, true /* fromPromise */);\r\n ^\r\n\r\n[Error: SQLITE_ERROR: table user_profiles has no column named userId] {\r\n errno: 1,\r\n code: 'SQLITE_ERROR'\r\n}","timestamp":"2025-06-07T04:42:49.324Z"} +{"level":"ERROR","message":"Node.js v22.15.1","timestamp":"2025-06-07T04:42:49.325Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T04:46:47.782Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T04:46:47.818Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T04:46:48.525Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T04:46:48.652Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T04:46:48.758Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T04:46:48.826Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T04:46:48.893Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T04:46:49.237Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T04:46:49.238Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T04:46:49.243Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T04:46:49.280Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T04:46:49.282Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-07T04:46:49.286Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-07T04:46:49.287Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-07T04:46:49.304Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-07T04:46:49.305Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-07T04:46:49.321Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...\n[AdminPanel] Using default password: true","timestamp":"2025-06-07T04:46:51.105Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-07T04:46:51.183Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-07T04:46:51.184Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.","timestamp":"2025-06-07T04:46:51.185Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T04:46:51.186Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T04:46:51.398Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T04:46:51.597Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T04:46:51.620Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T04:46:51.621Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-07T04:46:51.732Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T04:46:51.733Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T04:46:51.734Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-07T04:46:51.735Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T04:46:51.736Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...","timestamp":"2025-06-07T04:46:51.737Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)","timestamp":"2025-06-07T04:46:51.738Z"} +{"level":"INFO","message":"[WDFPlugin] Initializing routes...\n[WDFPlugin] Routes initialized","timestamp":"2025-06-07T04:46:51.740Z"} +{"level":"INFO","message":"[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...\n[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-07T04:46:51.742Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...\n[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public","timestamp":"2025-06-07T04:46:51.744Z"} +{"level":"INFO","message":"[AdminPanel] Admin panel routes initialized","timestamp":"2025-06-07T04:46:51.748Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T04:46:51.750Z"} +{"level":"INFO","message":"[ACC] CustomAuth detected, verifying...","timestamp":"2025-06-07T04:46:52.610Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:46:52.612Z"} +{"level":"INFO","message":"[ACC] CustomAuth register: Ibruh","timestamp":"2025-06-07T04:46:52.614Z"} +{"level":"INFO","message":"[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:46:52.617Z"} +{"level":"INFO","message":"[AccountService] Created new user 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-07T04:46:52.637Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:46:52.638Z"} +{"level":"ERROR","message":"[AccountRepository] Error saving account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB: SQLITE_ERROR: 41 values for 40 columns","timestamp":"2025-06-07T04:46:52.641Z"} +{"level":"ERROR","message":"node:internal/process/promises:394\r\n triggerUncaughtException(err, true /* fromPromise */);\r\n ^\r\n\r\n[Error: SQLITE_ERROR: 41 values for 40 columns] {\r\n errno: 1,\r\n code: 'SQLITE_ERROR'\r\n}","timestamp":"2025-06-07T04:46:52.644Z"} +{"level":"ERROR","message":"Node.js v22.15.1","timestamp":"2025-06-07T04:46:52.645Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T04:48:08.007Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T04:48:08.025Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T04:48:08.279Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T04:48:08.287Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T04:48:08.344Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T04:48:08.346Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T04:48:08.389Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T04:48:08.571Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T04:48:08.573Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T04:48:08.577Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T04:48:08.581Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T04:48:08.583Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins...","timestamp":"2025-06-07T04:48:08.585Z"} +{"level":"INFO","message":"[PluginManager] Plugin class used for comparison: Plugin","timestamp":"2025-06-07T04:48:08.586Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/core/wdf/FakeWdfPlugin.js' extends: Plugin","timestamp":"2025-06-07T04:48:08.602Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: WDFPlugin","timestamp":"2025-06-07T04:48:08.603Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/HelloWorldPlugin.js' extends: Plugin\n[PluginManager] Loaded plugin: HelloWorldPlugin","timestamp":"2025-06-07T04:48:08.619Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin password...\n[AdminPanel] Using default password: true","timestamp":"2025-06-07T04:48:09.932Z"} +{"level":"INFO","message":"[AdminPanel] Admin password hashed successfully","timestamp":"2025-06-07T04:48:10.014Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin '{dirname}/plugins/AdminPanelPlugin.js' extends: Plugin","timestamp":"2025-06-07T04:48:10.015Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: AdminPanelPlugin\n[PluginManager] Initializing pre-load plugins...","timestamp":"2025-06-07T04:48:10.016Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin WDFPlugin: Execution type mismatch or no config.\n[PluginManager] Skipping plugin HelloWorldPlugin: Execution type mismatch or no config.","timestamp":"2025-06-07T04:48:10.017Z"} +{"level":"INFO","message":"[PluginManager] Skipping plugin AdminPanelPlugin: Execution type mismatch or no config.\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T04:48:10.018Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T04:48:10.196Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T04:48:10.416Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T04:48:10.435Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T04:48:10.436Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-07T04:48:10.518Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T04:48:10.519Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T04:48:10.520Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-07T04:48:10.521Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T04:48:10.521Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...","timestamp":"2025-06-07T04:48:10.522Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: WDFPlugin (Execution Type: init)","timestamp":"2025-06-07T04:48:10.523Z"} +{"level":"INFO","message":"[WDFPlugin] Initializing routes...","timestamp":"2025-06-07T04:48:10.523Z"} +{"level":"INFO","message":"[WDFPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorldPlugin (Execution Type: init)\n[HelloWorldPlugin] Initializing routes...","timestamp":"2025-06-07T04:48:10.524Z"} +{"level":"INFO","message":"[HelloWorldPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: AdminPanelPlugin (Execution Type: init)","timestamp":"2025-06-07T04:48:10.525Z"} +{"level":"INFO","message":"[AdminPanel] Initializing admin panel routes...","timestamp":"2025-06-07T04:48:10.526Z"} +{"level":"INFO","message":"[AdminPanel] Serving static files from: D:\\ibra\\OpenParty\\plugins\\panel\\public\n[AdminPanel] Admin panel routes initialized\n[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T04:48:10.528Z"} +{"level":"INFO","message":"[ACC] CustomAuth detected, verifying...","timestamp":"2025-06-07T04:48:18.726Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:48:18.727Z"} +{"level":"INFO","message":"[ACC] CustomAuth register: Ibruh","timestamp":"2025-06-07T04:48:18.728Z"} +{"level":"INFO","message":"[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:48:18.729Z"} +{"level":"INFO","message":"[AccountService] Created new user 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-07T04:48:18.758Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:48:18.762Z"} +{"level":"INFO","message":"[AccountRepository] Saved account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB.","timestamp":"2025-06-07T04:48:18.780Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T04:48:23.723Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:48:23.742Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:48:40.024Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:48:55.889Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:48:55.978Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-07T04:48:55.978Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set\n[AccountRouteHandler] Updating existing profile 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-07T04:48:55.979Z"} +{"level":"INFO","message":"[AccountService] Updating user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set\n[AccountService] Processed 'favorites' array to object for profile 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-07T04:48:55.980Z"} +{"level":"ERROR","message":"[AccountService] Received 'songsPlayed' as a number (0) for profile 2194214a-c1b9-4361-b83b-ea5d53715448. This will be ignored as the model expects an array of map names for 'songsPlayed'.","timestamp":"2025-06-07T04:48:55.981Z"} +{"level":"INFO","message":"[AccountService] Updated existing user 2194214a-c1b9-4361-b83b-ea5d53715448\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:48:55.982Z"} +{"level":"INFO","message":"[AccountRepository] Saved account 2194214a-c1b9-4361-b83b-ea5d53715448 to DB.","timestamp":"2025-06-07T04:48:56.094Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:49:10.036Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:49:40.044Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:49:40.396Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 2194214a-c1b9-4361-b83b-ea5d53715448","timestamp":"2025-06-07T04:49:40.398Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:49:40.399Z"} +{"level":"INFO","message":"[MostPlayedRepository] Loading most played data from DB...","timestamp":"2025-06-07T04:49:40.402Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:49:40.404Z"} +{"level":"INFO","message":"[MostPlayedRepository] Most played data loaded from DB.","timestamp":"2025-06-07T04:49:40.423Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:50:10.044Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:50:31.073Z"} +{"level":"ERROR","message":"[LEADERBOARD] Error in handleRegularLeaderboard: SQLITE_ERROR: no such column: name","timestamp":"2025-06-07T04:50:31.078Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:50:32.243Z"} +{"level":"ERROR","message":"[LEADERBOARD] Error in handleRegularLeaderboard: SQLITE_ERROR: no such column: name","timestamp":"2025-06-07T04:50:32.245Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:50:34.417Z"} +{"level":"ERROR","message":"[LEADERBOARD] Error in handleRegularLeaderboard: SQLITE_ERROR: no such column: name","timestamp":"2025-06-07T04:50:34.418Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T04:50:35.060Z"} +{"level":"ERROR","message":"[LEADERBOARD] Error in handleRegularLeaderboard: SQLITE_ERROR: no such column: name","timestamp":"2025-06-07T04:50:35.063Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:50:40.050Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:51:10.068Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:51:40.069Z"} +{"level":"INFO","message":"[AdminPanel] Login attempt received","timestamp":"2025-06-07T04:52:03.059Z"} +{"level":"INFO","message":"[AdminPanel] Request body: [object Object]\n[AdminPanel] Comparing passwords...","timestamp":"2025-06-07T04:52:03.061Z"} +{"level":"INFO","message":"[AdminPanel] Password match result: true","timestamp":"2025-06-07T04:52:03.164Z"} +{"level":"INFO","message":"[AdminPanel] Login successful","timestamp":"2025-06-07T04:52:03.165Z"} +{"level":"ERROR","message":"TypeError: plugins.map is not a function\n at D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:133:30\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\n at requireAuth (D:\\ibra\\OpenParty\\plugins\\AdminPanelPlugin.js:83:17)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:149:13)\n at Route.dispatch (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\route.js:119:3)\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:284:15\n at Function.process_params (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\index.js:346:12)","timestamp":"2025-06-07T04:52:04.850Z"} +{"level":"INFO","message":"[AdminPanel] Backups directory does not exist, creating: D:\\ibra\\OpenParty\\backups","timestamp":"2025-06-07T04:52:05.446Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:52:10.069Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:52:40.079Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:53:10.089Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:53:40.094Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:54:10.101Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:54:40.106Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:55:10.107Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:55:40.112Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:56:10.126Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:56:40.134Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:57:10.144Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:57:40.148Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:58:10.149Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:58:40.164Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:59:10.181Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T04:59:40.183Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T05:00:10.190Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T05:00:40.194Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T05:01:10.193Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T05:01:40.208Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T05:02:10.212Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T05:02:40.220Z"} +{"level":"ERROR","message":"[AdminPanel] Stats update error: pluginManager.getPlugins(...).filter is not a function","timestamp":"2025-06-07T05:03:10.225Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T05:03:24.444Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T05:03:24.456Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T05:03:24.742Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T05:03:24.750Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T05:03:24.805Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T05:03:24.808Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T05:03:24.866Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T05:03:25.002Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T05:03:25.004Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T05:03:25.045Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T05:03:25.055Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T05:03:25.056Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T05:03:25.061Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.\n[PluginManager] Manifest.json not found in plugin folder: HelloWorld. Skipping.\n[PluginManager] Manifest.json not found in plugin folder: panel. Skipping.","timestamp":"2025-06-07T05:03:25.064Z"} +{"level":"INFO","message":"[PluginManager] Initializing pre-load plugins...\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T05:03:25.065Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T05:03:25.235Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T05:03:25.492Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T05:03:25.506Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T05:03:25.507Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-07T05:03:25.623Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T05:03:25.624Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T05:03:25.625Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized","timestamp":"2025-06-07T05:03:25.626Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized","timestamp":"2025-06-07T05:03:25.627Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...","timestamp":"2025-06-07T05:03:25.628Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T05:03:25.629Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T05:08:48.879Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T05:08:48.900Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T05:08:49.167Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T05:08:49.169Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T05:08:49.232Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T05:08:49.234Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T05:08:49.270Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T05:08:49.368Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T05:08:49.369Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T05:08:49.371Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T05:08:49.375Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T05:08:49.376Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T05:08:49.379Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.","timestamp":"2025-06-07T05:08:49.381Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('WDFPlugin') differs from manifest ('FakeWdfPlugin') for plugin in folder 'FakeWDF'. Using manifest name. Logger will use 'WDFPlugin'.","timestamp":"2025-06-07T05:08:49.386Z"} +{"level":"ERROR","message":"[PluginManager] Main plugin file 'HelloWorld.js' not found in HelloWorld at D:\\ibra\\OpenParty\\plugins\\HelloWorld\\HelloWorld.js. Skipping.","timestamp":"2025-06-07T05:08:49.386Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: FakeWdfPlugin (v1.0.0) from FakeWDF\n[PluginManager] Initializing pre-load plugins...\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T05:08:49.387Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T05:08:49.697Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T05:08:49.998Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T05:08:50.039Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T05:08:50.040Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-07T05:08:50.106Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T05:08:50.107Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T05:08:50.108Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-07T05:08:50.108Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T05:08:50.109Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...","timestamp":"2025-06-07T05:08:50.110Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: FakeWdfPlugin (Execution Type: init)","timestamp":"2025-06-07T05:08:50.111Z"} +{"level":"INFO","message":"[WDFPlugin] Initializing routes...\n[WDFPlugin] Routes initialized","timestamp":"2025-06-07T05:08:50.112Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T05:08:50.112Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T05:33:18.068Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T05:33:18.086Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T05:33:18.336Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T05:33:18.338Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T05:33:18.374Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T05:33:18.377Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T05:33:18.416Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T05:33:18.556Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T05:33:18.557Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T05:33:18.581Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T05:33:18.588Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T05:33:18.589Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T05:33:18.592Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.","timestamp":"2025-06-07T05:33:18.594Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('WDFPlugin') differs from manifest ('FakeWdfPlugin') for plugin in folder 'FakeWDF'. Updating logger to use manifest name 'FakeWdfPlugin'.","timestamp":"2025-06-07T05:33:18.608Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: FakeWdfPlugin (v1.0.0) from FakeWDF","timestamp":"2025-06-07T05:33:18.610Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('HelloWorldPlugin') differs from manifest ('HelloWorld') for plugin in folder 'HelloWorld'. Updating logger to use manifest name 'HelloWorld'.\n[PluginManager] Loaded plugin: HelloWorld (v1.0.0) from HelloWorld","timestamp":"2025-06-07T05:33:18.626Z"} +{"level":"ERROR","message":"[PluginManager] Error loading plugin from JDPartyWDF: Cannot find module '../../../database/config/encryption.json'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js\nError: Cannot find module '../../../database/config/encryption.json'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js\n at Function._resolveFilename (node:internal/modules/cjs/loader:1401:15)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)\n at Object. (D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js:7:19)\n at Module._compile (node:internal/modules/cjs/loader:1730:14)","timestamp":"2025-06-07T05:33:18.633Z"} +{"level":"INFO","message":"[PluginManager] Initializing pre-load plugins...\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T05:33:18.634Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T05:33:18.803Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T05:33:19.069Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T05:33:19.108Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T05:33:19.110Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-07T05:33:19.192Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T05:33:19.193Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T05:33:19.196Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T05:33:19.201Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Calling initroute for plugin: FakeWdfPlugin (Execution Type: init)\n[FakeWdfPlugin] Initializing routes...\n[FakeWdfPlugin] Routes initialized\n[PluginManager] Calling initroute for plugin: HelloWorld (Execution Type: init)\n[HelloWorld] Initializing routes...\n[HelloWorld] Routes initialized\n[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs","timestamp":"2025-06-07T05:33:19.202Z"} +{"level":"INFO","message":"[SERVER] Running in development mode","timestamp":"2025-06-07T05:33:19.203Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T05:34:09.567Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T05:34:09.597Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T05:34:09.665Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T05:34:09.667Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T05:34:09.680Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T05:34:09.683Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T05:34:09.715Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T05:34:09.732Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T05:34:09.733Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T05:34:09.735Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T05:34:09.738Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T05:34:09.739Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T05:34:09.742Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.","timestamp":"2025-06-07T05:34:09.743Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('WDFPlugin') differs from manifest ('FakeWdfPlugin') for plugin in folder 'FakeWDF'. Updating logger to use manifest name 'FakeWdfPlugin'.","timestamp":"2025-06-07T05:34:09.750Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: FakeWdfPlugin (v1.0.0) from FakeWDF","timestamp":"2025-06-07T05:34:09.750Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('HelloWorldPlugin') differs from manifest ('HelloWorld') for plugin in folder 'HelloWorld'. Updating logger to use manifest name 'HelloWorld'.","timestamp":"2025-06-07T05:34:09.751Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorld (v1.0.0) from HelloWorld","timestamp":"2025-06-07T05:34:09.752Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: JDPartyWDF (v1.0.0) from JDPartyWDF","timestamp":"2025-06-07T05:34:09.757Z"} +{"level":"INFO","message":"[PluginManager] Plugin 'FakeWdfPlugin' is being overridden and will be disabled by another plugin.\n[FakeWdfPlugin] disabled\n[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T05:34:09.758Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T05:34:09.787Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T05:34:09.827Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T05:34:09.833Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T05:34:09.834Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-07T05:34:09.844Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T05:34:09.845Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T05:34:09.847Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-07T05:34:09.848Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T05:34:09.849Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized","timestamp":"2025-06-07T05:34:09.851Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized","timestamp":"2025-06-07T05:34:09.851Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers","timestamp":"2025-06-07T05:34:09.852Z"} +{"level":"INFO","message":"[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[PluginManager] Calling initroute for plugin: HelloWorld (Execution Type: init)\n[HelloWorld] Initializing routes...\n[HelloWorld] Routes initialized\n[PluginManager] Calling initroute for plugin: JDPartyWDF (Execution Type: init)\n[JDPartyWDF] Initializing JDPartyWDF routes...","timestamp":"2025-06-07T05:34:09.853Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Loading saved session...","timestamp":"2025-06-07T05:34:09.855Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No saved session found","timestamp":"2025-06-07T05:34:09.856Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for {\"Despacito\":0} (1/3)","timestamp":"2025-06-07T05:34:09.856Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Creating WDF Session at Room MainJDParty","timestamp":"2025-06-07T05:34:09.858Z"} +{"level":"INFO","message":"[JDPartyWDF] JDPartyWDF routes initialized.","timestamp":"2025-06-07T05:34:09.859Z"} +{"level":"ERROR","message":"[JDPartyWDF] [WDF] AuthKey WDF Has low security. PLEASE CHANGE OR WDF WILL BE HIJACKED.","timestamp":"2025-06-07T05:34:09.860Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T05:34:09.861Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map","timestamp":"2025-06-07T05:34:39.016Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Most Voted Map: Despacito","timestamp":"2025-06-07T05:34:39.017Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for {\"Despacito\":0,\"MaterialGirl\":0} (2/3)","timestamp":"2025-06-07T05:39:20.379Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map","timestamp":"2025-06-07T05:40:00.370Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Most Voted Map: Despacito","timestamp":"2025-06-07T05:40:00.372Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Tournament Presentation for MaterialGirl (0/3)","timestamp":"2025-06-07T05:44:41.960Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Tournament Map: MaterialGirl","timestamp":"2025-06-07T05:44:56.765Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Tournament Presentation for Despacito (1/3)","timestamp":"2025-06-07T05:48:46.318Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Tournament Map: Despacito","timestamp":"2025-06-07T05:49:01.324Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T06:00:47.743Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T06:00:47.798Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T06:00:48.120Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T06:00:48.122Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T06:00:48.174Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T06:00:48.176Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T06:00:48.240Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T06:00:48.499Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T06:00:48.501Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T06:00:48.505Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T06:00:48.511Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T06:00:48.512Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T06:00:48.516Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.","timestamp":"2025-06-07T06:00:48.517Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('WDFPlugin') differs from manifest ('FakeWdfPlugin') for plugin in folder 'FakeWDF'. Updating logger to use manifest name 'FakeWdfPlugin'.","timestamp":"2025-06-07T06:00:48.556Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: FakeWdfPlugin (v1.0.0) from FakeWDF","timestamp":"2025-06-07T06:00:48.557Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('HelloWorldPlugin') differs from manifest ('HelloWorld') for plugin in folder 'HelloWorld'. Updating logger to use manifest name 'HelloWorld'.","timestamp":"2025-06-07T06:00:48.571Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorld (v1.0.0) from HelloWorld","timestamp":"2025-06-07T06:00:48.572Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: JDPartyWDF (v1.0.0) from JDPartyWDF","timestamp":"2025-06-07T06:00:48.660Z"} +{"level":"INFO","message":"[PluginManager] Plugin 'FakeWdfPlugin' is being overridden and will be disabled by another plugin.\n[FakeWdfPlugin] disabled\n[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T06:00:48.671Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T06:00:48.960Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T06:00:49.274Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T06:00:49.308Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T06:00:49.310Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-07T06:00:49.378Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T06:00:49.379Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T06:00:49.381Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-07T06:00:49.382Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T06:00:49.382Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...","timestamp":"2025-06-07T06:00:49.383Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[PluginManager] Calling initroute for plugin: HelloWorld (Execution Type: init)\n[HelloWorld] Initializing routes...\n[HelloWorld] Routes initialized\n[PluginManager] Calling initroute for plugin: JDPartyWDF (Execution Type: init)","timestamp":"2025-06-07T06:00:49.385Z"} +{"level":"INFO","message":"[JDPartyWDF] Initializing JDPartyWDF routes...","timestamp":"2025-06-07T06:00:49.386Z"} +{"level":"ERROR","message":"[PluginManager] Error initializing plugin JDPartyWDF: Cannot read properties of undefined (reading 'wdfKey')\nTypeError: Cannot read properties of undefined (reading 'wdfKey')\n at new WDFSessionManager (D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js:18:35)\n at JDPartyWDFPlugin.initroute (D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js:1185:31)\n at D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js:117:40\n at Map.forEach ()\n at PluginManager.initializePlugins (D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js:112:22)\n at Core.init (D:\\ibra\\OpenParty\\core\\classes\\Core.js:63:24)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Server. (D:\\ibra\\OpenParty\\core\\classes\\Server.js:36:7)","timestamp":"2025-06-07T06:00:49.387Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T06:00:49.389Z"} +{"level":"INFO","message":"[SERVER] Stopping server...","timestamp":"2025-06-07T06:01:55.834Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T06:01:58.550Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T06:01:58.556Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T06:01:58.645Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T06:01:58.646Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T06:01:58.653Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T06:01:58.655Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T06:01:58.684Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T06:01:58.698Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T06:01:58.699Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T06:01:58.707Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T06:01:58.716Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T06:01:58.717Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T06:01:58.720Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.","timestamp":"2025-06-07T06:01:58.721Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('WDFPlugin') differs from manifest ('FakeWdfPlugin') for plugin in folder 'FakeWDF'. Updating logger to use manifest name 'FakeWdfPlugin'.","timestamp":"2025-06-07T06:01:58.727Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: FakeWdfPlugin (v1.0.0) from FakeWDF","timestamp":"2025-06-07T06:01:58.728Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('HelloWorldPlugin') differs from manifest ('HelloWorld') for plugin in folder 'HelloWorld'. Updating logger to use manifest name 'HelloWorld'.","timestamp":"2025-06-07T06:01:58.728Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorld (v1.0.0) from HelloWorld","timestamp":"2025-06-07T06:01:58.729Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: JDPartyWDF (v1.0.0) from JDPartyWDF","timestamp":"2025-06-07T06:01:58.739Z"} +{"level":"INFO","message":"[PluginManager] Plugin 'FakeWdfPlugin' is being overridden and will be disabled by another plugin.\n[FakeWdfPlugin] disabled\n[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T06:01:58.740Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T06:01:58.764Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T06:01:58.796Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T06:01:58.801Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T06:01:58.801Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-07T06:01:58.813Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T06:01:58.814Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T06:01:58.814Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...\n[ROUTE] LeaderboardRouteHandler routes initialized","timestamp":"2025-06-07T06:01:58.815Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized","timestamp":"2025-06-07T06:01:58.816Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[PluginManager] Calling initroute for plugin: HelloWorld (Execution Type: init)","timestamp":"2025-06-07T06:01:58.816Z"} +{"level":"INFO","message":"[HelloWorld] Initializing routes...\n[HelloWorld] Routes initialized\n[PluginManager] Calling initroute for plugin: JDPartyWDF (Execution Type: init)\n[JDPartyWDF] Initializing JDPartyWDF routes...","timestamp":"2025-06-07T06:01:58.817Z"} +{"level":"ERROR","message":"[PluginManager] Error initializing plugin JDPartyWDF: Cannot read properties of undefined (reading 'wdfKey')\nTypeError: Cannot read properties of undefined (reading 'wdfKey')\n at new WDFSessionManager (D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js:18:35)\n at JDPartyWDFPlugin.initroute (D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js:1185:31)\n at D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js:117:40\n at Map.forEach ()\n at PluginManager.initializePlugins (D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js:112:22)\n at Core.init (D:\\ibra\\OpenParty\\core\\classes\\Core.js:63:24)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Server. (D:\\ibra\\OpenParty\\core\\classes\\Server.js:36:7)","timestamp":"2025-06-07T06:01:58.818Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T06:01:58.819Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T06:02:26.882Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T06:02:26.888Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T06:02:26.986Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T06:02:26.988Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T06:02:27.008Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T06:02:27.010Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T06:02:27.041Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T06:02:27.059Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T06:02:27.060Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T06:02:27.062Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T06:02:27.065Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T06:02:27.066Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T06:02:27.069Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.","timestamp":"2025-06-07T06:02:27.071Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('WDFPlugin') differs from manifest ('FakeWdfPlugin') for plugin in folder 'FakeWDF'. Updating logger to use manifest name 'FakeWdfPlugin'.","timestamp":"2025-06-07T06:02:27.076Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: FakeWdfPlugin (v1.0.0) from FakeWDF","timestamp":"2025-06-07T06:02:27.077Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('HelloWorldPlugin') differs from manifest ('HelloWorld') for plugin in folder 'HelloWorld'. Updating logger to use manifest name 'HelloWorld'.","timestamp":"2025-06-07T06:02:27.078Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorld (v1.0.0) from HelloWorld","timestamp":"2025-06-07T06:02:27.079Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: JDPartyWDF (v1.0.0) from JDPartyWDF","timestamp":"2025-06-07T06:02:27.089Z"} +{"level":"INFO","message":"[PluginManager] Plugin 'FakeWdfPlugin' is being overridden and will be disabled by another plugin.\n[FakeWdfPlugin] disabled\n[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T06:02:27.090Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T06:02:27.115Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T06:02:27.149Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T06:02:27.154Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T06:02:27.155Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-07T06:02:27.166Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T06:02:27.167Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T06:02:27.168Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-07T06:02:27.169Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T06:02:27.169Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized","timestamp":"2025-06-07T06:02:27.170Z"} +{"level":"INFO","message":"[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[PluginManager] Calling initroute for plugin: HelloWorld (Execution Type: init)\n[HelloWorld] Initializing routes...\n[HelloWorld] Routes initialized\n[PluginManager] Calling initroute for plugin: JDPartyWDF (Execution Type: init)\n[JDPartyWDF] Initializing JDPartyWDF routes...","timestamp":"2025-06-07T06:02:27.171Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Loading saved session...","timestamp":"2025-06-07T06:02:27.172Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Session loaded successfully.","timestamp":"2025-06-07T06:02:27.174Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Creating WDF Session at Room MainJDParty","timestamp":"2025-06-07T06:02:27.175Z"} +{"level":"INFO","message":"[JDPartyWDF] JDPartyWDF routes initialized.","timestamp":"2025-06-07T06:02:27.176Z"} +{"level":"ERROR","message":"[JDPartyWDF] [WDF] AuthKey WDF Has low security. PLEASE CHANGE OR WDF WILL BE HIJACKED.","timestamp":"2025-06-07T06:02:27.176Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T06:02:27.177Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Tournament Presentation for Despacito (Round 3/3)","timestamp":"2025-06-07T06:02:27.178Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Tournament Map: Despacito (Round 3)","timestamp":"2025-06-07T06:02:27.186Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for [\"Despacito\",\"MaterialGirl\"] (Vote Cycle Song 1/3)","timestamp":"2025-06-07T06:02:27.189Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map","timestamp":"2025-06-07T06:02:27.204Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Most Voted Map: MaterialGirl","timestamp":"2025-06-07T06:02:27.205Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for [\"Despacito\",\"Despacito\"] (Vote Cycle Song 2/3)","timestamp":"2025-06-07T06:03:13.636Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map","timestamp":"2025-06-07T06:03:53.639Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Most Voted Map: Despacito","timestamp":"2025-06-07T06:03:53.641Z"} +{"level":"INFO","message":"[ACC] CustomAuth detected, verifying...","timestamp":"2025-06-07T06:06:29.981Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 312b41ee-c032-4559-99cd-27208f42b381\n[DatabaseManager] getDb() called. this._db is: set\n[ACC] CustomAuth register: Ibratabian17C\n[AccountService] Updating user 312b41ee-c032-4559-99cd-27208f42b381\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:06:30.103Z"} +{"level":"INFO","message":"[AccountService] Created new user 312b41ee-c032-4559-99cd-27208f42b381\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:06:30.108Z"} +{"level":"INFO","message":"[AccountRepository] Saved account 312b41ee-c032-4559-99cd-27208f42b381 to DB.","timestamp":"2025-06-07T06:06:30.124Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:06:33.401Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:06:33.402Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 312b41ee-c032-4559-99cd-27208f42b381\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:07:11.857Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 158 (line 1 column 159)","timestamp":"2025-06-07T06:07:11.973Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 158 (line 1 column 159)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:07:11.977Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 158 (line 1 column 159)\n[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 158 (line 1 column 159)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:07:31.939Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:07:38.205Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 312b41ee-c032-4559-99cd-27208f42b381","timestamp":"2025-06-07T06:07:38.211Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:07:38.212Z"} +{"level":"INFO","message":"[MostPlayedRepository] Loading most played data from DB...","timestamp":"2025-06-07T06:07:38.224Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:07:38.225Z"} +{"level":"INFO","message":"[MostPlayedRepository] Most played data loaded from DB.","timestamp":"2025-06-07T06:07:38.236Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 158 (line 1 column 159)\n[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 158 (line 1 column 159)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:07:51.937Z"} +{"level":"ERROR","message":"Error: Cannot find module '../../../database/data/wdf/newsfeed.json'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js\n at Function._resolveFilename (node:internal/modules/cjs/loader:1401:15)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)\n at D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js:1281:18\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)","timestamp":"2025-06-07T06:07:52.630Z"} +{"level":"ERROR","message":"Error: Cannot find module '../../database/wdf/next-happyhours.json'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js\n at Function._resolveFilename (node:internal/modules/cjs/loader:1401:15)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)\n at D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js:1287:18\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)","timestamp":"2025-06-07T06:07:52.632Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 158 (line 1 column 159)","timestamp":"2025-06-07T06:08:11.949Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 158 (line 1 column 159)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:08:11.953Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 158 (line 1 column 159)","timestamp":"2025-06-07T06:08:31.955Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 158 (line 1 column 159)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:08:31.996Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for [\"MaterialGirl\",\"Despacito\"] (Vote Cycle Song 3/3)","timestamp":"2025-06-07T06:08:34.985Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T06:08:42.114Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T06:08:42.129Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T06:08:42.416Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T06:08:42.419Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T06:08:42.488Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T06:08:42.490Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T06:08:42.540Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T06:08:42.649Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T06:08:42.651Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T06:08:42.668Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T06:08:42.676Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T06:08:42.677Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T06:08:42.682Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.","timestamp":"2025-06-07T06:08:42.683Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('WDFPlugin') differs from manifest ('FakeWdfPlugin') for plugin in folder 'FakeWDF'. Updating logger to use manifest name 'FakeWdfPlugin'.","timestamp":"2025-06-07T06:08:42.716Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: FakeWdfPlugin (v1.0.0) from FakeWDF","timestamp":"2025-06-07T06:08:42.717Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('HelloWorldPlugin') differs from manifest ('HelloWorld') for plugin in folder 'HelloWorld'. Updating logger to use manifest name 'HelloWorld'.","timestamp":"2025-06-07T06:08:42.730Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorld (v1.0.0) from HelloWorld","timestamp":"2025-06-07T06:08:42.731Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: JDPartyWDF (v1.0.0) from JDPartyWDF","timestamp":"2025-06-07T06:08:42.810Z"} +{"level":"INFO","message":"[PluginManager] Plugin 'FakeWdfPlugin' is being overridden and will be disabled by another plugin.\n[FakeWdfPlugin] disabled\n[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T06:08:42.811Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T06:08:43.029Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T06:08:43.193Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T06:08:43.211Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T06:08:43.212Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler\n[ROUTER] Registered route handler: AccountRouteHandler","timestamp":"2025-06-07T06:08:43.306Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T06:08:43.307Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized","timestamp":"2025-06-07T06:08:43.308Z"} +{"level":"INFO","message":"[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-07T06:08:43.309Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...","timestamp":"2025-06-07T06:08:43.309Z"} +{"level":"INFO","message":"[ROUTE] UbiservicesRouteHandler routes initialized\n[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...","timestamp":"2025-06-07T06:08:43.310Z"} +{"level":"INFO","message":"[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized\n[PluginManager] Initializing init plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[PluginManager] Calling initroute for plugin: HelloWorld (Execution Type: init)\n[HelloWorld] Initializing routes...\n[HelloWorld] Routes initialized\n[PluginManager] Calling initroute for plugin: JDPartyWDF (Execution Type: init)","timestamp":"2025-06-07T06:08:43.310Z"} +{"level":"INFO","message":"[JDPartyWDF] Initializing JDPartyWDF routes...","timestamp":"2025-06-07T06:08:43.311Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Loading saved session...","timestamp":"2025-06-07T06:08:43.311Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Session loaded successfully.","timestamp":"2025-06-07T06:08:43.312Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Creating WDF Session at Room MainJDParty","timestamp":"2025-06-07T06:08:43.313Z"} +{"level":"INFO","message":"[JDPartyWDF] JDPartyWDF routes initialized.","timestamp":"2025-06-07T06:08:43.314Z"} +{"level":"ERROR","message":"[JDPartyWDF] [WDF] AuthKey WDF Has low security. PLEASE CHANGE OR WDF WILL BE HIJACKED.","timestamp":"2025-06-07T06:08:43.315Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T06:08:43.316Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)\n[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:08:52.055Z"} +{"level":"ERROR","message":"Error: Cannot find module '../../database/wdf/next-happyhours.json'\nRequire stack:\n- D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js\n- D:\\ibra\\OpenParty\\core\\classes\\PluginManager.js\n- D:\\ibra\\OpenParty\\core\\classes\\Core.js\n- D:\\ibra\\OpenParty\\core\\classes\\Server.js\n- D:\\ibra\\OpenParty\\server.js\n at Function._resolveFilename (node:internal/modules/cjs/loader:1401:15)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)\n at D:\\ibra\\OpenParty\\plugins\\JDPartyWDF\\WDF.js:1287:18\n at Layer.handle [as handle_request] (D:\\ibra\\OpenParty\\node_modules\\express\\lib\\router\\layer.js:95:5)","timestamp":"2025-06-07T06:08:57.530Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:09:11.967Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:09:11.968Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map","timestamp":"2025-06-07T06:09:19.982Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Most Voted Map: Despacito","timestamp":"2025-06-07T06:09:19.983Z"} +{"level":"INFO","message":"[HELPER] Checking SaveData dir","timestamp":"2025-06-07T06:09:25.997Z"} +{"level":"INFO","message":"[VAR] Initializing....","timestamp":"2025-06-07T06:09:26.004Z"} +{"level":"INFO","message":"[SONGDB] Processing Songdbs","timestamp":"2025-06-07T06:09:26.099Z"} +{"level":"INFO","message":"[SONGDB] 2 Maps Loaded","timestamp":"2025-06-07T06:09:26.102Z"} +{"level":"INFO","message":"[MAIN] Starting OpenParty with class-based architecture","timestamp":"2025-06-07T06:09:26.114Z"} +{"level":"INFO","message":"[SERVER] Starting OpenParty server...","timestamp":"2025-06-07T06:09:26.117Z"} +{"level":"INFO","message":"[CORE] Initializing core...","timestamp":"2025-06-07T06:09:26.146Z"} +{"level":"INFO","message":"[DatabaseManager] New instance created.","timestamp":"2025-06-07T06:09:26.162Z"} +{"level":"INFO","message":"[DatabaseManager] Starting database initialization...","timestamp":"2025-06-07T06:09:26.164Z"} +{"level":"INFO","message":"[DatabaseManager] Connected to the SQLite database. this._db is now set.","timestamp":"2025-06-07T06:09:26.165Z"} +{"level":"INFO","message":"[DatabaseManager] All tables created. Resolving initialize promise.","timestamp":"2025-06-07T06:09:26.170Z"} +{"level":"INFO","message":"[CORE] Database initialized successfully.","timestamp":"2025-06-07T06:09:26.171Z"} +{"level":"INFO","message":"[PluginManager] Loading plugins from plugins directory...","timestamp":"2025-06-07T06:09:26.174Z"} +{"level":"ERROR","message":"[PluginManager] Manifest.json not found in plugin folder: AdminPanel. Skipping.","timestamp":"2025-06-07T06:09:26.175Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('WDFPlugin') differs from manifest ('FakeWdfPlugin') for plugin in folder 'FakeWDF'. Updating logger to use manifest name 'FakeWdfPlugin'.","timestamp":"2025-06-07T06:09:26.180Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: FakeWdfPlugin (v1.0.0) from FakeWDF","timestamp":"2025-06-07T06:09:26.180Z"} +{"level":"INFO","message":"[PluginManager] Plugin class-defined name ('HelloWorldPlugin') differs from manifest ('HelloWorld') for plugin in folder 'HelloWorld'. Updating logger to use manifest name 'HelloWorld'.","timestamp":"2025-06-07T06:09:26.181Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: HelloWorld (v1.0.0) from HelloWorld","timestamp":"2025-06-07T06:09:26.182Z"} +{"level":"INFO","message":"[PluginManager] Loaded plugin: JDPartyWDF (v1.0.0) from JDPartyWDF","timestamp":"2025-06-07T06:09:26.191Z"} +{"level":"INFO","message":"[PluginManager] Plugin 'FakeWdfPlugin' is being overridden and will be disabled by another plugin.\n[FakeWdfPlugin] disabled\n[PluginManager] Initializing pre-load plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[ROUTER] Loading all route handlers...","timestamp":"2025-06-07T06:09:26.192Z"} +{"level":"INFO","message":"[HELPER] Serving playlist.json from Static Database","timestamp":"2025-06-07T06:09:26.217Z"} +{"level":"INFO","message":"[CAROUSEL] Initializing....","timestamp":"2025-06-07T06:09:26.256Z"} +{"level":"INFO","message":"[SongRepository] Loading songs from songdbs.json...","timestamp":"2025-06-07T06:09:26.260Z"} +{"level":"INFO","message":"[SongRepository] Loaded 2 songs.","timestamp":"2025-06-07T06:09:26.261Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: DefaultRouteHandler","timestamp":"2025-06-07T06:09:26.272Z"} +{"level":"INFO","message":"[ROUTER] Registered route handler: AccountRouteHandler\n[ROUTER] Registered route handler: LeaderboardRouteHandler\n[ROUTER] Registered route handler: UbiservicesRouteHandler\n[ROUTER] Registered route handler: SongDBRouteHandler\n[ROUTER] Registered route handler: CarouselRouteHandler\n[ROUTER] All route handlers loaded successfully\n[ROUTER] Initializing all route handlers...\n[ROUTE] DefaultRouteHandler initializing routes...","timestamp":"2025-06-07T06:09:26.274Z"} +{"level":"INFO","message":"[ROUTE] DefaultRouteHandler routes initialized\n[AccountRouteHandler] Initializing routes...\n[AccountRouteHandler] Routes initialized\n[ROUTE] LeaderboardRouteHandler initializing routes...","timestamp":"2025-06-07T06:09:26.275Z"} +{"level":"INFO","message":"[ROUTE] LeaderboardRouteHandler routes initialized\n[ROUTE] UbiservicesRouteHandler initializing routes...\n[ROUTE] UbiservicesRouteHandler routes initialized","timestamp":"2025-06-07T06:09:26.275Z"} +{"level":"INFO","message":"[ROUTE] SongDBRouteHandler initializing routes...\n[ROUTE] SongDBRouteHandler routes initialized\n[CarouselRouteHandler] Initializing routes...\n[CarouselRouteHandler] Routes initialized\n[ROUTER] Initialized 6 route handlers\n[CORE] Using class-based route handlers\n[CORE] Core routes initialized","timestamp":"2025-06-07T06:09:26.276Z"} +{"level":"INFO","message":"[PluginManager] Initializing init plugins...\n[PluginManager] Skipping disabled plugin: FakeWdfPlugin\n[PluginManager] Calling initroute for plugin: HelloWorld (Execution Type: init)\n[HelloWorld] Initializing routes...\n[HelloWorld] Routes initialized\n[PluginManager] Calling initroute for plugin: JDPartyWDF (Execution Type: init)\n[JDPartyWDF] Initializing JDPartyWDF routes...","timestamp":"2025-06-07T06:09:26.277Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Loading saved session...","timestamp":"2025-06-07T06:09:26.278Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Session loaded successfully.","timestamp":"2025-06-07T06:09:26.278Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Creating WDF Session at Room MainJDParty","timestamp":"2025-06-07T06:09:26.279Z"} +{"level":"INFO","message":"[JDPartyWDF] JDPartyWDF routes initialized.","timestamp":"2025-06-07T06:09:26.280Z"} +{"level":"ERROR","message":"[JDPartyWDF] [WDF] AuthKey WDF Has low security. PLEASE CHANGE OR WDF WILL BE HIJACKED.","timestamp":"2025-06-07T06:09:26.281Z"} +{"level":"INFO","message":"[CORE] Core initialized successfully\n[SERVER] Listening on 0.0.0.0:80\n[SERVER] Open panel to see more logs\n[SERVER] Running in development mode","timestamp":"2025-06-07T06:09:26.281Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:09:31.972Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:09:31.973Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:09:51.992Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:09:51.993Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:10.079Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:10.079Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)\n[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:10:12.017Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:21.094Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:21.095Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Bot [BOT] BrunoPluto added to the party\n[JDPartyWDF] [WDF] Bot [BOT] SalsaSensation added to the party\n[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:22.304Z"} +{"level":"INFO","message":"[AccountService] Getting user data for 312b41ee-c032-4559-99cd-27208f42b381\n[DatabaseManager] getDb() called. this._db is: set\n[JDPartyWDF] [WDF] User 312b41ee-c032-4559-99cd-27208f42b381 Joined The Party","timestamp":"2025-06-07T06:10:22.305Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:27.266Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:27.267Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:10:32.016Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:10:32.018Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:32.266Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:32.267Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:37.263Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:37.264Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:41.080Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:41.081Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:42.264Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:42.265Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:47.281Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:47.283Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:10:52.037Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:10:52.039Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:52.282Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:10:57.301Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:10:57.302Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:01.092Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:01.093Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:02.301Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:07.303Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:07.305Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)\n[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:11:12.056Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:12.304Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:12.305Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:17.304Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:17.305Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:21.088Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:21.089Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:22.304Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:22.304Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:27.311Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:27.312Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:11:32.061Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:11:32.062Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:32.306Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:32.307Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:37.326Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:41.076Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:41.077Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:42.327Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:42.329Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:47.325Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:47.326Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:11:52.081Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:11:52.082Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:52.327Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:52.328Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:11:57.345Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:11:57.348Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:01.092Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:02.349Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:02.350Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:07.350Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:07.351Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:12:12.101Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:12:12.102Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:12.347Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:17.349Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:17.350Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:21.065Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:21.066Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:22.349Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:22.350Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Bot [BOT] JazzyJumper added to the party","timestamp":"2025-06-07T06:12:27.347Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Bot [BOT] SalsaSensation added to the party\n[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:27.348Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:12:32.121Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:12:32.122Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:32.368Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:32.369Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:37.367Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:37.368Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:41.069Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:41.070Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:42.385Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:42.386Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:12:47.386Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:47.387Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:12:52.142Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:12:52.143Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:52.390Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:12:57.388Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:13:01.072Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:01.073Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:02.394Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:07.393Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:13:12.161Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:13:12.163Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:13:12.408Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:12.408Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:13:17.424Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:17.425Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:13:21.076Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:21.077Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:22.425Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:13:27.429Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:27.430Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:13:32.181Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:13:32.182Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:13:32.427Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:32.428Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:13:33.866Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:33.867Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket\n[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:41.127Z"} +{"level":"INFO","message":"[AccountService] Finding user from ticket","timestamp":"2025-06-07T06:13:42.799Z"} +{"level":"INFO","message":"[DatabaseManager] getDb() called. this._db is: set","timestamp":"2025-06-07T06:13:42.799Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:13:52.205Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:13:52.206Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Tournament Presentation for MaterialGirl (Round 1/3)","timestamp":"2025-06-07T06:13:56.341Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Tournament Map: MaterialGirl (Round 1)","timestamp":"2025-06-07T06:14:11.336Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)","timestamp":"2025-06-07T06:14:12.210Z"} +{"level":"ERROR","message":"[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:14:12.211Z"} +{"level":"ERROR","message":"[ErrorHandler] [Express] Unterminated fractional number in JSON at position 161 (line 1 column 162)\n[ErrorHandler] SyntaxError: Unterminated fractional number in JSON at position 161 (line 1 column 162)\n at JSON.parse ()\n at parse (D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\types\\json.js:92:19)\n at D:\\ibra\\OpenParty\\node_modules\\body-parser\\lib\\read.js:128:18\n at AsyncResource.runInAsyncScope (node:async_hooks:214:14)\n at invokeCallback (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:238:16)\n at done (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:227:7)\n at IncomingMessage.onEnd (D:\\ibra\\OpenParty\\node_modules\\raw-body\\index.js:287:7)\n at IncomingMessage.emit (node:events:518:28)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)","timestamp":"2025-06-07T06:14:32.215Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Tournament Presentation for MaterialGirl (Round 2/3)","timestamp":"2025-06-07T06:18:19.430Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Tournament Map: MaterialGirl (Round 2)","timestamp":"2025-06-07T06:18:21.161Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Tournament Presentation for MaterialGirl (Round 3/3)","timestamp":"2025-06-07T06:22:11.553Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Tournament Map: MaterialGirl (Round 3)","timestamp":"2025-06-07T06:22:21.835Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for [\"Despacito\",\"Despacito\"] (Vote Cycle Song 1/3)","timestamp":"2025-06-07T06:26:10.783Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map","timestamp":"2025-06-07T06:26:52.099Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Most Voted Map: Despacito","timestamp":"2025-06-07T06:26:52.119Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for [\"Despacito\",\"Despacito\"] (Vote Cycle Song 2/3)","timestamp":"2025-06-07T06:31:31.826Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map","timestamp":"2025-06-07T06:32:21.132Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Most Voted Map: Despacito","timestamp":"2025-06-07T06:32:21.307Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for [\"MaterialGirl\",\"Despacito\"] (Vote Cycle Song 3/3)","timestamp":"2025-06-07T06:57:43.709Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map\n[JDPartyWDF] [WDF] Current Most Voted Map: Despacito\n[JDPartyWDF] [WDF] Tournament Presentation for Despacito (Round 1/3)\n[JDPartyWDF] [WDF] Current Tournament Map: Despacito (Round 1)\n[JDPartyWDF] [WDF] Tournament Presentation for Despacito (Round 2/3)\n[JDPartyWDF] [WDF] Current Tournament Map: Despacito (Round 2)\n[JDPartyWDF] [WDF] Tournament Presentation for Despacito (Round 3/3)","timestamp":"2025-06-07T06:57:44.450Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Tournament Map: Despacito (Round 3)","timestamp":"2025-06-07T06:57:44.473Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Voting Phase for [\"Despacito\",\"MaterialGirl\"] (Vote Cycle Song 1/3)","timestamp":"2025-06-07T06:57:44.583Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] No one voted for the options, selecting a random map","timestamp":"2025-06-07T06:57:58.599Z"} +{"level":"INFO","message":"[JDPartyWDF] [WDF] Current Most Voted Map: Despacito","timestamp":"2025-06-07T06:57:58.600Z"} diff --git a/core/models/Account.js b/core/models/Account.js index b56e402..ea53ac9 100644 --- a/core/models/Account.js +++ b/core/models/Account.js @@ -25,6 +25,29 @@ class Account { this.rank = data.rank || 0; this.scores = data.scores || {}; // Map of mapName to score data this.favorites = data.favorites || {}; // User's favorite maps + this.songsPlayed = data.songsPlayed || []; // Array of map names + this.progression = data.progression || {}; + this.history = data.history || {}; // Example: {"MapName": playCount} + + // New fields from extended JSON structures (assuming these were added from previous step) + this.skin = data.skin || null; + this.diamondPoints = data.diamondPoints || 0; + this.unlockedAvatars = data.unlockedAvatars || []; + this.unlockedSkins = data.unlockedSkins || []; + this.unlockedAliases = data.unlockedAliases || []; + this.unlockedPortraitBorders = data.unlockedPortraitBorders || []; + this.wdfRank = data.wdfRank || 0; + this.stars = data.stars || 0; + this.unlocks = data.unlocks || 0; + this.populations = data.populations || []; + this.inProgressAliases = data.inProgressAliases || []; + this.language = data.language || null; + this.firstPartyEnv = data.firstPartyEnv || null; + this.syncVersions = data.syncVersions || {}; + this.otherPids = data.otherPids || []; + this.stats = data.stats || {}; + this.mapHistory = data.mapHistory || { classic: [], kids: [] }; + this.createdAt = data.createdAt || new Date().toISOString(); this.updatedAt = data.updatedAt || new Date().toISOString(); } @@ -35,7 +58,105 @@ class Account { * @returns {Account} Updated account instance */ update(data) { - Object.assign(this, data); + // Helper: Check if a value is a plain object + const _isObject = (item) => { + return item && typeof item === 'object' && !Array.isArray(item); + }; + + // Helper: Deeply merge source object's properties into target object + const _deepMergeObjects = (target, source) => { + const output = { ...target }; + for (const key in source) { + if (source.hasOwnProperty(key)) { + const sourceVal = source[key]; + const targetVal = output[key]; + if (_isObject(sourceVal)) { + if (_isObject(targetVal)) { + output[key] = _deepMergeObjects(targetVal, sourceVal); + } else { + // If target's property is not an object, or doesn't exist, + // clone the source object property. + output[key] = _deepMergeObjects({}, sourceVal); + } + } else { + // For non-object properties (primitives, arrays), source overwrites target. + // Specific array merging is handled in the main update loop. + output[key] = sourceVal; + } + } + } + return output; + }; + + const simpleOverwriteKeys = [ + 'profileId', 'userId', 'username', 'nickname', 'name', 'email', 'password', 'ticket', + 'avatar', 'country', 'platformId', 'alias', 'aliasGender', 'jdPoints', + 'portraitBorder', 'rank', 'skin', 'diamondPoints', 'wdfRank', 'stars', + 'unlocks', 'language', 'firstPartyEnv' + ]; + + const deepMergeObjectKeys = [ + 'scores', 'progression', 'history', 'favorites', 'stats', 'syncVersions' + ]; + + const unionArrayKeys = [ // Arrays of unique primitive values + 'unlockedAvatars', 'unlockedSkins', 'unlockedAliases', 'unlockedPortraitBorders', 'otherPids', 'songsPlayed' + ]; + + for (const key in data) { + if (data.hasOwnProperty(key)) { + const incomingValue = data[key]; + + if (simpleOverwriteKeys.includes(key)) { + this[key] = incomingValue; + } else if (deepMergeObjectKeys.includes(key)) { + if (_isObject(incomingValue)) { + this[key] = _deepMergeObjects(this[key] || {}, incomingValue); + } else { // If incoming data for a deep-merge key is not an object, overwrite. + this[key] = incomingValue; + } + } else if (unionArrayKeys.includes(key)) { + if (Array.isArray(incomingValue)) { + this[key] = [...new Set([...(this[key] || []), ...incomingValue])]; + } else { // If incoming data for a union-array key is not an array, overwrite. + this[key] = incomingValue; + } + } else if (key === 'populations') { + if (Array.isArray(incomingValue)) { + const existingItems = this.populations || []; + const mergedItems = [...existingItems]; + incomingValue.forEach(newItem => { + const index = mergedItems.findIndex(ep => ep.subject === newItem.subject && ep.spaceId === newItem.spaceId); + if (index !== -1) mergedItems[index] = _deepMergeObjects(mergedItems[index], newItem); + else mergedItems.push(newItem); + }); + this.populations = mergedItems; + } else this.populations = incomingValue; + } else if (key === 'inProgressAliases') { + if (Array.isArray(incomingValue)) { + const existingItems = this.inProgressAliases || []; + const mergedItems = [...existingItems]; + incomingValue.forEach(newItem => { + const index = mergedItems.findIndex(ea => ea.id === newItem.id); + if (index !== -1) mergedItems[index] = _deepMergeObjects(mergedItems[index], newItem); + else mergedItems.push(newItem); + }); + this.inProgressAliases = mergedItems; + } else this.inProgressAliases = incomingValue; + } else if (key === 'mapHistory') { + if (_isObject(incomingValue)) { + const currentMapHistory = this.mapHistory || { classic: [], kids: [] }; + this.mapHistory = { + classic: [...new Set([...(currentMapHistory.classic || []), ...(incomingValue.classic || [])])], + kids: [...new Set([...(currentMapHistory.kids || []), ...(incomingValue.kids || [])])] + }; + } else this.mapHistory = incomingValue; + } else if (this.hasOwnProperty(key)) { + // Default for other existing properties not specially handled: overwrite + this[key] = incomingValue; + } + } + } this.updatedAt = new Date().toISOString(); return this; } @@ -110,10 +231,83 @@ class Account { rank: this.rank, scores: this.scores, favorites: this.favorites, + songsPlayed: this.songsPlayed, + progression: this.progression, + history: this.history, + // New fields + skin: this.skin, + diamondPoints: this.diamondPoints, + unlockedAvatars: this.unlockedAvatars, + unlockedSkins: this.unlockedSkins, + unlockedAliases: this.unlockedAliases, + unlockedPortraitBorders: this.unlockedPortraitBorders, + wdfRank: this.wdfRank, + stars: this.stars, + unlocks: this.unlocks, + populations: this.populations, + inProgressAliases: this.inProgressAliases, + language: this.language, + firstPartyEnv: this.firstPartyEnv, + syncVersions: this.syncVersions, + otherPids: this.otherPids, + stats: this.stats, + mapHistory: this.mapHistory, createdAt: this.createdAt, updatedAt: this.updatedAt }; } + + /** + * Convert to plain object for public API responses, excluding sensitive data. + * @returns {Object} Sanitized plain object representation + */ + toPublicJSON() { + const publicData = { + profileId: this.profileId, + userId: this.userId, + username: this.username, + nickname: this.nickname, + name: this.name, + avatar: this.avatar, + country: this.country, + platformId: this.platformId, + alias: this.alias, + aliasGender: this.aliasGender, + jdPoints: this.jdPoints, + portraitBorder: this.portraitBorder, + rank: this.rank, + scores: this.scores, + favorites: this.favorites, + songsPlayed: this.songsPlayed, + progression: this.progression, + history: this.history, + // New fields + skin: this.skin, + diamondPoints: this.diamondPoints, + unlockedAvatars: this.unlockedAvatars, + unlockedSkins: this.unlockedSkins, + unlockedAliases: this.unlockedAliases, + unlockedPortraitBorders: this.unlockedPortraitBorders, + wdfRank: this.wdfRank, + stars: this.stars, + unlocks: this.unlocks, + populations: this.populations, + inProgressAliases: this.inProgressAliases, + language: this.language, + firstPartyEnv: this.firstPartyEnv, + syncVersions: this.syncVersions, + otherPids: this.otherPids, + stats: this.stats, + mapHistory: this.mapHistory, + createdAt: this.createdAt, + updatedAt: this.updatedAt + }; + // Explicitly remove sensitive fields if they were somehow added + delete publicData.email; + delete publicData.password; + delete publicData.ticket; + return publicData; + } } -module.exports = Account; \ No newline at end of file +module.exports = Account; diff --git a/core/repositories/AccountRepository.js b/core/repositories/AccountRepository.js index cfa3ebb..bd4609a 100644 --- a/core/repositories/AccountRepository.js +++ b/core/repositories/AccountRepository.js @@ -30,20 +30,48 @@ class AccountRepository { rows.forEach(row => { try { const accountData = { + // Existing fields profileId: row.profileId, + userId: row.userId, + username: row.username, + nickname: row.nickname, name: row.name, + email: row.email, + password: row.password, // Should be handled securely if stored + ticket: row.ticket, alias: row.alias, aliasGender: row.aliasGender, avatar: row.avatar, country: row.country, - createdAt: row.createdAt, - ticket: row.ticket, platformId: row.platformId, jdPoints: row.jdPoints, portraitBorder: row.portraitBorder, + rank: row.rank, scores: row.scores ? JSON.parse(row.scores) : {}, songsPlayed: row.songsPlayed ? JSON.parse(row.songsPlayed) : [], - favorites: row.favorites ? JSON.parse(row.favorites) : [] + favorites: row.favorites ? JSON.parse(row.favorites) : {}, + progression: row.progression ? JSON.parse(row.progression) : {}, + history: row.history ? JSON.parse(row.history) : {}, + createdAt: row.createdAt, + updatedAt: row.updatedAt, + // New fields + skin: row.skin, + diamondPoints: row.diamondPoints, + unlockedAvatars: row.unlockedAvatars ? JSON.parse(row.unlockedAvatars) : [], + unlockedSkins: row.unlockedSkins ? JSON.parse(row.unlockedSkins) : [], + unlockedAliases: row.unlockedAliases ? JSON.parse(row.unlockedAliases) : [], + unlockedPortraitBorders: row.unlockedPortraitBorders ? JSON.parse(row.unlockedPortraitBorders) : [], + wdfRank: row.wdfRank, + stars: row.stars, + unlocks: row.unlocks, + populations: row.populations ? JSON.parse(row.populations) : [], + inProgressAliases: row.inProgressAliases ? JSON.parse(row.inProgressAliases) : [], + language: row.language, + firstPartyEnv: row.firstPartyEnv, + syncVersions: row.syncVersions ? JSON.parse(row.syncVersions) : {}, + otherPids: row.otherPids ? JSON.parse(row.otherPids) : [], + stats: row.stats ? JSON.parse(row.stats) : {}, + mapHistory: row.mapHistory ? JSON.parse(row.mapHistory) : { classic: [], kids: [] } }; accounts[row.profileId] = new Account(accountData); } catch (parseError) { @@ -75,27 +103,73 @@ class AccountRepository { const scoresJson = JSON.stringify(accountData.scores || {}); const songsPlayedJson = JSON.stringify(accountData.songsPlayed || []); const favoritesJson = JSON.stringify(accountData.favorites || []); + const progressionJson = JSON.stringify(accountData.progression || {}); + const historyJson = JSON.stringify(accountData.history || {}); + // Stringify new JSON fields + const unlockedAvatarsJson = JSON.stringify(accountData.unlockedAvatars || []); + const unlockedSkinsJson = JSON.stringify(accountData.unlockedSkins || []); + const unlockedAliasesJson = JSON.stringify(accountData.unlockedAliases || []); + const unlockedPortraitBordersJson = JSON.stringify(accountData.unlockedPortraitBorders || []); + const populationsJson = JSON.stringify(accountData.populations || []); + const inProgressAliasesJson = JSON.stringify(accountData.inProgressAliases || []); + const syncVersionsJson = JSON.stringify(accountData.syncVersions || {}); + const otherPidsJson = JSON.stringify(accountData.otherPids || []); + const statsJson = JSON.stringify(accountData.stats || {}); + const mapHistoryJson = JSON.stringify(accountData.mapHistory || { classic: [], kids: [] }); return new Promise((resolve, reject) => { db.run(`INSERT OR REPLACE INTO user_profiles ( - profileId, name, alias, aliasGender, avatar, country, createdAt, ticket, - platformId, jdPoints, portraitBorder, scores, songsPlayed, favorites - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + profileId, userId, username, nickname, name, email, password, ticket, + alias, aliasGender, avatar, country, platformId, jdPoints, portraitBorder, rank, + scores, songsPlayed, favorites, progression, history, + skin, diamondPoints, unlockedAvatars, unlockedSkins, unlockedAliases, unlockedPortraitBorders, + wdfRank, stars, unlocks, populations, inProgressAliases, language, firstPartyEnv, + syncVersions, otherPids, stats, mapHistory, + createdAt, updatedAt + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ accountData.profileId, + accountData.userId, + accountData.username, + accountData.nickname, accountData.name, + accountData.email, + accountData.password, // Ensure this is handled securely (e.g., hashed) if stored + accountData.ticket, accountData.alias, accountData.aliasGender, accountData.avatar, accountData.country, - accountData.createdAt, - accountData.ticket, accountData.platformId, accountData.jdPoints, accountData.portraitBorder, + accountData.rank, scoresJson, songsPlayedJson, - favoritesJson + favoritesJson, + progressionJson, + historyJson, + // New fields + accountData.skin, + accountData.diamondPoints, + unlockedAvatarsJson, + unlockedSkinsJson, + unlockedAliasesJson, + unlockedPortraitBordersJson, + accountData.wdfRank, + accountData.stars, + accountData.unlocks, + populationsJson, + inProgressAliasesJson, + accountData.language, + accountData.firstPartyEnv, + syncVersionsJson, + otherPidsJson, + statsJson, + mapHistoryJson, + // Timestamps + accountData.createdAt, + accountData.updatedAt ], (err) => { if (err) { @@ -124,20 +198,48 @@ class AccountRepository { } else if (row) { try { const accountData = { + // Existing fields profileId: row.profileId, + userId: row.userId, + username: row.username, + nickname: row.nickname, name: row.name, + email: row.email, + password: row.password, + ticket: row.ticket, alias: row.alias, aliasGender: row.aliasGender, avatar: row.avatar, country: row.country, - createdAt: row.createdAt, - ticket: row.ticket, platformId: row.platformId, jdPoints: row.jdPoints, portraitBorder: row.portraitBorder, + rank: row.rank, scores: row.scores ? JSON.parse(row.scores) : {}, songsPlayed: row.songsPlayed ? JSON.parse(row.songsPlayed) : [], - favorites: row.favorites ? JSON.parse(row.favorites) : [] + favorites: row.favorites ? JSON.parse(row.favorites) : {}, + progression: row.progression ? JSON.parse(row.progression) : {}, + history: row.history ? JSON.parse(row.history) : {}, + createdAt: row.createdAt, + updatedAt: row.updatedAt, + // New fields + skin: row.skin, + diamondPoints: row.diamondPoints, + unlockedAvatars: row.unlockedAvatars ? JSON.parse(row.unlockedAvatars) : [], + unlockedSkins: row.unlockedSkins ? JSON.parse(row.unlockedSkins) : [], + unlockedAliases: row.unlockedAliases ? JSON.parse(row.unlockedAliases) : [], + unlockedPortraitBorders: row.unlockedPortraitBorders ? JSON.parse(row.unlockedPortraitBorders) : [], + wdfRank: row.wdfRank, + stars: row.stars, + unlocks: row.unlocks, + populations: row.populations ? JSON.parse(row.populations) : [], + inProgressAliases: row.inProgressAliases ? JSON.parse(row.inProgressAliases) : [], + language: row.language, + firstPartyEnv: row.firstPartyEnv, + syncVersions: row.syncVersions ? JSON.parse(row.syncVersions) : {}, + otherPids: row.otherPids ? JSON.parse(row.otherPids) : [], + stats: row.stats ? JSON.parse(row.stats) : {}, + mapHistory: row.mapHistory ? JSON.parse(row.mapHistory) : { classic: [], kids: [] } }; resolve(new Account(accountData)); } catch (parseError) { @@ -166,20 +268,48 @@ class AccountRepository { } else if (row) { try { const accountData = { + // Existing fields profileId: row.profileId, + userId: row.userId, + username: row.username, + nickname: row.nickname, name: row.name, + email: row.email, + password: row.password, + ticket: row.ticket, alias: row.alias, aliasGender: row.aliasGender, avatar: row.avatar, country: row.country, - createdAt: row.createdAt, - ticket: row.ticket, platformId: row.platformId, jdPoints: row.jdPoints, portraitBorder: row.portraitBorder, + rank: row.rank, scores: row.scores ? JSON.parse(row.scores) : {}, songsPlayed: row.songsPlayed ? JSON.parse(row.songsPlayed) : [], - favorites: row.favorites ? JSON.parse(row.favorites) : [] + favorites: row.favorites ? JSON.parse(row.favorites) : {}, + progression: row.progression ? JSON.parse(row.progression) : {}, + history: row.history ? JSON.parse(row.history) : {}, + createdAt: row.createdAt, + updatedAt: row.updatedAt, + // New fields + skin: row.skin, + diamondPoints: row.diamondPoints, + unlockedAvatars: row.unlockedAvatars ? JSON.parse(row.unlockedAvatars) : [], + unlockedSkins: row.unlockedSkins ? JSON.parse(row.unlockedSkins) : [], + unlockedAliases: row.unlockedAliases ? JSON.parse(row.unlockedAliases) : [], + unlockedPortraitBorders: row.unlockedPortraitBorders ? JSON.parse(row.unlockedPortraitBorders) : [], + wdfRank: row.wdfRank, + stars: row.stars, + unlocks: row.unlocks, + populations: row.populations ? JSON.parse(row.populations) : [], + inProgressAliases: row.inProgressAliases ? JSON.parse(row.inProgressAliases) : [], + language: row.language, + firstPartyEnv: row.firstPartyEnv, + syncVersions: row.syncVersions ? JSON.parse(row.syncVersions) : {}, + otherPids: row.otherPids ? JSON.parse(row.otherPids) : [], + stats: row.stats ? JSON.parse(row.stats) : {}, + mapHistory: row.mapHistory ? JSON.parse(row.mapHistory) : { classic: [], kids: [] } }; resolve(new Account(accountData)); } catch (parseError) { @@ -208,20 +338,48 @@ class AccountRepository { } else if (row) { try { const accountData = { + // Existing fields profileId: row.profileId, + userId: row.userId, + username: row.username, + nickname: row.nickname, name: row.name, + email: row.email, + password: row.password, + ticket: row.ticket, alias: row.alias, aliasGender: row.aliasGender, avatar: row.avatar, country: row.country, - createdAt: row.createdAt, - ticket: row.ticket, platformId: row.platformId, jdPoints: row.jdPoints, portraitBorder: row.portraitBorder, + rank: row.rank, scores: row.scores ? JSON.parse(row.scores) : {}, songsPlayed: row.songsPlayed ? JSON.parse(row.songsPlayed) : [], - favorites: row.favorites ? JSON.parse(row.favorites) : [] + favorites: row.favorites ? JSON.parse(row.favorites) : {}, + progression: row.progression ? JSON.parse(row.progression) : {}, + history: row.history ? JSON.parse(row.history) : {}, + createdAt: row.createdAt, + updatedAt: row.updatedAt, + // New fields + skin: row.skin, + diamondPoints: row.diamondPoints, + unlockedAvatars: row.unlockedAvatars ? JSON.parse(row.unlockedAvatars) : [], + unlockedSkins: row.unlockedSkins ? JSON.parse(row.unlockedSkins) : [], + unlockedAliases: row.unlockedAliases ? JSON.parse(row.unlockedAliases) : [], + unlockedPortraitBorders: row.unlockedPortraitBorders ? JSON.parse(row.unlockedPortraitBorders) : [], + wdfRank: row.wdfRank, + stars: row.stars, + unlocks: row.unlocks, + populations: row.populations ? JSON.parse(row.populations) : [], + inProgressAliases: row.inProgressAliases ? JSON.parse(row.inProgressAliases) : [], + language: row.language, + firstPartyEnv: row.firstPartyEnv, + syncVersions: row.syncVersions ? JSON.parse(row.syncVersions) : {}, + otherPids: row.otherPids ? JSON.parse(row.otherPids) : [], + stats: row.stats ? JSON.parse(row.stats) : {}, + mapHistory: row.mapHistory ? JSON.parse(row.mapHistory) : { classic: [], kids: [] } }; resolve(new Account(accountData)); } catch (parseError) { diff --git a/core/services/AccountService.js b/core/services/AccountService.js index 58e94ec..a93f3af 100644 --- a/core/services/AccountService.js +++ b/core/services/AccountService.js @@ -86,18 +86,41 @@ class AccountService { async updateUser(profileId, userData) { this.logger.info(`Updating user ${profileId}`); let account = await AccountRepository.findById(profileId); - + + const processedUserData = { ...userData }; + + // Pre-process favorites: if it's an array of mapNames, convert to model's object structure + if (Array.isArray(processedUserData.favorites)) { + const newFavorites = {}; + for (const mapName of processedUserData.favorites) { + if (typeof mapName === 'string') { // Ensure items are strings + newFavorites[mapName] = { addedAt: new Date().toISOString() }; + } + } + processedUserData.favorites = newFavorites; + this.logger.info(`Processed 'favorites' array to object for profile ${profileId}`); + } + + // Pre-process songsPlayed: if it's a number (e.g., from older formats), ignore it + // to prevent corrupting the 'songsPlayed' array of map names in the model. + if (processedUserData.hasOwnProperty('songsPlayed') && typeof processedUserData.songsPlayed === 'number') { + this.logger.warn(`Received 'songsPlayed' as a number (${processedUserData.songsPlayed}) for profile ${profileId}. This will be ignored as the model expects an array of map names for 'songsPlayed'.`); + delete processedUserData.songsPlayed; // Do not pass it to account.update if it's a number + } + + // Add any other necessary pre-processing for other fields here + if (!account) { account = new Account({ profileId, - ...userData + ...processedUserData // Use processed data for new account }); this.logger.info(`Created new user ${profileId}`); } else { - account.update(userData); + account.update(processedUserData); // Pass processed data for update this.logger.info(`Updated existing user ${profileId}`); } - + return AccountRepository.save(account); } diff --git a/core/services/CarouselService.js b/core/services/CarouselService.js index 3737e1d..606152b 100644 --- a/core/services/CarouselService.js +++ b/core/services/CarouselService.js @@ -10,28 +10,31 @@ class CarouselService { * Generate a carousel based on search criteria and type. * @param {string} search - The search string or tag. * @param {string} type - The type of carousel (e.g., "partyMap", "sweatMap"). + * @param {string} [profileId=null] - The profile ID for personalization. * @returns {Object} The generated carousel object. */ - generateCarousel(search, type) { - return generateCarousel(search, type); + generateCarousel(search, type, profileId = null) { + return generateCarousel(search, type, profileId); } /** * Generate a cooperative carousel. * @param {string} search - The search string or tag. + * @param {string} [profileId=null] - The profile ID for personalization. * @returns {Object} The generated cooperative carousel object. */ - generateCoopCarousel(search) { - return generateCoopCarousel(search); + generateCoopCarousel(search, profileId = null) { + return generateCoopCarousel(search, profileId); } /** * Generate a sweat carousel. * @param {string} search - The search string or tag. + * @param {string} [profileId=null] - The profile ID for personalization. * @returns {Object} The generated sweat carousel object. */ - generateSweatCarousel(search) { - return generateSweatCarousel(search); + generateSweatCarousel(search, profileId = null) { + return generateSweatCarousel(search, profileId); } /** diff --git a/database/config/v1/jd21/parameters.json b/database/config/v1/jd21/parameters.json new file mode 100644 index 0000000..cc5a867 --- /dev/null +++ b/database/config/v1/jd21/parameters.json @@ -0,0 +1,103 @@ +{ + "parameters": { + "us-staging": { + "fields": { + "spaceId": "59f82720-778f-427a-a0bd-e81cb112c044" + }, + "relatedPopulation": null + }, + "us-sdkClientClub": { + "fields": { + "ps4ClubWebsite": "https://static8.cdn.ubi.com/u/sites/uplay/index.html", + "xoneLaunchPath": "Ms-xbl-55C5EE27://default?url=/games/{deepLink}&context={context}&titleid={gameTitleId}&env={clubEnvName}&genomeid={applicationId}&actioncompleted={actionCompletedList}&debug={debug}&spaceId={spaceId}&applicationId={applicationId}", + "dynamicPanelUrl": "https://{env}public-ubiservices.ubi.com/v1/profiles/{profileId}/club/dynamicPanel/MyProfile.png?spaceId={spaceId}&noRedirect=true", + "psApiClubWebsite": "https://static8.cdn.ubi.com/u/sites/uplay/index.html", + "ps4PsnoLaunchPath": "psno://localhost/?response_type=code&client_id=171ca84a-371e-412b-a807-6531f3f1e454&scope=psn%3As2s&redirect_uri={ps4ClubWebsiteUrlEncoded}&state={ps4ClubWebsiteArgumentsPsnoEncoded}", + "psApiPsnoLaunchPath": "psno://localhost/?response_type=code&client_id=171ca84a-371e-412b-a807-6531f3f1e454&scope=psn%3As2s&redirect_uri={psApiClubWebsiteUrlEncoded}&state={psApiClubWebsiteArgumentsPsnoEncoded}", + "stadiaClubWebsiteUrl": "https://static8.cdn.ubi.com/u/sites/UbisoftClub/Stadia/index.html?url=/games/{deepLink}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&env={env}&displayMode={displayMode}&locale={locale}&actioncompleted={actionCompletedList}&jotunVersion={jotunVersion}&jotunBinaryVersion={jotunBinaryVersion}&ticket={ticket}", + "switchClubWebsiteUrl": "https://static8.cdn.ubi.com/u/sites/UbisoftClub/NintendoSwitch/index.html?url=/games/{deepLink}&ussdkversion={usSdkVersionName}&env={clubEnvName}&actioncompleted={actionCompletedList}&forceLang={forceLang}&profileId={profileId}&ticket={ticket}&context={context}&debug={debug}&spaceId={spaceId}&applicationId={applicationId}", + "ps4ClubWebsiteArguments": "url=/games/{deepLink}&spaceId={spaceId}&applicationId={applicationId}&context={context}&env={clubEnvName}&genomeid={applicationId}&actioncompleted={actionCompletedList}&ussdkversion={usSdkVersionName}&debug={debug}{geometry}&ticket={ticket}&profileid={profileId}", + "psApiClubWebsiteArguments": "url=/games/{deepLink}&spaceId={spaceId}&applicationId={applicationId}&context={context}&env={clubEnvName}&genomeid={applicationId}&actioncompleted={actionCompletedList}&ussdkversion={usSdkVersionName}&debug={debug}{geometry}&ticket={ticket}&profileId={profileId}&psEnterButton={psEnterButton}" + }, + "relatedPopulation": null + }, + "us-sdkClientUplay": { + "fields": { + "ps4UplayUrl": "https://{env}overlay.cdn.ubisoft.com/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ubiTicket={ubiTicket}&firstPartyToken={firstPartyToken}&env={environment}&deviceType=tv&playerSessionId={playerSessionId}&psEnterButton={psEnterButton}&platformVariant={platformVariant}", + "ps5UplayUrl": "https://{env}overlay.cdn.ubisoft.com/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ubiTicket={ubiTicket}&firstPartyToken={firstPartyToken}&env={environment}&deviceType=tv&playerSessionId={playerSessionId}&platformVariant={platformVariant}", + "ounceUplayUrl": "https://{env}connect.cdn.ubisoft.com/overlay/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ubiTicket={ubiTicket}&firstPartyToken={firstPartyToken}&env={environment}&deviceType=tv&playerSessionId={playerSessionId}&platformVariant={platformVariant}", + "switchUplayUrl": "https://{env}connect.cdn.ubisoft.com/overlay/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ubiTicket={ubiTicket}&firstPartyToken={firstPartyToken}&env={environment}&deviceType=tv&playerSessionId={playerSessionId}&platformVariant={platformVariant}", + "psnUplayClientId": "171ca84a-371e-412b-a807-6531f3f1e454", + "iosUplayWebLaunchUrl": "https://{env}overlay.cdn.ubisoft.com/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ticket={ticket}&env={environment}&playerSessionId={playerSessionId}&deviceType=phone&isStandalone=false", + "xoneUplayUWPLaunchUrl": "Ms-xbl-55C5EE27://default?isUbisoftConnect=true&baseURL={env}overlay.cdn.ubisoft.com/default/µApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&env={environment}&deviceType=tv&playerSessionId={playerSessionId}", + "xoneUplayWebLaunchUrl": "https://{env}overlay.cdn.ubisoft.com/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ubiTicket={ubiTicket}&firstPartyToken={firstPartyToken}&env={environment}&deviceType=tv&playerSessionId={playerSessionId}&platformVariant={platformVariant}", + "macosUplayWebLaunchUrl": "https://{env}overlay.cdn.ubisoft.com/default/?spaceId={spaceId}&applicationId={applicationId}&platform=macos&locale={locale}&env={environment}&deviceType=desktop", + "androidUplayWebLaunchUrl": "https://{env}overlay.cdn.ubisoft.com/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ticket={ticket}&env={environment}&playerSessionId={playerSessionId}&deviceType=phone&isStandalone=false", + "iosUplayWebCompletionUrl": "ubisoftconnectscheme:", + "scarlettUplayUWPLaunchUrl": "Ms-xbl-55C5EE27://default?isUbisoftConnect=true&baseURL={env}overlay.cdn.ubisoft.com/default/µApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&env={environment}&deviceType=tv&playerSessionId={playerSessionId}", + "scarlettUplayWebLaunchUrl": "https://{env}overlay.cdn.ubisoft.com/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&profileId={profileId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ubiTicket={ubiTicket}&firstPartyToken={firstPartyToken}&env={environment}&deviceType=tv&playerSessionId={playerSessionId}&platformVariant={platformVariant}", + "xoneUplayWebCompletionUrl": "about:blank", + "macosUplayWebCompletionUrl": "ubisoftconnectscheme:", + "ounceUplayWebCompletionUrl": "uplayscheme:", + "switchUplayWebCompletionUrl": "uplayscheme:", + "androidUplayWebCompletionUrl": "ubisoftconnectscheme:", + "iosUplayWebLaunchUrlMicroApp": "https://{env}overlay.cdn.ubisoft.com/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ticket={ticket}&env={environment}&playerSessionId={playerSessionId}&deviceType=phone&profileId={profileId}&isStandalone=false", + "scarlettUplayWebCompletionUrl": "about:blank", + "androidUplayWebLaunchUrlMicroApp": "https://{env}overlay.cdn.ubisoft.com/default/?microApp={microApp}µAppParams={microAppParams}&spaceId={spaceId}&applicationId={applicationId}&platform={platform}&locale={locale}&sdkVersion={sdkVersion}&ticket={ticket}&env={environment}&playerSessionId={playerSessionId}&deviceType=phone&profileId={profileId}&isStandalone=false" + }, + "relatedPopulation": null + }, + "us-sdkClientUrlsPlaceholders": { + "fields": { + "baseurl_ws": { + "China": "wss://public-ws-ubiservices.ubisoft.cn/", + "Standard": "wss://{env}public-ws-ubiservices.ubi.com", + "China_GAAP": "wss://gaap.ubiservices.ubi.com:16000" + }, + "baseurl_aws": { + "China": "https://public-ubiservices.ubisoft.cn", + "Standard": "https://{env}public-ubiservices.ubi.com", + "China_GAAP": "https://gaap.ubiservices.ubi.com:12000" + }, + "baseurl_msr": { + "China": "https://public-ubiservices.ubisoft.cn", + "Standard": "https://msr-{env}public-ubiservices.ubi.com", + "China_GAAP": "https://gaap.ubiservices.ubi.com:12000" + } + }, + "relatedPopulation": null + }, + "us-sdkClientLogin": { + "fields": { + "populationHttpRequestOptimizationEnabled": true, + "populationHttpRequestOptimizationRetryCount": 0, + "populationHttpRequestOptimizationRetryTimeoutIntervalMsec": 5000, + "populationHttpRequestOptimizationRetryTimeoutIncrementMsec": 1000 + }, + "relatedPopulation": null + }, + "us-sdkClientFeaturesSwitches": { + "fields": { + "populationsAutomaticUpdate": true, + "forcePrimarySecondaryStoreSyncOnReturnFromBackground": true + }, + "relatedPopulation": null + }, + "us-sdkClientChina": { + "fields": { + "websocketHost": "public-ws-ubiservices.ubi.com", + "tLogApplicationId": "", + "tLogApplicationKey": "", + "tLogApplicationName": "" + }, + "relatedPopulation": null + }, + "us-sdkClientUrls": { + "fields": { + "populations": "{baseurl_aws}/{version}/profiles/me/populations", + "profilesToken": "{baseurl_aws}/{version}/profiles/{profileId}/tokens/{token}" + }, + "relatedPopulation": null + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 854533e..33d56f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,21 @@ { "name": "open-party", - "version": "1.1.0", + "version": "3.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "open-party", - "version": "1.1.0", + "version": "3.0.0", "license": "MIT", "dependencies": { + "archiver": "^7.0.1", "axios": "^1.8.4", + "bcrypt": "^6.0.0", "body-parser": "^1.20.3", "chalk": "^5.4.1", "express": "^4.21.2", + "express-session": "^1.18.1", "fs": "^0.0.1-security", "md5": "^2.3.0", "pm2": "^6.0.5", @@ -32,6 +35,73 @@ "license": "MIT", "optional": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@npmcli/fs": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", @@ -75,6 +145,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pm2/agent": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.1.1.tgz", @@ -349,6 +429,18 @@ "license": "ISC", "optional": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -425,7 +517,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "optional": true, "engines": { "node": ">=8" } @@ -464,6 +555,195 @@ "license": "ISC", "optional": true }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/archiver-utils/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/archiver/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -529,12 +809,25 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -564,6 +857,29 @@ "node": ">=10.0.0" } }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/bcrypt/node_modules/node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -935,6 +1251,62 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -981,11 +1353,96 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/crc32-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/croner": { "version": "4.1.97", "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==" }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -1115,6 +1572,12 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1124,8 +1587,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", @@ -1305,12 +1767,30 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter2": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==", "license": "MIT" }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -1366,6 +1846,40 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-session": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz", + "integrity": "sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, "node_modules/extrareqp2": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", @@ -1374,6 +1888,12 @@ "follow-redirects": "^1.14.0" } }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", @@ -1449,6 +1969,34 @@ } } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -1729,8 +2277,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "optional": true + "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", @@ -2025,7 +2572,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "optional": true, "engines": { "node": ">=8" } @@ -2056,12 +2602,44 @@ "node": ">=0.12.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC", - "optional": true + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, "node_modules/js-git": { "version": "0.7.8", @@ -2107,6 +2685,48 @@ "node": ">=0.2.0" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2605,6 +3225,17 @@ "node": ">= 10.12.0" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-gyp/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2686,6 +3317,15 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2766,6 +3406,12 @@ "node": ">= 14" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -2789,12 +3435,52 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -3087,6 +3773,21 @@ "node": ">=10" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -3200,6 +3901,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3263,6 +3973,36 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3495,6 +4235,27 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", @@ -3771,6 +4532,19 @@ "node": ">= 0.8" } }, + "node_modules/streamx": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -3785,7 +4559,21 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3800,7 +4588,19 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3928,6 +4728,15 @@ "node": ">=8" } }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3994,6 +4803,18 @@ "node": ">= 0.6" } }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -4084,7 +4905,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", - "optional": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4105,6 +4925,103 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4146,6 +5063,60 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zip-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } } }, "dependencies": { @@ -4155,6 +5126,49 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, "@npmcli/fs": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", @@ -4186,6 +5200,12 @@ } } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, "@pm2/agent": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.1.1.tgz", @@ -4389,6 +5409,14 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "optional": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4443,8 +5471,7 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "optional": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -4469,6 +5496,129 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "optional": true }, + "archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "requires": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==" + }, + "readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + }, + "tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "requires": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + } + } + }, + "archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "requires": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, + "readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + } + } + }, "are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -4524,11 +5674,22 @@ "proxy-from-env": "^1.1.0" } }, + "b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "optional": true + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4539,6 +5700,22 @@ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==" }, + "bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "requires": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "dependencies": { + "node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==" + } + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -4793,6 +5970,41 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, + "compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "requires": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4827,11 +6039,63 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + } + } + }, "croner": { "version": "4.1.97", "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==" }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -4919,6 +6183,11 @@ "gopd": "^1.2.0" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4927,8 +6196,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "optional": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "2.0.0", @@ -5042,11 +6310,21 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "eventemitter2": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -5090,6 +6368,33 @@ "vary": "~1.1.2" } }, + "express-session": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz", + "integrity": "sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==", + "requires": { + "cookie": "0.7.2", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" + }, + "cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" + } + } + }, "extrareqp2": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", @@ -5098,6 +6403,11 @@ "follow-redirects": "^1.14.0" } }, + "fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, "fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", @@ -5148,6 +6458,22 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, + "foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "requires": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + } + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -5346,8 +6672,7 @@ "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "optional": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "has-flag": { "version": "4.0.0", @@ -5546,8 +6871,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "optional": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { "version": "4.0.3", @@ -5568,11 +6892,29 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "optional": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } }, "js-git": { "version": "0.7.8", @@ -5609,6 +6951,43 @@ "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", "integrity": "sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==" }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -5973,6 +7352,11 @@ } } }, + "node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" + }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -6012,6 +7396,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6068,6 +7457,11 @@ "netmask": "^2.0.2" } }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -6083,11 +7477,37 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, "path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -6301,6 +7721,16 @@ "tunnel-agent": "^0.6.0" } }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -6386,6 +7816,11 @@ "side-channel": "^1.0.6" } }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -6431,6 +7866,32 @@ "util-deprecate": "^1.0.1" } }, + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6581,6 +8042,19 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, "shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", @@ -6750,6 +8224,16 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "streamx": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "requires": { + "bare-events": "^2.2.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -6762,7 +8246,16 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "optional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6773,7 +8266,14 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "optional": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } @@ -6852,6 +8352,14 @@ "readable-stream": "^3.1.1" } }, + "text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "requires": { + "b4a": "^1.6.4" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6901,6 +8409,14 @@ "mime-types": "~2.1.24" } }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -6969,7 +8485,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, "requires": { "isexe": "^2.0.0" } @@ -6983,6 +8498,61 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7007,6 +8577,39 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "requires": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + } + } } } } diff --git a/package.json b/package.json index b0f1e09..e740386 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,13 @@ "author": "PartyService", "license": "MIT", "dependencies": { + "archiver": "^7.0.1", "axios": "^1.8.4", + "bcrypt": "^6.0.0", "body-parser": "^1.20.3", "chalk": "^5.4.1", "express": "^4.21.2", + "express-session": "^1.18.1", "fs": "^0.0.1-security", "md5": "^2.3.0", "pm2": "^6.0.5", diff --git a/plugins/AdminPanel/AdminPanelPlugin.js b/plugins/AdminPanel/AdminPanelPlugin.js new file mode 100644 index 0000000..8e684d1 --- /dev/null +++ b/plugins/AdminPanel/AdminPanelPlugin.js @@ -0,0 +1,704 @@ +/** + * Admin Panel Plugin for OpenParty + * Provides a secure web interface for server management + */ +const express = require('express'); +const session = require('express-session'); +const bcrypt = require('bcrypt'); +const { exec } = require('child_process'); +const archiver = require('archiver'); // Moved to top +const fs = require('fs'); +const path = require('path'); // Standard library +const Plugin = require('../../core/classes/Plugin'); // Adjusted path +const Logger = require('../../core/utils/logger'); // Adjusted path + +class AdminPanelPlugin extends Plugin { + constructor() { + super('AdminPanelPlugin', 'Secure admin panel for server management'); + this.logger = new Logger('AdminPanel'); + this.sessionSecret = process.env.SESSION_SECRET || 'openparty-secure-session'; + + // Initialize admin password (logger might not be fully initialized with manifest name yet) + const plainPassword = process.env.ADMIN_PASSWORD || 'admin123'; + console.log('[AdminPanelPlugin] Initializing admin password...'); // Use console.log before logger is guaranteed + console.log(`[AdminPanelPlugin] Using default password: ${!process.env.ADMIN_PASSWORD}`); + + // Hash the admin password + try { + this.adminPassword = bcrypt.hashSync(plainPassword, 10); + this.logger.info('Admin password hashed successfully'); + } catch (error) { + this.logger.error('Failed to hash admin password:', error); + throw error; + } + + this.backupInterval = 24 * 60 * 60 * 1000; // 24 hours + this.startTime = Date.now(); + this.stats = { + activeUsers: 0, + totalSongs: 0, + lastBackup: null, + activePlugins: 0 + }; + + this.app = null; // To store the Express app instance + + // Initialize stats update interval + setInterval(() => this.updateStats(), 30000); // Update every 30 seconds + } + + initroute(app) { + this.app = app; // Store the Express app instance + this.logger.info('Initializing admin panel routes...'); + + // Body parsing middleware (assuming express.json and express.urlencoded are global) + // If not, they might need to be added here or in Core.js globally. + // For this integration, we'll assume they are handled globally. + + // Session middleware - specific to the admin panel + app.use(session({ + secret: this.sessionSecret, + resave: false, + saveUninitialized: false, + cookie: { + secure: process.env.NODE_ENV === 'production', // Only use secure cookies in production + maxAge: 24 * 60 * 60 * 1000 // 24 hours + } + })); + + // Serve static files + app.use('/panel', express.static(path.join(__dirname, 'panel/public'))); + this.logger.info(`Serving static files from: ${path.join(__dirname, 'panel/public')}`); + + // Make sure the directory exists + if (!fs.existsSync(path.join(__dirname, 'panel/public'))) { + this.logger.error(`Static files directory does not exist: ${path.join(__dirname, 'panel/public')}`); + fs.mkdirSync(path.join(__dirname, 'panel/public'), { recursive: true }); + this.logger.info(`Created static files directory: ${path.join(__dirname, 'panel/public')}`); + } + + // Authentication middleware + const requireAuth = (req, res, next) => { + if (req.session.authenticated) { + next(); + } else { + res.redirect('/panel/login'); + } + }; + + // TODO: Consider implementing rate limiting for login attempts to prevent brute-force attacks. + // Example: using a middleware like 'express-rate-limit'. + // Login route + app.get('/panel/login', (req, res) => { + res.sendFile(path.join(__dirname, 'panel/public/login.html')); + }); + + app.post('/panel/login', async (req, res) => { + try { + this.logger.info('Login attempt received'); + this.logger.info('Request body:', req.body); + + const { password } = req.body; + if (!password) { + this.logger.warn('No password provided'); + return res.redirect('/panel/login?error=1'); + } + + this.logger.info('Comparing passwords...'); + const match = await bcrypt.compare(password, this.adminPassword); + this.logger.info(`Password match result: ${match}`); + + if (match) { + req.session.authenticated = true; + this.logger.info('Login successful'); + res.redirect('/panel/dashboard'); + } else { + this.logger.warn('Invalid password attempt'); + res.redirect('/panel/login?error=1'); + } + } catch (error) { + this.logger.error(`Login error: ${error.message}`); + this.logger.error(error.stack); + res.redirect('/panel/login?error=1'); + } + }); + + // Dashboard + app.get('/panel/dashboard', requireAuth, (req, res) => { + res.sendFile(path.join(__dirname, 'panel/public/dashboard.html')); + }); + + // Plugin management + app.get('/panel/api/plugins', requireAuth, (req, res) => { + const pluginManager = req.app.get('pluginManager'); + const pluginsMap = pluginManager.getPlugins(); + const pluginsArray = Array.from(pluginsMap.values()).map(plugin => ({ + name: plugin.name, + description: plugin.description, + enabled: plugin.isEnabled() + })); + res.json(pluginsArray); + }); + + app.post('/panel/api/plugins/toggle', requireAuth, (req, res) => { + try { + const pluginManager = req.app.get('pluginManager'); + const { pluginName } = req.body; // Changed from 'name' to 'pluginName' + + if (!pluginName) { + return res.status(400).json({ success: false, message: 'Plugin name (pluginName) is required' }); + } + + const plugin = pluginManager.getPlugin(pluginName); // Use getPlugin for direct access + + if (!plugin) { + return res.status(404).json({ success: false, message: `Plugin ${pluginName} not found` }); + } + + let newStatusMessage; + if (plugin.isEnabled()) { + plugin.disable(); + newStatusMessage = `Plugin ${pluginName} has been disabled`; + this.logger.info(newStatusMessage); + } else { + plugin.enable(); + newStatusMessage = `Plugin ${pluginName} has been enabled`; + this.logger.info(newStatusMessage); + } + res.json({ success: true, message: newStatusMessage, enabled: plugin.isEnabled() }); + + } catch (error) { + this.logger.error(`Error toggling plugin: ${error.message}`); + res.status(500).json({ success: false, message: error.message }); + } + }); + + // Server status endpoint + app.get('/panel/api/status', requireAuth, (req, res) => { + const settings = require('../../settings.json'); + let currentVersion = 'N/A'; + try { + const packageJsonPath = path.join(process.cwd(), 'package.json'); + if (fs.existsSync(packageJsonPath)) { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + currentVersion = packageJson.version; + } + } catch (e) { this.logger.error("Failed to read package.json version for status API", e); } + res.json({ + maintenance: settings.server.serverstatus.isMaintenance, + uptime: Math.floor((Date.now() - this.startTime) / 1000), + version: currentVersion + }); + }); + + // Server stats endpoint + app.get('/panel/api/stats', requireAuth, (req, res) => { + res.json(this.stats); + }); + + // Server management endpoints + app.post('/panel/api/update', requireAuth, async (req, res) => { + try { + const { stdout, stderr } = await new Promise((resolve, reject) => { + exec('git pull && npm install', (error, stdout, stderr) => { + if (error) reject(error); + else resolve({ stdout, stderr }); + }); + }); + this.logger.info('Update successful'); + res.json({ message: 'Update successful', output: stdout, details: stderr }); + } catch (error) { + this.logger.error(`Update error: ${error.message}`); + res.status(500).json({ error: error.message }); + } + }); + + app.post('/panel/api/restart', requireAuth, (req, res) => { + res.json({ message: 'Server restarting...' }); + process.exit(42); // Trigger restart through PM2 + }); + + app.post('/panel/api/reload-plugins', requireAuth, (req, res) => { + try { + const pluginManager = req.app.get('pluginManager'); + pluginManager.loadPlugins(); // No longer needs settings.modules + this.logger.info('Plugins reloaded via API.'); + res.json({ message: 'Plugins reloaded successfully' }); + } catch (error) { + res.status(500).json({ error: error.message }); + } + }); + + // Savedata management + app.get('/panel/api/savedata', requireAuth, (req, res) => { + try { + const savedataPath = path.join(process.cwd(), 'database/data'); + + if (!fs.existsSync(savedataPath)) { + this.logger.error(`Savedata directory does not exist: ${savedataPath}`); + return res.status(404).json({ error: 'Savedata directory not found' }); + } + + const files = fs.readdirSync(savedataPath) + .filter(file => file.endsWith('.json')) + .map(file => { + const filePath = path.join(savedataPath, file); + const stats = fs.statSync(filePath); + return { + name: file, + size: stats.size, + modified: stats.mtime + }; + }); + + res.json(files); + } catch (error) { + this.logger.error(`Error getting savedata: ${error.message}`); + res.status(500).json({ error: error.message }); + } + }); + + app.post('/panel/api/savedata/:type', requireAuth, (req, res) => { + const { type } = req.params; + const { data } = req.body; + try { + fs.writeFileSync( + path.join(process.cwd(), 'database/data', `${type}.json`), + JSON.stringify(data, null, 2) + ); + // Commit changes to Git + exec(`git add . && git commit -m "Update ${type} savedata" && git push`, { + cwd: process.cwd() + }, (error) => { + if (error) { + this.logger.error(`Git error: ${error.message}`); + } + }); + res.json({ message: 'Savedata updated successfully' }); + } catch (error) { + res.status(500).json({ error: error.message }); + } + }); + + // Backup system + this.setupAutomaticBackup(); + + // Get backups list + app.get('/panel/api/backups', requireAuth, (req, res) => { + try { + const backupsPath = path.join(process.cwd(), 'backups'); + + if (!fs.existsSync(backupsPath)) { + this.logger.info(`Backups directory does not exist, creating: ${backupsPath}`); + fs.mkdirSync(backupsPath, { recursive: true }); + return res.json([]); + } + + const backups = fs.readdirSync(backupsPath) + .filter(dir => { + const dirPath = path.join(backupsPath, dir); + return fs.statSync(dirPath).isDirectory(); + }) + .map(dir => { + const dirPath = path.join(backupsPath, dir); + const stats = fs.statSync(dirPath); + + // Calculate total size of backup + let totalSize = 0; + const dataPath = path.join(dirPath, 'data'); + if (fs.existsSync(dataPath)) { + const calculateDirSize = (dirPath) => { + let size = 0; + const files = fs.readdirSync(dirPath); + for (const file of files) { + const filePath = path.join(dirPath, file); + const stat = fs.statSync(filePath); + if (stat.isDirectory()) { + size += calculateDirSize(filePath); + } else { + size += stat.size; + } + } + return size; + }; + totalSize = calculateDirSize(dataPath); + } + + return { + filename: dir, + date: new Date(dir.replace(/-/g, ':')), + size: totalSize, + type: 'Auto' + }; + }); + + // Sort by date (newest first) + backups.sort((a, b) => b.date - a.date); + + res.json(backups); + } catch (error) { + this.logger.error(`Error getting backups: ${error.message}`); + res.status(500).json({ error: error.message }); + } + }); + + // Create backup + app.post('/panel/api/backup', requireAuth, (req, res) => { + this.createBackup() + .then(() => res.json({ success: true, message: 'Backup created successfully' })) + .catch(error => res.status(500).json({ success: false, error: error.message })); + }); + + // Download backup + app.get('/panel/api/backups/download/:filename', requireAuth, (req, res) => { + try { + const { filename } = req.params; + if (!filename) { + return res.status(400).json({ success: false, message: 'Backup filename is required' }); + } + + const backupPath = path.join(process.cwd(), 'backups', filename); + + if (!fs.existsSync(backupPath)) { + this.logger.error(`Backup not found: ${backupPath}`); + return res.status(404).json({ success: false, message: 'Backup not found' }); + } + + // Create a zip file of the backup + const zipFilename = `${filename}.zip`; + const zipPath = path.join(process.cwd(), 'backups', zipFilename); + + // Create a write stream for the zip file + const output = fs.createWriteStream(zipPath); + const archive = archiver('zip', { + zlib: { level: 9 } // Maximum compression + }); + + // Listen for all archive data to be written + output.on('close', () => { + this.logger.info(`Backup archive created: ${zipPath} (${archive.pointer()} bytes)`); + + // Send the zip file + res.download(zipPath, zipFilename, (err) => { + if (err) { + this.logger.error(`Error sending backup: ${err.message}`); + } + + // Delete the temporary zip file after sending + fs.unlink(zipPath, (unlinkErr) => { + if (unlinkErr) { + this.logger.error(`Error deleting temporary zip file: ${unlinkErr.message}`); + } + }); + }); + }); + + // Handle errors + archive.on('error', (err) => { + this.logger.error(`Error creating backup archive: ${err.message}`); + res.status(500).json({ success: false, message: `Error creating backup archive: ${err.message}` }); + }); + + // Pipe archive data to the output file + archive.pipe(output); + + // Add the backup directory to the archive + archive.directory(backupPath, false); + + // Finalize the archive + archive.finalize(); + } catch (error) { + this.logger.error(`Error downloading backup: ${error.message}`); + res.status(500).json({ success: false, message: error.message }); + } + }); + + // Delete backup + app.delete('/panel/api/backups/delete/:filename', requireAuth, (req, res) => { + try { + const { filename } = req.params; + if (!filename) { + return res.status(400).json({ success: false, message: 'Backup filename is required' }); + } + + const backupPath = path.join(process.cwd(), 'backups', filename); + + if (!fs.existsSync(backupPath)) { + this.logger.error(`Backup not found: ${backupPath}`); + return res.status(404).json({ success: false, message: 'Backup not found' }); + } + + // Delete the backup directory recursively + fs.rmSync(backupPath, { recursive: true, force: true }); + + this.logger.info(`Backup deleted: ${filename}`); + res.json({ success: true, message: 'Backup deleted successfully' }); + } catch (error) { + this.logger.error(`Error deleting backup: ${error.message}`); + res.status(500).json({ success: false, message: error.message }); + } + }); + + // Check for updates + app.get('/panel/api/check-updates', requireAuth, async (req, res) => { + try { + // Get current version from package.json + const packagePath = path.join(process.cwd(), 'package.json'); + let currentVersion = '1.0.0'; + + if (fs.existsSync(packagePath)) { + const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8')); + currentVersion = packageJson.version || '1.0.0'; + } + + // For demo purposes, we'll simulate checking for updates + // In a real implementation, you would fetch from a remote repository + const hasUpdate = Math.random() > 0.5; // Randomly determine if update is available + + if (hasUpdate) { + // Simulate a newer version + const newVersion = currentVersion.split('.') + .map((part, index) => index === 2 ? parseInt(part) + 1 : part) + .join('.'); + + res.json({ + available: true, + currentVersion, + version: newVersion, + changelog: 'Bug fixes and performance improvements.' + }); + } else { + res.json({ + available: false, + currentVersion + }); + } + } catch (error) { + this.logger.error(`Error checking for updates: ${error.message}`); + res.status(500).json({ error: error.message }); + } + }); + + // Maintenance mode + app.post('/panel/api/maintenance', requireAuth, (req, res) => { + try { + const settingsPath = path.join(process.cwd(), 'settings.json'); + const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); + + // Toggle maintenance mode + settings.server.serverstatus.isMaintenance = !settings.server.serverstatus.isMaintenance; + + // Write updated settings back to file + fs.writeFileSync( + settingsPath, + JSON.stringify(settings, null, 2) + ); + + res.json({ + success: true, + enabled: settings.server.serverstatus.isMaintenance + }); + } catch (error) { + this.logger.error(`Error toggling maintenance mode: ${error.message}`); + res.status(500).json({ + success: false, + error: error.message + }); + } + }); + + // Settings endpoint + app.get('/panel/api/settings', requireAuth, (req, res) => { + try { + const settingsPath = path.join(process.cwd(), 'settings.json'); // process.cwd() is the root + const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); + + // Return a sanitized version of settings (remove sensitive data if needed) + res.json({ + server: { + port: settings.server.port, + isPublic: settings.server.isPublic, + enableSSL: settings.server.enableSSL, + domain: settings.server.domain, + modName: settings.server.modName, + maintenance: settings.server.serverstatus.isMaintenance, + channel: settings.server.serverstatus.channel + }, + // Get plugin info from PluginManager and manifests + plugins: [] // Placeholder, will be populated below + }); + const pluginManager = req.app.get('pluginManager'); + if (pluginManager) { + const pluginsMap = pluginManager.getPlugins(); + res.locals.plugins = Array.from(pluginsMap.values()).map(p => ({ + name: p.manifest.name, + description: p.manifest.description, + execution: p.manifest.execution, + enabled: p.isEnabled(), + version: p.manifest.version + })); + } + res.json(res.locals); // Send the combined data + } catch (error) { + this.logger.error(`Error getting settings: ${error.message}`); + res.status(500).json({ error: error.message }); + } + }); + + app.post('/panel/api/settings', requireAuth, (req, res) => { + try { + const { server } = req.body; + + if (!server) { + return res.status(400).json({ success: false, message: 'Server settings are required' }); + } + + const settingsPath = path.join(process.cwd(), 'settings.json'); + const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); + + // Update only allowed settings + if (server.port !== undefined) settings.server.port = server.port; + if (server.isPublic !== undefined) settings.server.isPublic = server.isPublic; + if (server.enableSSL !== undefined) settings.server.enableSSL = server.enableSSL; + if (server.domain !== undefined) settings.server.domain = server.domain; + if (server.modName !== undefined) settings.server.modName = server.modName; + if (server.maintenance !== undefined) settings.server.serverstatus.isMaintenance = server.maintenance; + if (server.channel !== undefined) settings.server.serverstatus.channel = server.channel; + + // Write updated settings back to file + fs.writeFileSync( + settingsPath, + JSON.stringify(settings, null, 2) + ); + + res.json({ + success: true, + message: 'Settings updated successfully' + }); + } catch (error) { + this.logger.error(`Error updating settings: ${error.message}`); + res.status(500).json({ + success: false, + error: error.message + }); + } + }); + + // Logs endpoint + app.get('/panel/api/logs', requireAuth, (req, res) => { + try { + const { level = 'all', limit = 100 } = req.query; + const logsDir = path.join(process.cwd(), 'logs'); + + // Create logs directory if it doesn't exist + if (!fs.existsSync(logsDir)) { + fs.mkdirSync(logsDir, { recursive: true }); + } + + // For demo purposes, generate some sample logs if no log file exists + const logFile = path.join(logsDir, 'server.log'); + if (!fs.existsSync(logFile)) { + const sampleLogs = [ + '[INFO] Server started successfully', + '[INFO] Loaded 3 plugins', + '[WARNING] Plugin XYZ is using deprecated API', + '[ERROR] Failed to connect to database', + '[INFO] User logged in: admin', + '[DEBUG] Processing request: GET /api/songs', + '[INFO] Request completed in 120ms' + ]; + fs.writeFileSync(logFile, sampleLogs.join('\n')); + } + + // Read log file + let logs = fs.readFileSync(logFile, 'utf8').split('\n').filter(Boolean); + + // Filter by level if specified + if (level !== 'all') { + const levelUpper = level.toUpperCase(); + logs = logs.filter(log => log.includes(`[${levelUpper}]`)); + } + + // Limit number of logs + logs = logs.slice(-parseInt(limit)); + + res.json({ + logs, + total: logs.length + }); + } catch (error) { + this.logger.error(`Error getting logs: ${error.message}`); + res.status(500).json({ error: error.message }); + } + }); + + this.logger.info('Admin panel routes initialized'); + } + + async updateStats() { + try { + // Update active users (example: count connected clients) + this.stats.activeUsers = Object.keys(this.app?.io?.sockets?.sockets || global.io?.sockets?.sockets || {}).length; // Prefer app.io if available + + // Update total songs + const songPath = path.join(process.cwd(), 'database/data/songs.json'); + if (fs.existsSync(songPath)) { + const songs = JSON.parse(fs.readFileSync(songPath, 'utf8')); + this.stats.totalSongs = Object.keys(songs).length; + } else { this.stats.totalSongs = 0; } + + // Update active plugins count + const pluginManager = this.app?.get('pluginManager'); + if (pluginManager) { + this.stats.activePlugins = Array.from(pluginManager.getPlugins().values()).filter(p => p.isEnabled()).length; + } + } catch (error) { + this.logger.error(`Stats update error: ${error.message}`); + } + } + + async createBackup() { + try { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + const backupDir = path.join(process.cwd(), 'backups', timestamp); + fs.mkdirSync(backupDir, { recursive: true }); + + // Backup database and savedata + const dataDir = path.join(process.cwd(), 'database/data'); + fs.cpSync(dataDir, path.join(backupDir, 'data'), { recursive: true }); + + // Create Git tag for the backup + await new Promise((resolve, reject) => { + exec(`git tag backup-${timestamp} && git push origin backup-${timestamp}`, { + cwd: process.cwd() + }, (error, stdout, stderr) => { + if (error) { + this.logger.error(`Git tagging/pushing error during backup: ${error.message}`); + this.logger.error(`Git stderr: ${stderr}`); + reject(error); + } else { + this.logger.info(`Git tag and push successful for backup-${timestamp}`); + this.logger.info(`Git stdout: ${stdout}`); + resolve(); + } + }); + }); + // Update last backup timestamp + this.stats.lastBackup = timestamp; + this.logger.info(`Backup created successfully: ${timestamp}`); + } catch (error) { + this.logger.error(`Backup creation failed: ${error.message}`); + throw error; + } + } + + setupAutomaticBackup() { + setInterval(() => { + this.createBackup().catch(error => { + this.logger.error(`Automatic backup failed: ${error.message}`); + }); + }, this.backupInterval); + } +} + +module.exports = new AdminPanelPlugin(); \ No newline at end of file diff --git a/plugins/AdminPanel/panel/README.md b/plugins/AdminPanel/panel/README.md new file mode 100644 index 0000000..44d7565 --- /dev/null +++ b/plugins/AdminPanel/panel/README.md @@ -0,0 +1,71 @@ +# OpenParty Admin Panel Plugin + +## Overview +Secure web-based administration interface for OpenParty server management. Features a modern dark theme UI and comprehensive server management capabilities. + +## Features +- Secure session-based authentication +- Server status monitoring +- Plugin management +- Savedata modification and Git integration +- Automated backups +- Update management +- Maintenance mode control +- Server logs viewer + +## Installation +1. Install dependencies: +```bash +cd plugins/panel +npm install +``` + +2. Add the plugin to `settings.json`: +```json +{ + "modules": [ + { + "name": "AdminPanelPlugin", + "description": "Secure admin panel for server management", + "path": "{dirname}/plugins/AdminPanelPlugin.js", + "execution": "init" + } + ] +} +``` + +3. Set environment variables (optional): +- `SESSION_SECRET`: Custom session secret (default: 'openparty-secure-session') +- `ADMIN_PASSWORD`: Admin password (default: 'admin123') + +## Security +- Session-based authentication +- Password hashing with bcrypt +- HTTPS-only cookie security +- Session expiration + +## Usage +1. Access the panel at: `https://your-server/panel` +2. Login with admin credentials +3. Use the dashboard to manage: + - Server status and statistics + - Plugin management + - Savedata modifications + - Backup management + - Server updates + - Maintenance mode + - Server logs + +## Automated Features +- Daily automated backups +- Git integration for savedata changes +- Plugin hot-reloading +- Server update management + +## Development +The panel uses a modern tech stack: +- Express.js for backend +- SQLite for session storage +- Modern CSS with dark theme +- Responsive design +- Vanilla JavaScript for frontend interactions \ No newline at end of file diff --git a/plugins/AdminPanel/panel/package.json b/plugins/AdminPanel/panel/package.json new file mode 100644 index 0000000..ba59214 --- /dev/null +++ b/plugins/AdminPanel/panel/package.json @@ -0,0 +1,11 @@ +{ + "name": "openparty-admin-panel", + "version": "1.0.0", + "description": "Admin panel plugin for OpenParty server", + "private": true, + "dependencies": { + "bcrypt": "^5.1.1", + "express-session": "^1.17.3", + "connect-sqlite3": "^0.9.13" + } +} \ No newline at end of file diff --git a/plugins/AdminPanel/panel/public/dashboard.html b/plugins/AdminPanel/panel/public/dashboard.html new file mode 100644 index 0000000..b6ecb8e --- /dev/null +++ b/plugins/AdminPanel/panel/public/dashboard.html @@ -0,0 +1,1122 @@ + + + + + + OpenParty Admin Panel + + + + + + + +
+ +
+
+

OpenParty

+

Admin Panel

+
+ +
+ + +
+ +
+
+

Server Overview

+
+ + Online +
+
+
+
+
+
+

Active Players

+
0
+
+
+ +
+
+
+
+
+
+

Songs Available

+
0
+
+
+ +
+
+
+
+
+
+

Server Uptime

+
0h
+
+
+ +
+
+
+
+
+
+

Active Plugins

+
0
+
+
+ +
+
+
+
+
+

Quick Actions

+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + \ No newline at end of file diff --git a/plugins/AdminPanel/panel/public/js/plugins.js b/plugins/AdminPanel/panel/public/js/plugins.js new file mode 100644 index 0000000..57c7e89 --- /dev/null +++ b/plugins/AdminPanel/panel/public/js/plugins.js @@ -0,0 +1,67 @@ +// Plugin management functionality +async function loadPlugins() { + try { + const response = await fetch('/panel/api/plugins'); + const plugins = await response.json(); + const pluginsList = document.getElementById('pluginsList'); + pluginsList.innerHTML = plugins.map(plugin => ` + + ${plugin.name} + ${plugin.description || 'No description available.'} + + + + + ${plugin.enabled ? 'Enabled' : 'Disabled'} + + + + + + + `).join(''); + /* + Suggested CSS for the new classes (add to your panel's CSS file): + .plugin-row.plugin-disabled { opacity: 0.7; } + .plugin-name { font-weight: bold; } + .badge { padding: 0.4em 0.6em; font-size: 0.9em; } + .bg-success { background-color: #28a745; color: white; } + .bg-secondary { background-color: #6c757d; color: white; } + .btn-sm { padding: 0.25rem 0.5rem; font-size: .875rem; } + .btn-outline-warning { border-color: #ffc107; color: #ffc107; } + .btn-outline-warning:hover { background-color: #ffc107; color: #212529; } + .btn-outline-success { border-color: #28a745; color: #28a745; } + .btn-outline-success:hover { background-color: #28a745; color: white; } + */ + } catch (error) { + showToast(error.message, 'error'); + } +} + +async function togglePlugin(pluginName) { + try { + const response = await fetch('/panel/api/plugins/toggle', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ pluginName }) + }); + const result = await response.json(); + showToast(result.message); + loadPlugins(); // Refresh the plugins list + } catch (error) { + showToast(error.message, 'error'); + } +} + +// Load plugins when the plugins section is shown +document.querySelector('[onclick="showSection(\'plugins\')"]') + .addEventListener('click', loadPlugins); \ No newline at end of file diff --git a/plugins/AdminPanel/panel/public/login.html b/plugins/AdminPanel/panel/public/login.html new file mode 100644 index 0000000..78a1924 --- /dev/null +++ b/plugins/AdminPanel/panel/public/login.html @@ -0,0 +1,100 @@ + + + + + + OpenParty Admin Panel - Login + + + + + + + + + + + + + + +
+
+ +

OpenParty Admin Panel

+

Enter your password to continue

+
+ +
+
+ +
+
+ +
+ +
+
+ + +
+ + +
+ + + + \ No newline at end of file diff --git a/core/wdf/FakeWdfPlugin.js b/plugins/FakeWDF/FakeWdfPlugin.js similarity index 99% rename from core/wdf/FakeWdfPlugin.js rename to plugins/FakeWDF/FakeWdfPlugin.js index c8570d1..6fdddb7 100644 --- a/core/wdf/FakeWdfPlugin.js +++ b/plugins/FakeWDF/FakeWdfPlugin.js @@ -3,8 +3,8 @@ * Handles World Dance Floor (WDF) related routes as a plugin */ const axios = require('axios'); -const Plugin = require('../classes/Plugin'); // Assuming Plugin is located at ../core/classes/Plugin.js -const Logger = require('../utils/logger'); +const Plugin = require('../../core/classes/Plugin'); // Assuming Plugin is located at ../core/classes/Plugin.js +const Logger = require('../../core/utils/logger'); class WDFPlugin extends Plugin { /** diff --git a/plugins/FakeWDF/manifest.json b/plugins/FakeWDF/manifest.json new file mode 100644 index 0000000..ccc7d5f --- /dev/null +++ b/plugins/FakeWDF/manifest.json @@ -0,0 +1,8 @@ +{ + "name": "FakeWdfPlugin", + "version": "1.0.0", + "description": "Create a fake response for WDF so that the mod can run on older version.", + "main": "FakeWdfPlugin.js", + "author": "OpenParty", + "execution": "init" +} \ No newline at end of file diff --git a/plugins/HelloWorldPlugin.js b/plugins/HelloWorld/HelloWorld.js similarity index 92% rename from plugins/HelloWorldPlugin.js rename to plugins/HelloWorld/HelloWorld.js index aa1d87d..8303d9f 100644 --- a/plugins/HelloWorldPlugin.js +++ b/plugins/HelloWorld/HelloWorld.js @@ -2,7 +2,7 @@ * Example HelloWorld Plugin for OpenParty * Demonstrates how to create a plugin using the new class-based architecture */ -const Plugin = require('../core/classes/Plugin'); +const Plugin = require('../../core/classes/Plugin'); // Adjusted path class HelloWorldPlugin extends Plugin { /** diff --git a/plugins/HelloWorld/manifest.json b/plugins/HelloWorld/manifest.json new file mode 100644 index 0000000..71cdf23 --- /dev/null +++ b/plugins/HelloWorld/manifest.json @@ -0,0 +1,8 @@ +{ + "name": "HelloWorld", + "version": "1.0.0", + "description": "A simple Hello World plugin.", + "main": "HelloWorld.js", + "author": "OpenParty", + "execution": "init" +} diff --git a/settings.json b/settings.json index ad6f651..5fa2eea 100644 --- a/settings.json +++ b/settings.json @@ -8,7 +8,7 @@ "forcePort": false, "isPublic": true, "enableSSL": true, - "domain": "jdp.justdancenext.xyz", + "domain": "justdanceservices.prjktla.online", "modName": "Just Dance Unlimited Mod", "serverstatus": { "isMaintenance": false, @@ -16,17 +16,17 @@ } }, "modules": [ - { - "name": "WDFPlugin", - "description": "Create a fake response for WDF so that the mod can run on older version", - "path": "{dirname}/core/wdf/FakeWdfPlugin.js", - "execution": "init" - }, { "name": "HelloWorldPlugin", "description": "A simple example plugin that demonstrates the plugin system", "path": "{dirname}/plugins/HelloWorldPlugin.js", "execution": "init" + }, + { + "name": "AdminPanelPlugin", + "description": "Secure admin panel for server management and maintenance", + "path": "{dirname}/plugins/AdminPanelPlugin.js", + "execution": "init" } ] } \ No newline at end of file