highLevel syncs across chans, shows in userlist

This commit is contained in:
rainbow napkin 2024-12-03 20:27:37 -05:00
parent 279640a7e7
commit 8ccb9003cc
8 changed files with 102 additions and 38 deletions

View file

@ -39,7 +39,7 @@ module.exports = class{
userObj.sockets.push(socket.id); userObj.sockets.push(socket.id);
}else{ }else{
await userDB.populate('flair'); await userDB.populate('flair');
userObj = new connectedUser(userDB.user, userDB.id, userDB.rank, chanRank, userDB.flair.name, this, socket); userObj = new connectedUser(userDB, chanRank, this, socket);
} }
//Set user entry in userlist //Set user entry in userlist
@ -84,7 +84,8 @@ module.exports = class{
this.userList.forEach((userObj, user) => { this.userList.forEach((userObj, user) => {
userList.push({ userList.push({
user: user, user: user,
flair: userObj.flair flair: userObj.flair,
highLevel: userObj.highLevel
}); });
}); });

View file

@ -28,15 +28,13 @@ module.exports = class{
defineListeners(socket){ defineListeners(socket){
socket.on("chatMessage", (data) => {this.relayChat(socket, data)}); socket.on("chatMessage", (data) => {this.relayChat(socket, data)});
socket.on("setFlair", async (data) => {this.setFlair(socket, data)}); socket.on("setFlair", (data) => {this.setFlair(socket, data)});
socket.on("setHighLevel", (data) => {this.setHighLevel(socket, data)});
} }
relayChat(socket, data){ relayChat(socket, data){
//Trim and Sanatize for XSS //Trim and Sanatize for XSS
const msg = validator.trim(validator.escape(data.msg)); const msg = validator.trim(validator.escape(data.msg));
//make sure high is an int
const high = validator.toInt(data.high);
const user = this.server.getSocketInfo(socket); const user = this.server.getSocketInfo(socket);
//nuke the message if its empty or huge //nuke the message if its empty or huge
@ -44,12 +42,7 @@ module.exports = class{
return; return;
} }
//nuke the message if the high number is wrong this.server.io.in(socket.chan).emit("chatMessage", {user: user.user, flair: user.flair, highLevel: user.highLevel, msg});
if(high < 0 || high > 10){
return;
}
this.server.io.in(socket.chan).emit("chatMessage", {user: socket.user.user, flair: user.flair, high, msg});
} }
async setFlair(socket, data){ async setFlair(socket, data){
@ -60,8 +53,10 @@ module.exports = class{
//We can take this data raw since our schema checks it against existing flairs, and mongoose sanatizes queries //We can take this data raw since our schema checks it against existing flairs, and mongoose sanatizes queries
const flairDB = await userDB.setFlair(data.flair); const flairDB = await userDB.setFlair(data.flair);
//GetConnects across all channels
const connections = this.server.getConnections(socket.user.user); const connections = this.server.getConnections(socket.user.user);
//For each connection
connections.forEach((conn) => { connections.forEach((conn) => {
conn.updateFlair(flairDB.name); conn.updateFlair(flairDB.name);
}); });
@ -70,4 +65,27 @@ module.exports = class{
} }
} }
} }
async setHighLevel(socket, data){
var userDB = await userModel.findOne({user: socket.user.user});
if(userDB){
try{
//Set high level
userDB.highLevel = data.highLevel;
//Save user DB Document
await userDB.save();
//GetConnects across all channels
const connections = this.server.getConnections(socket.user.user);
//For each connection
connections.forEach((conn) => {
conn.updateHighLevel(userDB.highLevel);
});
}catch(err){
return loggerUtils.socketExceptionHandler(socket, err);
}
}
}
} }

View file

@ -19,12 +19,13 @@ const flairModel = require('../../schemas/flairSchema');
const permissionModel = require('../../schemas/permissionSchema'); const permissionModel = require('../../schemas/permissionSchema');
module.exports = class{ module.exports = class{
constructor(id, name, rank, chanRank, flair, channel, socket){ constructor(userDB, chanRank, channel, socket){
this.id = id; this.id = userDB.id;
this.name = name; this.user = userDB.user;
this.rank = rank; this.rank = userDB.rank;
this.highLevel = userDB.highLevel;
this.flair = userDB.flair.name;
this.chanRank = chanRank; this.chanRank = chanRank;
this.flair = flair;
this.channel = channel; this.channel = channel;
this.sockets = [socket.id]; this.sockets = [socket.id];
} }
@ -59,6 +60,8 @@ module.exports = class{
id: this.id, id: this.id,
user: this.user, user: this.user,
rank: this.rank, rank: this.rank,
chanRank: this.chanRank,
highLevel: this.highLevel,
flair: this.flair flair: this.flair
} }
@ -79,12 +82,17 @@ module.exports = class{
} }
updateFlair(flair){ 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.flair = flair;
this.channel.broadcastUserList(); this.channel.broadcastUserList();
this.sendClientMetadata();
} }
updateHighLevel(highLevel){
this.highLevel = highLevel;
//TODO: show high-level in userlist
this.channel.broadcastUserList();
this.sendClientMetadata(); this.sendClientMetadata();
} }
} }

View file

