Hallo, Habr. Dit is die 2de artikel in die ssh-chat-reeks.
Wat ons sal doen:
- Kom ons voeg die vermoë by om jou eie ontwerpfunksies te skep
- Kom ons voeg markdown-ondersteuning by
- Kom ons voeg bot-ondersteuning by
- Verhoog wagwoordsekuriteit (hash en sout)
Jammer, maar daar sal geen stuur van lêers wees nie.
Pasgemaakte ontwerpkenmerke
Tans word die volgende ontwerpfunksies ondersteun:
@color
@bold
@underline
@hex
@box
Maar dit is die moeite werd om die vermoë by te voeg om jou eie funksies te skep:
Alle funksies word gestoor inобъекте под названием methods
Dit sal dus genoeg wees om 'n funksie te skepregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
U moet ook hierdie metode terugstuur nadat u die bediener geskep het
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethod
Nou, wanneer ons 'n bediener skep, kan ons formateringsmetodes registreer. Voorbeeld:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hi, ' + formatNick(name) + '!'
})
Markdown ondersteuning
Markdown is baie gerieflik, so kom ons voeg dit by met behulp van
// 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
Hoe sal dit werk
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
kan genoem word met behulp van @bot(botBob){Command}
Alles om met bots te werk, word in die lêer beskryf:
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;
};
Wat jy met bots kan doen:
- Laai monitor
- ontplooi
- Taakbord
Hash en sout
Hoekom nie ssh sleutels nie? Omdat ssh-sleutels op verskillende toestelle verskillend sal wees
Kom ons skep 'n lêer wat verantwoordelik sal wees vir die kontrolering en skep van wagwoorde
// 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
Ook 'n skrif vir sout en hash die wagwoord
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))
Ons werk op in users.json en in plaas daarvan om in lobby.js te vergelyk, gebruik ons checkPassword
Totale
As gevolg hiervan het ons 'n geselsie via ssh met ontwerpvermoëns en bots.
Bron: will.com