Ssh-chat, bahin 2

Hello, Habr. Kini ang ika-2 nga artikulo sa serye sa ssh-chat.

Unsa ang atong buhaton:

  • Atong idugang ang abilidad sa paghimo sa imong kaugalingon nga mga gimbuhaton sa disenyo
  • Atong idugang ang suporta sa markdown
  • Atong idugang ang suporta sa bot
  • Dugangi ang seguridad sa password (hash ug asin)
    Pasayloa, apan walay ipadala sa mga file.

Mga bahin sa custom nga disenyo

Sa pagkakaron, ang mosunod nga mga function sa disenyo gisuportahan:

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

Kinahanglan nimo usab nga ibalik kini nga pamaagi pagkahuman sa paghimo sa server

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

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

Karon, kung maghimo usa ka server, mahimo namong irehistro ang mga pamaagi sa pag-format. Pananglitan:

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

chat({})

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

Ssh-chat, bahin 2

Suporta sa markdown

Kombenyente kaayo ang Markdown, busa idugang kini gamit gimarkahan sa terminal

// 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, bahin 2

Bot

Sa unsang paagi kini molihok

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 matawag nga gamit @bot(botBob){Command}

Ang tanan alang sa pagtrabaho sa mga bot gihulagway sa file:

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, bahin 2

Unsa ang imong mahimo sa mga bot:

  • Monitor sa pagkarga
  • I-deploy
  • Task board

Hash ug asin

Nganong dili ssh yawe? Tungod kay ang mga yawe sa ssh magkalainlain sa lainlaing mga aparato
Magbuhat ta og file nga maoy responsable sa pagsusi ug paghimo og mga password

// 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

Usa usab ka script alang sa pag-asin ug pag-hash sa password

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

Nag-update kami sa users.json ug imbes nga itandi sa lobby.js among gigamit ang checkPassword

Ang resulta

Ingon usa ka sangputanan, kami adunay usa ka chat pinaagi sa ssh nga adunay mga kapabilidad sa disenyo ug mga bot.
Katapusan nga repositoryo

Source: www.habr.com

Idugang sa usa ka comment