diff --git a/README.md b/README.md index 9902977..c6f2762 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Canopy -0.4-INDEV Hotfix 2 +0.4-INDEV Hotfix 3 ========= Canopy - /ˈkæ.nə.pi/: diff --git a/package.json b/package.json index b758038..e0c23a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "canopy-of-indev", - "version": "0.4.2", + "version": "0.4.3", + "canopyDisplayVersion": "0.4-Indev Hotfix 3", "license": "AGPL-3.0-only", "dependencies": { "@braintree/sanitize-url": "^7.1.1", diff --git a/src/controllers/aboutController.js b/src/controllers/aboutController.js index 2b32b84..187157b 100644 --- a/src/controllers/aboutController.js +++ b/src/controllers/aboutController.js @@ -16,6 +16,7 @@ along with this program. If not, see .*/ //Config const config = require('../../config.json'); +const package = require('../../package.json'); //Local Imports const csrfUtils = require('../utils/csrfUtils'); @@ -23,5 +24,5 @@ const csrfUtils = require('../utils/csrfUtils'); //register page functions module.exports.get = async function(req, res){ //Render page - return res.render('about', {aboutText: config.aboutText, instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req)}); + return res.render('about', {aboutText: config.aboutText, instance: config.instanceName, user: req.session.user, version: package.canopyDisplayVersion, csrfToken: csrfUtils.generateToken(req)}); } \ No newline at end of file diff --git a/src/schemas/user/migrationSchema.js b/src/schemas/user/migrationSchema.js index c17ed51..9aff595 100644 --- a/src/schemas/user/migrationSchema.js +++ b/src/schemas/user/migrationSchema.js @@ -217,13 +217,22 @@ migrationSchema.statics.ingestLegacyUser = async function(rawProfile){ return; } + //Pull rank, dropping over-ranked users down to current enum length + let rank = Math.min(Math.max(0, profileArray[3]), permissionModel.rankEnum.length - 1); + + //If this user was a mod on the old site + if(rank == 2){ + //Set them up as a mod here + rank = permissionModel.rankEnum.length - 2; + } + //Create migration profile object from scraped info const migrationProfile = new this({ user: profileArray[1], pass: profileArray[2], //Clamp rank to 0 and the max setting allowed by the rank enum - rank: Math.min(Math.max(0, profileArray[3]), permissionModel.rankEnum.length - 1), + rank, email: validator.normalizeEmail(profileArray[4]), date: profileArray[7], }) diff --git a/src/server.js b/src/server.js index 50dcda0..f783a6d 100644 --- a/src/server.js +++ b/src/server.js @@ -75,6 +75,7 @@ const apiRouter = require('./routers/apiRouter'); //Define Config variables const config = require('../config.json'); +const package = require('../package.json'); const port = config.port; const dbUrl = `mongodb://${config.db.user}:${config.db.pass}@${config.db.address}:${config.db.port}/${config.db.database}`; @@ -208,7 +209,7 @@ Might be better if she kicked off everything at once, and ran a while loop to ch This runs once at server startup, and most startups will run fairly quickly so... Not worth it?*/ async function asyncKickStart(){ //Lettum fuckin' know wassup - console.log(`${config.instanceName}(Powered by Canopy) is booting up!`); + console.log(`${config.instanceName}(Powered by Canopy ${package.canopyDisplayVersion}) is booting up!`); //Run legacy migration await migrationModel.ingestLegacyDump(); diff --git a/src/views/about.ejs b/src/views/about.ejs index 8842ff0..cebfc35 100644 --- a/src/views/about.ejs +++ b/src/views/about.ejs @@ -40,6 +40,8 @@ along with this program. If not, see . %> it was decided that the original cytube fork, fore.st, had been run past it's prime. In summer/fall 2024, work began on a replacement. The resulting software became Canopy, which was first used to run the ourfore.st instance in late 2025.

+
+

Canopy Ver: <%= version %>

diff --git a/www/js/channel/channel.js b/www/js/channel/channel.js index 5d50499..6da26c3 100644 --- a/www/js/channel/channel.js +++ b/www/js/channel/channel.js @@ -337,13 +337,16 @@ function onYouTubeIframeAPIReady(){ //Set embed api to true client.ytEmbedAPILoaded = true; - //Get currently playing item - const nowPlaying = client.player.mediaHandler.nowPlaying; + //If the player is ready and has a mediaHandler loaded + if(client.player != null && client.player.mediaHandler != null){ + //Get currently playing item + const nowPlaying = client.player.mediaHandler.nowPlaying; - //If we're playing a youtube video and the official embeds are enabled - if(nowPlaying.type == 'yt' && localStorage.getItem('ytPlayerType') == "embed"){ - //Restart the video now that the embed api has loaded - client.player.start({media: nowPlaying}); + //If we're playing a youtube video and the official embeds are enabled + if(nowPlaying.type == 'yt' && localStorage.getItem('ytPlayerType') == "embed"){ + //Restart the video now that the embed api has loaded + client.player.start({media: nowPlaying}); + } } } diff --git a/www/js/channel/mediaHandler.js b/www/js/channel/mediaHandler.js index 3dd11ae..158e5cb 100644 --- a/www/js/channel/mediaHandler.js +++ b/www/js/channel/mediaHandler.js @@ -907,6 +907,10 @@ class hlsLiveStreamHandler extends hlsBase{ return; } + //Resize chat box to video aspect, since this is the only event thats reliably called on ratio change + //Re-enforcing UX rules a little more often shouldnt cause too many issues anywho. + this.client.chatBox.resizeAspect(); + //Calculate distance to end of stream const difference = this.video.duration - this.video.currentTime; diff --git a/www/js/channel/panels/pmPanel.js b/www/js/channel/panels/pmPanel.js index aaab30b..bcebc97 100644 --- a/www/js/channel/panels/pmPanel.js +++ b/www/js/channel/panels/pmPanel.js @@ -24,7 +24,7 @@ class pmPanel extends panelObj{ * @param {channel} client - Parent client Management Object * @param {Document} panelDocument - Panel Document */ - constructor(client, panelDocument){ + constructor(client, panelDocument, startSesh){ super(client, "Private Messaging", "/panel/pm", panelDocument); /** @@ -71,7 +71,17 @@ class pmPanel extends panelObj{ //Tell PMHandler to start tracking this panel this.client.pmHandler.panelList.set(this.uuid, null); + //Define network related listeners this.defineListeners(); + + //If a start sesh was provided + if(startSesh != null && startSesh != ""){ + //Send message out to server + this.client.pmSocket.emit("pm", { + recipients: startSesh.split(" "), + msg: "" + }); + } } closer(){ @@ -126,7 +136,6 @@ class pmPanel extends panelObj{ this.seshSendButton.addEventListener("click", this.send.bind(this)); this.seshBuffer.addEventListener('scroll', this.scrollHandler.bind(this)); this.ownerDoc.defaultView.addEventListener('resize', this.handleAutoScroll.bind(this)); - } startSesh(event){ @@ -180,6 +189,12 @@ class pmPanel extends panelObj{ * Render out current sesh array to sesh list UI */ renderSeshList(){ + //If we don't have a sesh list + if(this.seshList == null){ + //Fuck off, you're not even done building the object yet. + return; + } + //Clear out the sesh list this.seshList.innerHTML = ""; diff --git a/www/js/channel/userlist.js b/www/js/channel/userlist.js index 7db5a5e..5a4f24c 100644 --- a/www/js/channel/userlist.js +++ b/www/js/channel/userlist.js @@ -173,7 +173,8 @@ class userList{ function renderContextMenu(event){ //Setup menu map let menuMap = new Map([ - ["Profile", ()=>{this.client.cPanel.setActivePanel(new panelObj(this.client, `${user.user}`, `/panel/profile?user=${user.user}`))}], + ["Profile", ()=>{this.client.cPanel.setActivePanel(new panelObj(this.client, user.user, `/panel/profile?user=${user.user}`))}], + ["PM", ()=>{this.client.cPanel.setActivePanel(new pmPanel(client, undefined, user.user))}], ["Mention", ()=>{this.client.chatBox.catChat(`${user.user} `)}], ["Toke With", ()=>{this.client.chatBox.tokeWith(user.user)}], ]);