From a231c8fc4c8b2848f196235a397e389fe6e63d0e Mon Sep 17 00:00:00 2001 From: rainbow napkin Date: Sat, 11 Oct 2025 08:19:53 -0400 Subject: [PATCH] Started server-wide legacy cytube/fore.st toke count ingestion. --- config.example.json | 1 + config.example.jsonc | 4 + src/schemas/statSchema.js | 98 ++++++++++++++++++++++++- src/schemas/user/migrationSchema.js | 9 ++- src/views/partial/profile/tokeCount.ejs | 2 +- 5 files changed, 110 insertions(+), 4 deletions(-) diff --git a/config.example.json b/config.example.json index 372a5ac..5e3eb01 100644 --- a/config.example.json +++ b/config.example.json @@ -10,6 +10,7 @@ "altchaSecret": "CHANGE_ME", "ipSecret": "CHANGE_ME", "migrate": false, + "dropLegacyTokes": false, "ssl":{ "cert": "./server.cert", "key": "./server.key" diff --git a/config.example.jsonc b/config.example.jsonc index fea8c16..01eeab1 100644 --- a/config.example.jsonc +++ b/config.example.jsonc @@ -28,6 +28,10 @@ //WARNING: The migration folder is cleared after server boot, whether or not a migration took place or this option is enabled. //Keep your backups in a safe place, preferably a machine that DOESN'T have open inbound ports exposed to the internet/a publically accessible reverse proxy! "migrate": false, + //Drops all legacy tokes out of the statistics file since doing so manually from mongosh is a lot of typing out obnoxious parentha-glyphics. + //Requires migration to be disabled before it takes effect. + //WARNING: this does NOT affect user toke counts, migrated or otherwise. Use carefully! + "dropLegacyTokes": false, //SSL cert and key locations "ssl":{ "cert": "./server.cert", diff --git a/src/schemas/statSchema.js b/src/schemas/statSchema.js index f0a2c3f..f615703 100644 --- a/src/schemas/statSchema.js +++ b/src/schemas/statSchema.js @@ -187,7 +187,7 @@ statSchema.statics.getTokeCommandCounts = async function(){ count.set(command, 1); }else{ //Set it to ++curCount - count.set(command, ++curCount); + count.set(command, curCount + 1); } }); }); @@ -196,4 +196,100 @@ statSchema.statics.getTokeCommandCounts = async function(){ return count; } +/** + * Ingests legacy tokes handed over by the migration model + * @param {Array} rawLegacyTokes - List of strings containing contents of legacy cytube/fore.st toke logs + */ +statSchema.statics.ingestLegacyTokes = async function(rawLegacyTokes){ + //If migration is disabled + if(!config.migrate){ + //BAIL! + return; + } + + try{ + const statDB = await this.getStats(); + + //For each toke log + for(const tokeLog of rawLegacyTokes){ + //Split and iterate toke log by new line + for(const tokeLine of tokeLog.split('\n')){ + //Ensure line is a valid toke log line (this will break if your tokes take place after 12:46:40PM on Nov 20th 2286... Or before 21:46:40 Sep 08 2001) + //You'll probably want to have migrated from cytube/fore.st to canopy by then :) + //Also splits tokers array off for easier processing + const splitToke = tokeLine.match(/^\[.+\]|,[0-9]{1,4},|[0-9]{13}$/g) + if(splitToke != null){ + + //Create empty tokers map + const toke = new Map(); + + //Add qoutes around strings in the tokers line + let tokersLine = splitToke[0].replaceAll('[', '["'); + tokersLine = tokersLine.replaceAll(']','"]'); + tokersLine = tokersLine.replaceAll(',','","'); + + //Force feed doctored line into the JSON parser, and iterate by the array it shits out + for(const toker of JSON.parse(tokersLine)){ + toke.set(toker,"Legacy Tokes"); + } + + const date = new Date(Number(splitToke[2])); + + //Push toke on to statDB + statDB.tokes.push({ + toke, + date + }); + + console.log(`Adding legacy toke: ${tokersLine} from: ${date.toLocaleString()}`); + } + } + } + + //Save toke to file + await statDB.save(); + + console.log("Legacy tokes commited to server-wide database statistics file!"); + }catch(err){ + return loggerutils.localexceptionhandler(err); + } +} + +statSchema.statics.dropLegacyTokes = async function(){ + try{ + //If legacy toke dropping is disabled or migration is enabled + if(!config.dropLegacyTokes || config.migrate){ + //return + return; + } + + //pull stat doc + const statDB = await this.getStats(); + + //Create temporary toke array + const tokes = []; + + //Iterate through server toke history + for(const toke of statDB.tokes){ + //If it's not a legacy toke + if(Array.from(toke.toke)[0][1] != "Legacy Tokes"){ + //Add it to the temp array + tokes.push(toke); + } + } + + //Replace the server-wide toke log with our newly doctored one + statDB.tokes = tokes; + + //Save the stat document + statDB.save(); + + //Tell of our success + console.log("Removed migration tokes!"); + }catch(err){ + return loggerutils.localexceptionhandler(err); + } + +} + module.exports = mongoose.model("statistics", statSchema); \ No newline at end of file diff --git a/src/schemas/user/migrationSchema.js b/src/schemas/user/migrationSchema.js index c32b46d..1be7b73 100644 --- a/src/schemas/user/migrationSchema.js +++ b/src/schemas/user/migrationSchema.js @@ -24,6 +24,7 @@ const {mongoose} = require('mongoose'); const config = require('../../../config.json'); const {userModel} = require('../user/userSchema'); const permissionModel = require('../permissionSchema'); +const statModel = require('../statSchema'); const loggerUtils = require('../../utils/loggerUtils'); @@ -77,6 +78,7 @@ migrationSchema.statics.ingestLegacyDump = async function(){ try{ //If migration is disabled if(!config.migrate){ + statModel.dropLegacyTokes(); //BAIL! return; } @@ -140,7 +142,10 @@ migrationSchema.statics.ingestLegacyDump = async function(){ } //Ingest toke maps - this.ingestTokeMaps(tokeMaps); + await this.ingestTokeMaps(tokeMaps); + + //Pass toke logs over to the stat model for further ingestion + await statModel.ingestLegacyTokes(tokeLogs); }catch(err){ return loggerUtils.localExceptionHandler(err); } @@ -281,7 +286,7 @@ migrationSchema.statics.ingestTokeMaps = async function(rawTokeMaps){ console.log(`${toker[1]} tokes injected into user profile ${toker[0]}!`); } }catch(err){ - return loggerUtils.localExceptionHandler(err); + return loggerutils.localexceptionhandler(err); } } diff --git a/src/views/partial/profile/tokeCount.ejs b/src/views/partial/profile/tokeCount.ejs index d9a2094..9c1ab81 100644 --- a/src/views/partial/profile/tokeCount.ejs +++ b/src/views/partial/profile/tokeCount.ejs @@ -19,6 +19,6 @@ along with this program. If not, see . %>
<% profile.tokes.forEach((count, toke) => { %> -

!<%- toke %>: <%- count %>

+

<%- toke == "Legacy Tokes" ? '
' : '!' %><%- toke %>: <%- count %>

<% }); %>
\ No newline at end of file