Salam, Habr. Ieu mangrupikeun artikel ka-2 dina séri ssh-chat.
Naon anu bakal urang laksanakeun:
- Hayu urang tambahkeun kamampuhan pikeun nyieun fungsi desain sorangan
- Hayu urang tambahkeun dukungan markdown
- Hayu urang tambahkeun rojongan bot
- Ningkatkeun kaamanan sandi (hash sareng uyah)
Hapunten, tapi moal aya anu ngirim file.
Fitur desain custom
Ayeuna, fungsi desain di handap ieu dirojong:
@color
@bold
@underline
@hex
@box
Tapi éta patut nambihan kamampuan pikeun nyiptakeun fungsi anjeun nyalira:
Sadaya fungsi disimpen dinaобъекте под названием methods
Janten éta bakal cekap pikeun nyiptakeun fungsiregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
Anjeun oge kudu balik metoda ieu sanggeus nyieun server
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethod
Ayeuna, nalika nyiptakeun server, urang tiasa ngadaptarkeun metode pormat. conto:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hi, ' + formatNick(name) + '!'
})
rojongan Markdown
Markdown pohara merenah, jadi hayu urang tambahkeun ngagunakeun
// 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)
Bot
Kumaha éta bakal dianggo
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
bisa disebut maké @bot(botBob){Command}
Sagalana pikeun gawé bareng bot dijelaskeun dina file:
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;
};
Naon anu anjeun tiasa laksanakeun sareng bot:
- Beban monitor
- nyebarkeun
- Papan tugas
Hash jeung uyah
Naha henteu konci ssh? Kusabab konci ssh bakal béda dina alat anu béda
Hayu urang ngadamel file anu bakal tanggung jawab pikeun mariksa sareng nyiptakeun kecap akses
// 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
Ogé naskah pikeun salting na hashing sandi
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))
Urang ngamutahirkeun di users.json jeung tinimbang ngabandingkeun di lobby.js kami nganggo checkPassword
hasil
Hasilna, urang ngobrol via ssh kalawan kamampuhan desain jeung bot.
sumber: www.habr.com