Ssh-chat, pjesa 2

Përshëndetje, Habr. Ky është artikulli i dytë në serinë ssh-chat.

Çfarë do të bëjmë ne:

  • Le të shtojmë aftësinë për të krijuar funksionet tuaja të projektimit
  • Le të shtojmë mbështetjen e shënimit
  • Le të shtojmë mbështetje për robotët
  • Rritja e sigurisë së fjalëkalimit (hash dhe kripë)
    Na vjen keq, por nuk do të ketë dërgim të skedarëve.

Karakteristikat e dizajnit të personalizuar

Aktualisht, funksionet e mëposhtme të projektimit mbështeten:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Por ia vlen të shtoni aftësinë për të krijuar funksionet tuaja:
    Të gjitha funksionet ruhen në объекте под названием methods
    Pra, do të jetë e mjaftueshme për të krijuar një funksion registerMethod:

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

Ju gjithashtu duhet ta ktheni këtë metodë pas krijimit të serverit

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

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

Tani, kur krijojmë një server, ne mund të regjistrojmë metodat e formatimit. Shembull:

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

chat({})

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

Ssh-chat, pjesa 2

Mbështetje Markdown

Markdown është shumë i përshtatshëm, kështu që le ta shtojmë duke përdorur terminali i shënuar

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

Bots

Si do të funksionojë

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 mund të quhet duke përdorur @bot(botBob){Command}

Gjithçka për të punuar me bots përshkruhet në skedar:

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

Çfarë mund të bëni me robotët:

  • Ngarkoni monitorin
  • vendosë
  • Tabela e detyrave

Hash dhe kripë

Pse jo çelësat ssh? Sepse çelësat ssh do të jenë të ndryshëm në pajisje të ndryshme
Le të krijojmë një skedar që do të jetë përgjegjës për kontrollimin dhe krijimin e fjalëkalimeve

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

Gjithashtu një skript për kriposjen dhe hashimin e fjalëkalimit

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

Ne përditësojmë në users.json dhe në vend që të krahasojmë në lobby.js përdorim checkPassword

Total

Si rezultat, ne kemi një bisedë përmes ssh me aftësi dizajni dhe bots.
Depoja përfundimtare

Burimi: www.habr.com

Shto një koment