; #= P&P -rs
; ########################################
; Peace and Protection
; Notice and mass-message routines
; ########################################

;
; Notices windows
;
on *:INPUT:@Events*:_getcc | if (($left($1,1) != %.cmdchar) || (?me iswm $1) || ($mouse.key & 2)) { onotice $mid($target,$calc($pos($target,-,1) + 1)) $1- | halt }
on *:INPUT:@Notices*:_getcc | if ($left($1,1) == %.cmdchar) { .timer -mo 1 0 editbox -p $active $iif($istok(n msg notice onotice ohnotice ovnotice omsg,$right($1,-1),32),$1-2,$1) | if (?notice iswm $1) { ntc $2- | halt } }
menu @Notices {
  Text options...:textopt
}

;
; Recent notices (includes onotice support) also notice flood support
;
on ^*:NOTICE:*:*:{
  if (($level($fulladdress) == $dlevel) && (!$_isserv($nick))) {
    if ($hget(pnp.flood. $+ $cid,noticehalt.mass)) { hadd -u60 pnp.flood. $+ $cid noticehalt.mass 1 | halt }
    if ($hget(pnp.flood. $+ $cid,noticehalt. $+ $site)) { hadd -u60 pnp.flood. $+ $cid noticehalt. $+ $site 1 | halt }
    if ($hget(pnp.flood. $+ $cid,noticemass)) {
      if ($_genflood(notice.mass,$hget(pnp.config,xnotice.cfg))) {
        hadd -u60 pnp.flood. $+ $cid noticehalt.mass 1
        hadd -u60 pnp.flood. $+ $cid noticemass 1
        var %site = (all)
        _alert Flood Notice flood detected- Further notices from %site won't be shown
        halt
      }
    }
    if ($_genflood(notice. $+ $site,$hget(pnp.config,xnotice.cfg))) {
      hadd -u60 pnp.flood. $+ $cid noticehalt. $+ $site 1
      hadd -u60 pnp.flood. $+ $cid noticemass 1
      _alert Flood Notice flood detected- Further notices from $site won't be shown
      halt
    }
  }
  if (($target ischan) || ($1 == DCC)) return
  if (((@* iswm $target) && (@%* !iswm $target) && (@+* !iswm $target)) || (%.opnotice)) _recseen 10 notice $right($target,-1) +
  else _recseen 10 notice $nick
}

;
; Notice msg formatting
;
alias _naction if ($gettok($1,1,32) == /me) return * $me $gettok($1-,2-,32) | else return $1-
alias _mnmsg {
  var %msg = $_msg($1)
  if (&msg& !isin %msg) %msg = %msg &msg&
  if ($me ison $2) return $msg.compile(%msg,&chan&,$2,&ops&,$nick($2,0,o),&hops&,$nick($2,0,h),&vocs&,$nick($2,0,v),&users&,$nick($2,0),&ohs&,$nick($2,0,oh),&ovs&,$nick($2,0,ohv),&nops&,$nick($2,0,r),&msg&,$_naction($3-))
  else return $msg.compile(%msg,&chan&,$2,&ops&,??,&hops&,??,&vocs&,??,&users&,??,&ohs&,??,&ovs&,??,&nops&,??,&msg&,$_naction($3-))
}
alias _abmsg {
  var %msg = $_msg($1)
  if (&msg& !isin %msg) %msg = %msg &msg&
  return $msg.compile(%msg,&chan&,$2,&nick&,$3,&targets&,$calc($nick($2,0) - $numtok($3,44)),&msg&,$_naction($4-))
}
alias _pvmsg {
  var %msg = $_msg($1)
  if (&msg& !isin %msg) %msg = %msg &msg&
  return $msg.compile(%msg,&nick&,$2,&targets&,$3,&msg&,$_naction($4-))
}

;
; Mass notices (op/etc)
;

; Used to send a notice, shows to @Notices/@Events-* if active, else channel window
; _show.send.notice #chan target text
alias -l _show.send.notice {
  set -u %::text $3-
  set -u %::target $2
  set -u %::nick $me
  set -u %::address $gettok($hget(pnp. $+ $cid,-myself),2-,33)
  set -u %::chan $1
  set -u %:echo echo $color(own) $iif((@Notices* iswm $active) || (@Events* iswm $active),-qati2,-qti2 $1)
  theme.text NoticeSelfChan c
}

