aIRC — File Browser

aIRCv0.8.69 / aIRCv0.8.69 / addons / irc5.mrc

irc5.mrc — 19.11 KB — Download this file

;/**********************************************************************
; *
; * aIRC
; * IRC Client file 5
; *
; **********************************************************************/
;
alias _: {
  if (:* iswm $1) { return $right($1-,-1) }
  return $1-
}
alias _irc.actwin {
  if ($_irc.ircnum($active,1) != $_irc.ircnum) { return - $+ $iif($remove($1,-,a,s) != $null,$remove($1,-,a,s)) @Status $+ $_irc.ircnum }
  return -a $+ $iif($remove($1,-,a,s,e) != $null,$remove($1,-,a,s,e))
}
alias _irc.winwin {
  var %n = $_irc.ircnum
  if ($_ischan($2)) { var %w = @CH_ $+ %n $+   $+ $2 }
  else { var %w = @Q_ $+ %n $+   $+ $2 }
  if ($window(%w)) {
    if ($remove($1,-,a,s) != $null) { return - $+ $remove($1,-,a,s) %w }
    else { return %w }
  }
  if ($_irc.ircnum($active,1) != %n) { return - $+ $iif($remove($1,-,a,s) != $null,$remove($1,-,a,s)) @Status $+ %n }
  return -a $+ $iif($remove($1,-,a,s,e) != $null,$remove($1,-,a,s,e))
}
alias _irc.echo.snotice {
  if ($1- == $null) { return }
  if ($_getsetup(script,_snotice.show) <= 2) { _irc.echo.a $colour(notice) $1- }
  else { _irc.echo.s $colour(notice) $1- }
}
alias _irc.error.raw {
  %:echo = echo2 $^errcolor -eit @Status $+ %::ircnum
  var %alias = ^ $+ %::numeric
  if ($isalias(%alias)) { %alias $1- }
  else { %:echo $^error($2-) }
}
alias _irc.echo.raw { return _irc.lechol.s $colour(info) $1- }
alias _irc.echo.a { echo2 $iif($1 isnum,$1) $_irc.actwin(it) $iif($1 isnum,$2-,$1-) }
alias _irc.echo.w { echo2 $iif($1 isnum,$1) $_irc.winwin(it,$iif($1 isnum,$2,$1)) $iif($1 isnum,$3-,$2-) }
alias _irc.echo.s { echo2 $iif($1 isnum,$1) -it @Status $+ $_irc.ircnum $iif($1 isnum,$2-,$1-) }
alias _irc.lechol.a { echo2 $iif($1 isnum,$1) $_irc.actwin(eit) $iif($1 isnum,$2-,$1-) }
alias _irc.lechol.s { echo2 $iif($1 isnum,$1) -eit @Status $+ $_irc.ircnum $iif($1 isnum,$2-,$1-) }
alias _irc.lechol.w { echo2 $iif($1 isnum,$1) $_irc.winwin(eit,$iif($1 isnum,$2,$1)) $iif($1 isnum,$3-,$2-) }
alias _irc.error.a { echo2 $^errcolor $_irc.actwin(eit) $^error($1-) }
alias _irc.error.s { echo2 $^errcolor -eit @Status $+ $_irc.ircnum $^error($1-) }
alias _irc.error.w { echo2 $^errcolor $_irc.winwin(eit,$1) $^error($2-) }
alias _irc.info.a { echo2 $colour(info) $_irc.actwin(eit) $^*** $1- }
alias _irc.info.s { echo2 $colour(info) -eit @Status $+ $_irc.ircnum $^*** $1- }
alias _irc.info.w { echo2 $colour(info) $_irc.winwin(eit,$1) $^*** $2- }
alias _irc.ctcp.a { echo2 $colour(ctcp) $_irc.actwin(eit) $^*** $1- }
alias _irc.ctcp.s { echo2 $colour(ctcp) -eit @Status $+ $_irc.ircnum $^*** $1- }
alias _irc.ctcp.w { echo2 $colour(ctcp) $_irc.winwin(eit,$1) $^*** $2- }
alias _irc.echo.who {
  var %n = $_irc.ircnum
  if ($_irc.ircnum($active,1) != %n) { return echo2 $colour(normal) -ti @Status $+ %n }
  return echo2 $colour(normal) -ati
}
alias _irc.echo.whois {
  var %n = $_irc.ircnum
  if ($_minio(2,26)) && ($_irc.ircnum($active,1) == %n) { return echo2 $colour(whois) -ati }
  return echo2 $colour(whois) -ti @Status $+ %n
}
alias _irc.echo.rawstatus { return echo2 $colour(info) -ti @Status $+ $_irc.ircnum $1- }
alias _irc.echo.userhost {
  if ($1- == $null) { return }
  %:echo = _irc.echo.a $colour(info)
  ^userhost $1-
}
alias _onclosewin.status {
  if ($window($2)) { _irc.com quit }
  else {
    if ($sock(IRC [ $+ [ $_irc.ircnum($2) ] ] )) {
      info.a Closing IRC session $_irc.ircnum($2)
      sockwrite -n IRC [ $+ [ $_irc.ircnum($2) ] ] QUIT : $+ $_verinf
    }
    _timeremote _irc.mequit $_irc.ircnum($2)
  }
}
alias _windowopts.status { return 1 0 0 }
alias _onclosewin.channel {
  var %sock = IRC [ $+ [ $_irc.ircnum($2) ] ]
  if ($sock(%sock)) { sockwrite -n %sock PART $gettok($window($2),2,160) : $+ $_verinf }
}
alias _windowopts.channel { return 1 0 0 }
alias _onclosewin.DCC CHAT {
  sockclose $remove($2,@)
  sockclose $replace($remove($2,@),DCC CHAT,DCCCHAT)
  .timer $+ $remove($2,@) off
}
alias _windowopts.DCC CHAT { return 1 0 0 }
alias _onclosewin.DCC SEND {
  var %m = DCCSEND*,%i = $sock(%m,0),%s
  while (%i) {
    %s = $sock(%m,%i)
    if ($_sockmark(%s,2) == $2) {
      sockclose %s
      break
    }
    dec %i
  }
  var %m = DCC SEND*,%i = $sock(%m,0),%s
  while (%i) {
    %s = $sock(%m,%i)
    if ($_sockmark(%s,2) == $2) {
      sockclose %s
      break
    }
    dec %i
  }
}
alias _windowopts.DCC SEND { return 1 0 0 }
alias _onclosewin.DCC GET {
  var %m = DCCGET*,%i = $sock(%m,0),%s
  while (%i) {
    %s = $sock(%m,%i)
    if ($_sockmark(%s,2) == $2) {
      sockclose %s
      break
    }
    dec %i
  }
  var %m = DCC GET*,%i = $sock(%m,0),%s
  while (%i) {
    %s = $sock(%m,%i)
    if ($_sockmark(%s,2) == $2) {
      sockclose %s
      break
    }
    dec %i
  }
}
alias _windowopts.DCC GET { return 1 0 0 }

