Skip to content

Commit cc990d6

Browse files
committed
Use sets instead of arrays for user membership in channels
1 parent 1c8fa12 commit cc990d6

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

lib/bot.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ class Bot {
130130
if (nick === this.nickname && !this.announceSelfJoin) return;
131131
// self-join is announced before names (which includes own nick)
132132
// so don't add nick to channelUsers
133-
if (nick !== this.nickname) this.channelUsers[channel].push(nick);
133+
if (nick !== this.nickname) this.channelUsers[channel].add(nick);
134134
this.sendExactToDiscord(channel, `*${nick}* has joined the channel`);
135135
});
136136

@@ -141,23 +141,21 @@ class Bot {
141141
delete this.channelUsers[channel];
142142
return;
143143
}
144-
this.channelUsers[channel].splice(this.channelUsers[channel].indexOf(nick), 1);
144+
this.channelUsers[channel].delete(nick);
145145
this.sendExactToDiscord(channel, `*${nick}* has left the channel (${reason})`);
146146
});
147147

148148
this.ircClient.on('quit', (nick, reason, channels) => {
149149
if (!this.ircStatusNotices || nick === this.nickname) return;
150150
channels.forEach((channel) => {
151-
const index = this.channelUsers[channel].indexOf(nick);
152-
if (index === -1) return;
153-
this.channelUsers[channel].splice(index, 1);
151+
if (!this.channelUsers[channel].delete(nick)) return;
154152
this.sendExactToDiscord(channel, `*${nick}* has quit (${reason})`);
155153
});
156154
});
157155

158156
this.ircClient.on('names', (channel, nicks) => {
159157
if (!this.ircStatusNotices) return;
160-
this.channelUsers[channel] = Object.keys(nicks);
158+
this.channelUsers[channel] = new Set(Object.keys(nicks));
161159
});
162160

163161
this.ircClient.on('action', (author, to, text) => {

test/bot-events.test.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ describe('Bot Events', function () {
131131
// nick => '' means the user is not a special user
132132
const nicks = { [bot.nickname]: '', user: '', user2: '@', user3: '+' };
133133
bot.ircClient.emit('names', channel, nicks);
134-
bot.channelUsers.should.deep.equal({ '#channel': [bot.nickname, 'user', 'user2', 'user3'] });
134+
const channelNicks = new Set([bot.nickname, 'user', 'user2', 'user3']);
135+
bot.channelUsers.should.deep.equal({ '#channel': channelNicks });
135136
});
136137

137138
it('should send join messages to discord when config enabled', function () {
@@ -143,7 +144,8 @@ describe('Bot Events', function () {
143144
const text = `*${nick}* has joined the channel`;
144145
bot.ircClient.emit('join', channel, nick);
145146
bot.sendExactToDiscord.should.have.been.calledWithExactly(channel, text);
146-
bot.channelUsers.should.deep.equal({ '#channel': [bot.nickname, nick] });
147+
const channelNicks = new Set([bot.nickname, nick]);
148+
bot.channelUsers.should.deep.equal({ '#channel': channelNicks });
147149
});
148150

149151
it('should not announce itself joining by default', function () {
@@ -154,7 +156,8 @@ describe('Bot Events', function () {
154156
const nick = bot.nickname;
155157
bot.ircClient.emit('join', channel, nick);
156158
bot.sendExactToDiscord.should.not.have.been.called;
157-
bot.channelUsers.should.deep.equal({ '#channel': [bot.nickname] });
159+
const channelNicks = new Set([bot.nickname]);
160+
bot.channelUsers.should.deep.equal({ '#channel': channelNicks });
158161
});
159162

160163
it('should announce the bot itself when config enabled', function () {
@@ -175,21 +178,24 @@ describe('Bot Events', function () {
175178
const channel = '#channel';
176179
const nick = 'user';
177180
bot.ircClient.emit('names', channel, { [bot.nickname]: '', [nick]: '' });
178-
bot.channelUsers.should.deep.equal({ '#channel': [bot.nickname, nick] });
181+
const originalNicks = new Set([bot.nickname, nick]);
182+
bot.channelUsers.should.deep.equal({ '#channel': originalNicks });
179183
const reason = 'Leaving';
180184
const text = `*${nick}* has left the channel (${reason})`;
181185
bot.ircClient.emit('part', channel, nick, reason);
182186
bot.sendExactToDiscord.should.have.been.calledWithExactly(channel, text);
183187
// it should remove the nickname from the channelUsers list
184-
bot.channelUsers.should.deep.equal({ '#channel': [bot.nickname] });
188+
const channelNicks = new Set([bot.nickname]);
189+
bot.channelUsers.should.deep.equal({ '#channel': channelNicks });
185190
});
186191

187192
it('should not announce itself leaving a channel', function () {
188193
const bot = createBot({ ...config, ircStatusNotices: true });
189194
bot.connect();
190195
const channel = '#channel';
191196
bot.ircClient.emit('names', channel, { [bot.nickname]: '', user: '' });
192-
bot.channelUsers.should.deep.equal({ '#channel': [bot.nickname, 'user'] });
197+
const originalNicks = new Set([bot.nickname, 'user']);
198+
bot.channelUsers.should.deep.equal({ '#channel': originalNicks });
193199
const reason = 'Leaving';
194200
bot.ircClient.emit('part', channel, bot.nickname, reason);
195201
bot.sendExactToDiscord.should.not.have.been.called;

0 commit comments

Comments
 (0)