alias o onotice $1-
alias wall onotice $1-
alias onotice {
  if ($1 == $null) _qhelp /onotice | _simsplit mn /onotice $1- | if (%.msg.mn == $null) _qhelp /onotice $1-
  if ($len(%.msg.mn) > 300) _error Please use a smaller message.You must enter a message under 300 characters for mass notices.
  if ($me !ison %.chan.mn) _error Please specify a channel you are in.You cannot send mass notices to channels you are not currently in.
  var %sendto,%target = @ $+ %.chan.mn,%send = $_mnmsg(onotice,%.chan.mn,%.msg.mn)
  _show.send.notice %.chan.mn @ $+ %.chan.mn %send
  if ((@ isin $hget(pnp. $+ $cid,-feat)) && (($me isop %.chan.mn) || (o !isin $hget(pnp. $+ $cid,-feat)))) { _qnotice %target %send | return }
  var %num = $nick(%.chan.mn,0,o)
  if (%num == 0) return
  :loop
  if ($nick(%.chan.mn,%num,o) != $me) %sendto = %sendto $ifmatch
  if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len(%send)) > 450)) { _qnotice $_s2c(%sendto) %send | var %sendto }
  if (%num > 1) { dec %num | goto loop }
  if (%sendto) _qnotice $_s2c(%sendto) %send
}

alias oh ohnotice $1-
alias ohnotice {
  if ($1 == $null) _qhelp /ohnotice | _simsplit mn /ohnotice $1- | if (%.msg.mn == $null) _qhelp /ohnotice $1-
  if ($len(%.msg.mn) > 300) _error Please use a smaller message.You must enter a message under 300 characters for mass notices.
  if ($me !ison %.chan.mn) _error Please specify a channel you are in.You cannot send mass notices to channels you are not currently in.
  var %num,%sendto,%target = @% $+ %.chan.mn,%send = $_mnmsg(ohnotice,%.chan.mn,%.msg.mn)
  _show.send.notice %.chan.mn @% $+ %.chan.mn %send
  if ((+ isin $hget(pnp. $+ $cid,-feat)) && (($me ishop %.chan.mn) || ($me isop %.chan.mn) || (o !isin $hget(pnp. $+ $cid,-feat)))) { _qnotice %target %send | return }
  if ((@ isin $hget(pnp. $+ $cid,-feat)) && (($me isop %.chan.mn) || (o !isin $hget(pnp. $+ $cid,-feat)))) _qnotice @ $+ %.chan.mn %send
  else {
    %num = $nick(%.chan.mn,0,o)
    if (%num == 0) goto hop
    :loop1
    if ($nick(%.chan.mn,%num,o) != $me) %sendto = %sendto $ifmatch
    if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len(%send)) > 450)) { _qnotice $_s2c(%sendto) %send | var %sendto }
    if (%num > 1) { dec %num | goto loop1 }
  }
  :hop
  %num = $nick(%.chan.mn,0,h,o)
  if (%num == 0) goto done
  :loop2
  if ($nick(%.chan.mn,%num,h,o) != $me) %sendto = %sendto $ifmatch
  if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len(%send)) > 450)) { _qnotice $_s2c(%sendto) %send | var %sendto }
  if (%num > 1) { dec %num | goto loop2 }
  :done
  if (%sendto) _qnotice $_s2c(%sendto) %send
}

alias ov ovnotice $1-
alias ovnotice {
  if ($1 == $null) _qhelp /ovnotice | _simsplit mn /ovnotice $1- | if (%.msg.mn == $null) _qhelp /ovnotice $1-
  if ($len(%.msg.mn) > 300) _error Please use a smaller message.You must enter a message under 300 characters for mass notices.
  if ($me !ison %.chan.mn) _error Please specify a channel you are in.You cannot send mass notices to channels you are not currently in.
  var %num,%sendto,%target = @+ $+ %.chan.mn,%send = $_mnmsg(ovnotice,%.chan.mn,%.msg.mn)
  _show.send.notice %.chan.mn @+ $+ %.chan.mn %send
  if ((+ isin $hget(pnp. $+ $cid,-feat)) && (($me isvoice %.chan.mn) || ($me ishop %.chan.mn) || ($me isop %.chan.mn) || (o !isin $hget(pnp. $+ $cid,-feat)))) { _qnotice %target %send | return }
  if ((@ isin $hget(pnp. $+ $cid,-feat)) && (($me isop %.chan.mn) || (o !isin $hget(pnp. $+ $cid,-feat)))) _qnotice @ $+ %.chan.mn %send
  else {
    %num = $nick(%.chan.mn,0,o)
    if (%num == 0) goto voice
    :loop1
    if ($nick(%.chan.mn,%num,o) != $me) %sendto = %sendto $ifmatch
    if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len(%send)) > 450)) { _qnotice $_s2c(%sendto) %send | var %sendto }
    if (%num > 1) { dec %num | goto loop1 }
  }
  :voice
  %num = $nick(%.chan.mn,0,vh,o)
  if (%num == 0) goto done
  :loop2
  if ($nick(%.chan.mn,%num,vh,o) != $me) %sendto = %sendto $ifmatch
  if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len(%send)) > 450)) { _qnotice $_s2c(%sendto) %send | var %sendto }
  if (%num > 1) { dec %num | goto loop2 }
  :done
  if (%sendto) _qnotice $_s2c(%sendto) %send
}

