summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/handle.c b/handle.c
index b99e82d..fb08f73 100644
--- a/handle.c
+++ b/handle.c
@@ -24,6 +24,9 @@
 #include <err.h>
 
 
+static struct Oper opers[OPERS_MAX];
+size_t opers_c;
+
 static int names(struct Message *msg, struct Peer *peer);
 
 static int
@@ -192,6 +195,26 @@ nick(struct Message *msg, struct Peer *peer)
 }
 
 static int
+oper(struct Message *msg, struct Peer *peer)
+{
+	size_t i;
+
+	ensure(peer->type, reply(peer, 451), 0);
+	ensure(msg->params[0] && *msg->params[0], reply(peer, 461), 0);
+	ensure(msg->params[1] && *msg->params[1], reply(peer, 464), 0);
+
+	for (i = 0; i < opers_c; ++i)
+		if (!strcmp(opers[i].nick, msg->params[0]))
+			break;
+	ensure(i != opers_c && !strcmp(opers[i].pass, msg->params[1]), reply(peer, 464), 0);
+
+	peer->modes |= OPER;
+	reply(peer, 381);
+
+	return 0;
+}
+
+static int
 part(struct Message *msg, struct Peer *peer)
 {
 	size_t i;
@@ -343,6 +366,38 @@ setinfo(struct Message *msg, struct Peer *peer)
 }
 
 static int
+setoper(struct Message *msg, struct Peer *peer)
+{
+	size_t i;
+
+	ensure(peer->type == CONFIG, reply(peer, 481, "You're not a config file"), 0);
+	ensure(msg->params[0] && *msg->params[0], reply(peer, 461), 0);
+	ensure(msg->params[1], reply(peer, 461), 0);
+	ensure(
+		!*msg->params[1] || *msg->params[1] && opers_c < OPERS_MAX,
+		reply(peer, 420, msg->params[0]),
+		0
+	);
+
+	for (i = 0; i < opers_c; ++i)
+		if (!strcmp(opers[i].nick, msg->params[0]))
+			break;
+
+	if (*msg->params[1])
+	{
+		++opers_c;
+		strlcpy(opers[i].nick, msg->params[0], sizeof(opers->pass));
+		strlcpy(opers[i].pass, msg->params[1], sizeof(opers->pass));
+	}
+	else if (i < PEERS_MAX)
+	{
+		opers[i] = opers[--opers_c];
+	}
+
+	return 0;
+}
+
+static int
 user(struct Message *msg, struct Peer *peer)
 {
 	size_t i;
@@ -422,6 +477,7 @@ static struct Handler {
 	{ "names", names },
 	{ "nick", nick },
 	{ "notice", privmsg },
+	{ "oper", oper },
 	{ "part", part },
 	{ "ping", ping },
 	{ "pong", pong },
@@ -429,6 +485,7 @@ static struct Handler {
 	{ "quit", quit },
 	{ "setcreation", setcreation },
 	{ "setinfo", setinfo },
+	{ "setoper", setoper },
 	{ "user", user },
 	{ "whois", whois },
 };