summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c22
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;
 }