Compare commits

...

2 Commits

Author SHA1 Message Date
HF
27b8076178 alter user tabel 2022-10-19 13:19:57 +02:00
HF
bcd1511bb4 take flag and name of chat messages from user tabel 2022-10-19 13:02:26 +02:00
10 changed files with 86 additions and 100 deletions

View File

@ -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;

View File

@ -160,7 +160,7 @@ export class MailProvider {
return false;
}
await reguser.update({
mailVerified: true,
verified: true,
verificationReqAt: null,
});
return reguser.name;

View File

@ -13,17 +13,17 @@ export default async function getMe(user, lang = 'default') {
const userdata = await user.getUserData();
// sanitize data
const {
name, mailVerified,
name, verified,
} = userdata;
if (!name) userdata.name = null;
const messages = [];
if (USE_MAILER && name && !mailVerified) {
if (USE_MAILER && name && !verified) {
messages.push('not_verified');
}
if (messages.length > 0) {
userdata.messages = messages;
}
delete userdata.mailVerified;
delete userdata.verified;
userdata.canvases = getLocalicedCanvases(lang);
userdata.channels = {

View File

@ -244,7 +244,7 @@ class User {
return {
...data,
name: null,
mailVerified: false,
verified: false,
blockDm: false,
priv: false,
mailreg: false,
@ -260,7 +260,7 @@ class User {
return {
...data,
name: regUser.name,
mailVerified: regUser.mailVerified,
verified: regUser.verified,
blockDm: regUser.blockDm,
priv: regUser.priv,
totalPixels,

View File

@ -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);

View File

@ -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;

View File

@ -38,7 +38,7 @@ const RegUser = sequelize.define('User', {
defaultValue: false,
},
// null if external oauth authentification
// null if only ever used external oauth
password: {
type: DataTypes.CHAR(60),
allowNull: true,
@ -51,9 +51,9 @@ const RegUser = sequelize.define('User', {
defaultValue: 0,
},
// mail and Minecraft verified
// currently just mail verification
verified: {
type: DataTypes.TINYINT,
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
},
@ -98,10 +98,6 @@ const RegUser = sequelize.define('User', {
updatedAt: false,
getterMethods: {
mailVerified() {
return this.verified & 0x01;
},
blockDm() {
return this.blocks & 0x01;
},
@ -112,11 +108,6 @@ const RegUser = sequelize.define('User', {
},
setterMethods: {
mailVerified(num) {
const val = (num) ? (this.verified | 0x01) : (this.verified & ~0x01);
this.setDataValue('verified', val);
},
blockDm(num) {
const val = (num) ? (this.blocks | 0x01) : (this.blocks & ~0x01);
this.setDataValue('blocks', val);

View File

@ -56,7 +56,7 @@ export default async (req, res) => {
await user.regUser.update({
email,
mailVerified: false,
verified: false,
});
const host = getHostFromRequest(req);

View File

@ -15,8 +15,8 @@ export default async (req, res) => {
return;
}
const { name, email, mailVerified } = user.regUser;
if (mailVerified) {
const { name, email, verified } = user.regUser;
if (verified) {
res.status(400);
res.json({
errors: ['You are already verified.'],

View File

@ -77,7 +77,7 @@ app.use(routes);
// ip config
// -----------------------------------------------------------------------------
// sync sql models
sequelize.sync({ alter: { drop: false } })
sequelize.sync({ alter: { drop: true } })
// connect to redis
.then(connectRedis)
.then(async () => {