Nyob zoo, Habr. Nov yog tshooj 2 hauv ssh-chat series.
Peb yuav ua li cas:
- Cia peb ntxiv lub peev xwm los tsim koj tus kheej tsim kev ua haujlwm
- Wb ntxiv kev txhawb nqa markdown
- Wb ntxiv kev txhawb nqa bot
- Ua kom tus password ruaj ntseg (hash thiab ntsev)
Thov txim, tab sis yuav tsis xa cov ntaub ntawv.
Kev cai tsim nta
Tam sim no, cov qauv tsim hauv qab no tau txais kev txhawb nqa:
@color
@bold
@underline
@hex
@box
Tab sis nws tsim nyog ntxiv lub peev xwm los tsim koj tus kheej ua haujlwm:
Tag nrho cov haujlwm tau muab khaws cia rau hauvΠΎΠ±ΡΠ΅ΠΊΡΠ΅ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ methods
Yog li nws yuav txaus los tsim cov haujlwmregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
Koj kuj yuav tsum tau rov qab cov qauv no tom qab tsim lub server
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethod
Tam sim no, thaum tsim ib tus neeg rau zaub mov, peb tuaj yeem sau npe cov txheej txheem formatting. Piv txwv:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hi, ' + formatNick(name) + '!'
})
Kev them nyiaj yug Markdown
Markdown yooj yim heev, yog li cia peb ntxiv nws siv
// 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)
Cov txhawv
Yuav ua li cas
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
tuaj yeem hu tau siv @bot(botBob){Command}
Txhua yam ua haujlwm nrog bots tau piav qhia hauv cov ntaub ntawv:
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;
};
Koj tuaj yeem ua dab tsi nrog bots:
- Load saib
- Tso
- Task board
Hash thiab ntsev
Vim li cas ho tsis ssh yuam sij? Vim tias ssh yuam sij yuav txawv ntawm cov khoom siv sib txawv
Cia peb tsim cov ntaub ntawv uas yuav yog lub luag haujlwm rau kev kuaj xyuas thiab tsim cov passwords
// 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
Kuj yog ib tsab ntawv rau salting thiab hashing tus password
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))
Peb hloov kho hauv users.json thiab tsis txhob sib piv hauv lobby.js peb siv checkPassword
Qhov no
Yog li ntawd, peb muaj kev sib tham ntawm ssh nrog tsim muaj peev xwm thiab bots.
Tau qhov twg los: www.hab.com