Ssh-chat, pjesa 2

Përshëndetje, Habr. Ky është artikulli 2 në ciklin ssh-chat.

Çfarë do të bëjmë:

  • Do të shtojmë mundësinë e krijimit të funksioneve të personalizuara të formatimit
  • Do të shtojmë mbështetje për markdown
  • Do të shtojmë mbështetje për bota
  • Do të rrisim sigurinë e fjalëkalimeve (hash dhe kripë)
    Kështu që, nuk do të ketë dërgim skedash

Funksionet e personalizuara të formatimit

Në këtë moment është realizuar mbështetje për funksionet e mëposhtme të formatimit:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Por është e nevojshme të shtojmë mundësinë e krijimit të funksioneve të veta:
    Të gjitha funksionet ruhen në objektin e quajtur methods
    Kështu që do të mjaftojë të krijojmë një funksion registerMethod:

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

Gjithashtu 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ë një server, mund të regjistrojmë funksionet e formatimit. Për shembull:

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

chat({})

chat.registerMethod('hello', function(p, name){
  return  'Përshëndetje, '  +  formatNick(name) +  '!'
})

Ssh-chat, pjesa 2

Mbështetje 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

Bota

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('Jam këtu')
  },

  onCommand(command, write) {
    write('Duke bërë ' + command)
  }
})

onCommand mund të thirret me @bot(botBob){Command}

E gjitha për punë me botat është e 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 botat:

  • Monitorimi i ngarkesës
  • Instalo
  • Tabela e detyrave

Hash dhe kripë

Pse jo çelësa 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ë skenar për kripimin dhe hashing-un e fjalëkalimit

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

Përditësojmë në users.json dhe në vend të krahasimit në lobby.js përdorim checkPassword

Përfundimi

Si rezultat, ne kemi një chat përmes ssh me mundësi formatimi dhe bota.
Repo final

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster