diff options
Diffstat (limited to 'handle.c')
| -rw-r--r-- | handle.c | 79 |
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 }, |