aboutsummaryrefslogtreecommitdiffstats
path: root/server/src/commands/mod/dumb.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/commands/mod/dumb.js')
-rw-r--r--server/src/commands/mod/dumb.js98
1 files changed, 81 insertions, 17 deletions
diff --git a/server/src/commands/mod/dumb.js b/server/src/commands/mod/dumb.js
index 675ecd6..ecb4e0d 100644
--- a/server/src/commands/mod/dumb.js
+++ b/server/src/commands/mod/dumb.js
@@ -1,18 +1,20 @@
/*
- * Description: Make a user (spammer) dumb
+ * Description: Make a user (spammer) dumb (mute)
* Author: simple
*/
+// module constructor
exports.init = (core) => {
+ if (typeof core.muzzledHashes === 'undefined') {
core.muzzledHashes = {};
-}
+ }
+};
+// module main
exports.run = async (core, server, socket, data) => {
// increase rate limit chance and ignore if not admin or mod
- if (socket.uType == 'user') {
- server._police.frisk(socket.remoteAddress, 10);
-
- return;
+ if (socket.uType === 'user') {
+ return server._police.frisk(socket.remoteAddress, 10);
}
// check user input
@@ -24,29 +26,25 @@ exports.run = async (core, server, socket, data) => {
let badClient = server.findSockets({ channel: socket.channel, nick: data.nick });
if (badClient.length === 0) {
- server.reply({
+ return server.reply({
cmd: 'warn',
text: 'Could not find user in channel'
}, socket);
-
- return;
}
badClient = badClient[0];
// likely dont need this, muting mods and admins is fine
if (badClient.uType !== 'user') {
- server.reply({
+ return server.reply({
cmd: 'warn',
text: 'This trick wont work on mods and admin'
}, socket);
-
- return;
}
// store hash in mute list
let record = core.muzzledHashes[badClient.hash] = {
- dumb:true
+ dumb: true
}
// store allies if needed
@@ -59,12 +57,78 @@ exports.run = async (core, server, socket, data) => {
cmd: 'info',
text: `${socket.nick} muzzled ${data.nick} in ${socket.channel}, userhash: ${badClient.hash}`
}, { uType: 'mod' });
-}
+};
-exports.requiredData = ['nick'];
+// module hook functions
+exports.initHooks = (server) => {
+ server.registerHook('in', 'chat', this.chatCheck);
+ server.registerHook('in', 'invite', this.inviteCheck);
+ // TODO: add whisper hook, need hook priorities todo finished first
+};
+
+// hook incoming chat commands, shadow-prevent chat if they are muzzled
+exports.chatCheck = (core, server, socket, payload) => {
+ if (typeof payload.text !== 'string') {
+ return false;
+ }
+
+ if(core.muzzledHashes[socket.hash]){
+ // build fake chat payload
+ mutedPayload = {
+ cmd: 'chat',
+ nick: socket.nick,
+ text: payload.text
+ };
+
+ if (socket.trip) {
+ mutedPayload.trip = socket.trip;
+ }
+
+ // broadcast to any duplicate connections in channel
+ server.broadcast( mutedPayload, { channel: socket.channel, hash: socket.hash });
+ // broadcast to allies, if any
+ if(core.muzzledHashes[socket.hash].allies){
+ server.broadcast( mutedPayload, { channel: socket.channel, nick: core.muzzledHashes[socket.hash].allies });
+ }
+
+ // blanket "spam" protection, may expose the ratelimiting lines from `chat` and use that, TODO: one day #lazydev
+ server._police.frisk(socket.remoteAddress, 9);
+
+ return false;
+ }
+
+ return payload;
+};
+
+// shadow-prevent all invites from muzzled users
+exports.inviteCheck = (core, server, socket, payload) => {
+ if (typeof payload.nick !== 'string') {
+ return false;
+ }
+
+ if(core.muzzledHashes[socket.hash]){
+ // generate common channel
+ let channel = Math.random().toString(36).substr(2, 8);
+
+ // send fake reply
+ server.reply({
+ cmd: 'info',
+ text: `You invited ${payload.nick} to ?${channel}`
+ }, socket);
+
+ return false;
+ }
+
+ return payload;
+};
+
+// module meta
+exports.requiredData = ['nick'];
exports.info = {
name: 'dumb',
- usage: 'dumb {nick} [allies...]',
- description: 'Globally shadow mute a connection. Optional allies array will see muted messages.'
+ description: 'Globally shadow mute a connection. Optional allies array will see muted messages.',
+ usage: `
+ API: { cmd: 'dumb', nick: '<target nick>', allies: ['<optional nick array>', ...] }`
};
+exports.info.aliases = ['muzzle', 'mute'];