alias download {
if !$isdir($mircdirSDownload) { mkdir $mircdirScriptedDownloads }
set -u600 %«»FN $+(/,$gettok($remove($$1, http://), 2-, 47))
set -u600 %«»Dir $iif($2, $2-, $mircdirScriptedDownloads\)
if ($right(%«»Dir, 1) != \) set -u600 %«»Dir $+(%«»Dir, \)
if !$isdir(%«»Dir) {
var %i = 2, %levels = $numtok(%«»Dir, 92)
while %i <= %levels {
if (!$isdir($gettok(%«»Dir, $+(1-,%i), 92))) mkdir $+(", $gettok(%«»Dir, $+(1-,%i), 92), ")
inc %i
}
}
var %sockname = $+(download, $ticks)
sockopen %sockname $gettok($remove($$1, http://), 1, 47) 80
}
on *:SOCKOPEN:download*:{
sockwrite -n $sockname GET %«»FN HTTP/1.0
set -u600 %«»FN $+($mircdirScriptedDownloads\,$gettok(%«»FN, -1, 47))
sockwrite $sockname $crlf
}
on *:SOCKREAD:download*:{
if $sockerr > 0 {
echo $color(ctcp) -eabflirt Socket error: $+([, $sock($sockname).wserr, ]) $sock($sockname).wsmsg
halt
}
if %«»Read != 1 {
var %text
while 1 {
sockread %text
if (!$sockbr) return
if %text == HTTP/1.1 404 Not Found {
echo $color(ctcp) -eabflirt * HTTP/1.1 404 File %«»Read.Filename not found!
sockclose $sockname
halt
}
elseif $regex(%text, /^Content-Length: (\d+)$/) == 1 { set -u600 %«»Bytes.To.Read $regml(1) }
elseif (!%text) break
}
write -c %«»FN
set %«»Ticks $ticks
}
set -u10 %«»Read 1
while 1 {
sockread &code
if (!$sockbr) return
bwrite %«»FN -1 &code
if $file(%«»FN).size == %«»Bytes.To.Read {
var %secs = $round($calc(($ticks - %«»Ticks) / 1000), 0)
var %size = $file(%«»FN).size
var %xfer = $+([, $bytes($round($calc(%size / %secs), 0), 3).suf, /sec])
var %target = $+(", %«»Dir, $nopath(%«»FN), ")
echo $color(info2) -eabflirt * Downloaded %target $bytes(%size, 3).suf in $gmt(%secs, n:ss) %xfer
if $isfile(%target) && $mircdirScriptedDownloads\ != %«»Dir { .rename %target $+(", $remove(%target,"), .old, ") }
.rename %«»FN %target
unset %«»*
}
}
}