mirror of
https://codeberg.org/emersion/gamja
synced 2025-03-13 07:48:37 +01:00
Keep track of channel members, add /nick command
This commit is contained in:
parent
9a3409e970
commit
dba59fe2c7
@ -92,6 +92,12 @@ function createMessageElement(msg) {
|
|||||||
line.appendChild(createNickElement(msg.prefix.name));
|
line.appendChild(createNickElement(msg.prefix.name));
|
||||||
line.appendChild(document.createTextNode(" has left"));
|
line.appendChild(document.createTextNode(" has left"));
|
||||||
break;
|
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":
|
case "TOPIC":
|
||||||
line.appendChild(createNickElement(msg.prefix.name));
|
line.appendChild(createNickElement(msg.prefix.name));
|
||||||
line.appendChild(document.createTextNode(" changed the topic to: " + msg.params[1]));
|
line.appendChild(document.createTextNode(" changed the topic to: " + msg.params[1]));
|
||||||
@ -124,6 +130,7 @@ function createBuffer(name) {
|
|||||||
li: li,
|
li: li,
|
||||||
readOnly: false,
|
readOnly: false,
|
||||||
topic: null,
|
topic: null,
|
||||||
|
members: {},
|
||||||
messages: [],
|
messages: [],
|
||||||
|
|
||||||
addMessage: function(msg) {
|
addMessage: function(msg) {
|
||||||
@ -223,6 +230,22 @@ function connect() {
|
|||||||
}
|
}
|
||||||
buf.topic = topic;
|
buf.topic = topic;
|
||||||
break;
|
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:
|
case ERR_PASSWDMISMATCH:
|
||||||
console.error("Password mismatch");
|
console.error("Password mismatch");
|
||||||
disconnect();
|
disconnect();
|
||||||
@ -244,6 +267,7 @@ function connect() {
|
|||||||
case "JOIN":
|
case "JOIN":
|
||||||
var channel = msg.params[0];
|
var channel = msg.params[0];
|
||||||
var buf = createBuffer(channel);
|
var buf = createBuffer(channel);
|
||||||
|
buf.members[msg.prefix.name] = null;
|
||||||
if (msg.prefix.name != server.nick) {
|
if (msg.prefix.name != server.nick) {
|
||||||
buf.addMessage(msg);
|
buf.addMessage(msg);
|
||||||
}
|
}
|
||||||
@ -254,14 +278,23 @@ function connect() {
|
|||||||
break;
|
break;
|
||||||
case "PART":
|
case "PART":
|
||||||
var channel = msg.params[0];
|
var channel = msg.params[0];
|
||||||
createBuffer(channel).addMessage(msg);
|
var buf = createBuffer(channel);
|
||||||
|
delete buf.members[msg.prefix.name];
|
||||||
|
buf.addMessage(msg);
|
||||||
break;
|
break;
|
||||||
case "NICK":
|
case "NICK":
|
||||||
var newNick = msg.params[0];
|
var newNick = msg.params[0];
|
||||||
if (msg.prefix.name == server.nick) {
|
if (msg.prefix.name == server.nick) {
|
||||||
server.nick = newNick;
|
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;
|
break;
|
||||||
case "TOPIC":
|
case "TOPIC":
|
||||||
var channel = msg.params[0];
|
var channel = msg.params[0];
|
||||||
@ -334,6 +367,10 @@ function executeCommand(s) {
|
|||||||
var text = args.slice(1).join(" ");
|
var text = args.slice(1).join(" ");
|
||||||
sendMessage({ command: "PRIVMSG", params: [target, text] });
|
sendMessage({ command: "PRIVMSG", params: [target, text] });
|
||||||
break;
|
break;
|
||||||
|
case "nick":
|
||||||
|
var newNick = args[0];
|
||||||
|
sendMessage({ command: "NICK", params: [newNick] });
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
console.error("Unknwon command '" + cmd + "'");
|
console.error("Unknwon command '" + cmd + "'");
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
const RPL_WELCOME = "001";
|
const RPL_WELCOME = "001";
|
||||||
const RPL_TOPIC = "332";
|
const RPL_TOPIC = "332";
|
||||||
|
const RPL_NAMREPLY = "353";
|
||||||
|
const RPL_ENDOFNAMES = "366";
|
||||||
const ERR_PASSWDMISMATCH = "464";
|
const ERR_PASSWDMISMATCH = "464";
|
||||||
|
|
||||||
function parsePrefix(s) {
|
function parsePrefix(s) {
|
||||||
@ -106,3 +108,20 @@ function formatMessage(msg) {
|
|||||||
s += "\r\n";
|
s += "\r\n";
|
||||||
return s;
|
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),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user