aIRC — File Browser

aIRCv0.8.69 / aIRCv0.8.69 / addons / irc1.mrc

irc1.mrc — 27.05 KB — Download this file

;/**********************************************************************
; *
; * aIRC
; * IRC Client file 1
; *
; **********************************************************************/
;
;
;
alias _irc.load {  }
alias _irc.unload {
  if ($sock(IRC*)) || ($sock(DCCSEND*)) || ($sock(DCC SEND*)) || ($sock(DCCCHAT*)) || ($sock(DCC CHAT*)) || ($sock(DCC GET*)) {
    error.a Please close all IRC and DCC sessions before you try to uninstall the IRC Client.
    return 1
  }
}
alias _irc.addonver { return 1.0 }
dialog _irc.dialog {
  size -1 -1 115 157
  title "IRC Client [/irc]"
  option dbu

  box "Server",1000,5 5 105 55
  text "Server:",1001,10 15 25 10
  edit "",1002,35 13 70 10,autohs
  text "Port:",1003,10 30 25 10
  edit "",1004,35 28 70 10,autohs
  text "Password:",1005,10 45 25 10
  edit "",1006,35 43 70 10,autohs

  box "User",1010,5 65 105 70
  text "&Full Name:",1011,10 75 25 10
  edit "",1012,35 73 70 10,autohs
  text "E-&Mail:",1013,10 90 25 10
  edit "",1014,35 88 70 10,autohs
  text "&Nickname:",1015,10 105 25 10
  edit "",1016,35 103 70 10,autohs
  text "&Alt Nick:",1017,10 120 25 10
  edit "",1018,35 118 70 10,autohs

  button "Help",2991,5 140 30 15,disable
  button "Connect!",2992,43 140 30 15,ok
  button "Cancel",2993,80 140 30 15,cancel
}
alias _irc.dialog { _dialog -m _irc.dialog _irc.dialog }
ON *:DIALOG:_irc.dialog:*:*:{
  if ($devent == init) { _mdx.init $_icofile(ircclient.ico,$scriptdir) }
  elseif ($devent == sclick) && ($did == 2992) {
    if ($did(2992).enabled) {
      var %d = $dname,%server = $did(%d,1002,1),%port = $did(%d,1004,1),%pass = $did(%d,1006,1),%name = $did(%d,1012,1),%email = $did(%d,1014,1),%nick = $did(%d,1016,1),%anick = $did(%d,1018,1)
      _dummy $_irc.connect(%server,%port,%pass,%name,%email,%nick,%anick)
    }
    else { halt }
  }
  _irc.rdialog
}
alias irc {
  var %d = _irc.dialog,%server,%port,%pass,%name,%email,%nick,%anick,%tnick1,%tnick2

  _getlocalip irc $1-
  if ($result) { return }

  %server = $1
  tokenize 32 $2 $3-
  if ($_not($_isint($1))) { tokenize 32 $int($_minio(5,11)) $1- }
  %port = $1
  %nick = $2

  %name = $remove($_mini(mirc,user),$chr(9))
  if (%name == $null) { %name = airc }
  if ($_mini(mirc,email) != $null) { %email = $ifmatch }
  else { %email = airc@mail.com }
  %tnick1 = $mnick
  %tnick2 = $anick

  if (%nick != $null) {
    if (%tnick1 != %nick) { %anick = %tnick1 }
    else { %anick = %tnick2 }
    _dummy $_irc.connect(%server,%port,%pass,%name,%email,%nick,%anick)
  }
  else {
    if (%server == $null) { %server = $gettok($_mini(mirc,host),2,58) }
    %nick = %tnick1
    %anick = %tnick2
    _dialog -m %d %d
    did -o %d 1002 1 %server
    did -o %d 1004 1 %port
    did -o %d 1006 1 %pass
    did -o %d 1012 1 %name
    did -o %d 1014 1 %email
    did -o %d 1016 1 %nick
    did -o %d 1018 1 %anick
    _irc.rdialog
  }
}
alias _irc.connect {
  var %server = $1,%port = $2,%pass = $3,%name = $remove($4,$chr(9)),%email = $5,%nick = $6,%anick = $7,%i = 1,%tmp
  if (%pass == $null) { %pass = $null }
  if ($remove(%email,$chr(9)) != $null) { %email = $ifmatch }
  else { %email = airc@mail.com }
  if (%name == $null) { %name = airc }
  while ($sock(IRC [ $+ [ %i ] ] )) { inc %i }
  if ($window(@Status [ $+ [ %i ] ] ) == $null) { _irc.openwin status @Status $+ %i }
  echo2 $colour(info) -it @Status $+ %i $^*** Connecting to %server ( $+ %port $+ )
  %tmp = +irc.*. $+ %i
  unset % [ $+ [ %tmp ] ]
  sockopen IRC $+ %i %server %port
  sockmark IRC $+ %i %nick $+ $chr(9) $+ %server $+ $chr(9) $+ $null $+ $chr(9) $+ 0 $+ $chr(9) $+ $iif(%pass != $null,%pass,$null) $+ $chr(9) $+ %name $+ $chr(9) $+ $iif(%email != $null,%email,%email) $+ $chr(9) $+ $iif(%anick != $null,%anick,$null) $+ $chr(9) $+ _
}
alias _irc.rdialog {
  var %d = _irc.dialog
  if ($dialog(%d) == $null) { return }
  if ($_not($_ishost($did(%d,1002,1)))) || ($_not($_isint($did(%d,1004,1)))) || ($_text($did(%d,1012,1)) == $null) || ($_text($did(%d,1014,1)) == $null) || ($_text($did(%d,1016,1)) == $null) { did -b %d 2992 }
  else { did -e %d 2992 }
}
alias _irc.ircnum {
  if ($sockname) && ($2 == $null) { return $remove($gettok($sockname,1-2,160),$remove($gettok($sockname,1-2,160),1,2,3,4,5,6,7,8,9)) }
  if (@Status* iswm $1) { return $remove($1,@Status) }
  if (@CH_* iswm $1) { return $remove($gettok($1,1,160),@CH_) }
  if (@Q_* iswm $1) { return $remove($gettok($1,1,160),@Q_) }
  if (@DCC CHAT* iswm $1) { return $remove($gettok($1,1-2,160),@DCC CHAT) }
  if (@DCC SEND* iswm $1) { return $remove($gettok($1,1-2,160),@DCC SEND) }
  if (@DCC GET* iswm $1) { return $remove($gettok($1,1-2,160),@DCC GET) }
  if (@Status* iswm $active) { return $remove($active,@Status) }
  if (@CH_* iswm $active) { return $remove($gettok($active,1,160),@CH_) }
  if (@Q_* iswm $active) { return $remove($gettok($active,1,160),@Q_) }
  if (@DCC CHAT* iswm $active) { return $remove($gettok($active,1-2,160),@DCC CHAT) }
  if (@DCC SEND* iswm $active) { return $remove($gettok($active,1-2,160),@DCC SEND) }
  if (@DCC GET* iswm $active) { return $remove($gettok($active,1-2,160),@DCC GET) }
}
alias _irc.ircnums {
  if ($1) { return IRC $+ $_irc.ircnum($1) }
  return IRC $+ $_irc.ircnum
}
alias _irc.active { return $gettok($active,2,160) }
alias _irc.ischan { return $iif(@CH_* iswm $1,1,0) }
alias _irc.isquery { return $iif(@Q_* iswm $1,1,0) }
alias _irc.linick {
  if ($fline($2,$1,1,1)) || ($fline($2,+ [ $+ [ $1 ] ] ,1,1)) || ($fline($2,@ [ $+ [ $1 ] ] ,1,1)) || ($fline($2,. [ $+ [ $1 ] ] ,1,1)) { return $ifmatch }
}
alias _irc.Wisowner { return $iif(1.* iswm $line($2,$_irc.linick($1,$2),1),1,0) }
alias _irc.Wisop {
  var %t = $line($2,$_irc.linick($1,$2),1)
  return $iif(2@* iswm %t || 1.* iswm %t,1,0)
}
alias _irc.Wisvo { return $iif(3+* iswm $line($2,$_irc.linick($1,$2),1),1,0) }
alias _irc.snicks {
  if (@CH_* !iswm $active) { return }
  if ($sline($active,0) == 0) { return }
  if ($sline($active,0) == 1) { return $remove($strip($sline($active,1)),.,@,+) }
  var %t = 1,%f
  while ($sline($active,%t) != $null) {
    %f = %f $ifmatch
    inc %t
  }
  return $replace($remove($strip(%f),.,@,+),$chr(32),$chr(44))
}
alias _irc.chanickopvoice {
  var %nick = $1,%chanwin = $2,%flags = _
  if ($_irc.linick(%nick,%chanwin)) {
    %nick = $strip($line(%chanwin,$ifmatch,1))
    if (.* iswm %nick) { %flags = %flags $+ . }
    if (@* iswm %nick) { %flags = %flags $+ @ }
    if (+* iswm %nick) { %flags = %flags $+ + }
  }
  return %flags
}
alias _irc.prefixnick {
  var %nick = $1,%chanwin = $2
  if ($_minio(2,30)) {
    if ($_irc.linick(%nick,%chanwin)) { return $strip($line(%chanwin,$ifmatch,1)) }
  }
  return %nick
}
alias _irc.chanmembers2title {
  var %win = $1,%members,%title
  if ($window(%win)) {
    var %members = $line(%win,0,1),%title = $gettok($window(%win).title,2-,32)
    if (%title != $null) && ([+*] * !iswm %title) && ([+*]: * !iswm %title) { titlebar %win [ $+ %members $+ ]: %title }
    else { titlebar %win [[ $+ %members $+ ]] %title }

  }
}
alias _irc.param { return $_parameter($1,1,IRC Client [/irc],$2,$3,$4) }
alias _irc.busynick { _irc.busynick2 $1 $2 $_parameter($null,0,IRC Client [/irc],1,$remove($2,"),Somebody is using the nick [ $remove($2,") ] <COMMA> please choose another:) }
alias _irc.busynick2 {
  if ($3 == $null) { _irc.busynick $1 $2 }
  else {
    sockwrite -n $1 NICK $3
    sockmark $1 $puttok($sock($1).mark,$3,1,9)
  }
}
alias _irc.badnick { _irc.badnick2 $1 $2 $_parameter($null,0,IRC Client [/irc],1,$remove($2,"),Invalid nick: [ $remove($2,") ] <COMMA> please choose another:) }
alias _irc.badnick2 {
  if ($3 == $null) { _irc.busynick $1 $2 }
  else {
    sockwrite -n $1 NICK $3
    sockmark $1 $puttok($sock($1).mark,$3,1,9)
  }
}
alias _irc.sw {
  var %sock = IRC $+ $_irc.ircnum
  if ($sock(%sock)) {
 sockwrite -n %sock $1-
 }
}
alias _irc.checkquery {
  var %t = @Q_ $+ $_irc.ircnum $+   $+ $gettok($1,1,33),%t2
  if ($window(%t)) {
    if ($2 != $null) {
      %t2 = @Q_ $+ $_irc.ircnum $+   $+ $2
      renwin %t %t2
      %:echo   = echo2 $colour(nick) -it %t2
      %::flags = c
      ^nick
    }
    titlebar $iif($2,%t2,%t) ( $+ $gettok($1,2,33) $+ )
  }
}
alias _irc.mequit {
  var %i = $window(0),%win,%tmp,%ch = @CH_ $+ $1,%qy = @Q_ $+ $1
  while (%i) {
    %win = $window(%i)
    if ($gettok(%win,1,160) == %ch) || ($gettok(%win,1,160) == %qy) {
      close -@ %win
    }
    dec %i
  }
  %tmp = +irc.*. $+ $1
  unset % [ $+ [ %tmp ] ]
  .timer $+ %tmp off
  %win = @Status $+ $1
  var %string
  if ($2- != $null) { %string = [[ $+ $2- $+ ]] }
  if ($window(%win)) { echo2 $colour(info) -eit %win $^*** Disconnected %string }
  else { info.a Disconnected IRC Session $1 %string }
}
alias _irc.mmode {
  var %i = 1
  tokenize 32 $1 $2 $replace($3-,$chr(44),$chr(32))
  while ($gettok($3-,%i,32)) {
    _irc.sw MODE $1 $left($2,1) $+ $str($right($2,1),$numtok($gettok($3-, [ %i $+ - $+ [ $calc(%i + 3) ] ] ,32),32)) $gettok($3-, [ %i $+ - $+ [ $calc(%i + 3) ] ] ,32)
    inc %i 4
  }
}
alias _irc.usermode {
  var %win
  if ($_not($1)) { tokenize 32 $_irc.ircnum $2- }
  if ($_not($_isint($1))) { return }
  %win = @Status $+ $1
  if ($window(%win) == $null) { return }
  return $right($left($gettok($window(%win).title,2,32),-1),-1)
}
;
;;
;
; $_irc.chan(session|0 or $null for autodetect,N/chan).[property]
;   properties: topic, mode, key, limit, ial, win
;
alias _irc.chan {
  var %chan,%wwildcard,%win,%modes,%m,%tmp,%title,%topic,%members,%tmode
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %wwildcard = @CH_ $+ $1 $+  *
  if ($2 != $null) {
    if ($2 isnum) {
      if ($2 <= 0) { return $window(%wwildcard,0) }
      else { %win = $window(%wwildcard,$2) }
    }
    elseif (%wwildcard iswm $2) { %win = $2 }
    elseif ($_ischan($2)) { %chan = $2 }
  }
  elseif (%wwildcard iswm $active) { %win = $active }
  if (%chan == $null) && (%win != $null) { %chan = $gettok(%win,2,160) }
  %win = @CH_ $+ $1 $+ $chr(160) $+ %chan
  if ($window(%win) == $null) { return }
  if ($prop == $null) { return %chan }
  if ($prop == win) { return %win }
  if ($prop == status) { return joined }
  if ($prop == ial) { return $false }
  %title = $window(%win).title
  tokenize 32 %title
  %members = $remove($1,[,],:)
  if (*]: iswm $1) || ([* !iswm $2) { var %modes,%topic = $2- }
  elseif (*]: iswm $2) || (*] iswm $2) { var %modes = $2,%topic = $3- }
  elseif (k isincs $2) && (l isincs $2) { var %modes = $2-4,%topic = $5- }
  elseif (k isincs $2) || (l isincs $2) { var %modes = $2-3,%topic = $4- }
  else { }
  if ($prop == topic) { return %topic }
  if (*]: iswm %modes) { %modes = $left(%modes,-2) }
  elseif (*] iswm %modes) { %modes = $left(%modes,-1) }
  if ([+* iswm %modes) { %modes = $right(%modes,-2) }
  elseif ([* iswm %modes) { %modes = $right(%modes,-1) }
  %tmode = $gettok(%modes,1,32)
  %modes = + $+ %tmode $gettok(%modes,2-,32)
  if ($prop == mode) {
    if (%tmode == $null) { return }
    return %modes
  }
  %m = $gettok(%modes,1,32)
  if ($prop == key) {
    if (k isincs %m) {
      if (l !isincs %m) || ($pos(%m,k) < $pos(%m,l)) { return $gettok(%modes,2,32) }
      return $gettok(%modes,3,32)
    }
  }
  if ($prop == limit) {
    if (l isincs %m) {
      if (k !isincs %m) || ($pos(%m,l) < $pos(%m,k)) { return $gettok(%modes,2,32) }
      return $gettok(%modes,3,32)
    }
  }
}
;
;;
;
; $_irc.query(session|0 or $null for autodetect,N/query).[property]
;   properties: address, win
;
alias _irc.query {
  var %query,%wwildcard,%win
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %wwildcard = @Q_ $+ $1 $+  *
  if ($2 != $null) {
    if ($2 isnum) {
      if ($2 <= 0) { return $window(%wwildcard,0) }
      else { %win = $window(%wwildcard,$2) }
    }
    elseif (%wwildcard iswm $2) { %win = $2 }
    else { %query = $2 }
  }
  elseif (%wwildcard iswm $active) { %win = $active }
  if (%query == $null) && (%win != $null) { %query = $gettok(%win,2,160) }
  %win = @Q_ $+ $1 $+ $chr(160) $+ %query
  if ($window(%win) == $null) { return }
  if ($prop == $null) { return %query }
  if ($prop == win) { return %win }
  if ($prop == address) { return $remove($window(%win).title,$chr(40),$chr(41))) }
}
;
;;
;
; $_irc.chat(session|0 or $null for autodetect,N/chat).[property]
;   properties: ip, status, win
;
alias _irc.chat {
  var %chat,%wwildcard,%win,%sock1,%sock2
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %wwildcard = @DCC CHAT $+ $1 $+  *
  if ($2 != $null) {
    if ($2 isnum) {
      if ($2 <= 0) { return $window(%wwildcard,0) }
      else { %win = $window(%wwildcard,$2) }
    }
    elseif (%wwildcard iswm $2) { %win = $2 }
    else { %chat = $2 }
  }
  elseif (%wwildcard iswm $active) { %win = $active }
  if (%chat == $null) && (%win != $null) { %chat = $gettok(%win,3,160) }
  %win = @DCC CHAT $+ $1 $+ $chr(160) $+ %chat
  if ($window(%win) == $null) { return }
  if ($prop == $null) { return %chat }
  if ($prop == win) { return %win }
  if ($prop == ip) { return $remove($window(%win).title,$chr(40),$chr(41))) }
  if ($prop == status) {
    %sock1 = $remove(%win,@)
    %sock2 = $replace(%sock1,DCC CHAT,DCCCHAT)
    if ($sock(%sock2)) { return waiting }
    if ($sock(%sock1)) { return active }
    return inactive
  }
}
;
;;
;
; $_irc.ison(session|0 or $null for autodetect,nick,channel)
;
alias _irc.ison {
  var %win
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %win = @CH_ $+ $1 $+ $chr(160) $+ $3
  if ($window(%win) == $null) { return 0 }
  if ($_irc.linick($2,%win)) { return 1 }
  return 0
}
;
;;
;
; $_irc.isowner(session|0 or $null for autodetect,nick,channel)
;
alias _irc.isowner {
  var %win
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %win = @CH_ $+ $1 $+ $chr(160) $+ $3
  if ($window(%win) == $null) { return 0 }
  return $_irc.Wisowner($2,%win)
}
;
;;
;
; $_irc.isop(session|0 or $null for autodetect,nick,channel)
;
alias _irc.isop {
  var %win
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %win = @CH_ $+ $1 $+ $chr(160) $+ $3
  if ($window(%win) == $null) { return 0 }
  return $_irc.Wisop($2,%win)
}
;
;;
;
; $_irc.isvo(session|0 or $null for autodetect,nick,channel)
;
alias _irc.isvo {
  var %win
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %win = @CH_ $+ $1 $+ $chr(160) $+ $3
  if ($window(%win) == $null) { return 0 }
  return $_irc.Wisvo($2,%win)
}
;
;;
;
; $_irc.comchan(session|0 or $null for autodetect,nick,N)
;
alias _irc.comchan {
  var %i,%chan,%c
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %i = $_irc.chan($1,0)
  while (%i) {
    %chan = $_irc.chan($1,%i)
    if ($_irc.ison($1,$2,%chan)) {
      inc %c
      if (%c == $3) { return %chan }
    }
    dec %i
  }
  if ($3 == 0) { return %c }
}
;
;;
;
; $_irc.idle(session|0 or $null for autodetect)
;
alias _irc.idle {
  var %s,%idlem
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %idlem = %+irc.idlem. [ $+ [ $1 ] ]
  if (%idlem) {
    if ($ctime > %idlem) { return $round($calc($ctime - %idlem),0) }
  }
  return 0
}
;
;;
;
; $_irc.away(session|0 or $null for autodetect)
;
alias _irc.away {
  var %s
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %s = IRC $+ $1
  if (a isincs $_sockmark(%s,9)) { return $true }
  return $false
}
;
;;
;
; $_irc.me(session|0 or $null for autodetect)
;
alias _irc.me {
  var %s
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %s = IRC $+ $1
  return $_sockmark(%s,1)
}
;
;;
;
; $_irc.server(session|0 or $null for autodetect)
;
alias _irc.server {
  var %s
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %s = IRC $+ $1
  return $_sockmark(%s,3)
}
;
;;
;
; $_irc._server(session|0 or $null for autodetect)
;
alias _irc._server {
  var %s
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %s = IRC $+ $1
  return $_sockmark(%s,2)
}
;
;;
;
; $_irc.nick(session|0 or $null for autodetect,chan,N/nick)
;
alias _irc.nick {
  var %win
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %win = @CH_ $+ $1 $+ $chr(160) $+ $2
  if ($window(%win) == $null) { return }
  if ($3 == 0) { return $line(%win,0,1) }
  if ($_isint($3)) { return $remove($strip($line(%win,$3,1)),.,@,+) }
  if ($_irc.linick($3,%win)) { return $3 }
}
;
;;
;
; $_irc.snick(session|0 or $null for autodetect,chan,N)
;
alias _irc.snick {
  var %win
  if ($1 == 0) || ($1 == $null) { tokenize 32 $_irc.ircnum $2- }
  if ($1 !isnum) { return }
  %win = @CH_ $+ $1 $+ $chr(160) $+ $2
  if ($window(%win) == $null) { return }
  if ($3 == 0) {
    if ($sline(%win,0)) { return $ifmatch }
    return 0
  }
  if ($remove($strip($sline(%win,$3)),.,@,+) != $null) { return $ifmatch }
}
;
;;
;
; /_irc.togglechanmodes <chan> <mode>
;
alias _irc.togglechanmodes {
  var %m = $gettok($_irc.chan(0,$1).mode,1,32)
  if ($2 === k) {
    if (k isincs %m) { _irc.com MODE $1 -k $_irc.chan(0,$1).key }
    else { _irc.com MODE $1 +k $_param(1,$null,Channel key:)) }
  }
  elseif ($2 === l) {
    if (l isincs %m) { _irc.com MODE $1 -l }
    else { _irc.com MODE $1 +l $_param(isint,$null,Max users in channel:) }
  }
  else { _irc.com MODE $1 $iif($2 isincs %m,-,+) $+ $2 }
}
;
;;
;
; /_irc.askdccchatrequest
; 1 - local nick
; 2 - dcc socket name
; 3 - remote nick
; 4 - remote site
; 5 - remote IP
; 6 - remote port
; 7 - dcc window name
; 8 - IRC session socket name
;
alias _irc.askdccchatrequest {
  var %i,%d,%r
  while (1) {
    inc %i
    %d = irc.askdccchatrequest $+ %i
    if ($dialog(%d) == $null) { break }
  }
  unset %c.irc.askdccchatrequest.*
  %c.irc.askdccchatrequest.nick = $3
  %c.irc.askdccchatrequest.addy = ( $+ $4 $+ )
  showmirc -s
  %r = $dialog(%d,irc.askdccchatrequest,-4)
  if (%r == chat) {
    sockopen $2 $5 $6-
    sockmark $2 $3 $+ $chr(9) $+ $1 $+ $chr(9) $+ $7 $+ $chr(9) $+ $8 $+ $chr(9) $+ 0
    _irc.openwin.chat $2
  }
}
dialog irc.askdccchatrequest {
  title "aIRC DCC Chat"
  size -1 -1 122 60
  option dbu

  text %c.irc.askdccchatrequest.nick,10,2 6 119 10,center
  text %c.irc.askdccchatrequest.addy,20,2 14 119 10,center

  box "",30,2 0 118 24

  text "Wants to chat with you.",40,3 30 119 10,center

  button "Chat!",100,17 41 27 13,ok
  button "Cancel",101,48 41 27 13,cancel
  button "Ignore",102,79 41 27 13

  edit "chat",200,100 100 100 100,autohs hide result
}
ON *:DIALOG:irc.askdccchatrequest*:init:0:{
  _mdx.init $_icofile(question.ico)
  unset %c.irc.askdccchatrequest.*
  did -b $dname 102
}
ON *:DIALOG:irc.askdccchatrequest*:sclick:101:{
  did -o $dname 200 1 cancel
  dialog -k $dname
}
ON *:DIALOG:irc.askdccchatrequest*:sclick:102:{
  did -o $dname 200 1 ignore
  dialog -k $dname
}
alias _irc.askdccsendfile {
  var %f = $$dir="File to send:" *.*
  if (%f != $null) { _irc.com dcc send $1 $remove(%f,$chr(34)) }
}
alias _irc.send {
  if ($calc($_sockmark($1,7) + $_sockmark($1,8)) >= $_sockmark($1,4)) {
    var %sockname = $1
    _irc.send.rwin $1
    _irc.send.rcwin $1 DCC Send completed
    if ($_minio(0,17)) { beep }
    if ($_minio(2,13)) {
      close -@ $_sockmark($1,2)
      tokenize 9 $sock($1).mark
      var %time = $calc($ctime - $3),%cps = $round($calc($8 / %time),0)
      if ($_not(%cps)) { %cps = 0 }
      _irc.lechol.s $colour(ctcp) DCC Send of $nopath($1) to $6 completed ( $+ $_duratio(%time) %cps $+ cps)
    }
    sockclose %sockname
  }
  else {
    bread " $+ $_sockmark($1,1) $+ " $calc($_sockmark($1,7) + $_sockmark($1,8)) $_minio(0,21) &irc.send
    sockwrite $1 &irc.send
    sockmark $1 $puttok($sock($1).mark,$calc($_sockmark($1,8) + $bvar(&irc.send,0)),8,9)
    _irc.send.rwin $1
  }
}
;
;;
;
; /_irc.send.rwin <socket>
;
alias _irc.send.rwin {
  tokenize 9 $sock($1).mark
  if ($window($2) == $null) { return }
  var %time = $calc($ctime - $3),%cps = $round($calc($8 / %time),0),%left
  if ($8 = 0) { %left = n/a }
  elseif ($round($calc(($4 - $7 - $8) / %cps),0)) { %left = $_duratio($ifmatch) }
  else { %left = 0s }
  if ($_not(%cps)) { %cps = 0 }
  if ($line($2,0) == 0) {
    aline $colour(ctcp) $2  DCC Send session
    aline $2 
    aline $2    To: $+ $6
    aline $2  File: $+ $nopath($1)
    aline $2  Size: $+ $4
    aline $2 
    aline $colour(info2) $2  Time: $+ $_duratio(%time) $+ $chr(9) $+  $+ $colour(info) $+ Sent: $+ $8
    aline $colour(info2) $2  Left: $+ %left $+ $chr(9) $+   $+ $colour(info) $+ Ack: $+ 0
    aline $colour(info2) $2   Cps: $+ %cps $+ $chr(9) $+  $+ $colour(info) $+ Perc: $+ $_percent($calc($7 + $8),$4)
    aline $2 
    aline $colour(ctcp) $2 
    aline $colour(ctcp) $2 
  }
  else {
    rline $colour(info2) $2 7  Time: $+ $_duratio(%time) $+ $chr(9) $+  $+ $colour(info) $+ Sent: $+ $8
    rline $colour(info2) $2 8  Left: $+ %left $+ $chr(9) $+   $+ $colour(info) $+ Ack: $+ 0
    rline $colour(info2) $2 9   Cps: $+ %cps $+ $chr(9) $+  $+ $colour(info) $+ Perc: $+ $_percent($calc($7 + $8),$4)
  }
}
;
;;
;
; /_irc.send.rcwin <socket> <text>
;
alias _irc.send.rcwin {
  var %text = $2-
  tokenize 9 $sock($1).mark
  if ($window($2) == $null) { return }
  if ($line($2,0) == 0) { _irc.send.rwin $1 }
  var %l11 = $strip($line($2,11)),%l12 = $strip($line($2,12))
  if (%l11 == $null) { rline $colour(ctcp) $2 11  %text }
  else {
    if (%l12 != $null) { rline $colour(ctcp) $2 11  $ifmatch }
    rline $colour(ctcp) $2 12  %text
  }
}
;
;;
;
; /_irc.send.chtimer <socket> <counter>
;
alias _irc.send.chtimer {
  var %win = $_sockmark($1,2)
  .timer $+ $1 off
  if ($window(%win) == $null) { return }
  _irc.send.rwin $1
  if ($calc($ctime - $_sockmark($1,3)) == $_minio(2,11)) { _irc.send.rcwin $1 DCC Send timed out... }
  else { .timer $+ $1 -mo 1 500 _irc.send.chtimer $1 }
}
;
;;
;
; /_irc.get.rwin <socket>
;
alias _irc.get.rwin {
  var %bytes = $sock($1).rcvd
  tokenize 9 $sock($1).mark
  if ($window($2) == $null) { return }
  var %time = $calc($ctime - $3),%cps = $round($calc(%bytes / %time),0),%left
  if (%bytes = 0) { %left = n/a }
  elseif ($round($calc(($4 - $7 - %bytes) / %cps),0)) { %left = $_duratio($ifmatch) }
  else { %left = 0s }
  if ($_not(%cps)) { %cps = 0 }
  if ($line($2,0) == 0) {
    aline $colour(ctcp) $2  DCC Get session
    aline $2 
    aline $2  From: $+ $6
    aline $2  File: $+ $nopath($1)
    aline $2  Size: $+ $4
    aline $2 
    aline $colour(info2) $2  Time: $+ $_duratio(%time) $+ $chr(9) $+  $+ $colour(info) $+ Sent: $+ %bytes
    aline $colour(info2) $2  Left: $+ %left $+ $chr(9) $+   $+ $colour(info) $+ Cps: $+ %cps
    aline $colour(info2) $2  Perc: $+ $_percent($calc($7 + %bytes),$4)
    aline $2 
    aline $colour(ctcp) $2 
    aline $colour(ctcp) $2 
  }
  else {
    rline $colour(info2) $2 7  Time: $+ $_duratio(%time) $+ $chr(9) $+  $+ $colour(info) $+ Sent: $+ %bytes
    rline $colour(info2) $2 8  Left: $+ %left $+ $chr(9) $+   $+ $colour(info) $+ Cps: $+ %cps
    rline $colour(info2) $2 9  Perc: $+ $_percent($calc($7 + %bytes),$4)
  }
}
;
;;
;
; /_irc.get.rcwin <socket> <text>
;
alias _irc.get.rcwin {
  var %text = $2-
  tokenize 9 $sock($1).mark
  if ($window($2) == $null) { return }
  if ($line($2,0) == 0) { _irc.get.rwin $1 }
  var %l11 = $strip($line($2,11)),%l12 = $strip($line($2,12))
  if (%l11 == $null) { rline $colour(ctcp) $2 11  %text }
  else {
    if (%l12 != $null) { rline $colour(ctcp) $2 11  $ifmatch }
    rline $colour(ctcp) $2 12  %text
  }
}
;
;;
;
; /_irc.get.chtimer <socket> <counter>
;
alias _irc.get.chtimer {
  var %win = $_sockmark($1,2)
  .timer $+ $1 off
  if ($window(%win) == $null) { return }
  _irc.get.rwin $1
  if ($calc($ctime - $_sockmark($1,3)) == $_minio(2,11)) { _irc.get.rcwin $1 DCC Get timed out... }
  else { .timer $+ $1 -mo 1 500 _irc.get.chtimer $1 }
}
;
;;
;
; /_irc.askdccsendrequest1
;  1 - local file
;  2 - dcc get window
;  3 - $ctime (start)
;  4 - file size
;  5 - IRC session socket
;  6 - remote nick
;  7 - transfer beginsfrom 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.askdccsendrequest1 {
  var %i,%d,%r
  while (1) {
    inc %i
    %d = irc.askdccsendrequest1 $+ %i
    if ($dialog(%d) == $null) { break }
  }
  unset %c.irc.askdccsendrequest1.*
  %c.irc.askdccsendrequest1.nick = $gettok($1-,6,9)
  %c.irc.askdccsendrequest1.addy = $gettok($1-,13,9)
  %c.irc.askdccsendrequest1.f = $gettok($1-,1,9)
  %c.irc.askdccsendrequest1.file = File: $nopath($gettok($1-,1,9))
  %c.irc.askdccsendrequest1.size = Size: $gettok($1-,4,9)
  %c.irc.askdccsendrequest1.mini = $gettok($1-,14,9)
  showmirc -s
  %r = $dialog(%d,irc.askdccsendrequest1,-4)
  if ($gettok(%r,1,32) == accept) { _irc.dccget $puttok($puttok($1-,$gettok(%r,3-,32),1,9),$gettok(%r,2,32),14,9) }
}
dialog irc.askdccsendrequest1 {
  title "aIRC DCC Get"
  size -1 -1 156 82
  option dbu

  text %c.irc.askdccsendrequest1.nick,10,3 6 119 10,center
  text %c.irc.askdccsendrequest1.addy,20,3 14 119 10,center

  box "",30,3 0 120 24

  text "Wants to send you the following file:",40,5 29 116 10,center
  text %c.irc.askdccsendrequest1.file,50,10 39 117 10
  text %c.irc.askdccsendrequest1.size,60,8 47 117 10

  text "Save As:",70,4 60 100 10

  button "Accept",200,127 3 27 13,ok
  button "Cancel",210,127 19 27 13,cancel
  button "Ignore",220,127 35 27 13

  check "Minimize",230,125 53 30 10

  edit "",240,3 67 136 11

  button "?",250,142 67 11 10

  edit "accept",400,3 67 136 11,autohs hide result
}
ON *:DIALOG:irc.askdccsendrequest1*:init:0:{
  _mdx.init $_icofile(question.ico)
  var %f = %c.irc.askdccsendrequest1.f
  if (%c.irc.askdccsendrequest1.mini) { did -c $dname 230 }
  if ($nopath(%f) != %f) && ($_fixfilename(%f,f) != $null) { %f = $_fixfilename(%f,f) }
  else { %f = $getdir($nopath(%f)) $+ $nopath(%f) }
  did -o $dname 240 1 %f
  unset %c.irc.askdccsendrequest1.*
  did -b $dname 220,250
}
ON *:DIALOG:irc.askdccsendrequest1*:sclick:200:{
  if ($did(400) == accept) {
    var %f = $did(240)
    if ($nopath(%f) == %f) { %f = $getdir(%f) $+ %f }
    %f = $_fixfilename(%f)
    if (%f == $null) {
      ^playthemesound ERROR
      did -f $dname 240
      halt
    }
    did -o $dname 400 1 accept $did(230).state %f
  }
  dialog -k $dname
}
ON *:DIALOG:irc.askdccsendrequest1*:sclick:210:{
  did -o $dname 400 1 cancel
  dialog -k $dname
}
ON *:DIALOG:irc.askdccsendrequest1*:sclick:220:{
  did -o $dname 400 1 ignore
  dialog -k $dname
}