Browse Source

Add ability to join channel with multiple users

Joining channels allone is nice, but defeats the purpose of channels.
This patch adds the ability to join a channel with multiple users.
feature/channel
Sheogorath 5 years ago
parent
commit
394384689b
No known key found for this signature in database GPG Key ID: 1F05CC3635CDDFFD
  1. 5
      src/channel.js
  2. 5
      src/server.js
  3. 44
      test/command_join.js

5
src/channel.js

@ -3,8 +3,11 @@ function Channel(name) {
this.userlist = [] this.userlist = []
this.join = function(user) { this.join = function(user) {
let channel = this
this.userlist.push(user) this.userlist.push(user)
user.sendRaw(`:${user.nickname} JOIN ${this.name}`)
this.userlist.forEach(function(item) {
item.sendRaw(`:${user.nickname} JOIN ${channel.name}`)
})
} }
} }

5
src/server.js

@ -89,9 +89,14 @@ server.create = function create(config = {}) {
break; break;
case "JOIN": case "JOIN":
let channelname = tokenized[1] let channelname = tokenized[1]
if (Object.keys(channellist).includes(channelname)) {
channellist[channelname].join(user)
} else {
let channel = new Channel(channelname) let channel = new Channel(channelname)
channel.join(user) channel.join(user)
channellist[channelname] = channel channellist[channelname] = channel
}
break; break;
case "QUIT": case "QUIT":
server.closeConnection(user.nickname) server.closeConnection(user.nickname)

44
test/command_join.js

@ -25,4 +25,48 @@ describe("JOIN OK", function () {
mockedSock.emit('data', Buffer.from("USER guest tolmoon tolsun :Ronnie Reagan\r\n", "ascii")) mockedSock.emit('data', Buffer.from("USER guest tolmoon tolsun :Ronnie Reagan\r\n", "ascii"))
mockedSock.emit('data', Buffer.from("JOIN #testchan\r\n", "ascii")) mockedSock.emit('data', Buffer.from("JOIN #testchan\r\n", "ascii"))
}) })
it("should handle a JOIN command for more than one user -> JOIN #testchan and send join events to all channel members", function (done) {
const server = IRCServer.create()
// helper to count join messages for channel
// we should see 2 of them
let counter = 0
let mockedSock1 = new EventEmitter()
mockedSock1.address = function () {
return {port: 12346, family: 'IPv4', address: '127.0.0.1'}
}
mockedSock1.write = function (data) {
let answer = data.toString("ascii")
if (answer.indexOf("JOIN") >= 0 && counter === 1) {
assert.equal(answer, ":other_nick JOIN #testchan\r\n")
done()
}
if (answer === ":some_nick JOIN #testchan\r\n") {
counter++
}
}
mockedSock1.destroy = function () {
done("Destroyed socket without answering")
}
let mockedSock2 = new EventEmitter()
mockedSock2.address = function () {
return {port: 12346, family: 'IPv4', address: '127.0.0.1'}
}
mockedSock2.write = function (data) {
return
}
mockedSock2.destroy = function () {
done("Destroyed socket without answering")
}
server.emit("connection", mockedSock1)
server.emit("connection", mockedSock2)
mockedSock1.emit('data', Buffer.from("NICK some_nick\r\n", "ascii"))
mockedSock1.emit('data', Buffer.from("USER guest tolmoon tolsun :Ronnie Reagan\r\n", "ascii"))
mockedSock1.emit('data', Buffer.from("JOIN #testchan\r\n", "ascii"))
mockedSock2.emit('data', Buffer.from("NICK other_nick\r\n", "ascii"))
mockedSock2.emit('data', Buffer.from("USER guest tolmoon tolsun :Ronnie Reagan\r\n", "ascii"))
mockedSock2.emit('data', Buffer.from("JOIN #testchan\r\n", "ascii"))
})
}) })
Loading…
Cancel
Save