Ssh-chat, phần 2

Xin chào, Habr. Đây là bài thứ 2 trong loạt bài ssh-chat.

Chúng tôi sẽ làm gì:

  • Hãy thêm khả năng tạo các chức năng thiết kế của riêng bạn
  • Hãy thêm hỗ trợ đánh dấu
  • Hãy thêm hỗ trợ bot
  • Tăng cường bảo mật mật khẩu (băm và muối)
    Xin lỗi, nhưng sẽ không có việc gửi tập tin.

Tính năng thiết kế tùy chỉnh

Hiện tại, các chức năng thiết kế sau được hỗ trợ:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Nhưng đáng để thêm khả năng tạo các chức năng của riêng bạn:
    Tất cả các chức năng được lưu trữ trong объекте под названием methods
    Vì vậy, nó sẽ đủ để tạo ra một chức năng registerMethod:

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

Bạn cũng cần trả về phương thức này sau khi tạo máy chủ

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

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

Bây giờ, khi tạo máy chủ, chúng ta có thể đăng ký các phương thức định dạng. Ví dụ:

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

chat({})

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

Ssh-chat, phần 2

Hỗ trợ giảm giá

Markdown rất tiện lợi, vì vậy hãy thêm nó bằng cách sử dụng thiết bị đầu cuối được đánh dấu

// 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, phần 2

Bots

Nó sẽ làm việc như thế nào

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 có thể được gọi với @bot(botBob){Command}

Mọi thứ để làm việc với bot đều được mô tả trong tệp:

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, phần 2

Bạn có thể làm gì với bot:

  • màn hình tải
  • Triển khai
  • Bảng nhiệm vụ

Băm và muối

Tại sao không có phím ssh? Vì các phím ssh sẽ khác nhau trên các thiết bị khác nhau
Hãy tạo một tệp sẽ chịu trách nhiệm kiểm tra và tạo mật khẩu

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

Cũng là một tập lệnh để muối và băm mật khẩu

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

Chúng tôi cập nhật trong user.json và thay vì so sánh trong Lobby.js, chúng tôi sử dụng checkPassword

Tổng

Kết quả là chúng tôi có một cuộc trò chuyện qua ssh với khả năng thiết kế và bot.
Kho lưu trữ cuối cùng

Nguồn: www.habr.com

Thêm một lời nhận xét