Salut, Habr. Il s'agit de l'article 2 de la boucle ssh-chat.
Ce que nous ferons:
- Ajoutez la possibilité de créer vos propres fonctions de conception.
- Ajouter un support de démarque
- Ajouter le support du bot
- Augmentez la sécurité des mots de passe (hachage et sel)
Hélas, il n'y aura pas d'envoi de fichiers
Prise en charge actuellement implémentée des fonctionnalités de conception suivantes:
@color
@bold
@underline
@hex
@box
Mais cela vaut la peine d'ajouter la possibilité de créer vos propres fonctions:
Toutes les fonctions sont stockées dans un methods
Il suffira donc de créer la fonction registerMethod
:
// parserExec.js at end module.exports.registerMethod = function(name, func) { methods[name] = func }
Vous devez également renvoyer cette méthode après avoir créé le serveur.
// index.js at require part const { registerMethod } = require('./parserExec') // index.js at end module.exports.registerMethod = registerMethod
Maintenant, lors de la création d'un serveur, nous pouvons enregistrer des méthodes de formatage. Un exemple:
const chat = require('.') const { formatNick } = require('./format') chat({}) chat.registerMethod('hello', function(p, name){ return 'Hi, ' + formatNick(name) + '!' })

Prise en charge de Markdown
Le démarquage est très pratique, alors ajoutez-le en utilisant un terminal marqué
// 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)

Bots
Comment cela fonctionnera
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
peut être appelé à l'aide de @bot(botBob){Command}
Tout pour travailler avec les bots est décrit dans le fichier:
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; };

Que peut-on faire avec les bots:
- Moniteur de charge
- Déployer
- Tableau des tâches
Hash et sel
Pourquoi pas les clés ssh? Parce que les clés ssh seront différentes sur différents appareils
Créer un fichier dans lequel sera responsable de la vérification et de la création des mots de passe
// 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
Également un script pour saler et hacher un mot de passe
// To generate password run node ./encryptPassword password const { encodePass } =require('./crypto') console.log(encodePass(process.argv[2]))
Nous mettons à jour dans users.json et au lieu de comparer dans lobby.js nous utilisons checkPassword
Résumé
En conséquence, nous avons ssh chat avec des options de conception et des bots.
Dépôt final