เจนเฉเจฒเฉ, เจนเฉเจฌเจฐ. เจเจน ssh-chat เจฒเฉเฉ เจฆเจพ เจฆเฉเจเจพ เจฒเฉเจ เจนเฉเฅค
เจ เจธเฉเจ เจเฉ เจเจฐเจพเจเจเฉ:
- เจเจ เจคเฉเจนเจพเจกเฉ เจเจชเจฃเฉ เจกเจฟเจเจผเจพเจเจจ เจซเฉฐเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจฌเจฃเจพเจเจฃ เจฆเฉ เจฏเฉเจเจคเจพ เจจเฉเฉฐ เจเฉเฉเฉเจ
- เจเจ เจฎเจพเจฐเจเจกเจพเจเจจ เจธเจชเฉเจฐเจ เจเฉเฉเฉเจ
- เจเจ เจฌเฉเจ เจธเจนเจพเจเจคเจพ เจเฉเฉเฉเจ
- เจชเจพเจธเจตเจฐเจก เจธเฉเจฐเฉฑเจเจฟเจ เจตเจงเจพเจ (เจนเฉเจธเจผ เจ
เจคเฉ เจจเจฎเจ)
เจฎเจพเจซเจผ เจเจฐเจจเจพ, เจชเจฐ เจซเจผเจพเจเจฒเจพเจ เจจเจนเฉเจ เจญเฉเจเฉเจเจ เจเจพเจฃเจเฉเจเจเฅค
เจเจธเจเจฎ เจกเจฟเจเจผเจพเจเจจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ
เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจ, เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจกเจฟเจเจผเจพเจเจจ เจซเฉฐเจเจธเจผเจจ เจธเจฎเจฐเจฅเจฟเจค เจนเจจ:
@color
@bold
@underline
@hex
@box
เจชเจฐ เจเจน เจคเฉเจนเจพเจกเฉ เจเจชเจฃเฉ เจซเฉฐเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจฌเจฃเจพเจเจฃ เจฆเฉ เจฏเฉเจเจคเจพ เจจเฉเฉฐ เจเฉเฉเจจ เจฆเฉ เจฏเฉเจ เจนเฉ:
เจตเจฟเฉฑเจ เจธเจพเจฐเฉ เจซเฉฐเจเจธเจผเจจ เจธเจเฉเจฐ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเจจะพะฑัะตะบัะต ะฟะพะด ะฝะฐะทะฒะฐะฝะธะตะผ methods
เจเจธ เจฒเจ เจเจน เจเฉฑเจ เจซเฉฐเจเจธเจผเจจ เจฌเจฃเจพเจเจฃ เจฒเจ เจเจพเจซเฉ เจนเฉเจตเฉเจเจพregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
เจคเฉเจนเจพเจจเฉเฉฐ เจธเจฐเจตเจฐ เจฌเจฃเจพเจเจฃ เจคเฉเจ เจฌเจพเจ เจฆ เจเจธ เจตเจฟเจงเฉ เจจเฉเฉฐ เจตเจพเจชเจธ เจเจฐเจจ เจฆเฉ เจตเฉ เจฒเฉเฉ เจนเฉ
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethod
เจนเฉเจฃ, เจธเจฐเจตเจฐ เจฌเจฃเจพเจเจฃ เจตเฉเจฒเฉ, เจ เจธเฉเจ เจซเจพเจฐเจฎเฉเจเจฟเฉฐเจ เจตเจฟเจงเฉเจเจ เจจเฉเฉฐ เจฐเจเจฟเจธเจเจฐ เจเจฐ เจธเจเจฆเฉ เจนเจพเจเฅค เจเจฆเจพเจนเจฐเจจ:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hi, ' + formatNick(name) + '!'
})
เจฎเจพเจฐเจเจกเจพเจเจจ เจธเจฎเจฐเจฅเจจ
เจฎเจพเจฐเจเจกเจพเจเจจ เจฌเจนเฉเจค เจธเฉเจตเจฟเจงเจพเจเจจเจ เจนเฉ, เจเจธเจฒเจ เจเจ เจเจธเจจเฉเฉฐ เจตเจฐเจคเจฆเฉ เจนเฉเจ เจเฉเฉเฉเจ
// 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)
เจฌเฉเจเจธ
เจเจน เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐเฉเจเจพ
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
เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจฌเฉเจฒเจพเจเจ เจเจพ เจธเจเจฆเจพ เจนเฉ @bot(botBob){Command}
เจฌเฉเจเจพเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจธเจญ เจเฉเจ เจซเจพเจเจฒ เจตเจฟเฉฑเจ เจฆเฉฑเจธเจฟเจ เจเจฟเจ เจนเฉ:
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;
};
เจคเฉเจธเฉเจ เจฌเฉเจเจพเจ เจจเจพเจฒ เจเฉ เจเจฐ เจธเจเจฆเฉ เจนเฉ:
- เจฒเฉเจก เจฎเจพเจจเฉเจเจฐ
- เจตเฉฐเจกเฉ
- เจเจพเจธเจ เจฌเฉเจฐเจก
เจนเฉเจธเจผ เจ เจคเฉ เจจเจฎเจ
ssh เจเฉเฉฐเจเฉเจเจ เจเจฟเจเจ เจจเจนเฉเจ? เจเจฟเจเจเจเจฟ เจตเฉฑเจ-เจตเฉฑเจ เจกเจฟเจตเจพเจเจธเจพเจ 'เจคเฉ ssh เจเฉเฉฐเจเฉเจเจ เจตเฉฑเจเจฐเฉเจเจ เจนเฉเจฃเจเฉเจเจ
เจเจฒเฉ เจเฉฑเจ เจซเจพเจเจฒ เจฌเจฃเจพเจเจ เจเฉ เจชเจพเจธเจตเจฐเจก เจฆเฉ เจเจพเจเจ เจ
เจคเฉ เจฌเจฃเจพเจเจฃ เจฒเจ เจเจผเจฟเฉฐเจฎเฉเจตเจพเจฐ เจนเฉเจตเฉเจเฉ
// 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
เจชเจพเจธเจตเจฐเจก เจจเฉเฉฐ เจจเจฎเจ เจ เจคเฉ เจนเฉเจธเจผ เจเจฐเจจ เจฒเจ เจตเฉ เจเฉฑเจ เจธเจเฉเจฐเจฟเจชเจ
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))
เจ เจธเฉเจ user.json เจตเจฟเฉฑเจ เจ เฉฑเจชเจกเฉเจ เจเจฐเจฆเฉ เจนเจพเจ เจ เจคเฉ lobby.js เจตเจฟเฉฑเจ เจคเฉเจฒเจจเจพ เจเจฐเจจ เจฆเฉ เจฌเจเจพเจ เจ เจธเฉเจ checkPassword เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ
เจจเจคเฉเจเจพ
เจจเจคเฉเจเฉ เจตเจเฉเจ, เจธเจพเจกเฉ เจเฉเจฒ เจกเจฟเจเจผเจพเจเจจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจ
เจคเฉ เจฌเฉเจเจพเจ เจฆเฉ เจจเจพเจฒ ssh เจฐเจพเจนเฉเจ เจเฉฑเจฒเจฌเจพเจค เจนเฉเฉฐเจฆเฉ เจนเฉเฅค
เจธเจฐเฉเจค: www.habr.com