Përshendetje, Habr. Ky është artikulli 2 nga cikli ssh-chat.
Çfarë do të bëjmë:
- Do të shtojmë mundësinë e krijimit të funksioneve të personalizuara
- Do të shtojmë mbështetje për markdown
- Do të shtojmë mbështetje për robotë
- Do të rrisim sigurinë e fjalëkalimeve (hash dhe kripë)
Për fat të keq, por nuk do të ketë mundësi dërgimi të skedarëve
Funksionet e personalizuara të stilizimit
Aktualisht janë implementuar funksionet e stilizimit si më poshtë:
@color@bold@underline@hex@box
Megjithatë, duhet të shtojmë mundësinë e krijimit të funksioneve të veta:
Të gjitha funksionet ruhen në
Pra, mjafton të krijoni një funksionregisterMethod:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}Kështu që 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 = registerMethodTani, kur krijojmë serverin, 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 për markdown
Markdown është shumë i përshtatshëm, prandaj do ta shtojmë me
// 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)
Robotë
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('I'm here')
},
onCommand(command, write) {
write('Doing ' + command)
}
})onCommand mund të thirret përmes @bot(botBob){Komandë}
gjithçka për të punuar me robotët është 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;
};

Çfarë mund të bëjmë me robotët:
- Monitori i ngarkesës
- Disloko
- 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.
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 = checkPassGjithashtu, një skript për kripëzimin dhe hashimin e fjalëkalimeve.
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))Po azhurnojmë në users.json dhe në vend të krahasimit në lobby.js përdorim checkPassword.
Përfundimi
Si rezultat, ne kemi një bisedë për ssh me mundësi formatação dhe robotë.
Burimi: habr.com
