سه الدردشة ، الجزء 2

مرحبا يا هبر. هذه هي المادة 2 من حلقة 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) } }) 

يمكن استدعاء @bot(botBob){Command} باستخدام @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 ستكون مختلفة على الأجهزة المختلفة
قم بإنشاء ملف يكون مسؤولاً فيه عن التحقق من كلمات المرور وإنشاءها


 // 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])) 

نقوم بالتحديث في users.json وبدلاً من المقارنة في lobby.js نستخدم checkPassword


يؤدي


نتيجة لذلك ، لدينا دردشة ssh مع خيارات التصميم والبوتات.
مستودع النهائي

Source: https://habr.com/ru/post/ar467543/


All Articles