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/core/whisper.js | 110 ++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 server/src/commands/core/whisper.js (limited to 'server/src/commands/core/whisper.js') diff --git a/server/src/commands/core/whisper.js b/server/src/commands/core/whisper.js new file mode 100644 index 0000000..2ad2df0 --- /dev/null +++ b/server/src/commands/core/whisper.js @@ -0,0 +1,110 @@ +/* + Description: Display text on targets screen that only they can see +*/ + +// module support functions +const verifyNickname = (nick) => /^[a-zA-Z0-9_]{1,24}$/.test(nick); + +const parseText = (text) => { + // verifies user input is text + if (typeof text !== 'string') { + return false; + } + + // strip newlines from beginning and end + text = text.replace(/^\s*\n|^\s+$|\n\s*$/g, ''); + // replace 3+ newlines with just 2 newlines + text = text.replace(/\n{3,}/g, "\n\n"); + + return text; +}; + +// module main +exports.run = async (core, server, socket, payload) => { + // check user input + let text = parseText(payload.text); + + if (!text) { + // lets not send objects or empty text, yea? + return server._police.frisk(socket.remoteAddress, 13); + } + + // check for spam + let score = text.length / 83 / 4; + if (server._police.frisk(socket.remoteAddress, score)) { + return server.reply({ + cmd: 'warn', + text: 'You are sending too much text. Wait a moment and try again.\nPress the up arrow key to restore your last message.' + }, socket); + } + + let targetNick = payload.nick; + if (!verifyNickname(targetNick)) { + return; + } + + // find target user + let targetClient = server.findSockets({ channel: socket.channel, nick: targetNick }); + + if (targetClient.length === 0) { + return server.reply({ + cmd: 'warn', + text: 'Could not find user in channel' + }, socket); + } + + targetClient = targetClient[0]; + + server.reply({ + cmd: 'info', + type: 'whisper', + from: socket.nick, + trip: socket.trip || 'null', + text: `${socket.nick} whispered: ${text}` + }, targetClient); + + server.reply({ + cmd: 'info', + type: 'whisper', + text: `You whispered to @${targetNick}: ${text}` + }, socket); +}; + +// module hook functions +exports.initHooks = (server) => { + server.registerHook('in', 'chat', this.whisperCheck); +}; + +// hooks chat commands checking for /whisper +exports.whisperCheck = (core, server, socket, payload) => { + if (typeof payload.text !== 'string') { + return false; + } + + if (payload.text.startsWith('/whisper')) { + let input = payload.text.split(' '); + let target = input[1].replace(/@/g, ''); + input.splice(0, 2); + let whisperText = input.join(' '); + + this.run(core, server, socket, { + cmd: 'whisper', + nick: target, + text: whisperText + }); + + return false; + } + + return payload; +}; + +// module meta +exports.requiredData = ['nick', 'text']; +exports.info = { + name: 'whisper', + description: 'Display text on targets screen that only they can see', + usage: ` + API: { cmd: 'whisper', nick: '', text: '' } + Text: /whisper ` +}; -- cgit v1.2.1