Я пытался написать простой терминальный IRC-клиент, используя readline и net.
Отправка команд с использованием client.write()
работает отлично, за исключением случаев, когда я делаю это в readline.on('line' (cb) => cbstuff)
, и я не знаю, почему.
У меня есть две идеи о возможной проблеме и понятия не имею, как исправить любую из них:
Мое первое предположение заключается в том, что мне нужно что-то изменить в rl.createInterface()
для работы с клиентом вместо stin/stdout.
Мое второе подозрение заключается в том, что readline никогда не видит возврат каретки, потому что \n
или \r\n
где-то фильтруется/экранируется. С другой стороны, отправка \r\n
непосредственно в client.write()
работает, как и ожидалось, для многострочных сообщений.
Вот мой код:
const net = require('net');
const fs = require('fs');
const readline = require('readline');
const host = 'irc.freenode.net';
const port = 6666;
const client = new net.Socket();
rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
client.connect(port, host, () => {
console.log(`CONNECTED TO: ${host}:${port}\n`);
client.write('USER foo bar batz boo\r\nNICK nodetest123\r\n');
client.write('JOIN #testchan123\r\n');
rl.on('line', cmd => client.write(cmd));
// rl.prompt(); doesn't help
});
client.on('data', data => {
console.log(`DATA: ${data}`);
fs.appendFile("log.txt", data, err => {
if (err)
return console.log(err);
});
});
client.on('error', error => console.log(error));
client.on('close', () => console.log('Connection closed'));