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