int chk_autoop(struct flag_record fr, struct chanset_t *chan) { if (glob_bot(fr)) return 0; if (!chan || (!channel_take(chan) && !privchan(fr, chan, PRIV_OP) && chk_op(fr, chan) && !chk_deop(fr, chan))) { if (channel_autoop(chan) || chan_autoop(fr) || glob_autoop(fr)) return 1; } return 0; }
static void got_op(struct chanset_t *chan, char *nick, char *from, char *who, struct userrec *opu, struct flag_record *opper) { memberlist *m; char ch[sizeof chan->name]; char s[UHOSTLEN]; struct userrec *u; int check_chan = 0, snm = chan->stopnethack_mode; m = ismember(chan, who); if (!m) { if (channel_pending(chan)) return; putlog(LOG_MISC, chan->dname, CHAN_BADCHANMODE, chan->dname, who); chan->status |= CHAN_PEND; refresh_who_chan(chan->name); return; } /* Did *I* just get opped? */ if (!me_op(chan) && match_my_nick(who)) check_chan = 1; strcpy(ch, chan->name); simple_sprintf(s, "%s!%s", m->nick, m->userhost); if (!m->user) u = get_user_by_host(s); else u = m->user; get_user_flagrec(u, &victim, chan->dname); /* Flags need to be set correctly right from the beginning now, so that * add_mode() doesn't get irritated. */ m->flags |= CHANOP; check_tcl_mode(nick, from, opu, chan->dname, "+o", who); if (!(chan = modebind_refresh(ch, from, opper, s, &victim)) || !(m = ismember(chan, who))) return; /* Added new meaning of WASOP: * In mode binds it means: was the user an op before got (de)opped. A script * now can use [wasop nick chan] to check if user was op or wasnt. * (drummer) */ m->flags &= ~SENTOP; if (channel_pending(chan)) return; if (nick[0] && HALFOP_CANDOMODE('o') && !match_my_nick(who) && !match_my_nick(nick)) { if (channel_bitch(chan) && !(glob_master(*opper) || glob_bot(*opper)) && !chan_master(*opper) && !(glob_op(victim) || glob_bot(victim)) && !chan_op(victim)) add_mode(chan, '-', 'o', who); else if ((chan_deop(victim) || (glob_deop(victim) && !chan_op(victim))) && !glob_master(*opper) && !chan_master(*opper)) add_mode(chan, '-', 'o', who); else if (reversing) add_mode(chan, '-', 'o', who); } else if (reversing && HALFOP_CANDOMODE('o') && !match_my_nick(who) && !match_my_nick(nick)) add_mode(chan, '-', 'o', who); if (!nick[0] && HALFOP_CANDOMODE('o') && !match_my_nick(who)) { if (chan_deop(victim) || (glob_deop(victim) && !chan_op(victim))) { m->flags |= FAKEOP; add_mode(chan, '-', 'o', who); } else if (snm > 0 && snm < 7 && !((channel_autoop(chan) || glob_autoop(victim) || chan_autoop(victim)) && (chan_op(victim) || (glob_op(victim) && !chan_deop(victim)))) && !glob_exempt(victim) && !chan_exempt(victim)) { if (snm == 5) snm = channel_bitch(chan) ? 1 : 3; if (snm == 6) snm = channel_bitch(chan) ? 4 : 2; if (chan_wasoptest(victim) || glob_wasoptest(victim) || snm == 2) { if (!chan_wasop(m)) { m->flags |= FAKEOP; add_mode(chan, '-', 'o', who); } } else if (!(chan_op(victim) || (glob_op(victim) && !chan_deop(victim)))) { if (snm == 1 || snm == 4 || (snm == 3 && !chan_wasop(m))) { add_mode(chan, '-', 'o', who); m->flags |= FAKEOP; } } else if (snm == 4 && !chan_wasop(m)) { add_mode(chan, '-', 'o', who); m->flags |= FAKEOP; } } } m->flags |= WASOP; if (check_chan) recheck_channel(chan, 1); }