diff options
Diffstat (limited to 'handle.c')
| -rw-r--r-- | handle.c | 57 |
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 }, }; |