; Max percentage of caps
alias max.caps.per return 80
; <WORDS>:<LENGTH> - whichever takes effect first
alias min.caps.len return 3:20
; Max caps strikes allowed
alias max.caps.strikes return 3

alias caps {
  var %num = $numtok($1-,32),%y = 1,%u,%alpha,%pos
  while (%y <= %num) {
    var %1 = $gettok($1-,%y,32)
    var %x = 1
    while ($mid(%1,%x,1)) {
      var %letter = $v1
      if (%letter isletter) inc %alpha
      if (%letter isupper) { 
        inc %u
        if ($prop == p) var %pos = %pos $+(%y,:,%x)
      }
      inc %x
    }
    inc %y
  }
  var %t = $ceil($calc((%u / %alpha)*100))
  ; <CAPS>:<LETTERS>[:WORDS]
  if ($prop == r) return $+(%u,:,%alpha) $+ $iif(%num > 1,: $+ %num)
  ; <LETTER POSITION>:<WORD NUMBER>
  if ($prop == p) return %pos
  return %t
}
alias capsx return $round($calc(($regex($1-,/[A-Z]/g) / $len($remove($1-,$chr(32))))*100),1)

/*
alias acc.num {
  if ($1 ischan) {
    if ($2 ison $1) {
      var %pre = $remove($nick($1,$2).pnick,$2)
      ; 0 = Reg; 1 = Voice; 2 = HOp; 3 = Op; 4 = SOp; 5 = Founder
      if ($prop == pre) return %pre
      if ($prop == p) return $left(%pre,1) 
      if (~ isin %pre) || ($1 isowner $2) return 5
      elseif (& isin %pre) return 4
      elseif (@ isin %pre) || ($1 isop $2) return 3
      elseif (% isin %pre) || ($1 ishop $2) return 2
      elseif (+ isin %pre) || ($1 isvo $2) return 1
      else return 0
    }
  }
}
*/
on *:text:*:#:{
  var %max.words = $gettok($min.caps.len,1,58),%max.len = $gettok($min.caps.len,2,58)
  if ($numtok($1-,32) >= %max.words) || ($len($1-) >= %max.len) {
    if ($caps($1-) > $max.caps.per) {
      var %def = $+(caps,.,$chan,.,$nick)
      inc -u15 $+(%,%def)
      if ($($+(%,%def),2) >= $max.caps.strikes) {
        set -u0 $+(%,%def) 0
        if ($acc.num($me) >= 2) || (o isincs $usermode) {
          ban -u120 $chan $address($nick,2)
          if ($acc.num($me) != 2) && ($acc.num($nick) != 2) {
            kick $chan $nick Capslock violation - $+($iif($caps($1-) < 100,$calc(100- $caps($1-)),100),%) over the limit - 2 minute ban
          }
        }
        else echo $color(info) -t $chan * $nick is flooding *
      }
    }
  }
}

###############################################################

alias unban {
  var %n = 1,%bans
  while ($ibl($1,%n)) {
    var %b = $v1
    if ($$2 isin %b) var %bans = %bans %b 
    inc %n
  }
  ; %bans
}
