diff options
Diffstat (limited to 'handle.c')
| -rw-r--r-- | handle.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/handle.c b/handle.c index 31a11c1..ecbde08 100644 --- a/handle.c +++ b/handle.c @@ -76,8 +76,26 @@ join(struct Message *msg, struct Peer *peer) static int mode_channel(struct Message *msg, struct Peer *peer) { - (void)msg; - (void)peer; + enum ChannelPeerMode modes; + struct Channel *channel; + size_t i; + + for (i = 0; i < channels_c; ++i) + if (!strcmp(channels[i].name, msg->params[0])) + break; + ensure(i != channels_c, reply(peer, 403, msg->params[0]), 0); + channel = &channels[i]; + + ensure(msg->params[1] && *msg->params[1], reply(peer, 324, channel->name, ""), 0); + + for (i = 0; i < channel->peers_c; ++i) + if (channel->peers[i].p->fd == peer->fd) + break; + ensure(i != channel->peers_c, reply(peer, 482, channel->name), 0); + modes = channel->peers[i].modes; + + ensure(modes & CHANNEL_OPER || peer->modes & OPER, reply(peer, 482, channel->name), 0); + return 0; } |