diff --git a/src/backup.js b/src/backup.js index 80c7f26..b37f7f1 100644 --- a/src/backup.js +++ b/src/backup.js @@ -24,6 +24,7 @@ import { createPngBackup, incrementialBackupRedis, } from './core/tilesBackup'; +// eslint-disable-next-line import/no-unresolved import canvases from './canvases.json'; /* diff --git a/src/components/HelpModal.jsx b/src/components/HelpModal.jsx index 44c8693..8f409f6 100644 --- a/src/components/HelpModal.jsx +++ b/src/components/HelpModal.jsx @@ -48,7 +48,7 @@ const HelpModal = () => ( Some canvases have a different cooldown for replacing a user-set pixels than placing on a unset pixel. i.e. 4s/7s means 4s on fresh pixels and 7s on already set pixels. Higher zoomlevels take some time to update, the 3D globe gets updated at least once per day. - Have fun!
+ Have fun!Discord: pixelplanet.fun/discord
Source on github
Reddit: r/PixelPlanetFun
diff --git a/src/components/UserMessages.jsx b/src/components/UserMessages.jsx index 4e272a3..a4a5bbb 100644 --- a/src/components/UserMessages.jsx +++ b/src/components/UserMessages.jsx @@ -79,7 +79,7 @@ class UserMessages extends React.Component { {(messages.includes('not_verified') && messages.splice(messages.indexOf('not_verified'), 1)) ? (
- Please verify your mail address or your account could get deleted after a few days.
+ Please verify your mail address or your account could get deleted after a few days.
{(this.state.verify_answer)
? {this.state.verify_answer}
: Click here to request a new verification mail.}
diff --git a/src/core/ChatProvider.js b/src/core/ChatProvider.js
new file mode 100644
index 0000000..d91c381
--- /dev/null
+++ b/src/core/ChatProvider.js
@@ -0,0 +1,114 @@
+/* @flow */
+
+
+import logger from '../core/logger';
+import redis from '../data/redis';
+import User from '../data/models/User';
+import webSockets from '../socket/websockets';
+
+
+class ChatProvider {
+ /*
+ * TODO:
+ * history really be saved in redis
+ */
+ history: Array;
+
+ constructor() {
+ this.history = [];
+ }
+
+ addMessage(name, message) {
+ if (this.history.length > 20) {
+ this.history.shift();
+ }
+ this.history.push([name, message]);
+ }
+
+ async sendMessage(user, message) {
+ if (message.length > 300) {
+ // eslint-disable-next-line max-len
+ return 'You can\'t send a message this long :(';
+ }
+ const name = (user.regUser) ? user.regUser.name : null;
+ if (!name) {
+ // eslint-disable-next-line max-len
+ return 'Couldn\'t send your message, pls log out and back in again.';
+ }
+
+ if (user.isAdmin() && message.charAt(0) === '/') {
+ // admin commands
+ const cmd = message.split(' ', 3);
+ if (cmd[0] === '/mute') {
+ return ChatProvider.mute(cmd[1], cmd[2]);
+ } if (cmd[0] === '/unmute') {
+ return ChatProvider.unmute(cmd[1]);
+ }
+ }
+
+ const muted = await ChatProvider.checkIfMuted(user);
+ if (muted === -1) {
+ return 'You are permanently muted, join our discord to apppeal the mute';
+ }
+ if (muted > 0) {
+ if (muted > 120) {
+ const timeMin = Math.round(muted / 60);
+ return `You are muted for another ${timeMin} minutes`;
+ }
+ return `You are muted for another ${muted} seconds`;
+ }
+ this.addMessage(name, message);
+ webSockets.broadcastChatMessage(name, message);
+ return null;
+ }
+
+ broadcastChatMessage(name, message, sendapi: boolean = true) {
+ this.addMessage(name, message);
+ webSockets.broadcastChatMessage(name, message, sendapi);
+ }
+
+ static async checkIfMuted(user) {
+ const key = `mute:${user.id}`;
+ const ttl: number = await redis.ttlAsync(key);
+ return ttl;
+ }
+
+ static async mute(name, timeMin) {
+ const id = await User.name2Id(name);
+ if (!id) {
+ return `Couldn't find user ${name}`;
+ }
+ const key = `mute:${id}`;
+ if (timeMin) {
+ const ttl = timeMin * 60;
+ await redis.setAsync(key, '', 'EX', ttl);
+ webSockets.broadcastChatMessage('info',
+ `${name} has been muted for ${timeMin}min`);
+ } else {
+ await redis.setAsync(key, '');
+ webSockets.broadcastChatMessage('info',
+ `${name} has been muted forever`);
+ }
+ logger.info(`Muted user ${id}`);
+ return null;
+ }
+
+ static async unmute(name) {
+ const id = await User.name2Id(name);
+ if (!id) {
+ return `Couldn't find user ${name}`;
+ }
+ const key = `mute:${id}`;
+ const delKeys = await redis.delAsync(key);
+ if (delKeys !== 1) {
+ return `User ${name} is not muted`;
+ }
+ webSockets.broadcastChatMessage('info',
+ `${name} has been unmuted`);
+ logger.info(`Unmuted user ${id}`);
+ return null;
+ }
+}
+
+const chatProvider = new ChatProvider();
+export default chatProvider;
diff --git a/src/core/Image.js b/src/core/Image.js
index e9c72cd..3eed446 100644
--- a/src/core/Image.js
+++ b/src/core/Image.js
@@ -8,6 +8,7 @@ import RedisCanvas from '../data/models/RedisCanvas';
import logger from './logger';
import { getChunkOfPixel } from './utils';
import { TILE_SIZE } from './constants';
+// eslint-disable-next-line import/no-unresolved
import canvases from './canvases.json';
import Palette from './Palette';
diff --git a/src/core/draw.js b/src/core/draw.js
index f2ea784..8626f65 100644
--- a/src/core/draw.js
+++ b/src/core/draw.js
@@ -8,6 +8,7 @@ import { getChunkOfPixel, getOffsetOfPixel } from './utils';
import webSockets from '../socket/websockets';
import logger from './logger';
import RedisCanvas from '../data/models/RedisCanvas';
+// eslint-disable-next-line import/no-unresolved
import canvases from './canvases.json';
import { THREE_CANVAS_HEIGHT } from './constants';
diff --git a/src/core/me.js b/src/core/me.js
index 519c0c1..94a6717 100644
--- a/src/core/me.js
+++ b/src/core/me.js
@@ -5,6 +5,7 @@
*
* @flow
*/
+// eslint-disable-next-line import/no-unresolved
import canvases from './canvases.json';
diff --git a/src/core/passport.js b/src/core/passport.js
index 633404b..18a6f98 100644
--- a/src/core/passport.js
+++ b/src/core/passport.js
@@ -33,6 +33,7 @@ passport.deserializeUser((req, id, done) => {
RegUser.findOne({ where: { id } }).then((reguser) => {
if (reguser) {
user.regUser = reguser;
+ user.id = id;
} else {
user.id = null;
}
diff --git a/src/core/tileserver.js b/src/core/tileserver.js
index 3f160ba..3a1ddfa 100644
--- a/src/core/tileserver.js
+++ b/src/core/tileserver.js
@@ -8,6 +8,7 @@ import fs from 'fs';
import type { Cell } from './Cell';
import logger from './logger';
+// eslint-disable-next-line import/no-unresolved
import canvases from './canvases.json';
import Palette from './Palette';
import RedisCanvas from '../data/models/RedisCanvas';
diff --git a/src/data/models/RedisCanvas.js b/src/data/models/RedisCanvas.js
index ef5fed8..f9fc591 100644
--- a/src/data/models/RedisCanvas.js
+++ b/src/data/models/RedisCanvas.js
@@ -6,6 +6,7 @@ import {
THREE_TILE_SIZE,
THREE_CANVAS_HEIGHT,
} from '../../core/constants';
+// eslint-disable-next-line import/no-unresolved
import canvases from './canvases.json';
import logger from '../../core/logger';
diff --git a/src/data/models/User.js b/src/data/models/User.js
index d06636b..2954c11 100644
--- a/src/data/models/User.js
+++ b/src/data/models/User.js
@@ -9,7 +9,6 @@
import Sequelize from 'sequelize';
import redis from '../redis';
-import { randomDice } from '../../utils/random';
import logger from '../../core/logger';
import Model from '../sequelize';
@@ -32,8 +31,23 @@ class User {
this.regUser = null;
}
+ static async name2Id(name: string) {
+ try {
+ const userq = await Model.query('SELECT id FROM Users WHERE name = $1',
+ {
+ bind: [name],
+ type: Sequelize.QueryTypes.SELECT,
+ raw: true,
+ plain: true,
+ });
+ return userq.id;
+ } catch {
+ return null;
+ }
+ }
+
async setWait(coolDown: number, canvasId: number): Promise