about summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c79
1 files changed, 45 insertions, 34 deletions
diff --git a/handle.c b/handle.c
index 2a6fe1c..df36e1f 100644
--- a/handle.c
+++ b/handle.c
@@ -26,7 +26,7 @@
 static int
 join(struct Message *msg, struct Peer *peer)
 {
-	size_t i, j;
+	size_t i;
 
 	/* TODO: support comma separated list of channels, keys */
 	ensure(peer->type, reply(peer, 451), 0);
@@ -34,19 +34,16 @@ join(struct Message *msg, struct Peer *peer)
 	ensure(peer->channels_c != lengthof(peer->channels), reply(peer, 405, msg->params[0]), 0)
 	ensure(*msg->params[0] == '#', reply(peer, 403, msg->params[0]), 0);
 
+	for (i = 0; i < peer->channels_c; ++i)
+		ensure(strcmp(channels[i].name, msg->params[0]), (void)0, 0);
+
 	for (i = 0; i < channels_c; ++i)
 	{
 		if (strcmp(channels[i].name, msg->params[0]))
 			continue;
 
-		for (j = 0; j < channels[i].users_c; ++j)
-			ensure(
-				strcmp(channels[i].users[j]->nick, peer->nick),
-				(void)0,
-				0
-			);
-
-		ensure(!channel_join(&channels[i], peer), reply(peer, 471), 0);
+		if (channel_join(&channels[i], peer))
+			reply(peer, 471);
 		return 0;
 	}
 
@@ -107,11 +104,21 @@ nick(struct Message *msg, struct Peer *peer)
 	for (i = 0; i < peers_c; ++i)
 		if (peers[i].fd != peer->fd)
 			ensure(
-				!strcmp(peers[i].nick, peer->nick),
+				strcmp(peers[i].nick, msg->params[0]),
 				reply(peer, 433, msg->params[0]),
 				0
 			);
 
+	if (peer->type)
+		announce(
+			peer,
+			":%s!%s@%s NICK %s",
+			getnick(peer),
+			peer->user,
+			peer->host,
+			msg->params[0]
+		);
+
 	user_reg(peer, msg->params[0], NULL, NULL, NULL);
 
 	return 0;
@@ -145,6 +152,21 @@ part(struct Message *msg, struct Peer *peer)
 }
 
 static int
+ping(struct Message *msg, struct Peer *peer)
+{
+	ensure(msg->params[0] && *msg->params[0], reply(peer, 409), 0);
+
+	writef(
+		peer->fd,
+		":%s PONG :%s",
+		hostname,
+		msg->params[0]
+	);
+
+	return 0;
+}
+
+static int
 privmsg(struct Message *msg, struct Peer *peer)
 {
 	size_t i;
@@ -172,10 +194,13 @@ privmsg(struct Message *msg, struct Peer *peer)
 				writechanf(
 					peer,
 					&channels[i],
-					":%s!%s@%s PRIVMSG %s :%s",
+					":%s!%s@%s %s %s :%s",
 					peer->nick,
 					peer->user,
 					peer->host,
+					*msg->command == 'P'
+						? "PRIVMSG"
+						: "NOTICE",
 					msg->params[0],
 					msg->params[1]
 				);
@@ -192,10 +217,13 @@ privmsg(struct Message *msg, struct Peer *peer)
 
 			writef(
 				peers[i].fd,
-				":%s!%s@%s PRIVMSG %s :%s",
+				":%s!%s@%s %s %s :%s",
 				peer->nick,
 				peer->user,
 				peer->host,
+				*msg->command == 'P'
+					? "PRIVMSG"
+					: "NOTICE",
 				msg->params[0],
 				msg->params[1]
 			);
@@ -210,39 +238,20 @@ privmsg(struct Message *msg, struct Peer *peer)
 static int
 quit(struct Message *msg, struct Peer *peer)
 {
-	size_t i, j;
+	size_t i;
 
 	ensure(peer->type, (void)0, 1)
 
-	writef(
-		peer->fd,
+	announce(
+		peer,
 		":%s!%s@%s QUIT :%s",
 		getnick(peer),
 		peer->user,
 		peer->host,
 		msg->params[0] ? msg->params[0] : "Client Quit"
 	);
-
 	for (i = 0; i < peer->channels_c; ++i)
-	{
 		channel_exit(peer->channels[i], peer);
-		for (j = 0; j < peer->channels[i]->users_c; ++j)
-			peer->channels[i]->users[j]->flags |= ANNOUNCE;
-	}
-
-	for (i = 0; i < peers_c; ++i)
-		if (peers[i].flags & ANNOUNCE)
-		{
-			writef(
-				peers[i].fd,
-				":%s!%s@%s QUIT :%s",
-				getnick(peer),
-				peer->user,
-				peer->host,
-				msg->params[0] ? msg->params[0] : "Client Quit"
-			);
-			peers[i].flags &= ~ANNOUNCE;
-		}
 
 	return 1;
 }
@@ -278,7 +287,9 @@ static struct Handler {
 	{ "join", join },
 	{ "mode", mode },
 	{ "nick", nick },
+	{ "notice", privmsg },
 	{ "part", part },
+	{ "ping", ping },
 	{ "privmsg", privmsg },
 	{ "quit", quit },
 	{ "user", user },