Hello, Habr. Kini ang ika-2 nga artikulo sa serye sa ssh-chat.
Unsa ang atong buhaton:
- Atong idugang ang abilidad sa paghimo sa imong kaugalingon nga mga gimbuhaton sa disenyo
- Atong idugang ang suporta sa markdown
- Atong idugang ang suporta sa bot
- Dugangi ang seguridad sa password (hash ug asin)
Pasayloa, apan walay ipadala sa mga file.
Mga bahin sa custom nga disenyo
Sa pagkakaron, ang mosunod nga mga function sa disenyo gisuportahan:
@color
@bold
@underline
@hex
@box
Apan takus ang pagdugang sa abilidad sa paghimo sa imong kaugalingon nga mga gimbuhaton:
Ang tanan nga mga gimbuhaton gitipigan saΠΎΠ±ΡΠ΅ΠΊΡΠ΅ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ methods
Mao nga igo na ang paghimo usa ka functionregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
Kinahanglan nimo usab nga ibalik kini nga pamaagi pagkahuman sa paghimo sa server
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethod
Karon, kung maghimo usa ka server, mahimo namong irehistro ang mga pamaagi sa pag-format. Pananglitan:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hi, ' + formatNick(name) + '!'
})
Suporta sa markdown
Kombenyente kaayo ang Markdown, busa idugang kini gamit
// 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
Sa unsang paagi kini molihok
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
matawag nga gamit @bot(botBob){Command}
Ang tanan alang sa pagtrabaho sa mga bot gihulagway sa 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;
};
Unsa ang imong mahimo sa mga bot:
- Monitor sa pagkarga
- I-deploy
- Task board
Hash ug asin
Nganong dili ssh yawe? Tungod kay ang mga yawe sa ssh magkalainlain sa lainlaing mga aparato
Magbuhat ta og file nga maoy responsable sa pagsusi ug paghimo og mga password
// 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
Usa usab ka script alang sa pag-asin ug pag-hash sa password
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))
Nag-update kami sa users.json ug imbes nga itandi sa lobby.js among gigamit ang checkPassword
Ang resulta
Ingon usa ka sangputanan, kami adunay usa ka chat pinaagi sa ssh nga adunay mga kapabilidad sa disenyo ug mga bot.
Source: www.habr.com