diff --git a/server/src/commands/core/invite.js b/server/src/commands/core/invite.js index b98115b..00584b3 100644 --- a/server/src/commands/core/invite.js +++ b/server/src/commands/core/invite.js @@ -4,6 +4,79 @@ import * as UAC from '../utility/UAC/_info'; +// module support functions +/** + * Returns a message for if it's a valid nickname to invite. Returns null if there was no error. + * @param {any} nick + * @return {(string|null)} + */ +export function checkNickname (nick, inviterNick) { + if (typeof nick !== 'string' || !UAC.verifyNickname(nick)) { + return "Nickname was invalid."; + } else if (nick === inviterNick) { + return "Why would you invite yourself?"; + } + + return null; +} + +/** + * Returns the channel that should be invited to. + * @param {any} channel + * @return {string} + */ +export function getChannel (channel=undefined) { + if (typeof channel === 'string') { + return channel; + } else { + return Math.random().toString(36).substr(2, 8); + } +} + +/** + * Creates the payload that a user who is being invited would receive. + * @param {string} inviter The user who is inviting them. + * @param {string} channel The channel they are being invited to. + * @return {Object} + */ +export function createRecipientPayload (inviter, channel) { + return { + cmd: 'info', + type: 'invite', + from: inviter, + text: `${inviter} invited you to ?${channel}`, + }; +} + +/** + * Creates the payload that a user who invited users (and succeeded) would receive. + * @param {string} nick The user who was invited. + * @param {string} channel The channel they were invited to. + */ +export function createSuccessPayload (nick, channel) { + return { + cmd: 'info', + type: 'invite', + invite: channel, + text: `You invited ${nick} to ?${channel}`, + }; +} + +/** + * Sends the invites to the recipients. + * @param {MainServer} server The server. Required to broadcast the messages. + * @param {string} recipientNick The user who is being invited. + * @param {string} inviterNick The user who is doing the inviting. + * @param {string} originalChannel The channel they have in common, and where the invite is sent in. + * @param {string} inviteChannel The channel they are being invited to. + */ +export function sendInvite (server, recipientNick, inviterNick, originalChannel, inviteChannel) { + return server.broadcast(createRecipientPayload(inviterNick, inviteChannel), { + channel: originalChannel, + nick: recipientNick, + }); +} + // module main export async function run(core, server, socket, data) { // check for spam @@ -15,30 +88,19 @@ export async function run(core, server, socket, data) { } // verify user input - if (typeof data.nick !== 'string' || !UAC.verifyNickname(data.nick)) { + const nickValid = checkNickname(data.nick, socket.nick); + if (nickValid !== null) { + server.reply({ + cmd: 'warn', + text: nickValid, + }, socket); return true; } - // why would you invite yourself? - if (data.nick === socket.nick) { - return true; - } - - let channel; - if (typeof data.to === 'string') { - channel = data.to; - } else { - channel = Math.random().toString(36).substr(2, 8); - } + const channel = getChannel(data.to); // build and send invite - const payload = { - cmd: 'info', - type: 'invite', - from: socket.nick, - invite: channel, - text: `${socket.nick} invited you to ?${channel}`, - }; + const payload = createRecipientPayload(socket.nick, channel); const inviteSent = server.broadcast(payload, { channel: socket.channel, @@ -54,12 +116,7 @@ export async function run(core, server, socket, data) { } // reply with common channel - server.reply({ - cmd: 'info', - type: 'invite', - invite: channel, - text: `You invited ${data.nick} to ?${channel}`, - }, socket); + server.reply(createSuccessPayload(data.nick, channel), socket); // stats are fun core.stats.increment('invites-sent');