state: handle WHO replies in bulk

This commit is contained in:
Simon Ser 2023-04-19 13:04:58 +02:00
parent 2d651ef901
commit 2f627eecad

View File

@ -453,9 +453,18 @@ export const State = {
return { members }; return { members };
}); });
break; break;
case irc.RPL_WHOREPLY: case irc.RPL_ENDOFWHO:
case irc.RPL_WHOSPCRPL: target = msg.params[1];
who = client.parseWhoReply(msg); if (msg.list.length == 0 && !client.isChannel(target) && target.indexOf("*") < 0) {
// Not a channel nor a mask, likely a nick
return updateUser(target, (user) => {
return { offline: true };
});
} else {
return updateServer((server) => {
let users = new irc.CaseMapMap(server.users);
for (let reply of msg.list) {
let who = client.parseWhoReply(reply);
if (who.flags !== undefined) { if (who.flags !== undefined) {
who.away = who.flags.indexOf("G") >= 0; // H for here, G for gone who.away = who.flags.indexOf("G") >= 0; // H for here, G for gone
@ -469,13 +478,9 @@ export const State = {
who.offline = false; who.offline = false;
return updateUser(who.nick, who); users.set(who.nick, who);
case irc.RPL_ENDOFWHO: }
target = msg.params[1]; return { users };
if (msg.list.length == 0 && !client.isChannel(target) && target.indexOf("*") < 0) {
// Not a channel nor a mask, likely a nick
return updateUser(target, (user) => {
return { offline: true };
}); });
} }
break; break;