diff options
| -rw-r--r-- | handle.c | 34 | ||||
| -rw-r--r-- | 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); |