parent
6dc283765c
commit
b63fe24307
|
@ -4,11 +4,11 @@
|
||||||
import { Op } from 'sequelize';
|
import { Op } from 'sequelize';
|
||||||
import logger from './logger';
|
import logger from './logger';
|
||||||
import redis from '../data/redis/client';
|
import redis from '../data/redis/client';
|
||||||
import User from '../data/User';
|
|
||||||
import RateLimiter from '../utils/RateLimiter';
|
import RateLimiter from '../utils/RateLimiter';
|
||||||
import {
|
import {
|
||||||
Channel, RegUser, UserChannel, Message,
|
Channel, RegUser, UserChannel, Message,
|
||||||
} from '../data/sql';
|
} from '../data/sql';
|
||||||
|
import { findIdByNameOrId } from '../data/sql/RegUser';
|
||||||
import ChatMessageBuffer from './ChatMessageBuffer';
|
import ChatMessageBuffer from './ChatMessageBuffer';
|
||||||
import socketEvents from '../socket/SocketEvents';
|
import socketEvents from '../socket/SocketEvents';
|
||||||
import { cheapDetector } from './isProxy';
|
import { cheapDetector } from './isProxy';
|
||||||
|
@ -26,9 +26,12 @@ function getUserFromMd(mdUserLink) {
|
||||||
let mdUser = mdUserLink.trim();
|
let mdUser = mdUserLink.trim();
|
||||||
if (mdUser[0] === '@') {
|
if (mdUser[0] === '@') {
|
||||||
mdUser = mdUser.substring(1);
|
mdUser = mdUser.substring(1);
|
||||||
}
|
if (mdUser[0] === '[' && mdUser[mdUser.length - 1] === ')') {
|
||||||
if (mdUser[0] === '[' && mdUser[mdUser.length - 1] === ')') {
|
// if mdUser ping, select Id
|
||||||
return mdUser.substring(1, mdUser.lastIndexOf(']')).trim();
|
mdUser = mdUser.substring(
|
||||||
|
mdUser.lastIndexOf('(') + 1, mdUser.length - 1,
|
||||||
|
).trim();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return mdUser;
|
return mdUser;
|
||||||
}
|
}
|
||||||
|
@ -416,7 +419,7 @@ export class ChatProvider {
|
||||||
return t`Your mail has to be verified in order to chat`;
|
return t`Your mail has to be verified in order to chat`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const muted = await ChatProvider.checkIfMuted(user);
|
const muted = await ChatProvider.checkIfMuted(user.id);
|
||||||
if (muted === -1) {
|
if (muted === -1) {
|
||||||
return t`You are permanently muted, join our guilded to apppeal the mute`;
|
return t`You are permanently muted, join our guilded to apppeal the mute`;
|
||||||
}
|
}
|
||||||
|
@ -510,24 +513,24 @@ export class ChatProvider {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static async checkIfMuted(user) {
|
static async checkIfMuted(uid) {
|
||||||
const key = `mute:${user.id}`;
|
const key = `mute:${uid}`;
|
||||||
const ttl = await redis.ttl(key);
|
const ttl = await redis.ttl(key);
|
||||||
return ttl;
|
return ttl;
|
||||||
}
|
}
|
||||||
|
|
||||||
async mute(plainName, opts) {
|
async mute(nameOrId, opts) {
|
||||||
const timeMin = opts.duration || null;
|
const timeMin = opts.duration || null;
|
||||||
const initiator = opts.initiator || null;
|
const initiator = opts.initiator || null;
|
||||||
const printChannel = opts.printChannel || null;
|
const printChannel = opts.printChannel || null;
|
||||||
|
|
||||||
const name = (plainName.startsWith('@'))
|
const searchResult = await findIdByNameOrId(nameOrId);
|
||||||
? plainName.substring(1) : plainName;
|
if (!searchResult) {
|
||||||
const id = await User.name2Id(name);
|
return `Couldn't find user ${nameOrId}`;
|
||||||
if (!id) {
|
|
||||||
return `Couldn't find user ${name}`;
|
|
||||||
}
|
}
|
||||||
|
const { name, id } = searchResult;
|
||||||
const userPing = `@[${name}](${id})`;
|
const userPing = `@[${name}](${id})`;
|
||||||
|
|
||||||
const key = `mute:${id}`;
|
const key = `mute:${id}`;
|
||||||
if (timeMin) {
|
if (timeMin) {
|
||||||
const ttl = timeMin * 60;
|
const ttl = timeMin * 60;
|
||||||
|
@ -561,17 +564,17 @@ export class ChatProvider {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async unmute(plainName, opts) {
|
async unmute(nameOrId, opts) {
|
||||||
const initiator = opts.initiator || null;
|
const initiator = opts.initiator || null;
|
||||||
const printChannel = opts.printChannel || null;
|
const printChannel = opts.printChannel || null;
|
||||||
|
|
||||||
const name = (plainName.startsWith('@'))
|
const searchResult = await findIdByNameOrId(nameOrId);
|
||||||
? plainName.substring(1) : plainName;
|
if (!searchResult) {
|
||||||
const id = await User.name2Id(name);
|
return `Couldn't find user ${nameOrId}`;
|
||||||
if (!id) {
|
|
||||||
return `Couldn't find user ${name}`;
|
|
||||||
}
|
}
|
||||||
|
const { name, id } = searchResult;
|
||||||
const userPing = `@[${name}](${id})`;
|
const userPing = `@[${name}](${id})`;
|
||||||
|
|
||||||
const key = `mute:${id}`;
|
const key = `mute:${id}`;
|
||||||
const delKeys = await redis.del(key);
|
const delKeys = await redis.del(key);
|
||||||
if (delKeys !== 1) {
|
if (delKeys !== 1) {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* @flow
|
* @flow
|
||||||
* */
|
* */
|
||||||
|
|
||||||
import Sequelize from 'sequelize';
|
import { QueryTypes, Utils } from 'sequelize';
|
||||||
import redis from './redis/client';
|
import redis from './redis/client';
|
||||||
import logger from '../core/logger';
|
import logger from '../core/logger';
|
||||||
|
|
||||||
|
@ -93,23 +93,6 @@ class User {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static async name2Id(name: string) {
|
|
||||||
try {
|
|
||||||
const userq = await sequelize.query(
|
|
||||||
'SELECT id FROM Users WHERE name = $1',
|
|
||||||
{
|
|
||||||
bind: [name],
|
|
||||||
type: Sequelize.QueryTypes.SELECT,
|
|
||||||
raw: true,
|
|
||||||
plain: true,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
return userq.id;
|
|
||||||
} catch {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setRegUser(reguser) {
|
setRegUser(reguser) {
|
||||||
this.regUser = reguser;
|
this.regUser = reguser;
|
||||||
this.id = reguser.id;
|
this.id = reguser.id;
|
||||||
|
@ -244,7 +227,7 @@ class User {
|
||||||
'SELECT totalPixels FROM Users WHERE id = $1',
|
'SELECT totalPixels FROM Users WHERE id = $1',
|
||||||
{
|
{
|
||||||
bind: [id],
|
bind: [id],
|
||||||
type: Sequelize.QueryTypes.SELECT,
|
type: QueryTypes.SELECT,
|
||||||
raw: true,
|
raw: true,
|
||||||
plain: true,
|
plain: true,
|
||||||
},
|
},
|
||||||
|
@ -267,7 +250,7 @@ class User {
|
||||||
if (!this.regUser) return false;
|
if (!this.regUser) return false;
|
||||||
try {
|
try {
|
||||||
await this.regUser.update({
|
await this.regUser.update({
|
||||||
lastLogIn: Sequelize.literal('CURRENT_TIMESTAMP'),
|
lastLogIn: new Utils.Literal('CURRENT_TIMESTAMP'),
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { DataTypes } from 'sequelize';
|
import { DataTypes, QueryTypes } from 'sequelize';
|
||||||
import sequelize from './sequelize';
|
import sequelize from './sequelize';
|
||||||
|
|
||||||
import { generateHash } from '../../utils/hash';
|
import { generateHash } from '../../utils/hash';
|
||||||
|
@ -146,4 +146,39 @@ const RegUser = sequelize.define('User', {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export async function name2Id(name) {
|
||||||
|
try {
|
||||||
|
const userq = await sequelize.query(
|
||||||
|
'SELECT id FROM Users WHERE name = $1',
|
||||||
|
{
|
||||||
|
bind: [name],
|
||||||
|
type: QueryTypes.SELECT,
|
||||||
|
raw: true,
|
||||||
|
plain: true,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return userq.id;
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function findIdByNameOrId(searchString) {
|
||||||
|
let id = await name2Id(searchString);
|
||||||
|
if (id) {
|
||||||
|
return { name: searchString, id };
|
||||||
|
}
|
||||||
|
id = parseInt(searchString, 10);
|
||||||
|
if (!Number.isNaN(id)) {
|
||||||
|
const user = await RegUser.findByPk(id, {
|
||||||
|
attributes: ['name'],
|
||||||
|
raw: true,
|
||||||
|
});
|
||||||
|
if (user) {
|
||||||
|
return { name: user.name, id };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
export default RegUser;
|
export default RegUser;
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
import WebSocket from 'ws';
|
import WebSocket from 'ws';
|
||||||
|
|
||||||
import socketEvents from './SocketEvents';
|
import socketEvents from './SocketEvents';
|
||||||
import chatProvider from '../core/ChatProvider';
|
import chatProvider, { ChatProvider } from '../core/ChatProvider';
|
||||||
import { RegUser } from '../data/sql';
|
import { RegUser } from '../data/sql';
|
||||||
import { getIPFromRequest } from '../utils/ip';
|
import { getIPFromRequest } from '../utils/ip';
|
||||||
import { setPixelByCoords } from '../core/setPixel';
|
import { setPixelByCoords } from '../core/setPixel';
|
||||||
|
@ -239,6 +239,13 @@ class APISocketServer {
|
||||||
if (command === 'chat') {
|
if (command === 'chat') {
|
||||||
const [name, id, msg, country, channelId] = packet;
|
const [name, id, msg, country, channelId] = packet;
|
||||||
const uid = id || chatProvider.apiSocketUserId;
|
const uid = id || chatProvider.apiSocketUserId;
|
||||||
|
/*
|
||||||
|
* don't send if muted
|
||||||
|
*/
|
||||||
|
const mutedTtl = await ChatProvider.checkIfMuted(uid);
|
||||||
|
if (mutedTtl !== -2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* do not send message back up ws that sent it
|
* do not send message back up ws that sent it
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue
Block a user