forked from ppfun/pixelplanet
take flag and name of chat messages from user tabel
This commit is contained in:
parent
7192f31549
commit
bcd1511bb4
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user