From 62f4f17989622a91aa39834b73d4e527a96ce211 Mon Sep 17 00:00:00 2001 From: Nakidai Date: Wed, 7 Jan 2026 00:43:50 +0300 Subject: Move quit announcement code to quit() Well, it's more appropriate for that function to handle this rather than for ircd(). Now code looks simpler, ircd() is not that complex, and support for optional quit message is present --- handle.c | 34 ++++++++++++++++++++++++++++++++++ loop.c | 28 +--------------------------- 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); -- cgit 1.4.1