feat: add /list, /who, /whois commands + CLI parity
All checks were successful
check / check (push) Successful in 2m18s
All checks were successful
check / check (push) Successful in 2m18s
- Server: add LIST, WHO, WHOIS command handlers in dispatchCommand with proper IRC numerics (322/323, 352/315, 311/312/319/318) - SPA: add /list, /who, /whois command parsing and numeric display - CLI: add /motd, /who, /whois commands for feature parity - Rebuild SPA dist from source
This commit is contained in:
151
web/src/app.jsx
151
web/src/app.jsx
@@ -419,6 +419,100 @@ function App() {
|
||||
|
||||
break;
|
||||
}
|
||||
case "322": {
|
||||
// RPL_LIST — channel, member count, topic.
|
||||
if (Array.isArray(msg.params) && msg.params.length >= 2) {
|
||||
const chName = msg.params[0];
|
||||
const count = msg.params[1];
|
||||
const chTopic = body || "";
|
||||
addMessage("Server", {
|
||||
...base,
|
||||
text: `${chName} (${count} users): ${chTopic.trim()}`,
|
||||
system: true,
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "323":
|
||||
addMessage("Server", {
|
||||
...base,
|
||||
text: body || "End of channel list",
|
||||
system: true,
|
||||
});
|
||||
|
||||
break;
|
||||
case "352": {
|
||||
// RPL_WHOREPLY — channel, user, host, server, nick, flags.
|
||||
if (Array.isArray(msg.params) && msg.params.length >= 5) {
|
||||
const whoCh = msg.params[0];
|
||||
const whoNick = msg.params[4];
|
||||
const whoFlags = msg.params.length > 5 ? msg.params[5] : "";
|
||||
addMessage("Server", {
|
||||
...base,
|
||||
text: `${whoCh} ${whoNick} ${whoFlags}`,
|
||||
system: true,
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "315":
|
||||
addMessage("Server", {
|
||||
...base,
|
||||
text: body || "End of /WHO list",
|
||||
system: true,
|
||||
});
|
||||
|
||||
break;
|
||||
case "311": {
|
||||
// RPL_WHOISUSER — nick, user, host, *, realname.
|
||||
if (Array.isArray(msg.params) && msg.params.length >= 1) {
|
||||
const wiNick = msg.params[0];
|
||||
addMessage("Server", {
|
||||
...base,
|
||||
text: `${wiNick} (${body})`,
|
||||
system: true,
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "312": {
|
||||
// RPL_WHOISSERVER — nick, server, server info.
|
||||
if (Array.isArray(msg.params) && msg.params.length >= 2) {
|
||||
const wiNick = msg.params[0];
|
||||
const wiServer = msg.params[1];
|
||||
addMessage("Server", {
|
||||
...base,
|
||||
text: `${wiNick} on ${wiServer}`,
|
||||
system: true,
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "319": {
|
||||
// RPL_WHOISCHANNELS — nick, channels.
|
||||
if (Array.isArray(msg.params) && msg.params.length >= 1) {
|
||||
const wiNick = msg.params[0];
|
||||
addMessage("Server", {
|
||||
...base,
|
||||
text: `${wiNick} is on: ${body}`,
|
||||
system: true,
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "318":
|
||||
addMessage("Server", {
|
||||
...base,
|
||||
text: body || "End of /WHOIS list",
|
||||
system: true,
|
||||
});
|
||||
|
||||
break;
|
||||
case "375":
|
||||
case "372":
|
||||
case "376":
|
||||
@@ -873,6 +967,60 @@ function App() {
|
||||
|
||||
break;
|
||||
}
|
||||
case "/list": {
|
||||
try {
|
||||
await api("/messages", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ command: "LIST" }),
|
||||
});
|
||||
} catch (err) {
|
||||
addSystemMessage(
|
||||
"Server",
|
||||
`Failed to list channels: ${err.data?.error || "error"}`,
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "/who": {
|
||||
const whoTarget = parts[1] || (tab.type === "channel" ? tab.name : "");
|
||||
if (whoTarget) {
|
||||
try {
|
||||
await api("/messages", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ command: "WHO", to: whoTarget }),
|
||||
});
|
||||
} catch (err) {
|
||||
addSystemMessage(
|
||||
"Server",
|
||||
`WHO failed: ${err.data?.error || "error"}`,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
addSystemMessage("Server", "Usage: /who #channel");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "/whois": {
|
||||
if (parts[1]) {
|
||||
try {
|
||||
await api("/messages", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ command: "WHOIS", to: parts[1] }),
|
||||
});
|
||||
} catch (err) {
|
||||
addSystemMessage(
|
||||
"Server",
|
||||
`WHOIS failed: ${err.data?.error || "error"}`,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
addSystemMessage("Server", "Usage: /whois <nick>");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "/clear": {
|
||||
const clearTarget = tab.name;
|
||||
setMessages((prev) => ({ ...prev, [clearTarget]: [] }));
|
||||
@@ -891,6 +1039,9 @@ function App() {
|
||||
" /topic [text] — View or set channel topic",
|
||||
" /mode +/-flags — Set channel modes",
|
||||
" /motd — Display the message of the day",
|
||||
" /list — List all channels",
|
||||
" /who [#channel] — List users in a channel",
|
||||
" /whois nick — Show info about a user",
|
||||
" /clear — Clear messages in the current tab",
|
||||
" /quit [reason] — Disconnect from server",
|
||||
" /help — Show this help",
|
||||
|
||||
Reference in New Issue
Block a user