Add /whois command
This also rigs up some helpers in Client for handling the whois response, which I will use for /ban and /quiet and such shortly.
This commit is contained in:
@@ -48,6 +48,7 @@ export default class Client extends EventTarget {
|
||||
reconnectTimeoutID = null;
|
||||
pendingHistory = Promise.resolve(null);
|
||||
cm = irc.CaseMapping.RFC1459;
|
||||
whoisDB = new irc.CaseMapMap(null, irc.CaseMapping.RFC1459);
|
||||
|
||||
constructor(params) {
|
||||
super();
|
||||
@@ -201,6 +202,18 @@ export default class Client extends EventTarget {
|
||||
this.send({ command: "CAP", params: ["END"] });
|
||||
}
|
||||
break;
|
||||
case irc.RPL_WHOISUSER:
|
||||
case irc.RPL_WHOISSERVER:
|
||||
case irc.RPL_WHOISOPERATOR:
|
||||
case irc.RPL_WHOISIDLE:
|
||||
case irc.RPL_WHOISCHANNELS:
|
||||
case irc.RPL_ENDOFWHOIS:
|
||||
var nick = msg.params[1];
|
||||
if (!this.whoisDB.has(nick)) {
|
||||
this.whoisDB.set(nick, {});
|
||||
}
|
||||
this.whoisDB.get(nick)[msg.command] = msg;
|
||||
break;
|
||||
case irc.ERR_NICKLOCKED:
|
||||
case irc.ERR_SASLFAIL:
|
||||
case irc.ERR_SASLTOOLONG:
|
||||
@@ -271,6 +284,28 @@ export default class Client extends EventTarget {
|
||||
}
|
||||
}
|
||||
|
||||
whois(target, callback) {
|
||||
var targetCM = this.cm(target);
|
||||
var msg = { command: "WHOIS", params: [target] };
|
||||
return this.roundtrip(msg, (event) => {
|
||||
var msg = event.detail.message;
|
||||
switch (msg.command) {
|
||||
case irc.RPL_ENDOFWHOIS:
|
||||
var nick = msg.params[1];
|
||||
if (this.cm(nick) === targetCM) {
|
||||
return this.whoisDB.get(nick);
|
||||
}
|
||||
break;
|
||||
case irc.ERR_NOSUCHNICK:
|
||||
var nick = msg.params[1];
|
||||
if (this.cm(nick) === targetCM) {
|
||||
throw msg;
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
addAvailableCaps(s) {
|
||||
var l = s.split(" ");
|
||||
l.forEach((s) => {
|
||||
@@ -392,6 +427,7 @@ export default class Client extends EventTarget {
|
||||
|
||||
setCaseMapping(name) {
|
||||
this.cm = irc.CaseMapping.byName(name);
|
||||
this.whoisDB = new irc.CaseMapMap(this.whoisDB, this.cm);
|
||||
if (!this.cm) {
|
||||
console.error("Unsupported case-mapping '" + name + "', falling back to RFC 1459");
|
||||
this.cm = irc.CaseMapping.RFC1459;
|
||||
|
||||
Reference in New Issue
Block a user