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.c34
1 files changed, 34 insertions, 0 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;
 }