Ssh-chat, pati 2

Bonjou, Habr. Sa a se 2yèm atik nan seri ssh-chat la.

Kisa nou pral fè:

  • Ann ajoute kapasite pou kreye pwòp fonksyon konsepsyon ou
  • Ann ajoute sipò markdown
  • Ann ajoute sipò bot
  • Ogmante sekirite modpas (hash ak sèl)
    Padon, men pap gen okenn voye fichye yo.

Karakteristik konsepsyon koutim

Kounye a, fonksyon konsepsyon sa yo sipòte:

// parserExec.js at end
module.exports.registerMethod  =  function(name, func) {
  methods[name] =  func
}

Ou bezwen tou retounen metòd sa a apre ou fin kreye sèvè a

// index.js at require part
const { registerMethod } = require('./parserExec')

// index.js at end
module.exports.registerMethod  =  registerMethod

Koulye a, lè w ap kreye yon sèvè, nou ka anrejistre metòd fòma. Egzanp:

const  chat  =  require('.')
const { formatNick } =  require('./format')

chat({})

chat.registerMethod('hello', function(p, name){
  return  'Hi, '  +  formatNick(name) +  '!'
})

Ssh-chat, pati 2

Markdown sipò

Markdown trè pratik, kidonk ann ajoute li lè l sèvi avèk tèminal make

// format.js near require
const marked = require('marked');
const TerminalRenderer = require('marked-terminal');

marked.setOptions({
  renderer: new TerminalRenderer()
});

// format.js line 23
message = marked(message)

Ssh-chat, pati 2

Bots

Ki jan li pral travay

let writeBotBob = chat.registerBot({
  name: 'botBob',

  onConnect(nick, write){
    write('@hello{' + nick + '}')
  },

  onDisconnect(nick, write){},

  onMessage(nick, message, write) {
    if(message == 'botBob!') write('I'm here')
  },

  onCommand(command, write) {
    write('Doing ' + command)
  }
})

onCommand ka rele lè l sèvi avèk @bot(botBob){Command}

Tout bagay pou travay ak bot yo dekri nan dosye a:

let bots = []; // Все боты

let onWrite = () => {}; 

function getWrite(bot) { // Генерирует метод отправки сообщения для бота
  return msg => {
    onWrite(bot.name, msg);
  };
}

module.exports.message = function message(nick, message) { // index.js выполнит эту функцию после отправки сообщения
  bots.forEach(bot => {
    try {
      bot.onMessage(nick, message, getWrite(bot));
    } catch (e) {
      console.error(e);
    }
  });
};

module.exports.connect = function message(nick) { // При соединении
  bots.forEach(bot => {
    try {
      bot.onConnect(nick, getWrite(bot));
    } catch (e) {
      console.error(e);
    }
  });
};

module.exports.disConnect = function message(nick) { // При отсоединении
  bots.forEach(bot => {
    try {
      bot.onDisconnect(nick, message, getWrite(bot));
    } catch (e) {
      console.error(e);
    }
  });
};

module.exports.command = function message(name, message) { // При выполнении команды
  bots.forEach(bot => {
    if (bot.name == name) {
      try {
        bot.onCommand(message, getWrite(bot));
      } catch (e) {
        console.error(e);
      }
    }
  });
};

module.exports.registerBot = function(bot) {
  bots.push(bot);
  return  getWrite(bot)
};

module.exports.onMessage = func => {
  onWrite = func;
};

Ssh-chat, pati 2

Ki sa ou ka fè ak bots:

  • Chaj pou kontwole
  • deplwaye
  • Tablo travay

Hash ak sèl

Poukisa yo pa ssh kle? Paske kle ssh yo pral diferan sou aparèy diferan
Ann kreye yon dosye ki pral responsab pou tcheke ak kreye modpas

// crypto.js
const crypto = require('crypto');

function genRandomString(length) {
  return crypto
    .randomBytes(Math.ceil(length / 2))
    .toString('hex')
    .slice(0, length);
}

function sha512(password, salt){
  const hash = crypto.createHmac('sha512', salt); /** Hashing algorithm sha512 */
  hash.update(password);
  const value = hash.digest('hex');
  return value
};

function checkPass(pass, obj){
  return obj.password == sha512(pass, obj.salt)
}

function encodePass(pass){
  const salt = genRandomString(16)
  return JSON.stringify({
    salt,
    password: sha512(pass, salt)
  })
}

module.exports.encodePass = encodePass
module.exports.checkPass = checkPass

Epitou yon script pou sale ak hashing modpas la

// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))

Nou mete ajou nan users.json epi olye pou n konpare nan lobby.js nou itilize checkPassword

Total

Kòm yon rezilta, nou gen yon chat atravè ssh ak kapasite konsepsyon ak bots.
Depo final la

Sous: www.habr.com

Add nouvo kòmantè