martynsmith / node-irc

NodeJS IRC client library
GNU General Public License v3.0
1.33k stars 424 forks source link

Unespected exception on filter function #577

Open yhojann-cl opened 1 year ago

yhojann-cl commented 1 year ago

Have an unexpected error:

/.../node_modules/irc/lib/irc.js:849
                        throw err;
                        ^
TypeError: Cannot read properties of undefined (reading 'filter')
    at chanModes (/.../node_modules/irc/lib/irc.js:300:38)

The throw is called from:

        lines.forEach(function iterator(line) {
            if (line.length) {
                var message = parseMessage(line, self.opt.stripColors);

                try {
                    self.emit('raw', message);
                } catch (err) {
                    if (!self.conn.requestedDisconnect) {
                        throw err;
                    }
                }
            }
        });

When emit message, but in 300:38 says:

                            if (arr) {
                                channel.modeParams[mode] = channel.modeParams[mode]
                                    .filter(function(v) { return v !== param[0]; });
                            }
                            if (!arr || channel.modeParams[mode].length === 0) {
                                channel.mode = channel.mode.replace(mode, '');
                                delete channel.modeParams[mode];
                            }

When channel.modeParams[mode] is undefined. Channel has not a specific mode?, Fix it using a simple conditional:

                            if (arr && (channel.modeParams[mode] !== undefined)) {
                                channel.modeParams[mode] = channel.modeParams[mode]
                                    .filter(function(v) { return v !== param[0]; });
                            }
                            if (!arr || (channel.modeParams[mode] === undefined) || channel.modeParams[mode].length === 0) {
                                channel.mode = channel.mode.replace(mode, '');
                                delete channel.modeParams[mode];
                            }