summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-09-30 17:52:39 -0400
committerJune McEnroe <june@causal.agency>2020-09-30 17:52:39 -0400
commit3e67bf6557861a58d75f62c562a3a2b43f226435 (patch)
treeaada4c6bc2a93a0479b02009ec5c8cf3163eb0a4
parentAllow 2-param form of /whois, count comma-separated nicks (diff)
downloadcatgirl-3e67bf6557861a58d75f62c562a3a2b43f226435.tar.gz
catgirl-3e67bf6557861a58d75f62c562a3a2b43f226435.zip
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.
-rw-r--r--catgirl.14
-rw-r--r--chat.h1
-rw-r--r--command.c7
-rw-r--r--handle.c14
4 files changed, 21 insertions, 5 deletions
diff --git a/catgirl.1 b/catgirl.1
index ad2b3a2..6a45722 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -1,4 +1,4 @@
-.Dd September  6, 2020
+.Dd September 30, 2020
 .Dt CATGIRL 1
 .Os
 .
@@ -292,6 +292,8 @@ Change nicknames.
 Send a notice.
 .It Ic /ns Ar command
 Send a command to NickServ.
+.It Ic /ops
+List channel operators.
 .It Ic /part Op Ar message
 Leave the channel.
 .It Ic /query Ar nick
diff --git a/chat.h b/chat.h
index 6cf34b3..43df641 100644
--- a/chat.h
+++ b/chat.h
@@ -246,6 +246,7 @@ extern struct Replies {
 	uint list;
 	uint mode;
 	uint names;
+	uint ops;
 	uint topic;
 	uint whois;
 } replies;
diff --git a/command.c b/command.c
index 0d988cd..efc095c 100644
--- a/command.c
+++ b/command.c
@@ -174,6 +174,12 @@ static void commandNames(uint id, char *params) {
 	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) {
 	if (!params) return;
 	char *nick = strsep(&params, " ");
@@ -468,6 +474,7 @@ static const struct Handler {
 	{ "/o", commandOpen, Restricted },
 	{ "/op", commandOp, 0 },
 	{ "/open", commandOpen, Restricted },
+	{ "/ops", commandOps, 0 },
 	{ "/part", commandPart, 0 },
 	{ "/query", commandQuery, Restricted },
 	{ "/quit", commandQuit, 0 },
diff --git a/handle.c b/handle.c
index cf3c977..e3efe47 100644
--- a/handle.c
+++ b/handle.c
@@ -499,20 +499,26 @@ static void handleReplyNames(struct Message *msg) {
 		char *user = strsep(&name, "@");
 		enum Color color = (user ? hash(user) : Default);
 		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);
 	}
-	if (!replies.names) return;
+	if (!cat.len) return;
 	uiFormat(
 		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
 	);
 }
 
 static void handleReplyEndOfNames(struct Message *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) {