diff --git a/src/app/channel/activeChannel.js b/src/app/channel/activeChannel.js index 7c78111..c278df1 100644 --- a/src/app/channel/activeChannel.js +++ b/src/app/channel/activeChannel.js @@ -15,6 +15,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see .*/ //local imports +const connectedUser = require('./connectedUser'); const flairModel = require('../../schemas/flairSchema'); const permissionModel = require('../../schemas/permissionSchema'); @@ -22,6 +23,7 @@ module.exports = class{ constructor(server, name){ this.server = server; this.name = name; + //Keeping these in a map was originally a vestige but it's more preformant than an array or object so :P this.userList = new Map(); } @@ -34,13 +36,7 @@ module.exports = class{ //Add this socket on to the userobject userObj.sockets.push(socket.id); }else{ - //if this is the first connection, initialize the userObject w/ the current socked id - userObj = { - id: userDB.id, - rank: userDB.rank, - flair: userDB.flair, - sockets: [socket.id] - } + userObj = new connectedUser(userDB.user, userDB.id, userDB.rank, userDB.flair, this, socket); } //Set user entry in userlist @@ -50,7 +46,8 @@ module.exports = class{ socket.join(socket.chan); //Make sure the client receives important client-info before userlist - await this.sendClientMetadata(userDB, socket); + //await this.sendClientMetadata(userDB, socket); + await userObj.sendClientMetadata(); //Send out the userlist this.broadcastUserList(socket.chan); @@ -78,29 +75,6 @@ module.exports = class{ this.broadcastUserList(socket.chan); } - async sendClientMetadata(userObj, socket){ - const flairListDB = await flairModel.find({}); - var flairList = []; - - const user = { - id: userObj.id, - user: userObj.user, - rank: userObj.rank, - flair: userObj.flair - } - - flairListDB.forEach((flair)=>{ - if(permissionModel.rankToNum(flair.rank) <= permissionModel.rankToNum(userObj.rank)){ - flairList.push({ - name: flair.name, - displayName: flair.displayName - }); - } - }); - - socket.emit("clientMetadata", {user, flairList}); - } - broadcastUserList(){ var userList = []; @@ -113,24 +87,4 @@ module.exports = class{ this.server.io.in(this.name).emit("userList", userList); } - - updateFlair(user, flair){ - const userObj = this.userList.get(user); - - userObj.flair = flair; - - this.userList.set(user, userObj); - - //Quick hack to make this compatible with sendClientMetadata. make sure we do this AFTER setting the object in the userList map... - userObj.name = user; - - //Crawl through user's sockets (lol) - userObj.sockets.forEach((sockid) => { - //Send metadata to each one - const socket = this.server.io.sockets.sockets.get(sockid); - this.sendClientMetadata(userObj, socket); - }); - - this.broadcastUserList(); - } } \ No newline at end of file diff --git a/src/app/channel/channelManager.js b/src/app/channel/channelManager.js index 88ccce5..5101d97 100644 --- a/src/app/channel/channelManager.js +++ b/src/app/channel/channelManager.js @@ -118,9 +118,12 @@ module.exports = class{ } getConnectedChannels(socket){ + //Create a list to hold connected channels var chanList = []; + //For each channel this.activeChannels.forEach((channel) => { + //Check and see if the user is connected const foundUser = channel.userList.get(socket.user.user); //If we found a user and this channel hasn't been added to the list @@ -129,6 +132,25 @@ module.exports = class{ } }); + //return the channels this user is connected to return chanList; } + + getConnections(socket){ + //Create a list to store our connections + var connections = []; + + //For each channel + this.activeChannels.forEach((channel) => { + //Check and see if the user is connected + const foundUser = channel.userList.get(socket.user.user); + + //If we found a user and this channel hasn't been added to the list + if(foundUser){ + connections.push(foundUser); + } + }); + + return connections; + } } \ No newline at end of file diff --git a/src/app/channel/chatHandler.js b/src/app/channel/chatHandler.js index cc266d3..0198204 100644 --- a/src/app/channel/chatHandler.js +++ b/src/app/channel/chatHandler.js @@ -62,11 +62,11 @@ module.exports = class{ userDB.flair = data.flair; userDB = await userDB.save(); - chanList.forEach((channel) => { - channel.updateFlair(userDB.user, userDB.flair); - }); - + const connections = this.server.getConnections(socket); + connections.forEach((conn) => { + conn.updateFlair(userDB.flair); + }); }catch(err){ return loggerUtils.socketExceptionHandler(socket, err); } diff --git a/src/app/channel/connectedUser.js b/src/app/channel/connectedUser.js new file mode 100644 index 0000000..4b31432 --- /dev/null +++ b/src/app/channel/connectedUser.js @@ -0,0 +1,78 @@ +/*Canopy - The next generation of stoner streaming software +Copyright (C) 2024 Rainbownapkin and the TTN Community + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see .*/ + +//local imports +const flairModel = require('../../schemas/flairSchema'); +const permissionModel = require('../../schemas/permissionSchema'); + +module.exports = class{ + constructor(id, name, rank, flair, channel, socket){ + this.id = id; + this.name = name; + this.rank = rank; + this.flair = flair; + this.channel = channel; + this.sockets = [socket.id]; + } + + emit(eventName, args){ + //Crawl through user's sockets (lol) + this.sockets.forEach((sockid) => { + //Send event out to each one + const socket = this.channel.server.io.sockets.sockets.get(sockid); + socket.emit(eventName, args); + }); + } + + async sendClientMetadata(){ + //Get flairList from DB and setup flairList array + const flairListDB = await flairModel.find({}); + var flairList = []; + + //Setup our userObj + const userObj = { + id: this.id, + user: this.user, + rank: this.rank, + flair: this.flair + } + + //For each flair listed in the Database + flairListDB.forEach((flair)=>{ + //Check if the user has permission to use the current flair + if(permissionModel.rankToNum(flair.rank) <= permissionModel.rankToNum(this.rank)){ + //If so push a light version of the flair object into our final flair list + flairList.push({ + name: flair.name, + displayName: flair.displayName + }); + } + }); + + //Send off the metadata to our user's clients + this.emit("clientMetadata", {user: userObj, flairList}); + } + + updateFlair(flair){ + //This will run multiple times in a row, we don't need to broadcast the userlist every time + if(this.flair != flair){ + this.flair = flair; + this.channel.broadcastUserList(); + } + + this.sendClientMetadata(); + } +} \ No newline at end of file