From c719020e17cb1c98da55be6cc7efe0e50ab51ffa Mon Sep 17 00:00:00 2001 From: marzavec Date: Sat, 29 Sep 2018 23:44:36 -0700 Subject: Added hooks, modules and cleaned up code --- server/src/commands/mod/dumb.js | 98 ++++++++++++++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 17 deletions(-) (limited to 'server/src/commands/mod/dumb.js') 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: '', allies: ['', ...] }` }; +exports.info.aliases = ['muzzle', 'mute']; -- cgit v1.2.1