Përshëndetje, Habr. Ky është artikulli i dytë në serinë ssh-chat.
Çfarë do të bëjmë ne:
- Le të shtojmë aftësinë për të krijuar funksionet tuaja të projektimit
- Le të shtojmë mbështetjen e shënimit
- Le të shtojmë mbështetje për robotët
- Rritja e sigurisë së fjalëkalimit (hash dhe kripë)
Na vjen keq, por nuk do të ketë dërgim të skedarëve.
Karakteristikat e dizajnit të personalizuar
Aktualisht, funksionet e mëposhtme të projektimit mbështeten:
@color
@bold
@underline
@hex
@box
Por ia vlen të shtoni aftësinë për të krijuar funksionet tuaja:
Të gjitha funksionet ruhen nëобъекте под названием methods
Pra, do të jetë e mjaftueshme për të krijuar një funksionregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
Ju gjithashtu duhet ta ktheni 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, ne 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) + '!'
})
Mbështetje Markdown
Markdown është shumë i përshtatshëm, kështu që le ta shtojmë duke përdorur
// 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
Si do të funksionojë
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ë quhet duke përdorur @bot(botBob){Command}
Gjithçka për të punuar me bots përshkruhet në skedar:
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;
};
Çfarë mund të bëni me robotët:
- Ngarkoni monitorin
- vendosë
- 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
Le të krijojmë një skedar që do të jetë përgjegjës për kontrollimin 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 kriposjen dhe hashimin e fjalëkalimit
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))
Ne përditësojmë në users.json dhe në vend që të krahasojmë në lobby.js përdorim checkPassword
Total
Si rezultat, ne kemi një bisedë përmes ssh me aftësi dizajni dhe bots.
Burimi: www.habr.com