Hello, Habr. Ito ang ika-2 artikulo sa ssh-chat series.
Ano ang gagawin namin:
- Idagdag natin ang kakayahang lumikha ng sarili mong mga function ng disenyo
- Magdagdag tayo ng suporta sa markdown
- Magdagdag tayo ng suporta sa bot
- Dagdagan ang seguridad ng password (hash at asin)
Paumanhin, ngunit walang pagpapadala ng mga file.
Mga tampok ng custom na disenyo
Sa kasalukuyan, sinusuportahan ang mga sumusunod na function ng disenyo:
@color
@bold
@underline
@hex
@box
Ngunit ito ay nagkakahalaga ng pagdaragdag ng kakayahang lumikha ng iyong sariling mga pag-andar:
Ang lahat ng mga function ay naka-imbak saΠΎΠ±ΡΠ΅ΠΊΡΠ΅ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ methods
Kaya ito ay sapat na upang lumikha ng isang functionregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
Kailangan mo ring ibalik ang pamamaraang ito pagkatapos gawin ang server
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethod
Ngayon, kapag lumilikha ng isang server, maaari tayong magrehistro ng mga paraan ng pag-format. Halimbawa:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hi, ' + formatNick(name) + '!'
})
suporta sa markdown
Napaka-convenient ng markdown, kaya idagdag natin ito 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)
Mga bot
Paano ito gagana
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
maaaring tawaging gamit @bot(botBob){Command}
Ang lahat para sa pagtatrabaho sa mga bot ay inilarawan 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;
};
Ano ang maaari mong gawin sa mga bot:
- Mag-load ng monitor
- lumawak
- Task board
Hash at asin
Bakit hindi ssh keys? Dahil magkakaiba ang mga ssh key sa iba't ibang device
Gumawa tayo ng file na magiging responsable sa pagsuri at paggawa ng 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
Isa ring script para sa pag-aasin at pag-hash ng password
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))
Nag-a-update kami sa users.json at sa halip na ikumpara sa lobby.js ginagamit namin ang checkPassword
Kabuuan
Bilang resulta, mayroon kaming chat sa pamamagitan ng ssh na may mga kakayahan sa disenyo at mga bot.
Pinagmulan: www.habr.com