aIRC — File Browser

aIRCv0.8.69 / aIRCv0.8.69 / addons / irc3.mrc

irc3.mrc — 25.77 KB — Download this file

;/**********************************************************************
; *
; * aIRC
; * IRC Client file 3
; *
; **********************************************************************/
;
alias _irc.sr.nor {
  unset %::*
  %::ircnum = $remove($sockname,IRC)
  if (:* iswm $1) { tokenize 32 $right($1-,-1) }
  if (:* iswm $2) { tokenize 32 $1 $right($2-,-1) }
  if ($1 == ping) || ($1 == error) { %::event = $1 }
  else { %::event = $2 }
  if (:* iswm $3) && ($istok(error join nick quit topic wallops,%::event,32)) { tokenize 32 $1-2 $right($3-,-1) }
  if (:* iswm $4) && ($istok(invite mode notice part privmsg topic,%::event,32)) { tokenize 32 $1-3 $right($4-,-1) }
  if (%::event == kick) {
    if (:* iswm $5) { tokenize 32 $1-4 $right($5-,-1) }
    %::knick = $4
  }
  if (%::event == nick) { %::newnick = $3 }
  %::nick = $gettok($1,1,33)
  if (%::event == invite) && ($_ischan($4)) { %::chan = $4 }
  elseif ($_ischan($3)) { %::chan = $3 }
  elseif (@#* iswm $3) { %::chan = $right($3,-1) }
  %::fulladdress = $1
  %::site = $gettok($1,2,64)
  %::address = $gettok($1,2,33)
  %::target = $3
  %::me = $_irc.me
  %::@status = @Status $+ %::ircnum
  %::@chan = @CH_ $+ %::ircnum $+   $+ %::chan
  %::@query = @Q_ $+ %::ircnum $+   $+ %::nick
  if (%::event == ping) { _irc.sw PONG $2 }
  elseif (%::event == error) { _irc.on.error $3- }
  elseif (%::event == invite) { _irc.on.invite }
  elseif (%::event == join) { _irc.on.join }
  elseif (%::event == kick) { _irc.on.kick $5- }
  elseif (%::event == mode) {
    if (%::chan) { _irc.on.rawmode $4- }
    else { _irc.on.usermode $4- }
  }
  elseif (%::event == nick) { _irc.on.nick }
  elseif (%::event == notice) {
    if (* iswm $4-) { _irc.on.ctcpreply $left($right($4-,-1),-1) }
    elseif (. isin %::nick) { _irc.on.snotice $4- }
    else { _irc.on.notice $4- }
  }
  elseif (%::event == part) { _irc.on.part $4- }
  elseif (%::event == privmsg) {
    if (ACTION * iswm $4-) { _irc.on.action $left($5-,-1) }
    elseif (* iswm $4-) { _irc.on.ctcp $left($right($4-,-1),-1) }
    else { _irc.on.text $4- }
  }
  elseif (%::event == quit) {
    if (%::nick == %::me) { _irc.on.disconnect $3- }
    else { _irc.on.quit $3- }
  }
  elseif (%::event == topic) { _irc.on.topic $4- }
  elseif (%::event == wallops) { _irc.on.wallops $3- }
  else { echo2 -t %::@status $2- }
  if (*!*@* iswm %::fulladdress) {
    if (%::newnick != $null) { _irc.checkquery %::fulladdress %::newnick }
    else { _irc.checkquery %::fulladdress }
  }
  unset %::*
}
alias _irc.on.error {
  _irc.on.disconnect $1-
  _hook.call irc_onerror $1-
}
alias _irc.on.disconnect {
  _irc.mequit %::ircnum $1-
  _hook.call irc_ondisconnect $1-
}
alias _irc.on.quit {
  var %halt = 0,%i,%short = $_minio(2,19),%show,%showstatus = 0,%chan,%status,%win,%match
  %::reason = $1-
  _hook.call irc_onquit $1-
  if ($result) { %halt = 1 }
  %match = @CH_ $+ %::ircnum $+  *
  if (%halt == 0) {
    if (%short) { %::flags = cs }
    else { %::flags = c }
    %chan = $^quit
  }
  %i = $window(%match,0)
  unset %:echo
  while (%i) {
    %win = $window(%match,%i)
    if ($_irc.linick(%::nick,%win)) {
      dline -l %win $_irc.linick(%::nick,%win)
      _irc.chanmembers2title %win
      if (%halt == 0) {
        %show = $_chanevent(quits,$gettok(%win,2-,160))
        if ($_not(%show)) || (%show == 2) { echo2 $colour(quit) -t %win %chan }
        if (%show isin 1-2) { %showstatus = 1 }
      }
    }
    dec %i
  }
  if (%halt == 0) {
    unset %::flags
    if ($window(%::@status)) && (%showstatus) {
      %:echo = echo2 $colour(quit) -et %::@status
      %:echo $^quit
    }
    if ($window(%::@query)) {
      %:echo = echo2 $colour(quit) -t %::@query
      %:echo $^quit
    }
  }
}
alias _irc.on.wallops {
  _hook.call irc_onwallops $1-
  if ($result == $null) {
    %:echo = echo2 $colour(wallops) -eit %::@status
    %::text = $1-
    ^wallops
  }
}
alias _irc.on.topic {
  var %r,%show = $_chanevent(topics,%::chan)
  _hook.call irc_ontopic $1-
  if ($result == $null) {
    if (%show == 2) {  }
    else {
      %::flags = _
      %::topic = $1-
      if ($1- == $null) && ($len($1-) == 0) { %::flags = %::flags $+ u }
      if (%show) { %:echo = echo2 $colour(topic) -et %::@status }
      else {
        %::flags = %::flags $+ c
        %:echo = echo2 $colour(topic) -t %::@chan
      }
      ^topic
    }
  }
  if ($window(%::@chan)) {
    var %members,%modes,%tmodes = $_irc.chan(0,%::chan).mode,%topic
    %members = [[ $+ $line(%::@chan,0,1) $+ ]]
    if ($remove(%tmodes,+) != $null) { %modes = [+ $+ $ifmatch $+ ] }
    if ($1- != $null) || ($len($1-)) {
      %topic = $strip($1-)
      if (%modes != $null) { %modes = %modes $+ : }
      else { %members = %members $+ : }
    }
    titlebar %::@chan %members %modes %topic
  }
}
alias _irc.on.text {
  var %win,%nick = %::nick
  _hook.call irc_ontext $1-
  if ($result != $null) { return }
  %::msg = $1-
  if (%::chan) {
    var %win = %::@chan
    %::flags = _
    if (@* iswm %::target) { %::flags = %::flags $+ o }
    if ($len($1-) == 0) { %::flags = %::flags $+ n }
    if ($_minio(2,30)) { %::flags = %::flags $+ p }
    %::flags = %::flags $+ $_irc.chanickopvoice(%::nick,%win)
    if ($window(%win)) {
      %:echo = echo2 $colour(text) -lti %win
      %::flags = %::flags $+ c
      window -g %win 2
    }
    else {
      %:echo = echo2 $colour(text) -elti %::@status
      window -g %::@status 2
    }
    ^textchan
    _irc.remotechantext $1-
  }
  else {
    var %query = 1,%win = %::@query
    if ($len($1-)) { %::flags = _ }
    else { %::flags = n }
    %::msg = $1-
    if ($window(%win) == $null) {
      if ($_minio(4,5)) { %query = 0 }
      else { _irc.openwin wquery %win $iif($_minio(1,18),-n) }
    }
    if (%query) {
      %::flags = %::flags $+ q
      %:echo = echo2 $colour(text) -lti %win
      window -g %win 2
    }
    else {
      %::flags = %::flags $+ a
      var %w = $_irc.actwin(lti)
      %:echo = echo2 $colour(text) %w
      if (a !isin %w) { window -g %::@status 2 }
    }
    ^textuser
  }
}
alias _irc.on.action {
  var %win,%nick = %::nick
  _hook.call irc_onaction $1-
  if ($result != $null) { return }
  if (%::chan) {
    %win = %::@chan
    %::flags = _
    %::msg = $1-
    if ($len($1-) == 0) { %::flags = %::flags $+ n }
    if ($_minio(2,30)) { %::flags = %::flags $+ p }
    %::flags = %::flags $+ $_irc.chanickopvoice(%::nick,%win)
    if ($window(%win)) {
      %:echo = echo2 $colour(action) -lti %win
      %::flags = %::flags $+ c
      window -g %win 2
    }
    else {
      %:echo = echo2 $colour(action) -elti %::@status
      window -g %::@status 2
    }
    ^actionchan
    _irc.remotechantext $1-
  }
  else {
    var %query = 1,%win = %::@query
    if ($len($1-) == 0) { %::flags = n }
    else { %::flags = _ }
    %::msg = $1-
    if ($window(%win) == $null) {
      if ($_minio(4,5)) { %query = 0 }
      else { _irc.openwin wquery %win $iif($_minio(1,18),-n) }
    }
    if (%query) {
      %::flags = %::flags $+ q
      %:echo = echo2 $colour(action) -lti %win
      window -g %win 2
    }
    else {
      %::flags = %::flags $+ a
      var %w = $_irc.actwin(lti)
      %:echo = echo2 $colour(action) %w
      if (a !isin %w) { window -g %::@status 2 }
    }
    ^actionuser
  }
}
alias _irc.on.notice {
  var %win,%nick
  _hook.call irc_onnotice $1-
  if ($result != $null) { return }
  var %chan,%echo,%string,%act = $_minio(5,13),%noticeactiveecho
  %::flags = _
  %::msg = $1-
  if ($len($1-) == 0) { %::flags = %::flags $+ n }
  if (%::chan) {
    %win = %::@chan
    if ($_minio(2,30)) { %::flags = %::flags $+ p }
    %::flags = %::flags $+ $_irc.chanickopvoice(%::nick,%win)
    if ($window(%win)) { var %echo = echo2 $colour(notice) -ti %win,%noticeactiveecho = $iif($active == %win,0,1) }
    elseif (%act) { %noticeactiveecho = 1 }
    else { %echo = echo2 $colour(notice) -eti %::@status }
    if (%act) && (%noticeactiveecho) && ($active != %win) {
      %:echo = echo2 $colour(notice) $_irc.actwin(ti)
      ^noticechan
    }
    %:echo = %echo
    ^noticechan
  }
  else {
    var %string
    %:echo = echo2 $colour(notice) -eti %::@status
    %string = $^noticeuser
    if ($1 == dcc) {
      echo2 $colour(notice) -eti %::@status %string
      return
    }
    var %i = 1,%chanwin,%tmp
    while ($_irc.comchan(%::ircnum,%::nick,%i) != $null) {
      var %chanwin = $_irc.chan(%::ircnum,$ifmatch).win,%tmp = $addtok(%tmp,%chanwin,44)
      echo2 $colour(notice) -ti %chanwin %string
      inc %i
    }
    if (%i > 1) && (%act) && ($_irc.ircnum($active) == %::ircnum) && ($istok(%tmp,$active,44) == $false) { echo2 $colour(notice) $_irc.actwin(ti) %string }
    else {
      if (%act) && ($_irc.ircnum($active) == %::ircnum) && ($active != %::@status) { echo2 $colour(notice) $_irc.actwin(ti) %string }
      echo2 $colour(notice) -eti %::@status %string
    }
  }
}
alias _irc.on.snotice {
  _hook.call irc_onsnotice $1-
  if ($result == $null) {
    if ($_snoticefilter(%::nick,%::me,$1-) != $null) { _irc.echo.snotice $ifmatch }
  }
}
alias _irc.on.ctcp {
  var %win,%nick
  if (%::chan != $null) && ($window(%::@chan) == $null) { return }
  _hook.call irc_onctcp $1-
  if ($result != $null) { return }
  if ($_irc.protctcp(%::ircnum)) {
    if ($ifmatch == 1) { _irc.ctcp.a CTCP Flood detected! Ignoring all CTCPs (30 secs) }
    return 1
  }
  tokenize 32 $upper($1) $2-
  if ($1 == dcc) && ($istok(chat send accept resume,$2,32)) && (%::chan == $null) {

    var %size,%longip,%ip,%port,%file,%badcc

    if ($2 == chat) { var %longip = $4,%ip = $longip($4),%port = $5 }
    elseif ($2 == send) { var %size = $gettok($1-,$0,32),%longip = $gettok($1-,$calc($0 - 2),32),%ip = $longip(%longip),%port = $gettok($1-,$calc($0 - 1),32),%file = $remove($gettok($1-,3- [ $+ [ $calc($0 - 3) ] ] ,32),$chr(34)) }
    elseif ($istok(accept resume,$2,32)) { var %size = $gettok($1-,$0,32),%port = $gettok($1-,$calc($0 - 1),32),%file = $remove($gettok($1-,3- [ $+ [ $calc($0 - 2) ] ] ,32),$chr(34)) }

    if (($istok(send chat,$2,32)) && (%ip == $null)) || (%port == $null) || (($2 != chat) && ((%size == $null) || (%file == $null))) { %badcc = parameters }
    elseif (. isin %port) || ($_not($_isint(%port))) || (%port < 1024) || (%port > 65535) { %badcc = port }
    elseif ($istok(accept resume send,$2,32)) && (($nopath(%file) != %file) || ($_fixfilename(%file,m) == $null)) { %badcc = file }
    elseif ($istok(accept resume send,$2,32)) && ((. isin %size) || ($_not($_isint(%size)))) { %badcc = size }
    elseif ($istok(send chat,$2,32)) && (($_not($_isip(%ip))) || (127.* iswm %ip) || (*.255 iswm %ip) || (*.0 iswm %ip)) { %badcc = ip }

    if (%badcc != $null) {
      _irc.error.a Invalid DCC $2 request from %::nick $^bp(%::address) - Invalid $^b($upper(%badcc))
      return 1
    }


    if ($2 == accept) {
      var %t = DCCGET $+ %::ircnum $+   $+ %::nick $+  *,%i = 1,%mark
      while ($sock(%t,%i)) {
        if ($_sockmark($sock(%t,%i),12) == %port) {
          .timer $+ $sock(%t,%i) off
          %mark = $puttok($sock(%t,%i).mark,%size,7,9)
          sockclose $sock(%t,%i)
          _irc.dccget %mark
          return
        }
        inc %i
      }
    }
    elseif ($2 == chat) {
      var %t = DCCCHAT $+ %::ircnum $+   $+ %::nick,%s = DCC CHAT $+ %::ircnum $+   $+ %::nick,%w = @ $+ DCC CHAT $+ %::ircnum $+   $+ %::nick
      if ($sock(%t)) { sockclose %t }
      if ($sock(%s)) {
        _irc.error.s %::nick wants to DCC Chat with you, but there is an existing session.
        return
      }
      if ($creq == ignore) { _irc.echo.a $colour(ctcp) $^*** DCC Chat request from %::nick rejected }
      elseif ($creq == ask) { _timeremote _irc.askdccchatrequest %::me %s %::nick %::site %ip %port %w $sockname }
      else {
        sockopen %s %ip %port
        sockmark %s %::nick $+ $chr(9) $+ %::me $+ $chr(9) $+ %w $+ $chr(9) $+ $sockname $+ $chr(9) $+ $iif($_minio(0,20),1,0)
        _irc.openwin.chat %s
      }
    }
    elseif ($2 == resume) {
      var %t = DCCSEND $+ %::ircnum $+   $+ %::nick $+  *,%i = 1,%s
      while ($sock(%t,%i)) {
        %s = $ifmatch
        if ($sock(%s).port == %port) {
          sockmark %s $puttok($sock(%s).mark,%size,7,9)
          _irc.send.rcwin %s Resuming at %size bytes
          _irc.sw PRIVMSG %::nick :DCC ACCEPT $3- $+ 
          return
        }
        inc %i
      }
    }
    elseif ($2 == send) {
      var %l = $getdir(%file) $+ %file,%t = DCCGET $+ %::ircnum $+   $+ %::nick $+   $+ $replace(%file,$chr(32), ),%s = $replace(%t,DCCGET,DCC GET),%w = @ $+ %s,%sockmark = %l $+ $chr(9) $+ %w $+ $chr(9) $+ $ctime $+ $chr(9) $+ %size $+ $chr(9) $+ $sockname $+ $chr(9) $+ %::nick $+ $chr(9) $+ 0 $+ $chr(9) $+ 0 $+ $chr(9) $+ 1 $+ $chr(9) $+ 0 $+ $chr(9) $+ %ip $+ $chr(9) $+ %port $+ $chr(9) $+ %::site $+ $chr(9) $+ $iif($_minio(0,16),1,0)
      if ($sock(%t)) { sockclose %t }
      if ($sreq == ignore) { _irc.ctcp.a DCC Send request from %::nick rejected }
      elseif ($sock(%s)) { _irc.error.s %::nick wants to send you $^'(%file) $+ , but there's a get session with the same file with that user. }
      elseif ($sreq == ask) { _timeremote _irc.askdccsendrequest1 %sockmark }
      else { _timeremote _irc.dccget %sockmark }
      return
    }
  }
  else {
    _onctcp $1-
    if (%+ctcp.reply) && (%+ctcp.replymsg != $null) { _irc.sw NOTICE %::nick : $+ %+ctcp.replymsg $+  }
    if (%+ctcp.show) {
      var %chan,%act = $_minio(4,19)
      %::flags = _
      %::ctcp  = $upper($1)
      %::parms = $2-
      if (%+ctcp.hideparms) { %::flags = %::flags $+ h }
      if (@* iswm %::target) { %::flags = %::flags $+ o }
      if (%chan) {
        if ($_minio(2,30)) { %::flags = %::flags $+ p }
        %::flags = %::flags $+ $_irc.chanickopvoice(%::nick,%::@chan)
        if ($window(%::@chan)) { %:echo = echo2 $colour(ctcp) -ti %::@chan }
        elseif (%act) { %:echo = _irc.echo.a $colour(ctcp) }
        else { %:echo = echo2 $colour(ctcp) -eit %::@status }
        ^ctcpchan
      }
      else {
        if (%act) { %:echo = _irc.echo.a $colour(ctcp) }
        else { %:echo = echo2 $colour(ctcp) -eit %::@status }
        ^ctcpuser
      }
    }
  }
}
alias _irc.on.ctcpreply {
  _hook.call irc_onctcpreply $1-
  if ($result == $null) {
    if ($1 == ping) && ($2- isnum) && ($2- < $ticks) && ($2- > 0) {
      var %p = $calc(($ticks - $2) / 1000)
      if (%p < 1) { %p = $_duration(%p,3) }
      elseif (%p < 60) { %p = $_duration(%p,2) }
      else { %p = $_duration(%p,0) }
      _irc.echoctcpreply PING %p
    }
    else { _irc.echoctcpreply $1- }
  }
}
alias _irc.echoctcpreply {
  if ($_minio(4,19)) { %:echo = _irc.echo.a $colour(ctcp) }
  else { %:echo = echo2 $colour(ctcp) -eit %::@status }
  %::ctcp = $upper($1)
  %::parms = $2-
  %::flags = _
  ^ctcpreply
}

alias _irc.on.nick {
  var %halt = 0
  _hook.call irc_onnick $1-
  if ($result != $null) { %halt = 1 }
  if (%::nick == %::me) {
    sockmark $sockname $puttok($sock($sockname).mark,%::newnick,1,9)
    titlebar %::@status %::newnick $gettok($window(%::@status).title,2-,32)
    if (%halt == 0) {
      %:echo = echo2 $colour(nick) -et %::@status
      %::flags = y
      ^nick
    }
    _recent.add nick 10 %::newnick
    var %n = DCC CHAT $+ %::ircnum $+  *,%i = 1
    while ($sock(%n,%i)) {
      if ($_sockmark($ifmatch,2) == %::nick) { sockmark $sock(%n,%i) $puttok($sock($ifmatch).mark,%::newnick,2,9) }
      inc %i
    }
    var %n = DCCCHAT $+ %::ircnum $+  *,%i = 1
    while ($sock(%n,%i)) {
      if ($_sockmark($ifmatch,2) == %::nick) { sockmark $sock(%n,%i) $puttok($sock($ifmatch).mark,%::newnick,2,9) }
      inc %i
    }
  }
  unset %:echo
  %::flags = c
  tokenize 32 $^nick
  var %win,%chan,%match = @CH_ $+ %::ircnum $+  *,%i = $window(%match,0)
  while (%i) {
    %win = $window(%match,%i)
    if ($_irc.linick(%::nick,%win)) {
      %chan = $gettok(%win,2,160)
      if ($_irc.Wisowner(%::nick,%win)) { rline -l %win $_irc.linick(%::nick,%win) 1. $+ %::newnick }
      elseif ($_irc.Wisop(%::nick,%win)) { rline -l %win $_irc.linick(%::nick,%win) 2@ $+ %::newnick }
      elseif ($_irc.Wisvo(%::nick,%win)) { rline -l %win $_irc.linick(%::nick,%win) 3+ $+ %::newnick }
      else { rline -l %win $_irc.linick(%::nick,%win) 4 $+ %::newnick }
      if (%halt == 0) && ($_not($_chanevent(nicks,%chan))) { echo2 $colour(nick) -t %win $1- }
    }
    dec %i
  }
}
alias _irc.on.usermode {
  _hook.call irc_onusermode $1-
  if ($result == $null) {
    %:echo = echo2 $colour(mode) -et %::@status
    %::modes = $1-
    ^usermode
  }
  var %wt1 = $gettok($window(%::@status).title,1,32),%wtm = $remove($gettok($window(%::@status).title,2,32),[,],+),%wt3 = $gettok($window(%::@status).title,3-,32),%signo = +,%i = 1,%ordalf
  while ($mid($1,%i,1) != $null) {
    if ($mid($1,%i,1) == +) || ($mid($1,%i,1) == -) { var %signo = $ifmatch }
    else {
      if (%signo == -) { %wtm = $remove(%wtm,$mid($1,%i,1)) }
      else {
        %ordalf = $mid($1,%i,1) $+ %wtm
        %wtm = $_order(%ordalf)
      }
    }
    inc %i
  }
  %wtm = $remove(%wtm,+)
  if (%wtm == $null) { var %wtm }
  titlebar %::@status %wt1 [+ $+ %wtm $+ $chr(93) %wt3
}
alias _irc.on.rawmode {
  if ($window(%::@chan) == $null) { return }
  _hook.call irc_onrawmode $1-
  if ($result == $null) {
    var %show = $_chanevent(modes,%::chan)
    if (%show == 2) {  }
    else {
      %::modes = $1-
      if (%show) && ($window(%::@chan)) { %:echo = echo2 $colour(mode) -et %::@status }
      else { %:echo = echo2 $colour(mode) -t %::@chan }
      ^mode
    }
  }
  var %signo = +,%wtmodos = $_irc.chan(0,%::chan).mode,%wtm = $remove($gettok(%wtmodos,1,32),+),%inc,%tnick,%l = 1,%wtp,%wtl,%tt
  if (%wtm == $null) { var %wtm }
  if ($gettok(%wtmodos,3,32)) {
    %wtp = $gettok(%wtmodos,2,32)
    %wtl = $gettok(%wtmodos,3,32)
  }
  else {
    if (k isin %wtm) { %wtp = $gettok(%wtmodos,2,32) }
    if (l isin %wtm) { %wtl = $gettok(%wtmodos,2,32) }
  }
  while ($mid($1,%l,1) != $null) {
    %tt = $ifmatch
    if (%tt == +) || (%tt == -) { var %signo = $ifmatch }
    else {
      var %t = %signo $+ %tt
      if (%tt isin obhv) {
        inc %inc
        var %tnick = $gettok($2-,%inc,32)
        if (%t == +o) { rline -l %::@chan $_irc.linick(%tnick,%::@chan) 2@ $+ %tnick }
        if (%t == -o) && ($_irc.Wisop(%tnick,%::@chan)) { rline -l %::@chan $_irc.linick(%tnick,%::@chan) 4 $+ $remove(%tnick,@) }
        if (%t == +v) && ($_not($_irc.Wisop(%tnick,%::@chan))) { rline -l %::@chan $_irc.linick(%tnick,%::@chan) 3+ $+ %tnick }
        if (%t == -v) && ($_irc.Wisvo(%tnick,%::@chan)) { rline -l %::@chan $_irc.linick(%tnick,%::@chan) 4 $+ $remove(%tnick,+) }
      }
      elseif (%tt isin lk) {
        if (%signo == -) {
          var %wtm = $removecs(%wtm,%tt)
          if (%tt == k) { var %wtp }
          if (%tt == l) { var %wtl }
        }
        else {
          inc %inc
          if (%wtm != $null) { %wtm = $removecs(%wtm,%tt) }
          if (%tt == k) { %wtp = $gettok($2-,%inc,32) }
          if (%tt == l) { %wtl = $gettok($2-,%inc,32) }
          if (%wtm != $null) { %wtm = %tt $+ %wtm }
          else { %wtm = %tt }
        }
      }
      elseif (%signo == -) { var %wtm = $remove(%wtm,%tt) }
      else {
        if (%wtm != $null) { %wtm = $removecs(%wtm,%tt) }
        if (%wtm != $null) { %wtm = %tt $+ %wtm }
        else { %wtm = %tt }
      }
      if (%wtm == $null) { var %wtm }
      var %r = %r $+ %t
    }
    inc %l
  }
  %wtm = $remove(%wtm,[,],+)
  if (%wtm != $null) { %wtm = $_order(%wtm) }
  else { var %wtm }
  var %members,%modes,%tmodes,%topic = $_irc.chan(0,%::chan).topic
  if ($remove(%wtm,+) != $null) {
    %tmodes = + $+ $ifmatch
    if (k isincs %wtm) { %tmodes = %tmodes %wtp }
    if (l isincs %wtm) { %tmodes = %tmodes %wtl }
  }
  %members = [[ $+ $line(%::@chan,0,1) $+ ]]
  if (%tmodes != $null) { %modes = [[ $+ $ifmatch $+ ]] }
  if (%topic != $null) || ($len(%topic)) {
    if (%modes != $null) { %modes = %modes $+ : }
    else { %members = %members $+ : }
  }
  titlebar %::@chan %members %modes %topic
}
alias _irc.on.kick {
  var %halt = 0
  _hook.call irc_onkick $1-
  if ($result != $null) { %halt = 1 }

  if ($window(%::@chan) == $null) { return }
  %::reason = $1-
  if (%::knick == %::me) {
    close -@ %::@chan
    if (%halt == 0) {
      %:echo = echo2 $colour(kick) -t %::@status
      %::flags = y
      ^kick
    }
    _irc.sw JOIN %::chan
  }
  else {
    if (%halt == 0) {
      var %show = $_chanevent(kicks,%::chan)
      %:echo = echo2 $colour(kick) -t %::@status
      %::flags = y
      if (%show == 2) { }
      elseif (%show) {
        %:echo = echo2 $colour(kick) -t %::@status
        %::flags = _
        ^kick
      }
      else {
        %:echo = echo2 $colour(kick) -t %::@chan
        %::flags = c
        ^kick
      }
    }
    dline -l %::@chan $_irc.linick(%::knick,%::@chan)
    _irc.chanmembers2title %::@chan
  }
}
alias _irc.on.join {
  var %halt = 0
  _hook.call irc_onjoin $1-
  if ($result != $null) { %halt = 1 }

  var %show = $_chanevent(joins,%::chan),%short = $_minio(2,19),%addr = $_minio(0,2)
  if (%::nick == %::me) {
    _synchtime.set %::ircnum %::chan
    _irc.openwin wchannel %::@chan
    titlebar %::@chan [0]
    _irc.sw MODE %::chan
    _recent.add channel 10 %::chan
    if (%halt == 0) && (%show != 2) {
      %:echo = echo2 $colour(join) -t %::@chan
      %::flags = y
      ^join
    }
    _irc.chanmembers2title %::@chan
  }
  else {
    if ($window(%::@chan) == $null) { return }
    aline -l %::@chan 4 $+ %::nick
    _irc.chanmembers2title %::@chan
    if (%halt == 0) {
      %::flags = _
      if (%short) { %::flags = %::flags $+ s }
      if (%addr) { %::flags = %::flags $+ a }
      if (%show) { %:echo = echo2 $colour(join) -et %::@status }
      else {
        %::flags = %::flags $+ c
        %:echo = echo2 $colour(join) -t %::@chan
      }
      ^join
    }
  }
}
alias _irc.on.part {
  var %halt = 0
  _hook.call irc_onpart $1-
  if ($result != $null) { %halt = 1 }

  var %show = $_chanevent(parts,%::chan),%short = $_minio(2,19),%addr = $_minio(0,2)
  if ($window(%::@chan) == $null) { return }
  dline -l %::@chan $_irc.linick(%::nick,%::@chan)
  _irc.chanmembers2title %::@chan
  if (%halt == 0) {
    if (%show == 2) {  }
    else {
      %::flags = _
      if (%short) { %::flags = %::flags $+ s }
      if (%addr) { %::flags = %::flags $+ a }
      if ($len($1-)) { %::flags = %::flags $+ p }
      %::reason = $1-
      if (%show) { %:echo = echo2 $colour(part) -et %::@status }
      else {
        %::flags = %::flags $+ c
        %:echo = echo2 $colour(part) -t %::@chan
      }
      ^part
    }
  }
  if (%::nick == %::me) { close -@ %::@chan }
}
alias _irc.on.invite {
  _hook.call irc_oninvite $1-
  if ($result == $null) {
    if ($_minio(3,26)) && ($_irc.ircnum($active,1) == $_irc.ircnum) && (@Status* !iswm $active) { %:echo = echo2 $colour(invite) -at }
    else { %:echo = echo2 $colour(invite) -et %::@status }
    ^invite
  }
}
alias _irc.remotechantext {
  if ($_wordisinstring(%::me,$1-)) {
    if ($_rchini(_warnyournick,%::chan)) { _irc.lechol.s $^*** < $+ %::nick $+ : $+ %::chan $+ > $1- }
  }
}
;;
; /_irc.dccget <same as /_irc.askdccsendrequest1>
;  1 - local file
;  2 - dcc get window
;  3 - $ctime (start)
;  4 - file size
;  5 - IRC session socket
;  6 - remote nick
;  7 - transfer begins from byte ... (0 for the complete file)
;  8 - Current byte in transfer
;  9 - local file 1=not erased 0=erased
; 10 - 1=resume 0=no resume
; 11 - remote IP
; 12 - remote port
; 13 - remote site
; 14 - open window minimized
;
alias _irc.dccget {
  var %i,%d,%r,%s = DCCGET $+ $remove($gettok($1-,5,9),IRC) $+   $+ $gettok($1-,6,9) $+   $+ $replace($nopath($gettok($1-,1,9)),$chr(32), ),%t = $replace(%s,DCCGET,DCC GET)
  if ($isfile($gettok($1-,1,9)) == $true) && ($gettok($1-,10,9) == 0) {
    unset %c.irc.askdccsendrequest2.*
    while (1) {
      inc %i
      %d = irc.askdccsendrequest2 $+ %i
      if ($dialog(%d) == $null) { break }
    }
    %c.irc.askdccsendrequest2.file = File: $nopath($gettok($1-,1,9))
    %c.irc.askdccsendrequest2.size = Size: $gettok($1-,4,9)
    showmirc -s
    %r = $dialog(%d,irc.askdccsendrequest2,-4)
    if ($gettok(%r,1,32) == rename) {
      .timer -o 1 0 _irc.askdccsendrequest1 $1-
      return
    }
    if ($gettok(%r,1,32) == resume) {
      sockwrite -n $gettok($1-,5,9) PRIVMSG $gettok($1-,6,9) :DCC RESUME file.ext $gettok($1-,12,9) $file($gettok($1-,1,9)).size $+ 
      socklisten %s
      sockmark %s $puttok($1-,1,10,9)
      .timer $+ %s -o 1 $_minio(2,11) _closesocket %s
      return
    }
  }
  .timer $+ $gettok($1-,2,9) off
  close -@ $gettok($1-,2,9)
  _irc.openwin wdccg $gettok($1-,2,9) $iif($gettok($1-,14,9),-n)
  sockopen %t $gettok($1-,11,9) $gettok($1-,12,9)
  sockmark %t $1-
  _irc.get.rwin %t
  _irc.get.rcwin %t Acknowledging...
}
dialog irc.askdccsendrequest2 {
  title "aIRC DCC Get"
  size -1 -1 105 62
  option dbu

  text "The file you are about to download exists in your hard disk.",10,6 6 94 20,center

  text %c.irc.askdccsendrequest2.file,50,21 24 117 10
  text %c.irc.askdccsendrequest2.size,60,19 32 117 10

  button "Overwrite",100,5 45 31 13,ok
  button "Resume",101,38 45 31 13
  button "Rename",102,71 45 31 13,cancel

  edit "overwrite",400,3 67 136 11,autohs hide result
}
ON *:DIALOG:irc.askdccsendrequest2*:init:0:{
  _mdx.init $_icofile(question.ico)
  did -f $dname 102
  unset %c.irc.askdccsendrequest2.*
}
ON *:DIALOG:irc.askdccsendrequest2*:sclick:101:{
  did -o $dname 400 1 resume
  dialog -k $dname
}
ON *:DIALOG:irc.askdccsendrequest2*:sclick:102:{
  did -o $dname 400 1 rename
  dialog -k $dname
}