Përshëndetje, Habr. Ky është artikulli 2 në ciklin ssh-chat.
Çfarë do të bëjmë:
- Do të shtojmë mundësinë e krijimit të funksioneve të personalizuara të formatimit
- Do të shtojmë mbështetje për markdown
- Do të shtojmë mbështetje për bota
- Do të rrisim sigurinë e fjalëkalimeve (hash dhe kripë)
Kështu që, nuk do të ketë dërgim skedash
Funksionet e personalizuara të formatimit
Në këtë moment është realizuar mbështetje për funksionet e mëposhtme të formatimit:
@color@bold@underline@hex@box
Por është e nevojshme të shtojmë mundësinë e krijimit të funksioneve të veta:
Të gjitha funksionet ruhen në
Kështu që do të mjaftojë të krijojmë një funksionregisterMethod:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}Gjithashtu 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ë një server, mund të regjistrojmë funksionet e formatimit. Për shembull:
const chat = require('.')
const { formatNick } = require('.\/format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Përshëndetje, ' + formatNick(name) + '!'
})
Mbështetje 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)
Bota
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('Jam këtu')
},
onCommand(command, write) {
write('Duke bërë ' + command)
}
})onCommand mund të thirret me @bot(botBob){Command}
E gjitha për punë me botat është e 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 botat:
- Monitorimi i ngarkesës
- Instalo
- Tabela e detyrave
Hash dhe kripë
Pse jo çelësa 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ë skenar për kripimin dhe hashing-un e fjalëkalimit
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))Përditësojmë në users.json dhe në vend të krahasimit në lobby.js përdorim checkPassword
Përfundimi
Si rezultat, ne kemi një chat përmes ssh me mundësi formatimi dhe bota.
Burimi: habr.com
