Add /ops command

It's pretty awkward with large channels since NAMES isn't sorted by
prefixes or anything... But having it accumulate names across many
replies would require more reworking.
master
C. McEnroe 2020-09-30 17:52:39 -04:00
parent dce6c11cf6
commit 3e67bf6557
4 changed files with 21 additions and 5 deletions

View File

@ -1,4 +1,4 @@
.Dd September 6, 2020 .Dd September 30, 2020
.Dt CATGIRL 1 .Dt CATGIRL 1
.Os .Os
. .
@ -292,6 +292,8 @@ Change nicknames.
Send a notice. Send a notice.
.It Ic /ns Ar command .It Ic /ns Ar command
Send a command to NickServ. Send a command to NickServ.
.It Ic /ops
List channel operators.
.It Ic /part Op Ar message .It Ic /part Op Ar message
Leave the channel. Leave the channel.
.It Ic /query Ar nick .It Ic /query Ar nick

1
chat.h
View File

@ -246,6 +246,7 @@ extern struct Replies {
uint list; uint list;
uint mode; uint mode;
uint names; uint names;
uint ops;
uint topic; uint topic;
uint whois; uint whois;
} replies; } replies;

View File

@ -174,6 +174,12 @@ static void commandNames(uint id, char *params) {
replies.names++; replies.names++;
} }
static void commandOps(uint id, char *params) {
(void)params;
ircFormat("NAMES %s\r\n", idNames[id]);
replies.ops++;
}
static void commandInvite(uint id, char *params) { static void commandInvite(uint id, char *params) {
if (!params) return; if (!params) return;
char *nick = strsep(&params, " "); char *nick = strsep(&params, " ");
@ -468,6 +474,7 @@ static const struct Handler {
{ "/o", commandOpen, Restricted }, { "/o", commandOpen, Restricted },
{ "/op", commandOp, 0 }, { "/op", commandOp, 0 },
{ "/open", commandOpen, Restricted }, { "/open", commandOpen, Restricted },
{ "/ops", commandOps, 0 },
{ "/part", commandPart, 0 }, { "/part", commandPart, 0 },
{ "/query", commandQuery, Restricted }, { "/query", commandQuery, Restricted },
{ "/quit", commandQuit, 0 }, { "/quit", commandQuit, 0 },

View File

@ -499,20 +499,26 @@ static void handleReplyNames(struct Message *msg) {
char *user = strsep(&name, "@"); char *user = strsep(&name, "@");
enum Color color = (user ? hash(user) : Default); enum Color color = (user ? hash(user) : Default);
completeAdd(id, nick, color); completeAdd(id, nick, color);
if (!replies.names) continue; if (replies.ops && (prefixes == nick || prefixes[0] == '+')) continue;
if (!replies.ops && !replies.names) continue;
catf(&cat, "%s\3%02d%s\3", (buf[0] ? ", " : ""), color, prefixes); catf(&cat, "%s\3%02d%s\3", (buf[0] ? ", " : ""), color, prefixes);
} }
if (!replies.names) return; if (!cat.len) return;
uiFormat( uiFormat(
id, Cold, tagTime(msg), id, Cold, tagTime(msg),
"In \3%02d%s\3 are %s", "%s \3%02d%s\3 are %s",
(replies.ops ? "The operators of" : "In"),
hash(msg->params[2]), msg->params[2], buf hash(msg->params[2]), msg->params[2], buf
); );
} }
static void handleReplyEndOfNames(struct Message *msg) { static void handleReplyEndOfNames(struct Message *msg) {
(void)msg; (void)msg;
if (replies.names) replies.names--; if (replies.ops) {
replies.ops--;
} else if (replies.names) {
replies.names--;
}
} }
static void handleReplyNoTopic(struct Message *msg) { static void handleReplyNoTopic(struct Message *msg) {