; (no ops OR hops)
alias rnotice peon $1-
alias nnotice peon $1-
alias peon {
  if ($1 == $null) _qhelp /peon | _simsplit mn /peon $1- | if (%.msg.mn == $null) _qhelp /peon $1-
  if ($len(%.msg.mn) > 300) _error Please use a smaller message.You must enter a message under 300 characters for mass notices.
  if ($me !ison %.chan.mn) _error Please specify a channel you are in.You cannot send mass notices to channels you are not currently in.
  var %sendto,%send = $_mnmsg(peon,%.chan.mn,%.msg.mn)
  _show.send.notice %.chan.mn nonop/ $+ %.chan.mn %send
  var %num = $nick(%.chan.mn,0,a,oh)
  if (%num == 0) return
  :loop
  if ($nick(%.chan.mn,%num,a,oh) != $me) %sendto = %sendto $ifmatch
  if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len(%send)) > 450)) { _qnotice $_s2c(%sendto) %send | var %sendto }
  if (%num > 1) { dec %num | goto loop }
  if (%sendto) _qnotice $_s2c(%sendto) %send
}

alias allbut {
  if ($2 == $null) _qhelp /allbut | _split mn /allbut $1-
  if ($len(%.msg.mn) > 300) _error Please use a smaller message.You must enter a message under 300 characters for mass notices.
  if ($me !ison %.chan.mn) _error Please specify a channel you are in.You cannot send mass notices to channels you are not currently in.
  var %sendto,%chan = %.chan.mn,%msg = %.msg.mn,%target = $_nccs(44,%chan,%.targ.mn),%send = $_abmsg(allbut,%chan,%target,%msg),%ctarget = - $+ %target
  _show.send.notice %chan %chan %send
  var %num = $nick(%chan,0)
  if (%num == 1) return
  :loop
  if ($nick(%chan,%num) != $me) if ($istok(%target,$ifmatch,44) == $false) %sendto = %sendto $nick(%chan,%num)
  if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len(%send)) > 450)) { _qnotice $_s2c(%sendto) %send | var %sendto }
  if (%num > 1) { dec %num | goto loop }
  if (%sendto) _qnotice $_s2c(%sendto) %send
}

alias fnotice {
  if ($2 == $null) _qhelp /fnotice | _split mn /fnotice $1-
  if ($len(%.msg.mn) > 300) _error Please use a smaller message.You must enter a message under 300 characters for mass notices.
  if ($me !ison %.chan.mn) _error Please specify a channel you are in.You cannot send mass notices to channels you are not currently in.
  _show.send.notice %.chan.mn %.targ.mn %.msg.mn
  var %sendto,%num = $ialchan(%.targ.mn,%.chan.mn,0)
  if (%num < 1) return
  :loop
  if ($ialchan(%.targ.mn,%.chan.mn,%num).nick != $me) %sendto = %sendto $ifmatch
  if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len(%send)) > 450)) { _qnotice $_s2c(%sendto) %.msg.mn | var %sendto }
  if (%num > 1) { dec %num | goto loop }
  if (%sendto) _qnotice $_s2c(%sendto) %.msg.mn
}

alias n ntc $1-
alias ntc {
  if ($show == $false) { _qnotice $1- | return }
  if ($2 == $null) _qhelp /ntc $1
  var %sendto = $_ncs(44,$1)
  if (, isin %sendto) {
    if ($numtok(%sendto,44) < 6) var %msg = $_pvmsg(snotice,%sendto,$ifmatch,$2-)
    else var %msg = $_pvmsg(lnotice,$numtok(%sendto,44),$numtok(%sendto,44),$2-)
  }
  elseif ($_ischan($1)) var %msg = $_mnmsg(cnotice,$1,$2-)
  else var %msg = $_pvmsg(pnotice,%sendto,%sendto,$2-)
  notice %sendto %msg
}

