เชนเซเชฒเซ, เชนเซเชฌเซเชฐ. 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 เชฎเชพเช เชธเชฐเชเชพเชฎเชฃเซ เชเชฐเชตเชพเชจเซ เชฌเชฆเชฒเซ เชเซเชเชชเชพเชธเชตเชฐเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช
เชชเชฐเชฟเชฃเชพเชฎ
เชชเชฐเชฟเชฃเชพเชฎเซ, เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชกเชฟเชเชพเชเชจ เชเซเชทเชฎเชคเชพเช เช
เชจเซ เชฌเซเชเซ เชธเชพเชฅเซ ssh เชฆเซเชตเชพเชฐเชพ เชเซเช เชเซ.
เชธเซเชฐเซเชธ: www.habr.com