From 8821b5cff94617a1621dc73156118fc5c2b780f8 Mon Sep 17 00:00:00 2001 From: rainbow napkin Date: Wed, 11 Jun 2025 08:02:50 -0400 Subject: [PATCH] Started work on implementing chat buffer. --- src/app/channel/chat.js | 28 ++++++++++++++++ src/app/channel/chatHandler.js | 25 ++++++++++++--- src/schemas/channel/channelSchema.js | 4 ++- src/schemas/channel/chatSchema.js | 48 ++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 src/app/channel/chat.js create mode 100644 src/schemas/channel/chatSchema.js diff --git a/src/app/channel/chat.js b/src/app/channel/chat.js new file mode 100644 index 0000000..5414a67 --- /dev/null +++ b/src/app/channel/chat.js @@ -0,0 +1,28 @@ +/*Canopy - The next generation of stoner streaming software +Copyright (C) 2024-2025 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 .*/ + +class chat{ + constructor(user, flair, highLevel, msg, type, links){ + this.user = user; + this.flair = flair; + this.highLevel = highLevel; + this.msg = msg; + this.type = type; + this.links = links; + } +} + +module.exports = chat; \ No newline at end of file diff --git a/src/app/channel/chatHandler.js b/src/app/channel/chatHandler.js index 4248b61..ad627f4 100644 --- a/src/app/channel/chatHandler.js +++ b/src/app/channel/chatHandler.js @@ -22,12 +22,17 @@ const commandPreprocessor = require('./commandPreprocessor'); const loggerUtils = require('../../utils/loggerUtils'); const linkUtils = require('../../utils/linkUtils'); const emoteValidator = require('../../validators/emoteValidator'); +const chat = require('./chat'); const {userModel} = require('../../schemas/user/userSchema'); module.exports = class{ constructor(server){ + //Set server this.server = server; + //Initialize command preprocessor this.commandPreprocessor = new commandPreprocessor(server, this) + //Define the chat buffer + this.chatBuffer = []; } defineListeners(socket){ @@ -126,21 +131,33 @@ module.exports = class{ //Base chat functions relayChat(user, flair, highLevel, msg, type = 'chat', chan, links){ - this.server.io.in(chan).emit("chatMessage", {user, flair, highLevel, msg, type, links}); + this.relayChatObject(chan, new chat(user, flair, highLevel, msg, type, links)); + } + + relayChatObject(chan, chat){ + this.server.io.in(chan).emit("chatMessage", chat); } relayPrivateChat(socket, user, flair, highLevel, msg, type, links){ - socket.emit("chatMessage", {user, flair, highLevel, msg, type, links}); + this.relayPrivateChatObject(socket , new chat(user, flair, highLevel, msg, type, links)); + } + + relayPrivateChatObject(socket, chat){ + socket.emit("chatMessage", chat); } relayGlobalChat(user, flair, highLevel, msg, type = 'chat', links){ - this.server.io.emit("chatMessage", {user, flair, highLevel, msg, type, links}); + this.relayGlobalChatObject("chatMessage", new chat(user, flair, highLevel, msg, type, links)); + } + + relayGlobalChatObject(chat){ + this.server.io.emit("chatMessage", chat); } //User Chat Functions relayUserChat(socket, msg, type, links){ const user = this.server.getSocketInfo(socket); - this.relayChat(user.user, user.flair, user.highLevel, msg, type, socket.chan, links) + this.relayChat(user.user, user.flair, user.highLevel, msg, type, socket.chan, links); } //Toke Chat Functions diff --git a/src/schemas/channel/channelSchema.js b/src/schemas/channel/channelSchema.js index fd2d4ad..75e8593 100644 --- a/src/schemas/channel/channelSchema.js +++ b/src/schemas/channel/channelSchema.js @@ -31,6 +31,7 @@ const channelPermissionSchema = require('./channelPermissionSchema'); const channelBanSchema = require('./channelBanSchema'); const queuedMediaSchema = require('./media/queuedMediaSchema'); const playlistSchema = require('./media/playlistSchema'); +const chatSchema = require('./chatSchema'); //Utils const { exceptionHandler, errorHandler } = require('../../utils/loggerUtils'); @@ -118,7 +119,8 @@ const channelSchema = new mongoose.Schema({ } }, //Thankfully we don't have to keep track of alts, ips, or deleted users so this should be a lot easier than site-wide bans :P - banList: [channelBanSchema] + banList: [channelBanSchema], + chatBuffer: [chatSchema] }); diff --git a/src/schemas/channel/chatSchema.js b/src/schemas/channel/chatSchema.js new file mode 100644 index 0000000..b54f9b6 --- /dev/null +++ b/src/schemas/channel/chatSchema.js @@ -0,0 +1,48 @@ +/*Canopy - The next generation of stoner streaming software +Copyright (C) 2024-2025 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 .*/ + +//NPM Imports +const {mongoose} = require('mongoose'); + +const chatSchema = new mongoose.Schema({ + user: { + type: mongoose.SchemaTypes.String, + required: true, + }, + flair: { + type: mongoose.SchemaTypes.String, + required: true, + }, + highLevel: { + type: mongoose.SchemaTypes.Number, + required: true, + }, + msg: { + type: mongoose.SchemaTypes.String, + required: true, + }, + type: { + type: mongoose.SchemaTypes.String, + required: true, + }, + links: { + type: [mongoose.SchemaTypes.Number], + required: true, + }, +}); + + +module.exports = chatSchema; \ No newline at end of file