;
; All channel/etc messages
;
alias ame if ($chan(0) == 0) ame $1- | elseif ($1 == $null) _qhelp /ame | else _domm -c describe $1-
alias amsg if ($chan(0) == 0) amsg $1- | elseif ($1 == $null) _qhelp /amsg | else _domm -c msg $1-
alias aame if ($1 == $null) _qhelp /aame | else _domm -dqc describe $1-
alias aamsg if ($1 == $null) _qhelp /aamsg | else _domm -dqc msg $1-
alias acme if ($1 == $null) _qhelp /acme | else _domm -dq describe $1-
alias acmsg if ($1 == $null) _qhelp /acmsg | else  _domm -dq msg $1-
; _domm -cqda msg|describe message - massmsg chans/queries/dccs
; -a means don't msg chans in away exclusion list or that have reaced idle exclusion status (according to away options)
alias _domm {
  var %num
  if (($chat(0)) && (d isin $1)) {
    %num = $chat(0)
    :loopD
    if ($chat(%num).status == active) $2 = $+ $chat(%num) $3-
    if (%num > 1) { dec %num | goto loopD }
  }
  var %sendto,%how = $iif($2 == msg,_privmsg,_qca)
  if (($server) && ($chan(0)) && (c isin $1)) {
    %num = $chan(0)
    :loopC
    ; Skip?
    if (a isin $1) {
      if (($_cfgi(away.ignchan)) && ($istok($_cfgi(away.ignchanlist),$chan(%num),44))) goto skipC
      ; If idle block on, compare idle to current ctime or ctime of when we set away
      if (($_cfgi(away.ignidle)) && ($calc($hget(pnp. $+ $cid,-chanidle. $+ $chan(%num)) + 60 * $_cfgi(away.ignidletime)) < $iif($hget(pnp. $+ $cid,away),$gettok($ifmatch,2,32),$ctime))) goto skipC
    }
    if ($me !ison $chan(%num)) goto skipC
    if ($2 == msg) theme.msg Text $chan(%num) $color(own) $3-
    else theme.msg Action $chan(%num) $color($iif($color(own)  == $color(norm),action,own)) $3-
    %sendto = %sendto $chan(%num)
    if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len($3-)) > 450)) { %how $_s2c(%sendto) $3- | var %sendto }
    :skipC
    if (%num > 1) { dec %num | goto loopC }
  }
  if (($query(0)) && (q isin $1)) {
    %num = $query(0)
    :loopQ
    if (($hget(pnp. $+ $cid,-queryni. $+ $query(%num))) || ($query(%num) == $active)) {
      if ($2 == msg) theme.msg Text $query(%num) $color(own) $3-
      else theme.msg Action $query(%num) $color($iif($color(own)  == $color(norm),action,own)) $3-
      %sendto = %sendto $query(%num)
      if (($numtok(%sendto,32) >= $hget(pnp. $+ $cid,-target)) || ($calc($len(%sendto) + $len($3-)) > 450)) { %how $_s2c(%sendto) $3- | var %sendto }
    }
    if (%num > 1) { dec %num | goto loopQ }
  }
  if (%sendto) %how $_s2c(%sendto) $3-
}

;
; Tracks idleness of queries/chans for /acme/acmsg
; (purposely allows all cmdline activity to reset idle)
;

on *:TEXT:*:?:hadd -u120 pnp. $+ $cid -queryni. $+ $nick 1
on *:ACTION:*:?:hadd -u120 pnp. $+ $cid -queryni. $+ $nick 1
on *:INPUT:?:hadd -u120 pnp. $+ $cid -queryni. $+ $target 1
on *:CLOSE:?:if ($window(Status Window)) hdel pnp. $+ $cid -queryni. $+ $target
on *:UNOTIFY:hdel pnp. $+ $cid -queryni. $+ $nick
on *:QUIT:hdel pnp. $+ $cid -queryni. $+ $nick
raw 401:*no such*:hdel pnp. $+ $cid -queryni. $+ $2
; (only update channel idle times if not away- IE while we're away, idle channels is exactly the channels we were idle in before)
on *:INPUT:#:if (!$hget(pnp. $+ $cid,away)) hadd pnp. $+ $cid -chanidle. $+ $target $ctime
on me:*:JOIN:#:if (!$hget(pnp. $+ $cid,away)) hadd pnp. $+ $cid -chanidle. $+ $chan $ctime
on me:*:PART:#:hdel pnp. $+ $cid -chanidle. $+ $chan
on *:KICK:#:if ($knick == $me) hdel pnp. $+ $cid -chanidle. $+ $chan

