From bcd1511bb49119c876396e75b2003d8d63b59be8 Mon Sep 17 00:00:00 2001 From: HF Date: Wed, 19 Oct 2022 11:32:43 +0200 Subject: [PATCH] take flag and name of chat messages from user tabel --- src/core/ChatMessageBuffer.js | 72 ++++----------------------------- src/data/sql/Ban.js | 3 ++ src/data/sql/Message.js | 76 +++++++++++++++++++++++++++++------ 3 files changed, 73 insertions(+), 78 deletions(-) diff --git a/src/core/ChatMessageBuffer.js b/src/core/ChatMessageBuffer.js index 5356eb58..4220de7a 100644 --- a/src/core/ChatMessageBuffer.js +++ b/src/core/ChatMessageBuffer.js @@ -3,12 +3,9 @@ * it just buffers the msot recent 200 messages for each channel * */ -import Sequelize from 'sequelize'; -import logger from './logger'; +import { storeMessage, getMessagesForChannel } from '../data/sql/Message'; -import { Message, Channel } from '../data/sql'; - -const MAX_BUFFER_TIME = 120000; +const MAX_BUFFER_TIME = 600000; class ChatMessageBuffer { constructor(socketEvents) { @@ -24,12 +21,12 @@ class ChatMessageBuffer { async getMessages(cid, limit = 30) { if (limit > 200) { - return ChatMessageBuffer.getMessagesFromDatabase(cid, limit); + return getMessagesForChannel(cid, limit); } let messages = this.buffer.get(cid); if (!messages) { - messages = await ChatMessageBuffer.getMessagesFromDatabase(cid); + messages = await getMessagesForChannel(cid, limit); this.buffer.set(cid, messages); } this.timestamps.set(cid, Date.now()); @@ -39,18 +36,15 @@ class ChatMessageBuffer { cleanBuffer() { const curTime = Date.now(); const toDelete = []; - this.timestamps.forEach((cid, timestamp) => { + this.timestamps.forEach((timestamp, cid) => { if (curTime > timestamp + MAX_BUFFER_TIME) { toDelete.push(cid); } }); toDelete.forEach((cid) => { - this.buffer.delete(cid); this.timestamps.delete(cid); + this.buffer.delete(cid); }); - logger.info( - `Cleaned ${toDelete.length} channels from chat message buffer`, - ); } async broadcastChatMessage( @@ -64,20 +58,7 @@ class ChatMessageBuffer { if (message.length > 200) { return; } - Message.create({ - name, - flag, - message, - cid, - uid, - }); - Channel.update({ - lastMessage: Sequelize.literal('CURRENT_TIMESTAMP'), - }, { - where: { - id: cid, - }, - }); + storeMessage(name, flag, message, cid, uid); /* * goes through socket events and then comes * back at addMessage @@ -110,45 +91,6 @@ class ChatMessageBuffer { ]); } } - - static async getMessagesFromDatabase(cid, limit = 200) { - const messagesModel = await Message.findAll({ - attributes: [ - 'message', - 'uid', - 'name', - 'flag', - [ - Sequelize.fn('UNIX_TIMESTAMP', Sequelize.col('createdAt')), - 'ts', - ], - ], - where: { cid }, - limit, - order: [['createdAt', 'DESC']], - raw: true, - }); - const messages = []; - let i = messagesModel.length; - while (i > 0) { - i -= 1; - const { - message, - uid, - name, - flag, - ts, - } = messagesModel[i]; - messages.push([ - name, - message, - flag, - uid, - ts, - ]); - } - return messages; - } } export default ChatMessageBuffer; diff --git a/src/data/sql/Ban.js b/src/data/sql/Ban.js index 98969bf9..628407ff 100644 --- a/src/data/sql/Ban.js +++ b/src/data/sql/Ban.js @@ -60,6 +60,9 @@ async function cleanBans() { }, raw: true, }); + if (!expiredIPs.length) { + return; + } const ips = []; for (let i = 0; i < expiredIPs.length; i += 1) { ips.push(expiredIPs[i].ip); diff --git a/src/data/sql/Message.js b/src/data/sql/Message.js index 37450134..3b3ba6d4 100644 --- a/src/data/sql/Message.js +++ b/src/data/sql/Message.js @@ -4,7 +4,7 @@ * */ -import { DataTypes } from 'sequelize'; +import Sequelize, { DataTypes } from 'sequelize'; import sequelize from './sequelize'; import Channel from './Channel'; import RegUser from './RegUser'; @@ -17,18 +17,6 @@ const Message = sequelize.define('Message', { primaryKey: true, }, - name: { - type: `${DataTypes.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, - defaultValue: 'mx', - allowNull: false, - }, - - flag: { - type: DataTypes.CHAR(2), - defaultValue: 'xx', - allowNull: false, - }, - message: { type: `${DataTypes.CHAR(200)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, allowNull: false, @@ -55,4 +43,66 @@ Message.belongsTo(RegUser, { onDelete: 'cascade', }); +export async function storeMessage( + name, + flag, + message, + cid, + uid, +) { + await Channel.update({ + lastMessage: Sequelize.literal('CURRENT_TIMESTAMP'), + }, { + where: { + id: cid, + }, + }); + return Message.create({ + name, + flag, + message, + cid, + uid, + }); +} + +export async function getMessagesForChannel(cid, limit) { + const models = await Message.findAll({ + attributes: [ + 'message', + 'uid', + ], + include: { + model: RegUser, + as: 'user', + foreignKey: 'uid', + attributes: ['name', 'flag'], + }, + where: { cid }, + limit, + order: [['createdAt', 'DESC']], + raw: true, + }); + const messages = []; + let i = models.length; + while (i > 0) { + i -= 1; + const { + message, + uid, + 'user.name': name, + 'user.flag': flag, + ts, + } = models[i]; + messages.push([ + name, + message, + flag, + uid, + ts, + ]); + } + return messages; +} + export default Message;