aIRC — File Browser

aIRCv0.8.69 / aIRCv0.8.69 / script / bans.mrc

bans.mrc — 10.36 KB — Download this file

;/**********************************************************************
; *
; * aIRC
; * Bans
; *
; **********************************************************************/

ON *:CONNECT:{ hdel -w _aircjunk clearchanbans_* }
ON *:DISCONNECT:{ hdel -w _aircjunk clearchanbans_* }
ON ME:*:JOIN:#:{ _setd junk clearchanbans $chan 0 }
raw 367:*:{
  if ($istok(%c.rebans.c,$2,32)) { halt }
}
raw 368:*:{
  if ($istok(%c.rebans.c,$2,32)) {
    %c.rebans.c = $remtok(%c.rebans.c,$2,32)
    if (%c.rebans.c == $null) { unset %c.rebans.c }
    _ban.chexpire $2
    if ($me isop $2) {
      var %chan = $2,%win = @__banscheck $+ $2,%file = $_baninifile,%i,%line,%hostmask,%seton,%duration,%bantime,%dynamicbans = $iif($_rchini(dynamicbans,%chan),1,0)
      _openwins %win
      filter -fw $"(%file) %win %chan *
      filter -fw $"(%file) %win global *
      %i = $line(%win,0)
      while (%i) {
        var %line = $line(%win,%i),%hostmask = $gettok(%line,2,32),%seton = $gettok(%line,4,32),%duration = $gettok(%line,5,32),%reason = $gettok(%line,8-,32),%bantime = $calc(%seton + %duration - $ctime)
        if (%bantime > 9999999) { %bantime = 9999999 }
        if (%duration) && (%bantime > 0) {
          if ($_ischanban(%hostmask,%chan)) { .timer_UNBAN $+ %chan $+ , $+ %hostmask 1 %bantime _raw.unban %chan %hostmask }
          else { _addbaninchanbutcheckdynamic %dynamicbans %chan %hostmask %bantime %reason }
        }
        elseif ($_not($_ischanban(%hostmask,%chan))) { _addbaninchanbutcheckdynamic %dynamicbans %chan %hostmask 0 %reason }
        dec %i
      }
      close -@ %win
      if ($_prot.chansetting(cuenforcebans,30,1,%chan)) { enforcebans %chan }
      if ($_rchini(clearbans,%chan)) && ($_not($_get(junk,clearchanbans,%chan))) { _clearchanbans %chan }
    }
    halt
  }
}
; _addbaninchanbutcheckdynamic <dynamic? 1|0> <chan> <hostmask> <bantime> <reason>
alias _addbaninchanbutcheckdynamic {
  if ($1 == 0) || (($1) && ($ialchan($3,$2,0))) {
    if ($4) { kb -u $+ $4 $2 $3 $5- }
    else { kb $2 $3 $5- }
  }
}
; /_clearchanbans #channel
alias _clearchanbans {
  var %chan = $1,%i,%t
  if ($me !isop %chan) { return }
  %i = $ibl(%chan,0)
  while (%i) {
    %t = $ibl(%chan,%i)
    if ($gettok($ibl(%chan,%i).by,1,33) !isop %chan) && ($_not($_isban(%t,%chan))) { ban -r %chan %t }
    dec %i
  }
  _setd junk clearchanbans %chan 1
}
; /enforcebans #channel
alias enforcebans {
  if ($_disconnected) { return }
  var %chan = $_parameter($iif($1,$1,#),1,Enforce Channel Bans [/enforcebans],ischan,$null,Channel:),%banmask,%banner,%i,%nick,%fulladdress,%k,%bans
  if ($_iamnotop4com(%chan,enforcebans)) { return }
  if ($chan(%chan).ial != $true) {
    error.a IAL for %chan is not full yet... Please try again later.
    return
  }
  if ($_not($ibl(%chan,0))) {
    if ($show) { info.w %chan No bans to enforce in %chan }
    return
  }
  %bans = $ibl(%chan,0)
  while (%bans) {
    var %banmask = $ibl(%chan,%bans),%banner = $gettok($ibl(%chan,%bans).by,1,33)
    %i = $ialchan(%banmask,%chan,0)
    while (%i) {
      inc %k
      var %fulladdress = $ialchan(%banmask,%chan,%i),%nick = $gettok(%fulladdress,1,33)
      .timerENFORCEBAN $+  , $+ %chan $+ , $+ %banmask $+ , $+ %nick 1 $r(3,5) _prot.enforceban %chan %banmask %banner %nick %fulladdress
      dec %i
    }
    dec %bans
  }
  %bans = $ibl(%chan,0)
  if (%k) { info.w %chan Enforcing bans in %chan $+ : $_nsingoplur(%bans,ban,bans) found, kicking $_nsingoplur(%k,user,users) }
  else { info.w %chan Enforcing bans in %chan $+ : $_nsingoplur(%bans,ban,bans) found, no users to kick }
}
ON me:*:PART:#:{ .timer_UNBAN $+ $chan $+ ,* off }
ON *:KICK:#:{
  if ($knick == $me) { .timer_UNBAN $+ $chan $+ ,* off }
}
ON *:BAN:#:{
  var %line,%index,%file = $_baninifile
  %index = $chan $banmask
  %line = $read -ns" $+ %index $+ " %file
  if (%line) { write -l $+ $readn $"(%file) $chan $puttok(%line,$ctime,5,32) }
  %index = global $banmask
  %line = $read -ns" $+ %index $+ " %file
  if (%line) { write -l $+ $readn $"(%file) global $puttok(%line,$ctime,5,32) }
}
ON *:UNBAN:#:{ .timer_UNBAN $+ $chan $+ , $+ $banmask off }
ON *:DISCONNECT:{ .timer_UNBAN* off }
alias _ban.chexpire {
  var %win = @__banchexpire,%file = $_baninifile,%line,%seton,%duration,%changlobal,%hostmask,%chan
  _openwins %win
  filter -fw $"(%file) %win $1 *
  if ($_ischan($1)) { filter -fw $"(%file) %win global * }
  var %i = $line(%win,0)
  while (%i) {
    %line = $line(%win,%i)
    %chan = $iif($_ischan($gettok(%line,1,32)),$gettok(%line,1,32))
    %hostmask = $gettok(%line,2,32)
    %seton = $gettok(%line,4,32)
    %duration = $gettok(%line,5,32)
    if (%duration) {
      if ($ctime > $calc(%seton + %duration)) { .-ban %hostmask $iif(%chan,%chan) }
    }
    dec %i
  }
  close -@ %win
}
alias _start.bans {
  var %win = @__banstart,%file = $_baninifile,%line,%seton,%duration,%changlobal,%hostmask,%chan
  _ban.chexpire *
  _openwins %win
  filter -fw $"(%file) %win *
  var %i = $line(%win,0)
  while (%i) {
    %line = $line(%win,%i)
    %chan = $iif($_ischan($gettok(%line,1,32)),$gettok(%line,1,32))
    %hostmask = $gettok(%line,2,32)
    %seton = $gettok(%line,4,32)
    %duration = $gettok(%line,5,32)
    if (%duration) && (%bantime > 0) { .timer_-ban $+ $iif(%chan,%chan,global) $+ , $+ %hostmask 1 %bantime -ban %hostmask %chan }
    dec %i
  }
  close -@ %win
  _rehashbaninifile
}
;;
;
; /unban [#channel] [mask] [-n[ick] banner] [-f[irst] N] [-l[ast] N] [-b[efore] ctime] [-a[fter] ctime]
;
alias unban {
  var %d = _unban,%chan,%banner,%first,%last,%after,%before,%mask,%i = 1,%n,%ban,%by,%date,%win1 = @__unban1,%win2 = @__unban2,%win3 = @__unban3,%fff = 1
  if ($_ischan($1)) {
    %chan = #$1
    tokenize 32 $2-
  }
  else { %chan = $chan }
  if (-* !iswm $1) {
    %mask = $1
    tokenize 32 $2-
  }
  if (%chan != $null) {
    if ($_iamnotop4com(%chan,unban)) { return }
    if ($chan(%chan).ibl != $true) {
      error.a Ban list for $^'(%chan) isn´t full yet...
      return
    }
  }
  %banner = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-n*,1,32),1,32) + 1),32)
  %first = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-f*,1,32),1,32) + 1),32)
  %last = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-l*,1,32),1,32) + 1),32)
  %after = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-a*,1,32),1,32) + 1),32)
  %before = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-b*,1,32),1,32) + 1),32)
  if (-* iswm %banner) || (%banner == $null)  { %banner = * }
  if (-* iswm %first) || ($_not($_isint(%first))) { var %first }
  if (-* iswm %last) || ($_not($_isint(%last))) { var %last }
  if (-* iswm %after) || ($_not($_isint(%after))) { var %after }
  if (-* iswm %before) || ($_not($_isint(%before))) { var %before }

  if (%chan == $null) || (($_not($_ismask(%mask))) && ($_not(%first)) && ($_not(%last)) && ($_not(%after)) && ($_not(%before))) {
    if ($_not($_ismask(%mask))) { %mask = * }
    _dialog -m %d %d
    did -o %d 1002 1 %chan
    did -o %d 1004 1 $_fixmask(%mask)
    did -o %d 1006 1 %banner
    did -o %d 1012 1 %first
    did -o %d 1014 1 %last
    _unban.rdialog
    return
  }
  if (%last) || (%first) || (%after) || (%before) { %fff = 0 }
  if ($_not($_ismask(%mask))) { %mask = * }
  %mask = $_fixmask(%mask)
  %n = $ibl(%chan,0)
  close -@ %win1
  window -hls %win1
  _openwins %win2 %win3
  while (%i <= %n)  {
    var %ban = $_fixmask($ibl(%chan,%i)),%by = $ibl(%chan,%i).by,%date = $ibl(%chan,%i).ctime
    if ($_not($_isnum(%date))) { %date = $ctime }
    if (%banner iswm %by) && (%mask iswm %ban) { aline %win1 %fff %date %by %ban }
    inc %i
  }
  filter -ww %win1 %win2 *
  if ($_not(%fff)) {
    %n = $line(%win2,0)
    if (%first)  {
      %i = 1
      while (%i <= %n) && (%i <= %first) {
        rline %win2 %i 1 $gettok($line(%win2,%i),2-,32)
        inc %i
      }
    }
    if (%last)  {
      %i = %n
      while (%i) && (%i >= $calc(%n - %last + 1)) {
        rline %win2 %i 1 $gettok($line(%win2,%i),2-,32)
        dec %i
      }
    }
    if (%after) || (%before) {
      %i = 1
      while (%i <= %n) {
        %date = $gettok($line(%win2,%i),2,32)
        if ((%after)  && (%date > %after)) || ((%before) && (%date < %before)) { rline %win2 %i 1 $gettok($line(%win2,%i),2-,32) }
        inc %i
      }
    }
  }
  filter -ww %win2 %win3 1 *
  %i = 1
  %n = $line(%win3,0)
  if (0) { }
  else {
    while (%i <= %n) {
      if ($gettok($line(%win3,%i),4,32) != $null) { _raw.unban %chan $ifmatch }
      inc %i
    }
  }
  close -@ %win1 %win2 %win3
}
dialog _unban {
  size -1 -1 120 127
  title "Remove Bans [/unban]"
  option dbu

  box "Remove Bans...",1000,5 5 110 55
  text "in channel:",1001,10 15 30 10
  edit "",1002,40 13 70 10,autohs
  text "matching:",1003,10 30 30 10
  edit "",1004,40 28 70 10,autohs
  text "set by:",1005,10 45 30 10
  edit "",1006,40 43 70 10,autohs

  box "Options",1010,5 65 110 40
  text "First:",1011,10 75 30 10
  edit "",1012,40 73 70 10,autohs
  text "Last:",1013,10 90 30 10
  edit "",1014,40 88 70 10,autohs

  button "Help",2991,5 110 30 15,disable
  button "Unban",2992,45 110 30 15,ok
  button "Cancel",2993,85 110 30 15,cancel
}
ON *:DIALOG:_unban:*:*:{
  if ($devent == init) {
    _mdx.init $_icofile(unban.ico)
    _dummy $_lang.loaddialog($dname,$dname,00086969,main.lang,$scriptdir)
  }
  elseif ($devent == sclick) && ($did == 2992) {
    var %d = _unban,%chan = $did(%d,1002,1),%match = $did(%d,1004,1),%banner = $did(%d,1006,1),%first = $did(%d,1012,1),%last = $did(%d,1014,1),%parms
    if ($me isop %chan) && ($_ismask(%match)) {
      %parms = %chan $_fixmask(%match)
      if (-* !iswm $gettok(%banner,1,32)) && ($gettok(%banner,1,32) != $null) { %parms = %parms -n $ifmatch }
      if ($_isint(%first)) { %parms = %parms -f $ifmatch }
      if ($_isint(%last)) { %parms = %parms -l $ifmatch }
      unban %parms
    }
  }
  _unban.rdialog
}
alias _unban.rdialog {
  var %d = _unban
  if ($dialog(%d)) {
    if ($me !isop $did(%d,1002,1)) || ($_not($_ismask($did(%d,1004)))) { did -b %d 2992 }
    else { did -e %d 2992 }
  }
}
alias _rehashbaninifile {
  _hmake _aircinternalbanlist 30
  var %i = 1,%n,%win = @__rehashbaninifile
  _openwins %win
  loadbuf %win " $+ $_baninifile $+ "
  %n = $line(%win,0)
  while (%i <= %n) {
    hadd _aircinternalbanlist %i $gettok($line(%win,%i),1-2,32)
    inc %i
  }
  close -@ %win
}