lib/irc: add CapRegistry
This commit is contained in:
parent
f6895fed32
commit
4cabae89ff
5 changed files with 90 additions and 59 deletions
64
lib/irc.js
64
lib/irc.js
|
@ -794,3 +794,67 @@ export function parseURL(str) {
|
|||
|
||||
return { host, enttype, entity };
|
||||
}
|
||||
|
||||
export class CapRegistry {
|
||||
available = new Map();
|
||||
enabled = new Set();
|
||||
|
||||
addAvailable(s) {
|
||||
let l = s.split(" ");
|
||||
l.forEach((s) => {
|
||||
let i = s.indexOf("=");
|
||||
let k = s, v = "";
|
||||
if (i >= 0) {
|
||||
k = s.slice(0, i);
|
||||
v = s.slice(i + 1);
|
||||
}
|
||||
this.available.set(k.toLowerCase(), v);
|
||||
});
|
||||
}
|
||||
|
||||
parse(msg) {
|
||||
if (msg.command !== "CAP") {
|
||||
return;
|
||||
}
|
||||
|
||||
let subCmd = msg.params[1];
|
||||
let args = msg.params.slice(2);
|
||||
switch (subCmd) {
|
||||
case "LS":
|
||||
this.addAvailable(args[args.length - 1]);
|
||||
break;
|
||||
case "NEW":
|
||||
this.addAvailable(args[0]);
|
||||
break;
|
||||
case "DEL":
|
||||
args[0].split(" ").forEach((cap) => {
|
||||
cap = cap.toLowerCase();
|
||||
this.available.delete(cap);
|
||||
this.enabled.delete(cap);
|
||||
});
|
||||
break;
|
||||
case "ACK":
|
||||
// TODO: handle `ACK -cap` to
|
||||
args[0].split(" ").forEach((cap) => {
|
||||
cap = cap.toLowerCase();
|
||||
if (cap.startsWith("-")) {
|
||||
this.enabled.delete(cap.slice(1));
|
||||
} else {
|
||||
this.enabled.add(cap);
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
requestAvailable(l) {
|
||||
l = l.filter((cap) => {
|
||||
return this.available.has(cap) && !this.enabled.has(cap);
|
||||
});
|
||||
|
||||
if (l.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return { command: "CAP", params: ["REQ", l.join(" ")] };
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue