From: B.Greenham Date: Sun, 4 Apr 2010 19:32:34 +0000 (-0400) Subject: Update omode so that it can set +ah. X-Git-Tag: shadowircd-6.1.0~15^2~2 X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/commitdiff_plain/46a30dbe861f133bebde28328db91cf376026d5c Update omode so that it can set +ah. --- diff --git a/extensions/m_omode.c b/extensions/m_omode.c index f80e262..451b627 100644 --- a/extensions/m_omode.c +++ b/extensions/m_omode.c @@ -124,7 +124,24 @@ mo_omode(struct Client *client_p, struct Client *source_p, int parc, const char set_channel_mode(client_p, source_p->servptr, chptr, msptr, parc - 2, parv + 2); #else - if (parc == 4 && !strcmp(parv[2], "+o") && !irccmp(parv[3], source_p->name)) + if (parc == 4 && !strcmp(parv[2], "+a") && !irccmp(parv[3], source_p->name)) + { + /* Admining themselves */ + if (!wasonchannel) + { + sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL, + form_str(ERR_USERNOTINCHANNEL), parv[3], chptr->chname); + return 0; + } + sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +a %s", + me.name, parv[1], source_p->name); + sendto_server(NULL, chptr, CAP_TS6, NOCAPS, + ":%s TMODE %ld %s +a %s", + me.id, (long) chptr->channelts, parv[1], + source_p->id); + msptr->flags |= CHFL_ADMIN; + } + else if (parc == 4 && !strcmp(parv[2], "+o") && !irccmp(parv[3], source_p->name)) { /* Opping themselves */ if (!wasonchannel) @@ -141,11 +158,28 @@ mo_omode(struct Client *client_p, struct Client *source_p, int parc, const char source_p->id); msptr->flags |= CHFL_CHANOP; } - else + else if (parc == 4 && !strcmp(parv[2], "+h") && !irccmp(parv[3], source_p->name)) + { + /* Halfopping themselves */ + if (!wasonchannel) + { + sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL, + form_str(ERR_USERNOTINCHANNEL), parv[3], chptr->chname); + return 0; + } + sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +h %s", + me.name, parv[1], source_p->name); + sendto_server(NULL, chptr, CAP_TS6, NOCAPS, + ":%s TMODE %ld %s +h %s", + me.id, (long) chptr->channelts, parv[1], + source_p->id); + msptr->flags |= CHFL_HALFOP; + } + else if (ConfigChannel.use_admin) { /* Hack it so set_channel_mode() will accept */ if (wasonchannel) - msptr->flags |= CHFL_CHANOP; + msptr->flags |= CHFL_ADMIN; else { add_user_to_channel(chptr, source_p, CHFL_CHANOP); @@ -156,6 +190,27 @@ mo_omode(struct Client *client_p, struct Client *source_p, int parc, const char /* We know they were not opped before and they can't have opped * themselves as set_channel_mode() does not allow that * -- jilles */ + if (wasonchannel) + msptr->flags &= ~CHFL_ADMIN; + else + remove_user_from_channel(msptr); + } + else + { + /* CHFL_ADMIN is only useful if admin is enabled + * so hack it with op if it is not. */ + if (wasonchannel) + msptr->flags |= CHFL_CHANOP; + else + { + add_user_to_channel(chptr, source_p, CHFL_CHANOP); + msptr = find_channel_membership(chptr, source_p); + } + set_channel_mode(client_p, source_p, chptr, msptr, + parc - 2, parv + 2); + /* We know they were not opped before and they can't have opped + * themselves as set_channel_mode() does not allow that + * -- jilles */ if (wasonchannel) msptr->flags &= ~CHFL_CHANOP; else