summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/handle.c b/handle.c
index c825ec6..31a11c1 100644
--- a/handle.c
+++ b/handle.c
@@ -74,12 +74,19 @@ join(struct Message *msg, struct Peer *peer)
 }
 
 static int
-mode(struct Message *msg, struct Peer *peer)
+mode_channel(struct Message *msg, struct Peer *peer)
+{
+	(void)msg;
+	(void)peer;
+	return 0;
+}
+
+static int
+mode_peer(struct Message *msg, struct Peer *peer)
 {
 	int set = 1, m;
 
-	ensure(peer->type, reply(peer, 451), 0);
-	ensure(msg->params[0] && *msg->params[0], reply(peer, 431), 0);
+	ensure(!strcmp(msg->params[0], peer->nick), reply(peer, 502, msg->params[0]), 0);
 	ensure(msg->params[1] && *msg->params[1], reply(peer, 221), 0);
 
 	switch (*msg->params[1])
@@ -104,7 +111,7 @@ mode(struct Message *msg, struct Peer *peer)
 
 			if (set && !(m & (OPER | LOCALOPER)))
 				peer->modes |= m;
-			else if (!(m & RESTRICTED))
+			else if (!set && !(m & RESTRICTED))
 				peer->modes &= ~m;
 		}
 	}
@@ -114,6 +121,19 @@ mode(struct Message *msg, struct Peer *peer)
 }
 
 static int
+mode(struct Message *msg, struct Peer *peer)
+{
+	ensure(peer->type, reply(peer, 451), 0);
+	ensure(msg->params[0] && *msg->params[0], reply(peer, 431), 0);
+
+	switch (*msg->params[0])
+	{
+	break; case '#': case '!': case '+': case '&': return mode_channel(msg, peer);
+	break; default: return mode_peer(msg, peer);
+	}
+}
+
+static int
 names(struct Message *msg, struct Peer *peer)
 {
 	static char buf[MESSAGE_MAX];