diff options
Diffstat (limited to 'handle.c')
| -rw-r--r-- | handle.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/handle.c b/handle.c index 9e8cb5f..76f0a32 100644 --- a/handle.c +++ b/handle.c @@ -24,9 +24,12 @@ #include <err.h> +static int names(struct Message *msg, struct Peer *peer); + static int join(struct Message *msg, struct Peer *peer) { + struct Message namesmsg; size_t i; char *cp; @@ -46,6 +49,7 @@ join(struct Message *msg, struct Peer *peer) for (i = 0; i < peer->channels_c; ++i) ensure(strcmp(channels[i].name, msg->params[0]), (void)0, 0); + namesmsg = (struct Message){ .params = { msg->params[0] } }; for (i = 0; i < channels_c; ++i) { if (strcmp(channels[i].name, msg->params[0])) @@ -53,12 +57,15 @@ join(struct Message *msg, struct Peer *peer) if (channel_join(&channels[i], peer)) reply(peer, 471); + else + names(&namesmsg, peer); return 0; } channels[channels_c] = (struct Channel){0}; strlcpy(channels[channels_c].name, msg->params[0], sizeof(channels->name)); channel_join(&channels[channels_c++], peer); + names(&namesmsg, peer); return 0; } @@ -103,6 +110,38 @@ mode(struct Message *msg, struct Peer *peer) } static int +names(struct Message *msg, struct Peer *peer) +{ + static char buf[MESSAGE_MAX]; + size_t i, j; + + for (i = 0; i < peer->channels_c; ++i) + { + if (msg->params[0] && strcmp(msg->params[0], peer->channels[i]->name)) + continue; + + memset(buf, 0, sizeof(buf)); + for (j = 0; j < peer->channels[i]->users_c; ++j) + { + strlcat(buf, peer->channels[i]->users[j]->nick, sizeof(buf)); + if (strlen(buf) >= MESSAGE_MAX - 4*PEER_NICK_MAX) + { + reply(peer, 353, peer->channels[i]->name, buf); + memset(buf, 0, sizeof(buf)); + } else + { + strlcat(buf, " ", sizeof(buf)); + } + } + if (*buf) + reply(peer, 353, peer->channels[i]->name, buf); + } + + reply(peer, 366, msg->params[0] ? msg->params[0] : "*"); + return 0; +} + +static int nick(struct Message *msg, struct Peer *peer) { size_t i; @@ -380,6 +419,7 @@ static struct Handler { { { "join", join }, { "mode", mode }, + { "names", names }, { "nick", nick }, { "notice", privmsg }, { "part", part }, |