@ -77,6 +77,13 @@ const userSchema = new mongoose.Schema({
required: true, required: true,
default: "Signature not set!" default: "Signature not set!"
}, },
highLevel: {
type: mongoose.SchemaTypes.Number,
required: true,
min: 0,
max: 10,
default: 0
},
flair: { flair: {
type: mongoose.SchemaTypes.ObjectID, type: mongoose.SchemaTypes.ObjectID,
default: null, default: null,
@ -93,8 +100,6 @@ userSchema.pre('save', async function (next){
this.pass = hashUtil.hashPassword(this.pass); this.pass = hashUtil.hashPassword(this.pass);
} }
//If the flair was changed //If the flair was changed
if(this.isModified("flair")){ if(this.isModified("flair")){
//Get flair properties //Get flair properties

View file

@ -185,9 +185,16 @@ input#chat-panel-prompt{
margin: 0.2em; margin: 0.2em;
} }
.user-list-high-level{
margin: auto;
}
.chat-entry-high-level{ .chat-entry-high-level{
margin: 0.2em; margin: 0.2em;
margin-right: 0; margin-right: 0;
}
.high-level{
z-index: 2; z-index: 2;
background-image: url("/img/sweet_leaf_simple.png"); background-image: url("/img/sweet_leaf_simple.png");
background-size: 1.3em; background-size: 1.3em;
@ -199,13 +206,14 @@ input#chat-panel-prompt{
flex-shrink: 0; flex-shrink: 0;
} }
.chat-entry-high-level-img{ span.user-entry{
position: absolute; display: flex;
height: 1.7em; margin-bottom: 0.1em;
} }
.user-entry{ .user-entry{
margin: 0.2em; margin: 0;
margin-left: 0.1em;
font-size: 1em; font-size: 1em;
width: fit-content; width: fit-content;
} }

View file

@ -242,7 +242,7 @@ div#chat-panel-control-div{
text-shadow: none; text-shadow: none;
} }
.chat-entry-high-level{ .high-level{
text-shadow: 1px 1px 1px white, -1px -1px 1px white, 1px 1px 1px white, -1px 1px 1px white, 1px -1px 1px white; text-shadow: 1px 1px 1px white, -1px -1px 1px white, 1px 1px 1px white, -1px 1px 1px white, 1px -1px 1px white;
} }

View file

@ -59,6 +59,7 @@ class chatBox{
this.aspectLockIcon.addEventListener("click", this.lockAspect.bind(this)); this.aspectLockIcon.addEventListener("click", this.lockAspect.bind(this));
this.showChatIcon.addEventListener("click", ()=>{this.toggleUI()}); this.showChatIcon.addEventListener("click", ()=>{this.toggleUI()});
this.hideChatIcon.addEventListener("click", ()=>{this.toggleUI()}); this.hideChatIcon.addEventListener("click", ()=>{this.toggleUI()});
this.highSelect.addEventListener("change", this.setHighLevel.bind(this));
this.flairSelect.addEventListener("change", this.setFlair.bind(this)); this.flairSelect.addEventListener("change", this.setFlair.bind(this));
//Clickdragger/Resize //Clickdragger/Resize
@ -79,8 +80,8 @@ class chatBox{
//Create high-level label //Create high-level label
var highLevel = document.createElement('p'); var highLevel = document.createElement('p');
highLevel.classList.add("chat-panel-buffer","chat-entry-high-level"); highLevel.classList.add("chat-panel-buffer","chat-entry-high-level","high-level");
highLevel.innerHTML = `${chat.high}`; highLevel.innerHTML = `${chat.highLevel}`;
chatEntry.appendChild(highLevel); chatEntry.appendChild(highLevel);
//Create username label //Create username label
@ -113,13 +114,20 @@ class chatBox{
async send(event){ async send(event){
if((!event || !event.key || event.key == "Enter") && this.chatPrompt.value){ if((!event || !event.key || event.key == "Enter") && this.chatPrompt.value){
this.client.socket.emit("chatMessage",{msg: this.chatPrompt.value, high: this.highSelect.value}); this.client.socket.emit("chatMessage",{msg: this.chatPrompt.value});
this.chatPrompt.value = ""; this.chatPrompt.value = "";
} }
} }
handleClientInfo(data){ handleClientInfo(data){
this.updateFlairSelect(data.flairList, data.user.flair); this.updateFlairSelect(data.flairList, data.user.flair);
this.updateHighSelect(data.user.highLevel);
}
setHighLevel(event){
const highLevel = event.target.value;
this.client.socket.emit("setHighLevel", {highLevel});
} }
setFlair(event){ setFlair(event){
@ -128,7 +136,9 @@ class chatBox{
this.client.socket.emit("setFlair", {flair}); this.client.socket.emit("setFlair", {flair});
} }
updateHighSelect(highLevel){
this.highSelect.value = highLevel;
}
updateFlairSelect(flairList, flair){ updateFlairSelect(flairList, flair){
//clear current flair select //clear current flair select

View file

@ -88,20 +88,34 @@ class userList{
this.colorMap = newMap; this.colorMap = newMap;
} }
renderUser(user, color){ renderUser(user, flair){
var userEntry = document.createElement('p');
//Create user span
var userSpan = document.createElement('span');
userSpan.classList.add('chat-panel-users', 'user-entry');
//Create high-level label
var highLevel = document.createElement('p');
highLevel.classList.add("user-list-high-level","high-level");
highLevel.innerHTML = `${user.highLevel}`;
userSpan.appendChild(highLevel);
//Create nameplate
var userEntry = document.createElement('p');
userEntry.innerText = user.user; userEntry.innerText = user.user;
userEntry.id = `user-entry-${user.user}`; userEntry.id = `user-entry-${user.user}`;
//Override color with flair //Override color with flair
if(user.flair != "classic"){ if(user.flair != "classic"){
color = `flair-${user.flair}`; flair = `flair-${user.flair}`;
} }
//Add classes to classList
userEntry.classList.add("chat-panel-users","user-entry",flair);
userEntry.classList.add("chat-panel-users","user-entry",color); userSpan.appendChild(userEntry);
this.userList.appendChild(userEntry);
this.userList.appendChild(userSpan);
} }
toggleUI(show = this.userDiv.style.display == "none"){ toggleUI(show = this.userDiv.style.display == "none"){