From 1bec84ae083d2fe7001a9bdd232de5395a871fe1 Mon Sep 17 00:00:00 2001 From: HF Date: Sun, 29 Nov 2020 04:05:49 +0100 Subject: [PATCH] move chat ratelimiter to core/ChatProvider --- src/core/ChatProvider.js | 15 +++++++++++---- src/socket/SocketServer.js | 22 +++++++--------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/core/ChatProvider.js b/src/core/ChatProvider.js index 47372f7..d029d82 100644 --- a/src/core/ChatProvider.js +++ b/src/core/ChatProvider.js @@ -3,6 +3,7 @@ import logger from './logger'; import redis from '../data/redis'; import User from '../data/models/User'; import webSockets from '../socket/websockets'; +import RateLimiter from '../utils/RateLimiter'; import { Channel, RegUser, UserChannel } from '../data/models'; import ChatMessageBuffer from './ChatMessageBuffer'; import { cheapDetector } from './isProxy'; @@ -238,21 +239,27 @@ export class ChatProvider { return this.adminCommands(message, channelId); } + if (!user.rateLimiter) { + user.rateLimiter = new RateLimiter(20, 15, true); + } + const waitLeft = user.rateLimiter.tick(); + if (waitLeft) { + // eslint-disable-next-line max-len + return `You are sending messages too fast, you have to wait ${Math.floor(waitLeft / 1000)}s :(`; + } + if (!this.userHasChannelAccess(user, channelId)) { return 'You don\'t have access to this channel'; } const country = user.regUser.flag || 'xx'; - let displayCountry = (name.endsWith('berg') || name.endsWith('stein')) + const displayCountry = (name.endsWith('berg') || name.endsWith('stein')) ? 'il' : country; if (!user.regUser.verified) { return 'Your mail has to be verified in order to chat'; } - if (name === 'Aquila') { - displayCountry = 'ug'; - } if (message.length > 2 && message === message.toUpperCase() diff --git a/src/socket/SocketServer.js b/src/socket/SocketServer.js index 5d24bbd..ba8066c 100644 --- a/src/socket/SocketServer.js +++ b/src/socket/SocketServer.js @@ -5,7 +5,6 @@ import WebSocket from 'ws'; import logger from '../core/logger'; import Counter from '../utils/Counter'; -import RateLimiter from '../utils/RateLimiter'; import { getIPFromRequest } from '../utils/ip'; import CoolDownPacket from './packets/CoolDownPacket'; @@ -85,7 +84,6 @@ class SocketServer extends WebSocketEvents { const user = await authenticateClient(req); ws.user = user; ws.name = user.getName(); - ws.rateLimiter = new RateLimiter(20, 15, true); cheapDetector(user.ip); ws.send(OnlineCounter.dehydrate({ @@ -316,18 +314,6 @@ class SocketServer extends WebSocketEvents { */ if (ws.name && message) { const { user } = ws; - const waitLeft = ws.rateLimiter.tick(); - if (waitLeft) { - ws.send(JSON.stringify([ - 'info', - // eslint-disable-next-line max-len - `You are sending messages too fast, you have to wait ${Math.floor(waitLeft / 1000)}s :(`, - 'il', - channelId, - ])); - return; - } - /* * if DM channel, make sure that other user has DM open * (needed because we allow user to leave one-sided @@ -356,7 +342,13 @@ class SocketServer extends WebSocketEvents { channelId, ); if (errorMsg) { - ws.send(JSON.stringify(['info', errorMsg, 'il', channelId])); + ws.send(JSON.stringify([ + 'info', + errorMsg, + 'il', + channelId, + chatProvider.infoUserId, + ])); } } else { logger.info('Got empty message or message from unidentified ws');