aboutsummaryrefslogtreecommitdiffstats
path: root/server/src/commands/core/join.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/commands/core/join.js')
-rw-r--r--server/src/commands/core/join.js67
1 files changed, 35 insertions, 32 deletions
diff --git a/server/src/commands/core/join.js b/server/src/commands/core/join.js
index 965a8bc..644470e 100644
--- a/server/src/commands/core/join.js
+++ b/server/src/commands/core/join.js
@@ -6,7 +6,7 @@
const crypto = require('crypto');
const hash = (password) => {
- let sha = crypto.createHash('sha256');
+ const sha = crypto.createHash('sha256');
sha.update(password);
return sha.digest('base64').substr(0, 6);
};
@@ -15,15 +15,15 @@ const verifyNickname = (nick) => /^[a-zA-Z0-9_]{1,24}$/.test(nick);
// exposed "login" function to allow hooks to verify user join events
// returns object containing user info or string if error
-exports.parseNickname = (core, data) => {
- let userInfo = {
+export function parseNickname(core, data) {
+ const userInfo = {
nick: '',
uType: 'user',
trip: null,
};
// seperate nick from password
- let nickArray = data.nick.split('#', 2);
+ const nickArray = data.nick.split('#', 2);
userInfo.nick = nickArray[0].trim();
if (!verifyNickname(userInfo.nick)) {
@@ -31,90 +31,92 @@ exports.parseNickname = (core, data) => {
return 'Nickname must consist of up to 24 letters, numbers, and underscores';
}
- let password = nickArray[1];
+ const password = nickArray[1];
if (hash(password + core.config.tripSalt) === core.config.adminTrip) {
userInfo.uType = 'admin';
userInfo.trip = 'Admin';
- } else if (userInfo.nick.toLowerCase() == core.config.adminName.toLowerCase()) { // they've got the main-admin name while not being an admin
+ } else if (userInfo.nick.toLowerCase() === core.config.adminName.toLowerCase()) {
+ // they've got the main-admin name while not being an admin
return 'You are not the admin, liar!';
} else if (password) {
userInfo.trip = hash(password + core.config.tripSalt);
}
// TODO: disallow moderator impersonation
- for (let mod of core.config.mods) {
+ // for (const mod of core.config.mods) {
+ core.config.mods.forEach((mod) => {
if (userInfo.trip === mod.trip) {
userInfo.uType = 'mod';
}
- }
+ });
return userInfo;
-};
+}
// module main
-exports.run = async (core, server, socket, data) => {
+export async function run(core, server, socket, data) {
// check for spam
- if (server.police.frisk(socket.remoteAddress, 3)) {
+ if (server.police.frisk(socket.address, 3)) {
return server.reply({
cmd: 'warn',
- text: 'You are joining channels too fast. Wait a moment and try again.'
+ text: 'You are joining channels too fast. Wait a moment and try again.',
}, socket);
}
// calling socket already in a channel
if (typeof socket.channel !== 'undefined') {
- return;
+ return true;
}
// check user input
if (typeof data.channel !== 'string' || typeof data.nick !== 'string') {
- return;
+ return true;
}
- let channel = data.channel.trim();
+ const channel = data.channel.trim();
if (!channel) {
// must join a non-blank channel
- return;
+ return true;
}
- let userInfo = this.parseNickname(core, data);
+ const userInfo = this.parseNickname(core, data);
if (typeof userInfo === 'string') {
return server.reply({
cmd: 'warn',
- text: userInfo
+ text: userInfo,
}, socket);
}
// check if the nickname already exists in the channel
- let userExists = server.findSockets({
+ const userExists = server.findSockets({
channel: data.channel,
- nick: (targetNick) => targetNick.toLowerCase() === userInfo.nick.toLowerCase()
+ nick: (targetNick) => targetNick.toLowerCase() === userInfo.nick.toLowerCase(),
});
if (userExists.length > 0) {
// that nickname is already in that channel
return server.reply({
cmd: 'warn',
- text: 'Nickname taken'
+ text: 'Nickname taken',
}, socket);
}
userInfo.userHash = server.getSocketHash(socket);
// prepare to notify channel peers
- let newPeerList = server.findSockets({ channel: data.channel });
- let nicks = [];
+ const newPeerList = server.findSockets({ channel: data.channel });
+ const nicks = [];
- let joinAnnouncement = {
+ const joinAnnouncement = {
cmd: 'onlineAdd',
nick: userInfo.nick,
trip: userInfo.trip || 'null',
- hash: userInfo.userHash
+ hash: userInfo.userHash,
};
// send join announcement and prep online set
- for (let i = 0, l = newPeerList.length; i < l; i++) {
+ for (let i = 0, l = newPeerList.length; i < l; i += 1) {
server.reply(joinAnnouncement, newPeerList[i]);
nicks.push(newPeerList[i].nick);
}
@@ -131,18 +133,19 @@ exports.run = async (core, server, socket, data) => {
// reply with channel peer list
server.reply({
cmd: 'onlineSet',
- nicks: nicks
+ nicks,
}, socket);
// stats are fun
core.stats.increment('users-joined');
-};
-// module meta
-exports.requiredData = ['channel', 'nick'];
-exports.info = {
+ return true;
+}
+
+export const requiredData = ['channel', 'nick'];
+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>', channel: '<target channel>' }`,
};