Ssh-chat, pjesa 2

Përshendetje, Habr. Ky është artikulli 2 nga cikli ssh-chat.

Çfarë do të bëjmë:

  • Do të shtojmë mundësinë e krijimit të funksioneve të personalizuara
  • Do të shtojmë mbështetje për markdown
  • Do të shtojmë mbështetje për robotë
  • Do të rrisim sigurinë e fjalëkalimeve (hash dhe kripë)
    Për fat të keq, por nuk do të ketë mundësi dërgimi të skedarëve

Funksionet e personalizuara të stilizimit

Aktualisht janë implementuar funksionet e stilizimit si më poshtë:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Megjithatë, duhet të shtojmë mundësinë e krijimit të funksioneve të veta:
    Të gjitha funksionet ruhen në objektin të quajtur methods
    Pra, mjafton të krijoni një funksion registerMethod:

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

Kështu që duhet të kthejmë 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ë serverin, 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 për markdown

Markdown është shumë i përshtatshëm, prandaj do ta shtojmë me marked 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, pjesa 2

Robotë

Si do të funksionojë kjo

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ë thirret përmes @bot(botBob){Komandë}

gjithçka për të punuar me robotët është përshkruar në skedarin:

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ëjmë me robotët:

  • Monitori i ngarkesës
  • Disloko
  • 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.
Do të krijojmë një skedar që do të përgjigjet për kontrollin 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 kripëzimin dhe hashimin e fjalëkalimeve.

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

Po azhurnojmë në users.json dhe në vend të krahasimit në lobby.js përdorim checkPassword.

Përfundimi

Si rezultat, ne kemi një bisedë për ssh me mundësi formatação dhe robotë.
Repozitori përfundimtar

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster