예제 #1
0
파일: flags.c 프로젝트: Mafaioz/wraith
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;
}
예제 #2
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);
}