Ssh-chat, sehemu ya 2

Habari, Habr. Hii ni makala ya 2 katika mfululizo wa ssh-chat.

Tutafanya nini:

  • Hebu tuongeze uwezo wa kuunda vipengele vyako vya kubuni
  • Wacha tuongeze usaidizi wa alama
  • Wacha tuongeze usaidizi wa kijibu
  • Ongeza usalama wa nenosiri (heshi na chumvi)
    Samahani, lakini hakutakuwa na utumaji wa faili.

Vipengele vya muundo maalum

Hivi sasa, vipengele vifuatavyo vya kubuni vinatumika:

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

Pia unahitaji kurudisha njia hii baada ya kuunda seva

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

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

Sasa, wakati wa kuunda seva, tunaweza kusajili njia za uumbizaji. Mfano:

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

chat({})

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

Ssh-chat, sehemu ya 2

Usaidizi wa alama chini

Markdown ni rahisi sana, kwa hivyo wacha tuiongeze kwa kutumia terminal iliyowekwa alama

// 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, sehemu ya 2

Vijibu

Itafanyaje kazi

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 inaweza kuitwa kutumia @bot(botBob){Command}

Kila kitu cha kufanya kazi na bots kinaelezewa kwenye faili:

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, sehemu ya 2

Unachoweza kufanya na roboti:

  • Mfuatiliaji wa mzigo
  • Tumia
  • Bodi ya kazi

Hash na chumvi

Kwa nini sio funguo za ssh? Kwa sababu funguo za ssh zitakuwa tofauti kwenye vifaa tofauti
Wacha tuunda faili ambayo itakuwa na jukumu la kuangalia na kuunda nywila

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

Pia hati ya kuweka chumvi na kuharakisha nenosiri

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

Tunasasisha katika users.json na badala ya kulinganisha katika lobby.js tunatumia checkPassword

Jumla ya

Kwa hivyo, tuna gumzo kupitia ssh yenye uwezo wa kubuni na roboti.
Hifadhi ya mwisho

Chanzo: mapenzi.com

Kuongeza maoni