summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/handle.c b/handle.c
index 9e8cb5f..76f0a32 100644
--- a/handle.c
+++ b/handle.c
@@ -24,9 +24,12 @@
 #include <err.h>
 
 
+static int names(struct Message *msg, struct Peer *peer);
+
 static int
 join(struct Message *msg, struct Peer *peer)
 {
+	struct Message namesmsg;
 	size_t i;
 	char *cp;
 
@@ -46,6 +49,7 @@ join(struct Message *msg, struct Peer *peer)
 	for (i = 0; i < peer->channels_c; ++i)
 		ensure(strcmp(channels[i].name, msg->params[0]), (void)0, 0);
 
+	namesmsg = (struct Message){ .params = { msg->params[0] } };
 	for (i = 0; i < channels_c; ++i)
 	{
 		if (strcmp(channels[i].name, msg->params[0]))
@@ -53,12 +57,15 @@ join(struct Message *msg, struct Peer *peer)
 
 		if (channel_join(&channels[i], peer))
 			reply(peer, 471);
+		else
+			names(&namesmsg, peer);
 		return 0;
 	}
 
 	channels[channels_c] = (struct Channel){0};
 	strlcpy(channels[channels_c].name, msg->params[0], sizeof(channels->name));
 	channel_join(&channels[channels_c++], peer);
+	names(&namesmsg, peer);
 	return 0;
 }
 
@@ -103,6 +110,38 @@ mode(struct Message *msg, struct Peer *peer)
 }
 
 static int
+names(struct Message *msg, struct Peer *peer)
+{
+	static char buf[MESSAGE_MAX];
+	size_t i, j;
+
+	for (i = 0; i < peer->channels_c; ++i)
+	{
+		if (msg->params[0] && strcmp(msg->params[0], peer->channels[i]->name))
+			continue;
+
+		memset(buf, 0, sizeof(buf));
+		for (j = 0; j < peer->channels[i]->users_c; ++j)
+		{
+			strlcat(buf, peer->channels[i]->users[j]->nick, sizeof(buf));
+			if (strlen(buf) >= MESSAGE_MAX - 4*PEER_NICK_MAX)
+			{
+				reply(peer, 353, peer->channels[i]->name, buf);
+				memset(buf, 0, sizeof(buf));
+			} else
+			{
+				strlcat(buf, " ", sizeof(buf));
+			}
+		}
+		if (*buf)
+			reply(peer, 353, peer->channels[i]->name, buf);
+	}
+
+	reply(peer, 366, msg->params[0] ? msg->params[0] : "*");
+	return 0;
+}
+
+static int
 nick(struct Message *msg, struct Peer *peer)
 {
 	size_t i;
@@ -380,6 +419,7 @@ static struct Handler {
 {
 	{ "join", join },
 	{ "mode", mode },
+	{ "names", names },
 	{ "nick", nick },
 	{ "notice", privmsg },
 	{ "part", part },