Ssh-chat, bagian 2

Salam, Habr. Ieu mangrupikeun artikel ka-2 dina séri ssh-chat.

Naon anu bakal urang laksanakeun:

  • Hayu urang tambahkeun kamampuhan pikeun nyieun fungsi desain sorangan
  • Hayu urang tambahkeun dukungan markdown
  • Hayu urang tambahkeun rojongan bot
  • Ningkatkeun kaamanan sandi (hash sareng uyah)
    Hapunten, tapi moal aya anu ngirim file.

Fitur desain custom

Ayeuna, fungsi desain di handap ieu dirojong:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Tapi éta patut nambihan kamampuan pikeun nyiptakeun fungsi anjeun nyalira:
    Sadaya fungsi disimpen dina объекте под названием methods
    Janten éta bakal cekap pikeun nyiptakeun fungsi registerMethod:

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

Anjeun oge kudu balik metoda ieu sanggeus nyieun server

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

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

Ayeuna, nalika nyiptakeun server, urang tiasa ngadaptarkeun metode pormat. conto:

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

chat({})

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

Ssh-chat, bagian 2

rojongan Markdown

Markdown pohara merenah, jadi hayu urang tambahkeun ngagunakeun terminal ditandaan

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

Bot

Kumaha éta bakal dianggo

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 bisa disebut maké @bot(botBob){Command}

Sagalana pikeun gawé bareng bot dijelaskeun dina 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, bagian 2

Naon anu anjeun tiasa laksanakeun sareng bot:

  • Beban monitor
  • nyebarkeun
  • Papan tugas

Hash jeung uyah

Naha henteu konci ssh? Kusabab konci ssh bakal béda dina alat anu béda
Hayu urang ngadamel file anu bakal tanggung jawab pikeun mariksa sareng nyiptakeun kecap akses

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

Ogé naskah pikeun salting na hashing sandi

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

Urang ngamutahirkeun di users.json jeung tinimbang ngabandingkeun di lobby.js kami nganggo checkPassword

hasil

Hasilna, urang ngobrol via ssh kalawan kamampuhan desain jeung bot.
Repository ahir

sumber: www.habr.com

Tambahkeun komentar