Refactor ISUPPORT handling
Add a helper class to parse ISUPPORT tokens. Instead of having manual ISUPPORT handling all over the place, use pre-processed values.
This commit is contained in:
parent
31b293fa03
commit
ab3d4dd661
7 changed files with 128 additions and 84 deletions
100
lib/irc.js
100
lib/irc.js
|
@ -382,28 +382,88 @@ function unescapeISUPPORTValue(s) {
|
|||
});
|
||||
}
|
||||
|
||||
export function parseISUPPORT(tokens, params) {
|
||||
let changed = [];
|
||||
tokens.forEach((tok) => {
|
||||
if (tok.startsWith("-")) {
|
||||
let k = tok.slice(1);
|
||||
params.delete(k.toUpperCase());
|
||||
return;
|
||||
export class Isupport {
|
||||
raw = new Map();
|
||||
|
||||
parse(tokens) {
|
||||
tokens.forEach((tok) => {
|
||||
if (tok.startsWith("-")) {
|
||||
let k = tok.slice(1);
|
||||
this.raw.delete(k.toUpperCase());
|
||||
return;
|
||||
}
|
||||
|
||||
let i = tok.indexOf("=");
|
||||
let k = tok, v = "";
|
||||
if (i >= 0) {
|
||||
k = tok.slice(0, i);
|
||||
v = unescapeISUPPORTValue(tok.slice(i + 1));
|
||||
}
|
||||
|
||||
k = k.toUpperCase();
|
||||
|
||||
this.raw.set(k, v);
|
||||
});
|
||||
}
|
||||
|
||||
caseMapping() {
|
||||
let name = this.raw.get("CASEMAPPING");
|
||||
if (!name) {
|
||||
return CaseMapping.RFC1459;
|
||||
}
|
||||
|
||||
let i = tok.indexOf("=");
|
||||
let k = tok, v = "";
|
||||
if (i >= 0) {
|
||||
k = tok.slice(0, i);
|
||||
v = unescapeISUPPORTValue(tok.slice(i + 1));
|
||||
let cm = CaseMapping.byName(name);
|
||||
if (!cm) {
|
||||
console.error("Unsupported case-mapping '" + name + "', falling back to RFC 1459");
|
||||
return CaseMapping.RFC1459;
|
||||
}
|
||||
return cm;
|
||||
}
|
||||
|
||||
k = k.toUpperCase();
|
||||
monitor() {
|
||||
if (!this.raw.has("MONITOR")) {
|
||||
return 0;
|
||||
}
|
||||
let v = this.raw.get("MONITOR");
|
||||
if (v === "") {
|
||||
return Infinity;
|
||||
}
|
||||
return parseInt(v, 10);
|
||||
}
|
||||
|
||||
params.set(k, v);
|
||||
changed.push(k);
|
||||
});
|
||||
return changed;
|
||||
whox() {
|
||||
return this.raw.has("WHOX");
|
||||
}
|
||||
|
||||
prefix() {
|
||||
return this.raw.get("PREFIX") || "";
|
||||
}
|
||||
|
||||
chanTypes() {
|
||||
return this.raw.get("CHANTYPES") || STD_CHANTYPES;
|
||||
}
|
||||
|
||||
statusMsg() {
|
||||
return this.raw.get("STATUSMSG");
|
||||
}
|
||||
|
||||
network() {
|
||||
return this.raw.get("NETWORK");
|
||||
}
|
||||
|
||||
chatHistory() {
|
||||
if (!this.raw.has("CHATHISTORY")) {
|
||||
return 0;
|
||||
}
|
||||
let n = parseInt(this.raw.get("CHATHISTORY"), 10);
|
||||
if (n <= 0) {
|
||||
return Infinity;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
bouncerNetID() {
|
||||
return this.raw.get("BOUNCER_NETID");
|
||||
}
|
||||
}
|
||||
|
||||
export const CaseMapping = {
|
||||
|
@ -612,8 +672,8 @@ export function getMessageLabel(msg) {
|
|||
}
|
||||
|
||||
export function forEachChannelModeUpdate(msg, isupport, callback) {
|
||||
let chanmodes = isupport.get("CHANMODES") || STD_CHANMODES;
|
||||
let prefix = isupport.get("PREFIX") || "";
|
||||
let chanmodes = isupport.chanModes();
|
||||
let prefix = isupport.prefix();
|
||||
|
||||
let typeByMode = new Map();
|
||||
let [a, b, c, d] = chanmodes.split(",");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue