diff options
Diffstat (limited to '')
-rw-r--r-- | server/src/commands/core/invite.js | 107 | ||||
-rw-r--r-- | server/src/commands/core/join.js | 10 | ||||
-rw-r--r-- | server/src/commands/mod/dumb.js | 21 |
3 files changed, 102 insertions, 36 deletions
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)) { - return true; - } - - // why would you invite yourself? - if (data.nick === socket.nick) { + const nickValid = checkNickname(data.nick, socket.nick); + if (nickValid !== null) { + server.reply({ + cmd: 'warn', + text: nickValid, + }, socket); 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'); diff --git a/server/src/commands/core/join.js b/server/src/commands/core/join.js index 7e98721..ddbdf6d 100644 --- a/server/src/commands/core/join.js +++ b/server/src/commands/core/join.js @@ -32,7 +32,13 @@ export function parseNickname(core, data) { return 'Nickname must consist of up to 24 letters, numbers, and underscores'; } - const password = nickArray[1]; + let password = undefined; + // prioritize hash in nick for password over password field + if (typeof nickArray[1] === 'string') { + password = nickArray[1]; + } else if (typeof data.password === 'string') { + password = data.password; + } if (hash(password + core.config.tripSalt) === core.config.adminTrip) { userInfo.uType = 'admin'; @@ -152,5 +158,5 @@ export const info = { name: 'join', description: 'Place calling socket into target channel with target nick & broadcast event to channel', usage: ` - API: { cmd: 'join', nick: '<your nickname>', channel: '<target channel>' }`, + API: { cmd: 'join', nick: '<your nickname>', password: '<optional password>', channel: '<target channel>' }`, }; diff --git a/server/src/commands/mod/dumb.js b/server/src/commands/mod/dumb.js index 488ed9e..51fc745 100644 --- a/server/src/commands/mod/dumb.js +++ b/server/src/commands/mod/dumb.js @@ -4,6 +4,7 @@ */ import * as UAC from '../utility/UAC/_info'; +import * as Invite from '../core/invite'; // module constructor export function init(core) { @@ -117,19 +118,21 @@ export function chatCheck(core, server, socket, payload) { // shadow-prevent all invites from muzzled users export function inviteCheck(core, server, socket, payload) { - if (typeof payload.nick !== 'string') { - return false; - } - if (core.muzzledHashes[socket.hash]) { + const nickValid = Invite.checkNickname(payload.nick); + if (nickValid !== null) { + server.reply({ + cmd: 'warn', + text: nickValid, + }, socket); + return false; + } + // generate common channel - const channel = Math.random().toString(36).substr(2, 8); + const channel = Invite.getChannel(); // send fake reply - server.reply({ - cmd: 'info', - text: `You invited ${payload.nick} to ?${channel}`, - }, socket); + server.reply(Invite.createSuccessPayload(payload.nick, channel), socket); return false; } |