Add irc.forEachChannelModeUpdate helper

This commit is contained in:
Simon Ser
2021-06-11 12:54:42 +02:00
parent 37cff435a3
commit 0b3f5ef88b
2 changed files with 49 additions and 38 deletions
+47
View File
@@ -571,3 +571,50 @@ export function getMessageLabel(msg) {
return null;
}
export function forEachChannelModeUpdate(msg, isupport, callback) {
let chanmodes = isupport.get("CHANMODES") || STD_CHANMODES;
let prefix = isupport.get("PREFIX") || "";
let typeByMode = new Map();
let [a, b, c, d] = chanmodes.split(",");
Array.from(a).forEach((mode) => typeByMode.set(mode, "A"));
Array.from(b).forEach((mode) => typeByMode.set(mode, "B"));
Array.from(c).forEach((mode) => typeByMode.set(mode, "C"));
Array.from(d).forEach((mode) => typeByMode.set(mode, "D"));
parseMembershipModes(prefix).forEach((membership) => typeByMode.set(membership.mode, "B"));
if (msg.command !== "MODE") {
throw new Error("Expected a MODE message");
}
let change = msg.params[1];
let args = msg.params.slice(2);
let plusMinus = null;
let j = 0;
for (let i = 0; i < change.length; i++) {
if (change[i] === "+" || change[i] === "-") {
plusMinus = change[i];
continue;
}
if (!plusMinus) {
throw new Error("malformed mode string: missing plus/minus");
}
let mode = change[i];
let add = plusMinus === "+";
let modeType = typeByMode.get(mode);
if (!modeType) {
continue;
}
let arg = null;
if (modeType === "A" || modeType === "B" || (modeType === "C" && add)) {
arg = args[j];
j++;
}
callback(mode, add, arg);
}
}