about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--handle.c34
-rw-r--r--loop.c28
2 files changed, 35 insertions, 27 deletions
diff --git a/handle.c b/handle.c
index 61b34f7..87dfa77 100644
--- a/handle.c
+++ b/handle.c
@@ -159,6 +159,40 @@ privmsg(struct Message *msg, struct Peer *peer)
 static int
 quit(struct Message *msg, struct Peer *peer)
 {
+	size_t i, j;
+
+	ensure(peer->type, (void)0, 1)
+
+	writef(
+		peer->fd,
+		":%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;
 }
 
diff --git a/loop.c b/loop.c
index 9e91438..aa3f458 100644
--- a/loop.c
+++ b/loop.c
@@ -39,7 +39,7 @@ int port;
 void
 ircd(void)
 {
-	size_t i, j, k;
+	size_t i;
 	struct sockaddr_in addr, clientaddr;
 	int res, sfd, client;
 	nfds_t passed;
@@ -123,32 +123,6 @@ loop:
 		if (!(peers[i].flags & DELETE))
 			continue;
 
-		if (peers[i].type)
-			writef(
-				peers[i].fd,
-				":%s!%s@%s QUIT",
-				getnick(&peers[i]),
-				peers[i].user,
-				peers[i].host
-			);
-		for (j = 0; j < peers[i].channels_c; ++j)
-		{
-			channel_exit(peers[i].channels[j], &peers[i]);
-			if (peers[i].type) for (k = 0; k < peers[i].channels[j]->users_c; ++k)
-				peers[i].channels[j]->users[k]->flags |= ANNOUNCE;
-		}
-		for (j = 0; j < peers_c; ++j)
-			if (peers[j].flags & ANNOUNCE)
-			{
-				writef(
-					peers[j].fd,
-					":%s!%s@%s QUIT",
-					getnick(&peers[i]),
-					peers[i].user,
-					peers[i].host
-				);
-				peers[j].flags &= ~ANNOUNCE;
-			}
 		writef(peers[i].fd, "ERROR :Closing Link: %s", peers[i].host);
 		close(peers[i].fd);
 		user_remove(i);