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ăngregisterMethod
:
// 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) + '!'
})
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
// 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)
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;
};
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.
Nguồn: www.habr.com