;
alias _irc.com {
  unset %::*
  %::ircnum = $_irc.ircnum
  %::ircsock = IRC $+ %::ircnum
  %::me = $_irc.me(%::ircnum)
  %::@status = @Status $+ %::ircnum

  var %alias = _irc.com. $+ $1
  if ($isalias(%alias)) { %alias $2- }
  elseif ($istok(abook beep clipboard clear clearall close copy creq dde dqwindow echo editbox exit filter finger flash flushini font fsend fserve ial identd load loadbuf log mkdir perform remini remove rename resetidle rmdir run save savebuf set sline speak splay sreq strip timestamp titlebar unload unset url window winhelp write writeini,$1,32)) { $1- }
  elseif (timer* iswm $1) { $1- }
  else { _irc.sw $upper($1) $2- }
  unset %::*
}

alias _irc.com.chat { .timer -o 1 0 _irc.com dcc chat $1 }
alias _irc.com.dcc {

  if ($ip == $null) {
    _irc.error.a Your IP is unknown. Try again in a few seconds... (or press "ALT+O", go to "Local Info" and configure your I.P.)
    localinfo -h
    return 1
  }

  if ($1 == chat) {
    if ($2 == $null) {
      _irc.error.a Usage: /dcc chat <nick>
      return 1
    }
    if (. isin $2) {
      dcc chat $2
      return 0
    }
    var %t = DCCCHAT $+ %::ircnum $+   $+ $$2,%s = DCC CHAT $+ %::ircnum $+   $+ $$2,%w = @ $+ %s
    if ($sock(%t) == %t) { sockclose %t }
    if ($sock($replace(%t,DCCCHAT,DCC CHAT))) {
      _irc.error.a You already have a DCC Chat session with $2
      return 1
    }
    socklisten %t
    .timer $+ %s -o 1 $_minio(2,11) _closesocket $colour(ctcp) %t DCC chat with $2 timeout...
    sockmark %t $2 $+ $chr(9) $+ %::me $+ $chr(9) $+ %w $+ $chr(9) $+ %::ircsock
    _irc.sw NOTICE $$2 :DCC Chat ( $+ $ip $+ )
    _irc.sw PRIVMSG $$2 :DCC CHAT chat $longip($ip) $sock(%t).port $+ 
    if ($window(%w) == $null) { _irc.openwin wchat %w }
    echo2 $colour(info2) -it %w Chat with $2
    echo2 $colour(ctcp) -it %w Waiting for acknowledgement...
  }
  elseif ($1 == send) {
    if ($2 == $null) {
      _irc.error.a Usage: /dcc send <nick> <file>
      return 1
    }
    if (. isin $2) {
      dcc send $2-
      return 1
    }
    var %a = $remove($3-,$chr(34))
    if (%a == $null) {
      _timeremote _irc.askdccsendfile $2
      return 0
    }
    if ($isfile(%a) == $false) {
      _irc.error.a File not found: $^'(%a)
      return 1
    }
    var %t = DCCSEND $+ %::ircnum $+   $+ $$2 $+   $+ $replace($nopath(%a),$chr(32), )
    var %w = @ $+ $replace(%t,DCCSEND,DCC SEND)
    if ($sock(%t)) { sockclose %t }
    if ($sock($replace(%t,DCCSEND,DCC SEND))) {
      _irc.error.a You are already sending $^'($nopath(%a)) to $2
      return 1
    }
    if ($window(%w)) { close -@ %w }
    socklisten %t
    var %sockmark = %a $+ $chr(9) $+ %w $+ $chr(9) $+ $ctime $+ $chr(9) $+ $file(%a).size $+ $chr(9) $+ %t $+ $chr(9) $+ $2 $+ $chr(9) $+ 0 $+ $chr(9) $+ 0
    sockmark %t %sockmark
    .timer $+ %t -mo 1 800 _irc.send.chtimer %t
    close -@ %w
    _irc.openwin wdccs %w
    _irc.send.rwin %t
    _irc.send.rcwin %t Sending request...
    _irc.send.rcwin %t Waiting for acknowledgment...
    _irc.sw NOTICE $$2 :DCC Send $nopath(%a) ( $+ $ip $+ )
    _irc.sw PRIVMSG $$2 :DCC SEND " $+ %a $+ " $longip($ip) $sock(%t).port $file(%a).size $+ 
  }
  return 0
}
alias _irc.com.ame {
  if ($1- == $null) { _irc.error.a Usage: /ame <message> }
  else {
    var %a = @CH_ $+ %::ircnum,%i = $window(0),%tmp,%win
    while (%i) {
      %win = $window(%i)
      if ($gettok(%win,1,160) == %a) { %tmp = $addtok(%tmp, $gettok(%win,2,160),44) }
      dec %i
    }
    if (%tmp != $null) { _irc.com.describe %tmp $1- }
  }
}
alias _irc.com.amsg {
  if ($1- == $null) { _irc.error.a Usage: /amsg <message> }
  else {
    var %a = @CH_ $+ %::ircnum,%i = $window(0),%tmp,%win
    while (%i) {
      %win = $window(%i)
      if ($gettok(%win,1,160) == %a) { %tmp = $addtok(%tmp,$gettok(%win,2,160),44) }
      dec %i
    }
    if (%tmp != $null) { _irc.com.msg %tmp $1- }
  }
}
alias _irc.com.away {
  if ($1- == $null) { _irc.com.back }
  else { _irc.sw AWAY : $+ $1- }
}
alias _irc.com.back { _irc.sw AWAY }
alias _irc.com.ban {
  if ($1) {
    if ($_ischan($1)) && ($2) { _irc.mmode $1 +b $2- }
    elseif ($_irc.ischan($active)) { _irc.mmode $gettok($window($active),2,160) +b $1- }
    else { _irc.error.a Usage: /ban [#channel] <Nick[s]> }
  }
}
alias _irc.com.ctcp {
  if ($1 == $null) || ($2- == $null) { _irc.error.a Usage: /CTCP <Nick|#channel> <CTCP> }
  else {
    if ($2- == ping) {
      _irc.sw PRIVMSG $1 :PING $ticks $+ 
      tokenize 32 $1-2
    }
    else { _irc.sw PRIVMSG $1 : $+ $2- $+  }
    %:echo = _irc.echo.a $colour(ctcp)
    %:echo $^ctcpsend($1,$2-,%::me)
  }
}
alias _irc.com.ctcpreply {
  if ($1 == $null) || ($2- == $null) { _irc.error.a Usage: /CTCPREPLY <Nick|#channel> <CTCP> }
  else {
    _irc.sw NOTICE $1 : $+ $2- $+ 
    %:echo = _irc.echo.a $colour(ctcp)
    %:echo $^ctcpreplysend($1,$2-,%::me)
  }
}
alias _irc.com.devoice {
  if ($1) {
    if ($_ischan($1)) && ($2) { _irc.mmode $1 -v $2- }
    elseif ($_irc.ischan($active)) { _irc.mmode $gettok($window($active),2,160) -v $1- }
    else { goto devoice.error }
    return
  }
  :devoice.error
  _irc.error.a Usage: /devoice [#channel] <Nick[s]>
}
alias _irc.com.deop {
  if ($1) {
    if ($_ischan($1)) && ($2) { _irc.mmode $1 -o $2- }
    elseif ($_irc.ischan($active)) { _irc.mmode $gettok($window($active),2,160) -o $1- }
    else { goto deop.error }
    return
  }
  :deop.error
  _irc.error.a Usage: /deop [#channel] <Nick[s]>
}
alias _irc.com.describe {
  if ($1 == $null) || ($2- == $null) { _irc.error.a Usage: /describe <Nick|#channel> <message> }
  else {
    var %me = %::me,%target = $1,%i = $numtok(%target,44),%p,%irc,%showsend,%flags = y
    if ($_minio(2,30)) { %flags = yp }
    else { %flags = y }
    %::msg = $2-
    %::nick = %::me
    while (%i) {
      unset %::chan %::target
      %p = $gettok(%target,%i,44)
      if (=* iswm %p) { !describe %p %msg }
      else {
        var %chanwin = @CH_ $+ %::ircnum $+ $chr(160) $+ %p,%querywin = @Q_ $+ %::ircnum $+ $chr(160) $+ %p
        if ($window(%chanwin)) {
          %::target = %p
          %::chan = %p
          %::flags = %flags $+ $_irc.chanickopvoice(%::me,%chanwin)
          %:echo = echo2 $colour(action) -tiq %chanwin
          ^actionchan
        }
        elseif ($window(%querywin)) {
          %::target = %p
          %::flags = %flags
          %:echo = echo2 $colour(action) -tiq %querywin
          ^actionuser
        }
        else { %showsend = $addtok(%showsend,%p,44) }
        %irc = $addtok(%irc,%p,44)
      }
      dec %i
    }
    if (%showsend != $null) {
      %:echo = echo2 $colour(action) -ait
      %:echo $^actionsend(%showsend,%::msg,%::me)
    }
    if (%irc != $null) { _irc.sw PRIVMSG %irc :ACTION %::msg $+  }
    %::me = %me
    unset %::nick %::chan %::flags
  }
}
alias _irc.com.invite {
  if ($1 == $null) || ($2 == $null) { _irc.error.a Usage: /invite <Nick> <#channel> }
  else { _irc.sw INVITE $1- }
}
alias _irc.com.j { _irc.com join $1- }
alias _irc.com.join {
  if ($1- == $null) { _irc.error.a Usage: /join <#channel> [Password] }
  else { _irc.sw JOIN $_fixchans(#$1) $2- }
}
alias _irc.com.k { _irc.com kick $1- }
alias _irc.com.kick {
  var %c,%ns,%m,%i,%user,%defmsg
  if ($1) {
    if ($_ischan($1)) && ($2) { var %c = $1,%ns = $2,%m = $3- }
    elseif ($_irc.ischan($active)) { var %c = $_irc.active,%ns = $1,%m = $2- }
    else { goto kick.error }
  }
  else { goto kick.error }
  if (%m == $null) { var %m }
  %i = 1
  %defmsg = $_defmsg(kick,%m)
  while ($gettok(%ns,%i,44) != $null) {
    %user = $ifmatch
    _irc.sw KICK %c %user : $+ $replace(%defmsg,<CHAN>,%c,<NICK>,%user)
    inc %i
  }
  if (%m != $null) { _recent.add kickreason 20 $replace(%m,%c,<CHAN>) }
  return
  :kick.error
  _irc.error.a Usage: /kick [#channel] <Nick> [reason]
}
alias _irc.com.me {
  if ($_irc.ischan($active)) || ($_irc.isquery($active)) {
    if ($1-) { _irc.com describe $_irc.active $1- }
    else { _irc.error.a Usage: /me <message> }
  }
  else { _irc.error.a /me: can't use /me in this window }
}
alias _irc.com.mode {
  if ($1 == $null) { _irc.error.a Usage: /mode <Nick|#channel> [[+|-]modes [parameters]] }
  else { _irc.sw MODE $1- }
}
alias _irc.com.msg {
  if ($1 == $null) || ($2- == $null) { _irc.error.a Usage: /msg <Nick|#channel> <message> }
  else {
    var %me = %::me,%target = $1,%i = $numtok(%target,44),%p,%irc,%showsend,%flags = y
    if ($_minio(0,23)) { %flags = ym }
    if ($_minio(2,30)) { %flags = %flags $+ p }
    %::msg = $2-
    %::nick = %::me
    while (%i) {
      unset %::chan %::target
      %p = $gettok(%target,%i,44)
      if (=* iswm %p) { !msg %p %msg }
      else {
        var %chanwin = @CH_ $+ %::ircnum $+ $chr(160) $+ %p,%querywin = @Q_ $+ %::ircnum $+ $chr(160) $+ %p
        if ($window(%chanwin)) {
          %::target = %p
          %::chan = %p
          %::flags = %flags $+ $_irc.chanickopvoice(%::me,%chanwin)
          %:echo = echo2 $colour(own) -tiq %chanwin
          ^textchan
        }
        elseif ($window(%querywin)) {
          %::target = %p
          %::flags = %flags
          %:echo = echo2 $colour(own) -tiq %querywin
          ^textuser
        }
        else { %showsend = $addtok(%showsend,%p,44) }
        %irc = $addtok(%irc,%p,44)
      }
      dec %i
    }
    if (%showsend != $null) {
      %:echo = echo2 $colour(own) -ait
      %:echo $^textsend(%showsend,%::msg,%::me)
    }
    if (%irc != $null) { _irc.sw PRIVMSG %irc : $+ %::msg }
    %::me   = %me
    unset %::nick %::chan %::flags
  }
}
alias _irc.com.names {
  if ($1 == $null) {
    if ($_irc.ischan($active)) { _irc.sw NAMES $_irc.active }
    else { _irc.error.a Usage: /names <#channel> }
  }
  else { _irc.sw NAMES $_fixchans(#$1) }
}
alias _irc.com.notice {
  if ($1 == $null) || ($2- == $null) { _irc.error.a Usage: /notice <Nick|#channel> <notice> }
  else {
    %:echo = echo2 $colour(own) -ait
    %:echo $^noticesend($1,$2-,%::me)
    _irc.sw NOTICE $1 : $+ $2-
  }
}
alias _irc.com.notify {
  if ($1- != $null) { notify $1- }
  elseif ($_irc._notify.getlist != $null) {
    _irc._notify.flush %::ircnum
    _irc._notify.timer %::ircnum
  }
  else { _irc.lechol.s $colour(info2) $^*** Your notify list is empty }
}
alias _irc.com.op {
  if ($1) {
    if ($_ischan($1)) && ($2) { _irc.mmode $1 +o $2- }
    elseif ($_irc.ischan($active)) { _irc.mmode $gettok($window($active),2,160) +o $1- }
    else { goto op.error }
    return
  }
  :op.error
  _irc.error.a Usage: /op [#channel] <Nick[s]>
}
alias _irc.com.p { _irc.com part $1- }
alias _irc.com.part {
  if ($1 == $null) {
    if ($_irc.ischan($active)) { _irc.sw PART $_irc.active : $+ $_verinf }
    else { _irc.error.a Usage: /PART <#channel> }
  }
  else { _irc.sw PART $_fixchans(#$1) : $+ $iif($2- != $null,$2-,$_verinf) }
}
alias _irc.com.partall {
  var %a = @CH_ $+ %::ircnum,%i = $window(0),%win,%d
  while (%i) {
    %win = $window(%i)
    if ($gettok(%win,1,160) == %a) { _irc.sw PART $gettok(%win,2,160) : $+ $iif($1- != $null,$1-,$_verinf) }
    dec %i
  }
}
alias _irc.com.query {
  if ($1 == $null) { _irc.error.a Usage: /query <nick> [msg] }
  else {
    var %win = @Q_ $+ %::ircnum $+   $+ $1
    _irc.openwin wquery %win
    window -a %win
    if ($2- != $null) { _irc.com msg $1- }
  }
}
alias _irc.com.quit {
  _irc.sw QUIT : $+ $_quitmsg(0,$1-)
  sockclose %::ircsock
  _irc.mequit %::ircnum
}
alias _irc.com.server {
  var %s = $1,%p = $2,%n = $3
  if (%s == $null) { var %s = $gettok($window(%::@status).title,4,32) }
  if (%p == $null) { var %p = $sock(%::ircsock).port }
  if (%n == $null) { var %n = %::me }
  irc %s %p %n
}
alias _irc.com.topic {
  if ($1 == $null) {
    if ($_irc.ischan($active)) { _irc.sw TOPIC $_irc.active }
    else { _irc.error.a Usages: /topic <#channel> [topic] }
  }
  else { _irc.sw TOPIC #$1 : $+ $2- }
}
alias _irc.com.voice {
  if ($1) {
    if ($_ischan($1)) && ($2) { _irc.mmode $1 +v $2- }
    elseif ($_irc.ischan($active)) { _irc.mmode $gettok($window($active),2,160) +v $1- }
    else { goto voice.error }
    return
  }
  :voice.error
  _irc.error.a Usage: /voice [#channel] <Nick[s]>
}
alias _irc.com.raw { _irc.sw $1 $2 $3- }
alias _irc.com.quote { _irc.sw $1 $2 $3- }

;
alias _irc.setidle { set %+irc.idlem. [ $+ [ $1 ] ] $ctime }
alias _irc._autoaway {
  var %sock = IRC $+ $1
  if (%_away.autot) && ($sock(%sock)) && ($_irc.away($1) != $true) && ($_irc.idle($1) > $calc(%_away.autot * 60)) {
    sockwrite -n %sock AWAY :Autoaway after $_nsingoplur(%_away.autot,minute,minutes)
  }
}
;

alias _irc._notify.getlist {
  var %i = 1,%n = $notify(0),%r
  while (%i <= %n) {
    %r = $addtok(%r,$notify(%i),32)
    inc %i
  }
  return %r
}
alias _irc._notify.current { return %+irc.notify. [ $+ [ $1 ] ] }
alias _irc._notify.+ {
  var %nicks = $_irc._notify.current($1)
  %nicks = $addtok(%nicks,$2,32)
  if (%nicks != $null) { set %+irc.notify. [ $+ [ $1 ] ]  %nicks }
  else { unset % $+ +irc.notify. $+ $1 }
}
alias _irc._notify.- {
  var %nicks = $_irc._notify.current($1)
  %nicks = $remtok(%nicks,$2,32)
  if (%nicks != $null) { set %+irc.notify. [ $+ [ $1 ] ]  %nicks }
  else { unset % $+ +irc.notify. $+ $1 }
}
alias _irc._notify.flush { unset % $+ +irc.notify. $+ $1 }
alias _irc._notify.timer {
  var %sock = IRC $+ $1
  if ($sock(%sock)) {
    if ($_irc._notify.getlist != $null) { sockwrite -n %sock ISON : $+ $_irc._notify.getlist }
    .timer+irc.notify. $+ $1 -o 1 10 _irc._notify.timer $1-
  }
}
alias _irc.nickomp {
  var %win = $1,%input = $2,%matchn = $left(%input,-1) $+ *,%char = $right(%input,1),%matchg = * $+ %matchn,%i = 1,%n = $fline(%win,%matchg,0,1),%nick,%style = $_getsetup(nickomp,style)
  if (<NICK> !isin %style) {
    %style = <NICK><CHAR>
    _setsetup nickomp style %style
  }
  while (%i <= %n) {
    %nick = $remove($strip($line(%win,$fline(%win,%matchg,%i,1),1)),@,+,.)
    if (%matchn iswm %nick) { return $_nickomp.finalnick(%nick,%char,$_getsetup(nickomp,friendly),%style,$_getsetup(nickomp,clan)) $+  }
    inc %i
  }
  return %input
}
alias _irc.protctcp {
  var %var = +irc.protctcp. $+ $1,%p
  inc % $+ %var
  %p = % [ $+ [ %var ] ]
  if (%p >= 4) {
    if (%p == 4) {
      .timer $+ %var -o 1 30 unset % $+ %var
      return 1
    }
    return 2
  }
  .timer $+ %var -o 1 10 unset % $+ %var
  return 0
}