about summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-02-08 00:25:09 -0500
committerJune McEnroe <june@causal.agency>2020-02-08 00:25:09 -0500
commit7ebfeea33041f3d438e2de84760af950000393db (patch)
tree33b4abec74c4c3b0760b68fa9d150e6ec10b336c /handle.c
parentAdd /nick (diff)
downloadcatgirl-7ebfeea33041f3d438e2de84760af950000393db.tar.gz
catgirl-7ebfeea33041f3d438e2de84760af950000393db.zip
Handle NAMES reply
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/handle.c b/handle.c
index fe64f33..44329ff 100644
--- a/handle.c
+++ b/handle.c
@@ -14,6 +14,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
+#include <assert.h>
 #include <ctype.h>
 #include <err.h>
 #include <stdbool.h>
@@ -225,6 +226,32 @@ static void handlePart(struct Message *msg) {
 	);
 }
 
+static void handleReplyNames(struct Message *msg) {
+	require(msg, false, 4);
+	size_t id = idFor(msg->params[2]);
+	char buf[1024];
+	size_t len = 0;
+	while (msg->params[3]) {
+		char *name = strsep(&msg->params[3], " ");
+		name += strspn(name, self.prefixes);
+		char *nick = strsep(&name, "!");
+		char *user = strsep(&name, "@");
+		enum Color color = (user ? hash(user) : Default);
+		completeAdd(id, nick, color);
+		int n = snprintf(
+			&buf[len], sizeof(buf) - len,
+			"%s\3%02d%s\3", (len ? ", " : ""), color, nick
+		);
+		assert(n > 0 && len + n < sizeof(buf));
+		len += n;
+	}
+	uiFormat(
+		id, Cold, tagTime(msg),
+		"In \3%02d%s\3 are %s",
+		hash(msg->params[2]), msg->params[2], buf
+	);
+}
+
 static void handleReplyNoTopic(struct Message *msg) {
 	require(msg, false, 2);
 	uiFormat(
@@ -359,6 +386,7 @@ static const struct Handler {
 	{ "005", handleReplyISupport },
 	{ "331", handleReplyNoTopic },
 	{ "332", handleReplyTopic },
+	{ "353", handleReplyNames },
 	{ "372", handleReplyMOTD },
 	{ "432", handleErrorErroneousNickname },
 	{ "433", handleErrorNicknameInUse },