Keep track of channel members, add /nick command

This commit is contained in:
Simon Ser 2020-06-10 19:51:54 +02:00
parent 9a3409e970
commit dba59fe2c7
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
2 changed files with 58 additions and 2 deletions

View File

@ -92,6 +92,12 @@ function createMessageElement(msg) {
line.appendChild(createNickElement(msg.prefix.name));
line.appendChild(document.createTextNode(" has left"));
break;
case "NICK":
var newNick = msg.params[0];
line.appendChild(createNickElement(msg.prefix.name));
line.appendChild(document.createTextNode(" is now known as "));
line.appendChild(createNickElement(newNick));
break;
case "TOPIC":
line.appendChild(createNickElement(msg.prefix.name));
line.appendChild(document.createTextNode(" changed the topic to: " + msg.params[1]));
@ -124,6 +130,7 @@ function createBuffer(name) {
li: li,
readOnly: false,
topic: null,
members: {},
messages: [],
addMessage: function(msg) {
@ -223,6 +230,22 @@ function connect() {
}
buf.topic = topic;
break;
case RPL_NAMREPLY:
var channel = msg.params[2];
var members = msg.params.slice(3);
var buf = buffers[channel];
if (!buf) {
break;
}
members.forEach(function(s) {
var member = parseMembership(s);
buf.members[member.nick] = member.prefix;
});
break;
case RPL_ENDOFNAMES:
break;
case ERR_PASSWDMISMATCH:
console.error("Password mismatch");
disconnect();
@ -244,6 +267,7 @@ function connect() {
case "JOIN":
var channel = msg.params[0];
var buf = createBuffer(channel);
buf.members[msg.prefix.name] = null;
if (msg.prefix.name != server.nick) {
buf.addMessage(msg);
}
@ -254,14 +278,23 @@ function connect() {
break;
case "PART":
var channel = msg.params[0];
createBuffer(channel).addMessage(msg);
var buf = createBuffer(channel);
delete buf.members[msg.prefix.name];
buf.addMessage(msg);
break;
case "NICK":
var newNick = msg.params[0];
if (msg.prefix.name == server.nick) {
server.nick = newNick;
}
// TODO: append message to all buffers the user is a member of
for (var name in buffers) {
var buf = buffers[name];
if (buf.members[msg.prefix.name] !== undefined) {
buf.members[newNick] = buf.members[msg.prefix.name];
delete buf.members[msg.prefix.name];
buf.addMessage(msg);
}
}
break;
case "TOPIC":
var channel = msg.params[0];
@ -334,6 +367,10 @@ function executeCommand(s) {
var text = args.slice(1).join(" ");
sendMessage({ command: "PRIVMSG", params: [target, text] });
break;
case "nick":
var newNick = args[0];
sendMessage({ command: "NICK", params: [newNick] });
break;
default:
console.error("Unknwon command '" + cmd + "'");
}

View File

@ -1,5 +1,7 @@
const RPL_WELCOME = "001";
const RPL_TOPIC = "332";
const RPL_NAMREPLY = "353";
const RPL_ENDOFNAMES = "366";
const ERR_PASSWDMISMATCH = "464";
function parsePrefix(s) {
@ -106,3 +108,20 @@ function formatMessage(msg) {
s += "\r\n";
return s;
}
function parseMembership(s) {
// TODO: use the PREFIX token from RPL_ISUPPORT
const STD_MEMBERSHIPS = "~&@%+";
var i;
for (i = 0; i < s.length; i++) {
if (STD_MEMBERSHIPS.indexOf(s[i]) < 0) {
break;
}
}
return {
prefix: s.slice(0, i),
nick: s.slice(i),
};
}