; --- module fileserver ; --- load dependencies on *:load:{ hmakeandhfill file setgroups ad.updatead fserve t.temp 60 noupdatecaching } on *:signal:rebuild:{ startcache } ; --- unload clean on *:unload:{ stopfservesessions .timerfserve off .timercache off .timerschedulestart off .timerschedulestop off .timerfillallsends off hstore file hfree -w file } ; --- groups on *:signal:setgroups:{ setgroups } alias -l setgroups { tokenize 32 $inf(fserve,on) setgroup fileserver_fileserver $1 setgroup fileserver_dccwatch $and($1,$inf(dccwatch,on)) setgroup fileserver_afind $and($1,$inf(find,on)) setgroup fileserver_forcesend $and($1,$inf(fserve,forcesend)) setgroup fileserver_nosendonly $nod($inf(fserve,sendonly)) setgroup fileserver_onaway $inf(fservecache,onaway) setgroup fileserver_responsive $inf(fservecache,responsive) setgroup fileserver_grouppools $inf(fservead,grouppools) } ; --- register toggles on *:signal:set.dccwatch.on:{ setgroup fileserver_dccwatch $and($inf(fserve,on),$1) } on *:signal:set.find.on:{ setgroup fileserver_afind $and($inf(fserve,on),$1) } on *:signal:set.fserve.forcesend:{ setgroup fileserver_forcesend $and($inf(fserve,on),$1) } on *:signal:set.fserve.sendonly:{ setgroup fileserver_nosendonly $nod($1) ad.updatead fserve } on *:signal:set.fservecache.onaway:{ setgroup fileserver_onaway $1 } on *:signal:set.fservecache.responsive:{ setgroup fileserver_responsive $1 } on *:signal:set.fservead.grouppools:{ setgroup fileserver_grouppools $1 } on *:signal:set.fserve.on:{ setgroups if (!$1) { stopfservesessions } } alias -l stopfservesessions { ; !$1- var %o = $dat(fservelogin).num | while (%o) { fservelogin_close $dat(fservelogin,$dat(fservelogin,%o).itemat).wid dec %o } } ; --- feedback signals on *:signal:hashtables:{ $$1- file } on *:signal:updateads:{ $$1- fserve } on *:signal:makechn:{ $$1- find -1 find on @find/@locator searches $$1- fservead -1 fservead on fserve ad $$1- trigger $dat(trigger).num fserve on on 0 fserve-trigger- } ; --- updatepools listener on *:signal:updatepools:{ gq.sendonlycheck } ; --- table close on *:signal:close.fileserver:{ checkpools ad.updatead fserve startcache } ; --- on start on *:start:{ cachecheck startcache } alias -l cachecheck { if ((!$r.temp(noupdatecaching)) && ($inf(fservecache,onstart))) { updatehash } d.temp noupdatecaching } alias startcache { if ($inf(fservecache,expires)) { .timercache -io 0 $calc(3600* $inf(fservecache,expires.hours)) checkcache } elseif ($timer(cache)) { .timercache off } if ($inf(fserve,schedulestart)) { .timerschedulestart -io $inf(fservedata,schedulestart) 1 1 scheduledfserve start } elseif ($timer(schedulestart)) { .timerschedulestart off } if ($inf(fserve,schedulestop)) { .timerschedulestop -io $inf(fservedata,schedulestop) 1 1 scheduledfserve stop } elseif ($timer(schedulestop)) { .timerschedulestop off } } ; --- fileserver event groups #fileserver_forcesend on on *:connect:{ .timerfillallsends 1 30 .signal updatepools } #fileserver_forcesend end alias scheduledfserve { ; $1 = start|stop .timer $+ $ctimer -io 1 180 startcache ad.advertise fserve $1 } alias checkcache { if ((!$inf(fservecache,awayonly)) || ($away)) { updatehash } } #fileserver_onaway off ; --- update cache on away on *:signal:away.leaving:{ if (!$r.temp(updateonaway)) { updatehash } t.temp 180 updateonaway } #fileserver_onaway end ; --- fservelogin aliases alias -l qs { return $dat(fservelogin,$fservelogin_fromip($address)).pool } alias -l addfservequeue { ; $1 = fservelogin, $2- = file + size if ($dat(fservelogin,$1).cid !== $cid) { scid $v1 } .signal queue fserve $dat(fservelogin,$1).trigger $gettok($1,-1,46) $address $2- } ; --- fileserver chat administration on *:signal:chat.waiting.removed:{ ; $?1 = nick, $?2 = ip, $3 = wid if ($timer($+(chat.,$3))) { offtimer chat. $+ $3 if ($fservelogin_fromwid($3)) { fservelogin_remove $3 } } } on *:signal:chat.waiting.added:{ ; $?1 = nick, $?2 = ip, $3 = wid if ($fservelogin_fromwid($3)) { .timerchat. $+ $3 -io 1 180 fservelogin_remove $3 } } on *:signal:chat.active.removed:{ ; $?1 = nick, $?2 = ip, $3 = wid fservelogin_close $3 } on *:signal:chat.active.added:{ ; $!1 = nick, $2 = ip, $3 = wid offtimer chat. $+ $3 var %netnick = $fservelogin_fromwid($3) if ((%netnick !== $null) && ($dat(fservelogin,%netnick).exists)) { if (($fservelogin_fromip($2)) && ($v1 !== %netnick)) { var %orig = $v1 $dat(fservelogin,%orig,$addtok($dat(fservelogin,%orig).otherwids,$3,44)).otherwidsset $dat(fservelogin,%netnick).del } else { $dat(fservelogin,%netnick,$2).ipset } } if ($inf(firewall,on)) { offtimer $+(con.,$cid,.,$2) d.tmp con. $+ $2 if ($timer($+(firechat.,$cid,.,$2))) { .timer $+ $+(firechat.,$cid,.,$2) -e } } } on *:signal:chat.inactive.added:{ ; $!1 = nick, $2 = ip, $3 = wid offtimer chat. $+ $3 var %netnick = $fservelogin_fromwid($3) if ((%netnick !== $null) && ($fservelogin_isuninitialized(%netnick))) { var %nick = $gettok(%netnick,-1,46) if ($inf(firewall,on)) { if ($timer($+(firechat.,$cid,.,$2))) { $dat(fservelogin,%netnick).del windowclose $2 $3 return } if ($r.tmp(con. $+ $2) == again) { offtimer $+(con.,$cid,.,$2) | d.tmp con. $+ $2 statuserror failed to connect to $cborder(%nick) $cbrack($2) } else { if (($timer($+(con.,$cid,.,$2))) && (!$r.tmp(con. $+ $2))) { t.tmp 30 con. $+ $2 | .timercon. $+ $+($cid,.,$2) -e } .timerfirechat. $+ $+($cid,.,$2) -io 1 10 retryfservechat $uneval(%nick) $2 $uneval(%netnick) $cid secho retrying to chat with $cborder(%nick) $cbrack($2) windowclose $2 $3 return } } fservelogin_remove $3 } } alias retryfservechat { ; $1 = nick, $2 = ip, $3 = netnick, $4 = cid if ($fservelogin_fromip($2)) { if ($v1 !== $3) { $dat(fservelogin,$3).del } return } if ($scid($4) !== $null) { scid $v1 } if (($cid == $4) && ($server)) { t.tmp 30 con. $+ $2 again dccc chat $1-2 } elseif ($dat(fservelogin,$3).exists) { $dat(fservelogin,$3).del } } ; --- fserve session initialization on *:open:=:{ var %netnick = $fservelogin_fromip($address) if (%netnick == $null) { return } if (($inf(fserve,on)) && ($fservelogin_isuninitialized(%netnick))) { if ($dat(fservelogin,%netnick).cid !== $cid) { scid $v1 } if ($inf(fserve,hidechats)) { window -h = $+ $nick } fservelogin.add %netnick if (($isban(*!*@ $+ $address)) || ($isban($address($gettok(%netnick,-1,46),5)))) { .notice $gettok(%netnick,-1,46) $eval($inf(fservemsg,banned),2) $logo secho $cborder($nick) is banned on your fserve close -mc $nick halt } var %trigger = $dat(fservelogin,%netnick).trigger setcloseuptimer %netnick $inf(stats,access).++ setroot dofservewelcome if (($inf(fserve,showqueue)) && ($inf(top,queued,1))) { mc2 - | mostqueued mc1 } if ($ismodule(userstats)) { if (($inf(fserve,showsend)) && ($inf(top,sent,1))) { mc2 - | mostsend mc1 } if (($inf(fserve,showleech)) && ($inf(top,leeched,1))) { mc2 - | mostleeched mc1 } if (($inf(fserve,showuser)) && ($dat(user,%netnick).exists)) { mc2 - | userstats %netnick mc1 } } if ($inf(fserve,showstats)) { mc2 - | fservestats omc $nick } if ($dat(trigger,%trigger).welcome) { welcome $fstream(fservewelcome,$dat(trigger,%trigger).welcome_file).new } if (!$r.temp(welcome. $+ $address)) { mc2 - | mc1 $cborder(/) | failq } } } alias -l fservelogin.add { ; $1 = fservelogin tokenize 32 $1 $dat(fservelogin,$1).trigger $datset(fservelogin,$1,chatnick $nick,starttime $ctime,root $dat(trigger,$2).root,ip $address,pool $dat(trigger,$2).pool) fservemsg $1 opened } alias -l setcloseuptimer { ; $1 = fservelogin .timer $+ $dat(fservelogin,$1).ip -o 1 $inf(fservedata,idletime) fservelogin_timeout $dat(fservelogin,$1).wid } alias openserv { if (($1 isnum 1- $+ $dat(trigger).num) && ($2)) { if (!$inf(fserve,on)) { ad.advertise fserve start } startserv $1- } else { error syntax: /openserv [triggernr] [fulladdress] } } alias startserv { ; $1 = trigger, $2 = nick, $3 = fulladdress if (!$isban($3)) { if ($o.now < $o.max) { var %netnick = $+($getnet,.,$2) if ($fservelogin_isuninitialized(%netnick)) { fservelogin_remove $dat(fservelogin,%netnick).wid } if (!$dat(fservelogin,%netnick).exists) { $new(%netnick,trigger $1).fservelogin dccc chat $2 n/a } else { gq.nc $2 $eval($inf(fservemsg,doublelogin),2) } } else { gq.nc $2 $eval($inf(fservemsg,full),2) } } else { gq.nc $2 $eval($inf(fservemsg,banned),2) } } ; --- fservelogin handling alias -l fservelogin_remove { ; $1 = wid var %wid = $1 tokenize 32 $fservelogin_fromwid($1) if ($1 == $null) { dbout fservelogin_remove invalid wid %wid | return } var %ip = $dat(fservelogin,$1).ip if (!$fservelogin_isuninitialized($1)) { $fstream($r.temp(welcome. $+ %ip)).del d.temp welcome. $+ %ip d.temp dir_ $+ %ip d.temp text_ $+ %ip d.temp tips_ $+ %ip d.temp tipsshown_ $+ %ip offtimer %ip } elseif ($inf(firewall,on)) { offtimer $+(con.,$cid,.,%ip) offtimer $+(firechat.,$cid,.,%ip) d.tmp $+(con.,%ip) } var %nick = $gettok($1,-1,46),%otherwids = $dat(fservelogin,$1).otherwids,%o = $numtok(%otherwids,44) | while (%o) { windowclose %nick $gettok(%otherwids,%o,44) dec %o } windowclose %nick $dat(fservelogin,$1).wid $dat(fservelogin,$1).del } alias fservelogin_timeout { ; $1 = wid var %netnick = $fservelogin_fromwid($1) if ((%netnick !== $null) && ($dat(fservelogin,%netnick).exists)) { var %chatnick = $dat(fservelogin,%netnick).chatnick var %wid = $1 if ($dat(fservelogin,%netnick).cid !== $cid) { scid $v1 } if ($chat(%chatnick,$chatnr(%chatnick,%wid)).status == active) { omc1 %chatnick $bracket(this session timed out) } if ($server) { gq.nc $gettok(%netnick,-1,46) $eval($inf(fservemsg,timeout),2) } fservemsg %netnick timed out fservelogin_remove %wid } } alias fservelogin_close { ; $1 = wid var %netnick = $fservelogin_fromwid($1) if ((%netnick !== $null) && ($dat(fservelogin,%netnick).exists)) { fservemsg %netnick closed fservelogin_remove $1 } } alias -l fservelogin_fromwid { ; $1 = wid return $dat(fservelogin,1,$makepropstok(7,wid $1),[this]).select } alias -l fservelogin_fromip { ; $1 = ip return $dat(fservelogin,1,$makepropstok(7,ip $1),[this]).select } alias -l fservelogin_isuninitialized { ; $1 = fservelogin if (($dat(fservelogin,$1).exists) && (!$dat(fservelogin,$1).starttime)) { return 1 } } ; --- fserve session status messages alias -l fservemsg { ; $1 = fservelogin, $2- = msg if ($dat(fservelogin,$1).cid !== $cid) { scid $v1 } secho fileserver session to $cborder($dat(fservelogin,$1).chatnick) $cbrack($atail($gettok($1,-1,46),$dat(fservelogin,$1).ip)) $2- } alias -l netnicktoatail { ; $1 = netnick return $atail($gettok($1,-1,46),$deltok($1,-1,46)) } ; --- fserve welcome alias -l welcome { ; $1 = stream var %l = $r.temp(welcome. $+ $address) w.temp welcome. $+ $address $1 if (!$fopen($1)) { var %trigger = $dat(fservelogin,$fservelogin_fromip($address)).trigger error the fserve session welcome textfile $cborder($dat(trigger,%trigger).welcome_file) from trigger $cborder(%trigger) does not exist d.temp welcome. $+ $address return } if (!%l) { mc2 - } if ($inf(fserve,stopwelcome)) { var %k = $inf(fservedata,stopwelcome) } else { var %k = $calc(1 + $lines($fopen($1).fname)) } while ((%k) && (!$or($fopen($1).err,$fopen($1).eof))) { if ($fread($1) !== $null) { mc $fillonly($v1) } else { mc $chr(160) } dec %k } if ($or($fopen($1).err,$fopen($1).eof)) { if (%l) { mc2 - | mc1 $cborder(/) | failq } $fstream($1).del d.temp welcome. $+ $address } else { mc1 $cborder('C' for more $+ $chr(44) 'S' to stop) } } alias -l dofservewelcome { mc $fservewelcome_firstline if ($inf(fservewelcome,secondline).is) { mc $fservewelcome_secondline } if ($fservewelcome_thirdline !== $null) { mc1 $v1 } if ($fservewelcome_fourthline !== $null) { mc1 $v1 } if ($inf(fservewelcome,commands)) { fservewelcome_commands } } alias -l fservewelcome_firstline { var %author = $const(release,author),%version = $const(release,version) return $eval($inf(fservewelcome,firstline),2) } alias -l fservewelcome_secondline { var %number = $inf(stats,access),%address = $address return $eval($inf(fservewelcome,secondline),2) } alias -l fservewelcome_thirdline { return $fservewelcome_dccwatch $fservewelcome_instasend $fservewelcome_idletime $fservewelcome_timeout $fservewelcome_mincps $fservewelcome_maxcps } alias -l fservewelcome_dccwatch { if ($inf(fservewelcome,dccwatch)) { return $boldalize(Dccwatch:) $+ $cbrack($con($inf(dccwatch,on))) } } alias -l fservewelcome_instasend { if ($inf(fservewelcome,instasend)) { if (($inf(instasend,on)) && ($dat(queuepool,$qs).instasend)) { return $boldalize(Instasend) max.size: $+ $cbrack($size($dat(queuepool,$qs).instasend_maxbytes)) } return $boldalize(Instasend:) $+ $cbrack(off) } } alias -l fservewelcome_idletime { if ($inf(fservewelcome,idletime)) { return $boldalize(Idletime:) $+ $cbrack($inf(fservedata,idletime) secs) } } alias -l fservewelcome_timeout { if ($inf(fservewelcome,timeout)) { return $boldalize(Timeout:) $+ $cbrack($inf(fservedata,timeout) secs) } } alias -l fservewelcome_mincps { if ($inf(fservewelcome,mincps)) { if (($inf(mincps,on)) && ($dat(queuepool,$qs).mincps_on)) { return $+($inf(fservead,mincps),$chr(58),$cbrack($fserve.mincpslayout($qs))) } return $+($inf(fservead,mincps),$chr(58),$cbrack(off)) } } alias -l fservewelcome_maxcps { if ($inf(fservewelcome,maxcps)) { if ($inf(maxcps,on)) { return $+($inf(fservead,maxcps),$chr(58),$cbrack($ads.maxcps)) } return $+($inf(fservead,maxcps),$chr(58),$cbrack(off)) } } alias -l fservewelcome_fourthline { return $fservewelcome_online $fservewelcome_sends $fservewelcome_queues $fservewelcome_usersends $fservewelcome_userqueues $fservewelcome_userpriority } alias -l fservewelcome_online { if ($inf(fservewelcome,online)) { return O: $+ $cborder($fserve.olayout) } } alias -l fservewelcome_sends { if ($inf(fservewelcome,sends)) { return S: $+ $cborder($fserve.slayout($qs)) } } alias -l fservewelcome_queues { if ($inf(fservewelcome,queues)) { return Q: $+ $cborder($fserve.qlayout($qs)) } } alias -l fservewelcome_usersends { if ($inf(fservewelcome,usersends)) { return $csv(Your Sends,$fserve.yslayout($qs,$nick,$address,$cid)) } } alias -l fservewelcome_userqueues { if ($inf(fservewelcome,userqueues)) { return $csv(Your Queues,$fserve.yqlayout($qs,$nick,$address,$cid,fserve)) } } alias -l fservewelcome_userpriority { if ($inf(fservewelcome,userpriority)) { return $csv(Your Priority,$fserve.playout($nick)) } } alias -l fservewelcome_commands { mc1 $boldalize(Commands:) $c(2) $+ cd, clr_fqueues, clr_queue, clr_queues, dir, failq $+ $fservewelcome_optionalcommands(find) mc2 get, help, my_queues, pwd, queues, quit $+ $fservewelcome_optionalcommands(sends,stats,time,who) } alias -l fservewelcome_optionalcommands { ; $!1- = command, ... var %ret,%com,%i = 1,%o = $0 | while (%i <= %o) { %com = $ [ $+ [ %i ] ] if ($inf(fservecommand,%com)) { %ret = $+(%ret,$chr(44) %com) } inc %i } return %ret } ; --- dccwatch #fileserver_dccwatch on on !*:part:#:{ if (($aretriggersfor($chan)) && (!$aretriggersleft($chan,$nick))) { .signal dccwatch $nick $site $wildsite $event $chan } } on *:kick:#:{ if (($knick !== $me) && ($aretriggersfor($chan)) && (!$aretriggersleft($chan,$knick))) { var %wildsite if (!$address($knick,5)) { %wildsite = $+(*!*@,$getnet,.,$knick) } else { %wildsite = $address($knick,2) } .signal dccwatch $knick $deltok(%wildsite,1,64) %wildsite $event $chan } } on *:quit:{ .signal dccwatch $nick $site $wildsite $event } alias -l aretriggersfor { ; $1 = chan var %o = $dat(trigger).num | while (%o) { if (($dat(trigger,%o).on) && ($ch($dat(trigger,%o).ch,$1).is)) { return 1 } dec %o } } alias -l aretriggersleft { ; $1 = chan, $2 = nick var %chan,%b,%a = $dat(trigger).num,%o = $comchan($2,0) | while (%o) { %chan = $comchan($2,%o) if (%chan !== $1) { %b = %a | while (%b) { if (($dat(trigger,%b).on) && ($ch($dat(trigger,%b).ch,%chan).is) && ($lev($2,%chan) >= $dat(trigger,%b).lev)) { return 1 } dec %b } } dec %o } } on *:signal:dccwatch:{ ; $1 = nick, $2 = site, $3 = wildsite, $4 = event, $?5 = chan if (($4 == quit) || (!$timer(dccwatch. $+ $cid $+ . $+ $2))) { var %ip = * if ($isip($2)) { %ip = $v1 } elseif ($gq.nicktoip($1)) { %ip = $v1 } var %q = $gq.queueformat($gq.setall($gq.queue.new(*),nick,$1,ip,%ip,network,$getnet)) if ($od.queue(0,w,%q)) { offtimer dccwatch. $+ $cid $+ . $+ $getnet $+ . $+ $1 .timerdccwatch. $+ $cid $+ . $+ $2 1 $inf(dccwatch,delay.secs) remqueues $1 $3 $4 %q if (($5) && ($inf(dccwatch,notice))) { .notice $1 $dccwatch_warning($5) } } } } alias -l dccwatch_warning { ; $1 = channel var %chan = $1,%duration = $hourtime($inf(dccwatch,delay.secs)) return $eval($inf(dccwatch,warning),2) } alias -l remqueues { ; $1 = nick, $2 = wildsite, $3 = event, $4- = matchpattern var %nick if ((!$comchan($1,0)) && ($ial($2,0))) { %nick = $gettok($ial($2,1),1,33) } else { %nick = $1 } if (!$aretriggersleft(n/a,%nick)) { aecho removing queues from $cborder($1) because they $iif(($3 == quit),quit irc,are not on any serving channels) var %q,%o = $od.queue(0,w,$4-) | while (%o) { %q = $od.queue(%o,w,$4-) gq.deletepoolqueuenumber $gettok(%q,1,46) $deltok(%q,1,46) dec %o } remsends $1 .signal updatepools } } #fileserver_dccwatch end ; --- @find #fileserver_afind on on *:text:@find *:#:{ if ((!$inf(fserve,sendonly)) && ($chn(find).getsafe) && ($levchans($lev($nick,$chan),$triggerchan($chan)))) { afind $v1 $2- } } on *:text:@locator *:#:{ if ((!$inf(fserve,sendonly)) && ($chn(find).getsafe) && ($levchans($lev($nick,$chan),$triggerchan($chan)))) { afind $v1 $2- } } alias -l triggernumtoroot { ; $1 = fservetrigger,... var %k,%i = 1,%o = $numtok($1,44) | while (%i <= %o) { %k = $instok(%k,$replace($gettok($dat(trigger,$gettok($1,%i,44)).root,1-,92),$chr(32),$chr(63)),0,1) inc %i } return %k } alias -l afind { ; $1 = triggers, $2- = searchstring if (($adqueue($nick).exists) || ($r.tmp(ignore.find) > 1)) { return } if ($r.tmp(find.search)) { if ($inf(ignore,find.hammering)) { inkt3 $cid $+ .ignore.find $inf(ignore,find.secs) } gq.nc $nick $errortag sorry, there's another search in progress return } if ($inf(ignore,find)) { t.tmp $inf(ignore,find.secs) find.search } if ($afind_search($triggernumtoroot($1),$2-,gq.nc $nick,$1) !== $null) { $adqueue($v1,$nick,$iif(($inf(find,replyasmsg)),msg,notice) $nick).new } } #fileserver_afind end alias -l issubsetof { ; $1 = path, $2 = roots:C1 var %mount,%o = $numtok($2,1) | while (%o) { %mount = $gettok($2,%o,1) if (%mount == $left($1,$len(%mount))) { return %o } dec %o } } alias -l maskpath { ; $1 = spacetoqroot, $2 = directory return $gettok($replace($2 $+ \,$1 $+ \,/),1-,92) } alias -l afindformat { ; $1 = dir::bool, $2 = match info, $3 = litmatch if ($1) { return $cborder($+($makebold($2,$3),$chr(92))) } return $cbrack($makebold($2,$3)) } alias -l afindlocation { ; $1 = dir $null($regex(afl,$1-,^\/*([^\:\/]*)(\/|\:))) return $+(/,$regml(afl,1)) } alias -l afind_search { ; $1 = roots, $2 = searchstring, $3 = alias, $?4 = triggers var %alias = $3,%triggers = $4 tokenize 32 $1 $remove($2,$chr(47)) var %litmatch = $remwild($2-) if ($len(%litmatch) !isnum 2-) { %alias $errortag search string must be at least 2 characters | return } var %dirs = $inf(find,returndirs),%trigger,%subsetof,%n,%max = $iif(((!%triggers) || ($inf(find,allresults))),0,$inf(find,maxresults)),%i = 1,%x = 0,%w = 0 var %lastloc,%mtok,%nline,%mline,%dir,%q = $queue(1024).new,%wstring = $mkwild($2-),%timeout = 0 $queue(%q,$bracket($iif((%triggers),@) $+ find) $csv(Searching For,%wstring)).push var %ticks if ($inf(find,timelimit)) { %ticks = $calc($ticks + $inf(find,maxsearchms)) } else { var %ticks = 0 } while ((!%timeout) && ((!%max) || (%w < %max)) && ($md.file(%i,%wstring))) { %n = $v1 if ((%ticks) && ($ticks > %ticks)) { $queue(%q,$errortag searching stopped: search time exceeded $cborder($inf(find,maxsearchms) ms)).push | %timeout = 1 | continue } %subsetof = $issubsetof(%n,$1) if ($gettok(%n,-1,58) isnum) { %dir = 1 } else { %dir = 0 } if ((!%subsetof) || ((%dir) && (!%dirs))) { %n = inc %i continue } %trigger = $gettok($1,%subsetof,44) %nline = $r.file(%n) if (%dir) { %mline = %nline } else { %mline = $nosize(%nline) } var %o = 1,%m = $wildtok(%mline,%wstring,0,47) if ((%m) && ($afindlocation(%n) !== %lastloc)) { %lastloc = $v1 %x = 0 $queue(%q,$tag matches found in $cborder($lower($qtospace($maskpath(%trigger,%lastloc)))) $iif((%triggers),$csvu($inf(fservead,trigger),$fservead.triggerformat($gettok(%triggers,%subsetof,44))))).push } while (((!%max) || (%w < %max)) && (%o <= %m)) { if ((%ticks) && ($ticks > %ticks)) { $queue(%q,$errortag searching stopped: search time exceeded $cborder($inf(find,maxsearchms) ms)).push | %timeout = 1 | break } inc %x | inc %w %mtok = $gettok(%nline,$findtok(%mline,$wildtok(%mline,%wstring,%o,47),1,47),47) $queue(%q,$c(2) $+ %x $+ : $c(1) $+ $afindformat(%dir,%mtok,%litmatch)).push inc %o } inc %i } var %msgfound if (%w) { %msgfound = $bracket(found $iif((%max == %w),at least) %w match $+ $iif(%w !== 1,es)) } elseif ((!%triggers) || (!$inf(find,dontreplyalways))) { %msgfound = $bracket(found no matches) } else { $queue(%q).del | return } if (%triggers) { %msgfound = %msgfound $c(2) $+ on my fserve $afind_addfservead(%q,%msgfound) } else { $queue(%q,%msgfound).push } return %q } alias -l afind_addfservead { ; $1 = queue, $2 = message in front if ($inf(find,noad)) { $queue($1,$2 $logo).push } else { var %triggerchan = $triggerchan($chan) if ($inf(fservead,split)) { $queue($1,$2 $+ : $fserve.ad.split1($nick,%triggerchan)).push $queue($1,$fserve.ad.split2($chan,%triggerchan)).push } else { $queue($1,$2 $+ : $fserve.ad.temp($chan,$nick,%triggerchan)).push } } } ; --- local fserve cache searches alias find { var %f = $ticks if ($len($remwild($1-)) isnum 2-) { var %mkwild = $mkwild($1-) aecho searching fileserver cache for $cborder(%mkwild) var %x,%n,%i = 1 while ($md.file(%i,%mkwild *)) { if ($gettok(%n,1,47) !== $gettok($md.file(%i,%mkwild *),1,47)) { var %x } %n = $md.file(%i,%mkwild *) if ($gettok(%n,-1,58) isnum) { %n = inc %i continue } var %o = 1,%m = $wildtok($r.file(%n),%mkwild *,0,47) while (%o <= %m) { if (%mkwild iswm $lastoff($wildtok($r.file(%n),%mkwild *,%o,47))) { if (!%x) { aecho files found in $cborder(/ $+ $iif($left(%n,2) !== //,$gettok($lower($qtospace(%n)),1,47))) } inc %x aecho $c(2) $+ %x $+ : $c(1) $+ $cbrack($wildtok($r.file(%n),%mkwild *,%o,47)) } inc %o } inc %i } aecho $bracket(end of search) $csv(Duration,$calc($ticks - %f) ms) } else { aecho search string must be atleast 2 characters } } alias -l lastoff { tokenize 32 $1- | return $deltok($1-,-1,32) } alias start { var %mkwild = $mkwild($1-),%i = 1,%o = $md.file(0,%mkwild *) while (%i <= %o) { var %n = $md.file(%i,%mkwild *) if (%n) { var %a = $deltok($abspath($chr(47) $+ $qtospace($gettok(%n,1,47)) $+ $chr(92) $+ $wildtok($r.file(%n),%mkwild *,1,47)),-1,32) if ($isfile(%a)) { aecho now starting $cborder(%a) | run %a | return } } inc %i } error no matching files found } ; --- triggers #fileserver_fileserver on on *:signal:list:{ ; $1 = chan, $2 = nick, $!3 = wildsite if ((!$inf(fserve,sendonly)) && ($listchans($lev($2,$1),$triggerchan($1)))) { fservead.user $v1 $1 .notice $2 } } on *:nick:{ if ($dat(fservelogin,$+($getnet,.,$nick)).exists) { $dat(fservelogin,$+($getnet,.,$nick),$+($getnet,.,$newnick)).copy $dat(fservelogin,$+($getnet,.,$nick)).del } } on *:signal:fserve:{ ; $1 = event, $2 trigger, $3 = nick, $4 = fulladdress, $?5 = chan var %chans = $chhh($dat(trigger,$2).ch) if (($1 == ctcp) || ($istok(%chans,$5,44))) { if ((($1 == ctcp) && ($ctcplevcheck($3,$dat(trigger,$2).lev,%chans))) || (($1 == text) && ($lev($3,$5) >= $dat(trigger,$2).lev))) { startserv $2 $3 $4 } else { gq.lowlevelreply $3 $dat(trigger,$2).lev } } } #fileserver_fileserver end #fileserver_nosendonly on on *:signal:fserve:{ ; $1 = event, $2 trigger, $3 = nick, $!4 = fulladdress, $?5 = chan if (($1 == ctcp) || ($istok($chhh($dat(trigger,$2).ch),$5,44))) { gq.nc $3 $bracket($inf(fservead,fserveoffline)) $csvn($inf(fservead,offreason),$eval($inf(fservemsg,offline.reason),2)) } } on *:text:*:#:{ if ($istrigger($1-)) { .signal fserve $event $v1 $nick $fulladdress $chan } } ctcp *:*:?:{ if ($istrigger($1-)) { .signal fserve $event $v1 $nick $fulladdress } } alias -l istrigger { return $dat(trigger,1,$makepropstok(7,mode $event,trigger $1-,on 1),[this]).select } #fileserver_nosendonly end ; --- fserve browsing interface alias r.file { return $hget(file,$1) } alias m.file { return $hfind(file,$2-,$1,w) } alias -l md.file { return $hfind(file,$2-,$1,w).data } alias -l navigateto { ; $1 = path tokenize 32 $makevalidpath($1) if ($1- == $null) { return } if ($left($1-,1) == /) { var %o = $spacetoq($gettok($1-,1-,92)) } else { var %k = $spacetoq($gettok($1-,1-,92)),%o = $ls while ((%o !== /) && ($gettok(%k,1,92) == ..)) { %o = $updir(%o) | %k = $deltok(%k,1,92) } if (%k !== $null) { %o = %o $+ $iif(%o !== /,\) $+ %k } } if ($incach(%o)) { return %o } } alias -l makevalidpath { ; $1 = path var %i,%r = /\s*(\\)[\s\\]*/g $null($regsub(rdss,$replace($remove($strip($1),$chr(63),$chr(58)),$chr(47),$chr(92)),%r,\1,%i)) if ($left(%i,1) == $chr(92)) { return $chr(47) $+ $right(%i,-1) } return %i } alias -l incach { tokenize 32 $sl($1-) if (($1- == /) || ($issubdirof($qtospace($remove($gettok($1-,-1,92),$chr(47))),$updir($1-)))) { return $true } } alias -l issubdirof { ; $1 = subdirectory, $2 = full directory path var %subnum = 1 | while ($hget(file,$+($2,:,%subnum)) !== $null) { if ($istok($v1,$1,47)) { return 1 } inc %subnum } } alias -l dirup { return $deltok($1-,-1,92) } alias -l updir { return $iff($dirup($1-),/) } alias -l getroot { return $spacetoq($dat(fservelogin,$fservelogin_fromip($address)).root) } alias -l setroot { w.temp dir_ $+ $address $gettok($getroot,1-,92) } alias -l ls { return $gettok($replace($realdir $+ \,$getroot,/),1-,92) } alias -l sl { return $gettok($iif(($getroot !== /\),$v1,/) $+ $right($1-,-1),1-,92) } alias -l realdir { return $r.temp(dir_ $+ $address) } alias -l dolist { dirlist $realdir | filelist $realdir | mceol } alias -l setdir { w.temp dir_ $+ $address $lower($sl($1-)) } alias -l lssc { return $qtospace($r.temp(dir_ $+ $1)) } alias -l msgdir { mc1 $cborder($qtospace($ls)) } alias -l msgdne { mc1 $errortag directory does not exist } alias -l msgfdne { mc1 $errortag file does not exist } alias -l dirlist { if ($ls !== /) { .mc2 0D: .. } var %o = 1,%n = 0 while ($hget(file,$1- $+ : $+ %o)) { var %k = $v1,%i = 1,%b = $numtok(%k,47) while (%i <= %b) { inc %n | .mc2 %n $+ D: $gettok(%k,%i,47) | inc %i } inc %o } } alias -l filelist { var %o = 1,%n = 0 while ($hget(file,$1- $+ / $+ %o)) { var %a,%k = $v1,%i = 1,%b = $numtok(%k,47) while (%i <= %b) { inc %n | %a = $gettok(%k,%i,47) | .mc1 %n $+ F: $+ $c(2) $deltok(%a,-1,32) $+(,$gettok(%a,-1,32)) | inc %i } inc %o } } on *:chat:*:{ var %netnick = $fservelogin_fromip($address) if (%netnick == $null) { return } if (($timer($address)) && ($dat(fservelogin,%netnick).exists) && ($calc($ctime - $dat(fservelogin,%netnick).starttime) > $inf(fservedata,timeout))) { .timer $+ $address -e | halt } if ((!$dat(fservelogin,%netnick).exists) || (!$inf(fserve,on))) { return } if ($dat(fservelogin,%netnick).cid !== $cid) { scid $v1 } if (($isban(*!*@ $+ $address)) || ($isban($address($gettok(%netnick,-1,46),5)))) { .notice $gettok(%netnick,-1,46) $eval($inf(fservemsg,banned),2) $logo dbout isban $nick is banned on your fserve close -mc $nick halt } if ($r.temp(welcome. $+ $address)) { if ($1- == c) { welcome $r.temp(welcome. $+ $address) } else { $fstream($r.temp(welcome. $+ $address)).del | d.temp welcome. $+ $address | mc2 - | mc1 $cborder(/) | failq } setcloseuptimer %netnick return } if (($inf(fserve,showtips)) && (!$r.temp(tipsshown_ $+ $address))) { if (($1- == cd..) || ($1- == cd ..)) { w.temp tips_ $+ $address .. } elseif (($1 == cd) && ($2- !== $null) && ($count($2-,$chr(47),$chr(92)) == 0) && ($navigateto($2-) !== $null)) { var %thisdir = $gettok($right($v1,-1),-1,92) if ($r.temp(tips_ $+ $address) == $null) { w.temp tips_ $+ $address %thisdir } else { mc1 $bracket(Tip) instead of using two seperate commands $cbrack(cd $qtospace($r.temp(tips_ $+ $address))) and $cbrack(cd $qtospace(%thisdir)) $+ , this fserve also supports cd with multiple directories, as in $cbrack(cd $qtospace($r.temp(tips_ $+ $address) $+ \ $+ %thisdir)) $+ , or using the full path $cbrack(cd $qtospace($navigateto($2-))) w.temp tipsshown_ $+ $address 1 } } else { d.temp tips_ $+ $address } } var %text = $ls $1- if (%text == $deltok($r.temp(text_ $+ $address),1,32)) { w.temp text_ $+ $address $calc(1 + $gettok($r.temp(text_ $+ $address),1,32)) %text } else { w.temp text_ $+ $address 1 %text } if ($gettok($r.temp(text_ $+ $address),1,32) >= $inf(fservedata,maxrepeat)) { .notice $gettok(%netnick,-1,46) $eval($inf(fservemsg,repeat),2) $logo | fservelogin_close $dat(fservelogin,%netnick).wid | halt } setcloseuptimer %netnick if ($1) { if (!$ls) { dbout fservelogin %netnick has a null ls | setroot } if (($1- == dir) || ($1- == ls)) { dolist } elseif (($1- == cd..) || ($1- == cd ..) || ($1- == 0d)) { setdir $updir($ls) msgdir if ($1- == 0d) { dolist } } elseif (($1- == cd /) || ($1- == cd)) { setroot msgdir } elseif (($1 == cd) && ($2- !== $null)) { if (($3- == $null) && ($right($2,1) == d) && ($left($2,-1) isnum 0-)) { mc1 $bracket($null,you don't need to put cd in front of that. just type: $2) | return } if ($navigateto($2-) !== $null) { setdir $v1 | msgdir } else { msgdne | msgdir } } elseif (($right($1,1) == d) && ($left($1-,-1) isnum 1-)) { var %found,%o = 0,%i = 1,%c = $innt($v1),%d = $m.file(0,$realdir $+ :*) while (%i <= %d) { if (%c <= $calc(%o + $numtok($r.file($realdir $+ : $+ %i),47))) { setdir $ls $+ $iif($ls !== /,\) $+ $lower($spacetoq($gettok($r.file($realdir $+ : $+ %i),$calc(%c - %o),47))) msgdir | dolist | %found = $true | break } inc %o $numtok($r.file($realdir $+ : $+ %i),47) inc %i } if (!%found) { msgdne | msgdir } } elseif (($right($1,1) == f) && ($left($1-,-1) isnum 1-)) { var %found,%o = 0,%i = 1,%c = $innt($v1),%d = $m.file(0,$realdir $+ /*) while (%i <= %d) { if (%c <= $calc(%o + $numtok($r.file($realdir $+ / $+ %i),47))) { addfservequeue %netnick $abspath($qtospace($realdir) $+ $iif($realdir !== /,$chr(92)) $+ $gettok($r.file($realdir $+ / $+ %i),$calc(%c - %o),47)) %found = $true | break } inc %o $numtok($r.file($realdir $+ / $+ %i),47) inc %i } if (!%found) { msgfdne | msgdir } } elseif (($1 == get) && ($2)) { if ($3- == $null) && ($right($2,1) == f) && ($left($2,-1) isnum 1-) { mc1 $bracket($null,you don't need to put get in front of that. just type: $2) | return } var %found,%i = 1,%d = $m.file(0,$realdir $+ /*) while (%i <= %d) { if ($wildtok($r.file($realdir $+ / $+ %i),$2- $+ *,0,47)) { addfservequeue %netnick $abspath($qtospace($realdir) $+ $iif($realdir !== /,$chr(92)) $+ $wildtok($r.file($realdir $+ / $+ %i),$2- $+ *,1,47)) %found = $true | break } inc %i } if (!%found) { msgfdne | msgdir } } elseif (($1 == find) || ($1 == search)) { if ($inf(fservecommand,find)) { if ($afind_search($replace($gettok($dat(fservelogin,%netnick).root,1-,92),$chr(32),$chr(63)),$2-,mc1) !== $null) { var %q = $v1 | while (!$queue(%q).isempty) { msg = $+ $nick $queue(%q).pop } :error if ($error !== $null) { dbout chat_find $error } reseterror $queue(%q).del } } } elseif ($1- == pwd) { msgdir } elseif (($1 == fq) || ($1 == failq) || ($1 == failqueue)) { if ($2 isnum) { if ($dat(failqueue,$+($getnet,.,$nick,.,$2)).exists) { addfservequeue %netnick $dat(failqueue,$+($getnet,.,$nick,.,$2)).file $size($dat(failqueue,$+($getnet,.,$nick,.,$2)).size) } else { mc1 $errortag this failqueue number does not exist: $cbrack($2) } } else { failq 1 } } elseif (($1- == sends) || ($1- == s)) { if ($inf(fservecommand,sends)) { $gq.usersends(omc $nick,$qs,$nick,$address,$cid) } } elseif (($1- == queues) || ($1- == q)) { $gq.userqueues(omc $nick,$qs,$nick,$address,$getnet) } elseif (($1- == my_q) || ($1- == my_queues) || ($1- == myq)) { var %q = $gq.queuesinuseinpoolforuser($qs,$nick,$address,$cid),%inuse = $gq.queuesinuseforpool($qs) mc1 $bracket(Your Queues) $boldalize(You) have $cborder($fserve.yqlayout($qs,$nick,$address,$cid,fserve)) $fserve.qmilayout($qs) var %i = 1,%o = 0 | while (%i <= %inuse) { if ($gq.queueinpoolisfromuser($qs,$nick,$address,$getnet,%i)) { inc %o mc2 %o $+ : $c(1) $+ $csv(Queue,%i) $cbrack($gq.fileformat($qs,%i)) $csv(Priority,$dat(q,$qs,%i).priority) $csv(Network,$dat(q,$qs,%i).network) $csv(Age,$duration($calc($ctime - $dat(q,$qs,%i).ctime),2)) $csv(Type,$dat(q,$qs,%i).base) if (%o == %q) { break } } inc %i } if (%q) { mceol } } elseif (($1- == clr_fqs) || ($1- == clr_fqueues) || ($1- == clrfqs)) { fq.clruser $nick mc2 $bracket(removed all your failqueues) } elseif ($1- == clr_queues) { $gq.userclr_queues(omc $nick,$qs,$nick,$address,$getnet,$cid) } elseif ((($1 == clr_queue) || ($1 == del_q) || ($1 == clr_q)) && ($2 isnum 1-)) { if (($2 <= $gq.queuesinuseforpool($qs)) && ($gq.queueinpoolisfromuser($qs,$nick,$address,$getnet,$2))) { mc1 removed $cbrack($gq.fileformat($qs,$2)) from your queues gq.deletepoolqueuenumber $qs $2 .signal updatepools } else { mc1 $errortag this queue does not exist or is not yours, look up your queuenumbers by typing $c(2) $+ myq } } elseif ($1- == help) { mc1 $bracket(UPP file server help menu) mc1 cd $cborder(change your current directory $c(1) $+ $cbrack($c(2) $+ cd [directory|/|..])) mc1 clr_fqueues $cborder(deletes your failqueueslots, this won't delete your queues $c(1) $+ $cbrack($c(2) $+ same as: clr_fqs|clrfqs)) mc1 clr_queue $cborder(deletes one of your queues $c(1) $+ $cbrack($c(2) $+ clr_queue|del_q|clr_q )) mc1 clr_queues $cborder(deletes all your queues) mc1 dir $cborder(lists all files and directories in your current directory $c(1) $+ $cbrack($c(2) $+ same as: ls)) mc1 failq $cborder(lists your failqueues $c(1) $+ $cbrack($c(2) $+ failq|fq|failqueue )) if ($inf(fservecommand,find)) { mc1 find $cborder(searches fileserver. wildcards are supported $c(1) $+ $cbrack($c(2) $+ find ) $+ $cbrack(same as: search)) } mc1 get $cborder(gets file from the file server $c(1) $+ $cbrack($c(2) $+ get )) mc1 help $cborder(displays this help menu) mc1 my_queues $cborder(lists your queueslots $c(1) $+ $cbrack($c(2) $+ same as: my_q|myq)) mc1 pwd $cborder(shows your current directory) mc1 queues $cborder(shows the list of waiting queues $c(1) $+ $cbrack($c(2) $+ same as: q)) mc1 quit $cborder(closes this fserve session $c(1) $+ $cbrack($c(2) $+ same as: exit|bye)) if ($inf(fservecommand,sends)) { mc1 sends $cborder(shows the list of current sends $c(1) $+ $cbrack($c(2) $+ same as: s)) } if ($inf(fservecommand,stats)) { mc1 stats $cborder(shows file server statistics) } if ($inf(fservecommand,time)) { mc1 time $cborder(shows when this session times out) } if ($inf(fservecommand,who)) { mc1 who $cborder(shows who else is on the file server) } } elseif (($1- == bye) || ($1- == exit) || ($1- == quit)) { mc1 $bracket(bye bye) fservelogin_close $dat(fservelogin,%netnick).wid } elseif ($1- == stats) { if ($inf(fservecommand,stats)) { if ($inf(top,queued,1)) { mostqueued mc1 | mc2 - } if ($ismodule(userstats)) { if ($inf(top,sent,1)) { mostsend mc1 | mc2 - } if ($inf(top,leeched,1)) { mostleeched mc1 | mc2 - } if ($dat(user,%netnick).exists) { userstats %netnick mc1 | mc2 - } } fservestats mc } } elseif ($1- == time) { if ($inf(fservecommand,time)) { mc1 this session times out in $cborder($duration($calc($dat(fservelogin,%netnick).starttime + $inf(fservedata,timeout) - $ctime))) or after $cborder($duration($inf(fservedata,idletime))) idling } } elseif ($1- == who) { if ($inf(fservecommand,who)) { var %nnick,%i = 1,%o = $dat(fservelogin).num mc1 there $iif((%o == 2),is $ecborder(1) other user,are $ecborder($calc(%o -1)) other users) online $cbrack(max number of users is $o.max) while (%i <= %o) { %nnick = $dat(fservelogin,%i).itemat if (%nnick !== %netnick) { if ($fservelogin_isuninitialized(%nnick)) { mc1 user: $+ $cborder($netnicktoatail(%nnick)) $csv(status,connecting...) } else { mc1 user: $+ $cborder($netnicktoatail(%nnick)) ip: $+ $cbrack($dat(fservelogin,%nnick).ip) time remaining: $+ $cborder($duration($calc($dat(fservelogin,%nnick).starttime + $inf(fservedata,timeout) - $ctime))) $csv(directory,$lssc($dat(fservelogin,%nnick).ip)) } } inc %i } if (%o > 1) { mceol } } } } halt } ; --- fserve ad alias fservead.sayall { fserve.ad } alias fservead.sayalls { fserve.ad.multi } alias fserve.ad.multi { scid -at1 fserve.ad } alias -l fserve.ad { if (($server) && ($inf(fserve,on)) && ((!$inf(fservead,iffree)) || (!$allfull)) && ($fserveadchans)) { var %chan,%i = 1,%o = 0,%w = $v1,%b = $comchan($me,0) while (%i <= %b) { %chan = $comchan($me,%i) if (($istok(%w,%chan,44)) && ($fserve.removenoadtrigs($triggerchan(%chan)))) { var %k = $v1 inc %o 4 %chan = $uneval(%chan) if ($inf(fservead,split)) { .timer 1 %o fservead.msg %chan $+($,fserve.ad.split1,$chr(40),%chan,$chr(44),%k,$chr(41)) .timer 1 %o fservead.msg %chan $+($,c,$chr(40),1,$chr(41),$chr(32),$,+,$chr(32),$,fserve.ad.split2,$chr(40),%chan,$chr(44),%k,$chr(41)) } else { .timer 1 %o fservead.msg %chan $+($,fserve.ad.temp,$chr(40),%chan,$chr(44),%chan,$chr(44),%k,$chr(41)) } } inc %i } } } alias fservead.msg { ; $1 = channel, $2- = alias if ($me ison $1) { if ($inf(fservead,strip)) { var %msg = $strip($2-,c) } else { var %msg = $stripforchannel($1,$2-) } msg $1 %msg } } alias fservead { if ($me ison $1) { var %k = $triggerchan($1) if (%k) { %k = $fserve.removenoadtrigs(%k) if (%k) { if ($inf(fservead,split)) { var %msg1 = $fserve.ad.split1($1,%k) var %msg2 = $c(1) $+ $fserve.ad.split2($1,%k) if ($inf(fservead,strip)) { %msg1 = $strip(%msg1,c) | %msg2 = $strip(%msg2,c) } else { %msg1 = $stripforchannel($1,%msg1) | %msg2 = $stripforchannel($1,%msg2) } msg $1 %msg1 | msg $1 %msg2 } else { msg $1 $stripforchannel($1,$fserve.ad.temp($1,$1,%k)) } } elseif ($innput(notriggers)) { dopen fileserver | did -fu fileserver 66 } } else { dbout fservead no triggers for channel :: $1- } } else { error fservead you're not on channel $ecborder($1) } } alias -l fservead.user { ; $1 = triggers, $2 = channel, $3- = alias if ($inf(fservead,split)) { $3- $iif($inf(fservead,strip),$strip($fserve.ad.split1($4,$1),c),$fserve.ad.split1($4,$1)) $3- $iif($inf(fservead,strip),$strip($fserve.ad.split2($2,$1),c),$c(1) $+ $fserve.ad.split2($2,$1)) } else { $3- $fserve.ad.temp($2,$4,$1) } } alias fserve.ad.temp { ; $1 = channel, $2 = target, $3- = triggers tokenize 32 $1-2 $replace($3-,$chr(32),$chr(44)) if ($inf(fservead,strip)) { return $strip($fserve.ad.split1($2,$3) $fserve.ad.split2($1,$3),c) } return $fserve.ad.split1($2,$3) $fserve.ad.split2($1,$3) } alias fserve.ad.split1 { ; $1 = nick/target, $2- = triggers tokenize 32 $1 $replace($2-,$chr(32),$chr(44)) return $bracket($inf(fservead,fserveonline)) $fserve.ad.running $fserve.ad.triggers($2) $fserve.ad.maxcps $& $fserve.ad.mincps($2) $fserve.ad.nextsend($2) $fserve.ad.upstream $fserve.ad.downstream $fserve.ad.bandwidth $& $fserve.ad.firewall($1) $fserve.ad.splitend } alias fserve.ad.split2 { ; $1 = channel, $2- = triggers tokenize 32 $1 $replace($2-,$chr(32),$chr(44)) return $fserve.ad.access $fserve.ad.snagged $fserve.ad.record.cps $& $iif($inf(fservead,short),$fserve.ad.short($2),$fserve.ad.on $fserve.ad.sends($2) $fserve.ad.queues($2)) $& $fserve.ad.onserver($1) $fserve.ad.new($1) $fserve.ad.note($1) $& $logo } alias -l fserve.ad.splitend { if ($inf(fservead,split)) { return $eval($inf(fservead,continue),2) } } alias -l fserve.ad.triggers { return $csvu($inf(fservead,trigger) $+ $iif(($numtok($1,44) !== 1),s),$gettriggers($1)) } alias -l fserve.ad.running { if ($inf(fservead,running).is) { return $csv($inf(fservead,running),$upptime) } } alias -l fserve.ad.mincps { if (($inf(fservead,mincps).is) && ($inf(mincps,on))) { return $csv($inf(fservead,mincps),$fserve.mincps($1)) } } alias -l fserve.ad.maxcps { if (($inf(fservead,maxcps).is) && ($inf(maxcps,on))) { return $csv($inf(fservead,maxcps),$ads.maxcps) } } alias -l fserve.ad.record.cps { if ($inf(fservead,recordcps).is) { return $csv($inf(fservead,recordcps),$size($inf(stats,record.cps)) $+ /s by $inf(stats,record.cps.nick)) } } alias -l fserve.ad.on { if ($inf(fservead,online).is) { return $csv($inf(fservead,online),$fserve.olayout) } } alias -l fserve.ad.sends { if ($inf(fservead,sends).is) { return $csv($inf(fservead,sends),$fserve.sends($1)) } } alias -l fserve.ad.queues { if ($inf(fservead,queues).is) { return $csv($inf(fservead,queues),$fserve.queues($1)) } } alias -l fserve.ad.access { if ($inf(fservead,accessed).is) { tokenize 32 $inf(stats,access) | return $csv($inf(fservead,accessed),$1 $iif(($1 !== 1),$inf(fservead,accessed.ord2),$inf(fservead,accessed.ord1))) } } alias -l fserve.ad.snagged { if ($inf(fservead,snagged).is) { return $csv($inf(fservead,snagged),$size($inf(stats,send.bytes)) in $inf(stats,send.total) files) } } alias -l fserve.ad.upstream { if ($inf(fservead,upstream).is) { return $csv($inf(fservead,upstream),$ads.upstream) } } alias -l fserve.ad.downstream { if ($inf(fservead,downstream).is) { return $csv($inf(fservead,downstream),$ads.downstream) } } alias -l fserve.ad.bandwidth { if ($inf(fservead,bandwidth).is) { return $csv($inf(fservead,bandwidth),$ads.bandwidth) } } alias -l fserve.ad.note { if ($inf(fservead,note).is) { return $csv($inf(fservead,note),$fserve.ad.networkmsg(note,$1)) } } alias -l fserve.ad.onserver { if ($inf(fservead,onserver).is) { return $csv($inf(fservead,onserver),$fserve.ad.networkmsg(onserver,$1)) } } alias -l fserve.ad.new { if ($inf(fservead,new).is) { return $csv($inf(fservead,new),$fserve.ad.networkmsg(new,$1)) } } alias -l fserve.ad.firewall { if (($inf(firewall,note.ad).is) && ($inf(firewall,on))) { return $firewalladnote($1) } } alias -l fserve.ad.nextsend { if ($inf(fservead,nextsend).is) { return $csv($inf(fservead,nextsend),$ads.nextsend($fservetriggers2pools($1))) } } alias -l fservetriggers2pools { ; $1 = trigger,... var %k,%o = $numtok($1,44) | while (%o) { %k = $addtok(%k,$dat(trigger,$gettok($1,%o,44)).pool,44) dec %o } return %k } alias -l fserve.ad.short { var %r if ($inf(fservead,online).is) { %r = $boldalize(O:) $+ $cborder($fserve.olayout) } if ($inf(fservead,sends).is) { %r = %r $boldalize(S:) $+ $cborder($fserve.sends($1)) } if ($inf(fservead,queues).is) { %r = %r $boldalize(Q:) $+ $cborder($fserve.queues($1)) } return %r } alias -l fserve.ad.networkmsg { ; $1 = note|new|onserver, $2 = target if ($inf(fservead,networkmsgs)) { var %net = $fserve.ad.networkmsg.getnetchan($getnet,$2) if (($dat(fservenetwork,%net).exists) && ($dat(fservenetwork,%net).use_ [ $+ [ $1 ] ] )) { return $dat(fservenetwork,%net). [ $+ [ $1 ] ] } } return $inf(fservedata,$1) } alias -l fserve.ad.networkmsg.getnetchan { ; $1 = network, $2 = channel if ($dat(fservenetwork,$+($1,.,$2)).exists) { return $+($1,.,$2) } return $1 } ; --- fileserver group pool information #fileserver_grouppools off alias fserve.sends { var %pools,%pool,%i = 1,%o = $numtok($1,44) | while (%i <= %o) { %pool = $dat(trigger,$gettok($1,%i,44)).pool %pools = $addtok(%pools,%pool,44) set -l %pool_ [ $+ [ %pool ] ] $addtok( %pool_ [ $+ [ %pool ] ] ,$gettok($1,%i,44),44) inc %i } %i = 1 %o = $numtok(%pools,44) if (%o == 1) { return $fserve.slayout(%pools) } var %k while (%i <= %o) { %pool = $gettok(%pools,%i,44) %k = %k $iif((%k),&) %pool_ [ $+ [ %pool ] ] $+ $chr(58) $+ $fserve.slayout(%pool) inc %i } return %k } alias fserve.queues { var %pools,%pool,%i = 1,%o = $numtok($1,44) | while (%i <= %o) { %pool = $dat(trigger,$gettok($1,%i,44)).pool %pools = $addtok(%pools,%pool,44) set -l %pool_ [ $+ [ %pool ] ] $addtok( %pool_ [ $+ [ %pool ] ] ,$gettok($1,%i,44),44) inc %i } %i = 1 %o = $numtok(%pools,44) if (%o == 1) { return $fserve.qlayout(%pools) } var %k while (%i <= %o) { %pool = $gettok(%pools,%i,44) %k = %k $iif((%k),&) %pool_ [ $+ [ %pool ] ] $+ $chr(58) $+ $fserve.qlayout(%pool) inc %i } return %k } alias -l fserve.mincps { var %pools,%pool,%i = 1,%o = $numtok($1,44) | while (%i <= %o) { %pool = $dat(trigger,$gettok($1,%i,44)).pool %pools = $addtok(%pools,%pool,44) set -l %pool_ [ $+ [ %pool ] ] $addtok( %pool_ [ $+ [ %pool ] ] ,$gettok($1,%i,44),44) inc %i } %i = 1 %o = $numtok(%pools,44) if (%o == 1) { return $fserve.mincpslayout(%pools) } var %k while (%i <= %o) { %pool = $gettok(%pools,%i,44) %k = %k $iif((%k),&) %pool_ [ $+ [ %pool ] ] $+ $chr(58) $+ $fserve.mincpslayout(%pool) inc %i } return %k } #fileserver_grouppools end alias fserve.sends { var %i = $poollist($1) if ($numtok(%i,44) == 1) { return $fserve.slayout(%i) } else { var %i = 1,%k,%o = $numtok($1,44) | while (%i <= %o) { %k = %k $iif(%k,&) $fserve.slayout($dat(trigger,$gettok($1,%i,44)).pool) | inc %i } | return %k } } alias fserve.queues { var %i = $poollist($1) if ($numtok(%i,44) == 1) { return $fserve.qlayout(%i) } else { var %i = 1,%k,%o = $numtok($1,44) | while (%i <= %o) { %k = %k $iif(%k,&) $fserve.qlayout($dat(trigger,$gettok($1,%i,44)).pool) | inc %i } | return %k } } alias -l fserve.mincps { var %i = $poollist($1) if ($numtok(%i,44) == 1) { if ($dat(queuepool,%i).mincps_on) { return $fserve.mincpslayout(%i) } } else { var %i = 1,%k,%o = $numtok($1,44) | while (%i <= %o) { %k = %k $iif(%k,&) $fserve.mincpslayout($dat(trigger,$gettok($1,%i,44)).pool) | inc %i } | return %k } } alias -l o.max { return $inf(fservedata,maxonline) } alias -l o.now { return $dat(fservelogin).num } ; --- finding trigger channels alias -l gettriggers { var %a,%i = 1,%k,%o = $numtok($1,44) | while (%i <= %o) { %a = $gettok($1,%i,44) %k = $iif(%k,$v1 $eval($inf(fservead,separator),2)) $fservead.triggerformat(%a) inc %i } return %k } alias -l fservead.triggerformat { ; $1 = triggernum var %msg if (($inf(firewall,on)) && ($inf(fservead,firetriggers))) { %msg = //dccserver $rc(fservead,dccserverflags) on $inf(firewall,port) $chr(124) if ($dat(trigger,$1).mode == ctcp) { %msg = %msg ctcp $me } else { %msg = %msg say } } elseif ($dat(trigger,$1).mode == ctcp) { %msg = /ctcp $me } return %msg $dat(trigger,$1).trigger } alias -l fserve.removenoadtrigs { var %k,%i = 1,%o = $numtok($1,44) | while (%i <= %o) { if ($dat(trigger,$gettok($1,%i,44)).ad) { %k = $addtok(%k,$gettok($1,%i,44),44) } | inc %i } | return %k } alias -l fserveadchans { var %i = 1,%k,%o = $dat(trigger).num | while (%i <= %o) { if (($dat(trigger,%i).on) && ($dat(trigger,%i).ad)) { %k = $tokadd(%k,$chhh($dat(trigger,%i).ch),44) } inc %i } %k = $tokand(%k,$chhh($inf(fservead,ch)),44) return %k } alias -l listchans { var %a,%i = 1,%k,%o = $numtok($2,44) | while (%i <= %o) { %a = $gettok($2,%i,44) | if ($1 >= $dat(trigger,%a).list) { %k = $addtok(%k,%a,44) } | inc %i } | return %k } alias -l levchans { var %a,%i = 1,%k,%o = $numtok($2,44) | while (%i <= %o) { %a = $gettok($2,%i,44) | if ($1 >= $dat(trigger,%a).lev) { %k = $addtok(%k,%a,44) } | inc %i } | return %k } alias triggerchan { var %i = 1,%k,%o = $dat(trigger).num | while (%i <= %o) { if (($dat(trigger,%i).on) && ($ch($dat(trigger,%i).ch,$1).is)) { %k = $addtok(%k,%i,44) } | inc %i } | return %k } alias trigs { var %i = 1,%k,%o = $dat(trigger).num | while (%i <= %o) { if ($dat(trigger,%i).on) { %k = $addtok(%k,%i,44) } | inc %i } | return %k } alias -l fserve.olayout { return $+($o.now,/,$o.max) } alias -l fserve.yqlayout { ; $1 = pool, $2 = nick, $3 = ip, $4 = cid, $5 = base if ($dat(queuepool,$1).maxbytes_on) { return $+($size($gq.bytesqueuedinpoolforuser($1,$2,$3,$4)),/,$size($gq.maxbytesinpoolforuser($1))) } return $+($gq.queuesinuseinpoolforuser($1,$2,$3,$4),/,$fserve.toinf($gq.maxqueuesinpoolforuser($1,$2,$3,$4,$5))) } alias -l fserve.yslayout { ; $1 = pool, $2 = nick, $3 = ip, $4 = cid return $+($gq.sendsinuseinpoolforuser($1,$2,$3,$4),/,$fserve.toinf($gq.maxsendsinpoolforuser($1,$2,$3,$4))) } alias -l fserve.playout { var %trigger = $dat(fservelogin,$fservelogin_fromip($address)).trigger var %pri = $fmax($prinick($1,$gq.getchannelservice(fserve,%trigger)),$dat(trigger,%trigger).priority) return %pri } alias -l poollist { var %i = 1,%k,%o = $numtok($1,44) | while (%i <= %o) { %k = $addtok(%k,$dat(trigger,$gettok($1,%i,44)).pool,44) | inc %i } | return %k } ; --- fserve cache #fileserver_responsive on on *:close:@progress:{ d.temp hash.progress } alias files { if (($hget(temp,hash.exclude)) && ($hget(temp,hash.excludefolders)) && ($isfmatch($2-,$v1))) { if ($hget(temp,hash.progress)) { nextbstep $findfile($2-,*.*,0,0) } return } var %o = $findfile($2-,*.*,0,0) if (%o) { .bufferproc .radixsort $spacetoq($relpath($2-,$1)) $+ / } while (%o) { .bufferproc files_add %o $1- dec %o } } alias files_add { var %i = $1 tokenize 32 $2- var %file,%size,%a = $findfile($2-,*.*,%i,0) if ($hget(temp,hash.progress)) { nextstep } if (%a) { var %r = $spacetoq($relpath($2-,$1)),%l = $maxhashlen(file,$+(%r,/)),%n = $m.file(0,%r $+ /*) if (!%n) { %n = 1 } var %o = $r.file(%r $+ / $+ %n) var %w = $calc($len(%o) + $len(%n)) if ((!$hget(temp,hash.exclude)) || (!$hget(temp,hash.excludefiles)) || (!$ismatch($nopath(%a),$hget(temp,hash.excludefiles)))) { if ($gettok(%a,1-,32) == %a) { %size = $iif(($file(%a).size !== $null),$v1,0) hinc temp hash.totalsize $innt($calc(%size / 1024)) %file = $nopath(%a) $size(%size) inc %w $calc(1 + $len(%file)) if (%w >= %l) { inc %n | %o = %file } else { %o = $addtok(%o,%file,47) } hadd file %r $+ / $+ %n %o } else { error the file $cborder(%a) cannot be cached because the filename contains multiple adjacent spaces } } } } alias dirsss { if (($hget(temp,hash.exclude)) && ($hget(temp,hash.excludefolders)) && ($isfmatch($2-,$v1))) { if ($hget(temp,hash.progress)) { nextstep } return } var %o = $finddir($2-,*,0,0) if (%o) { .bufferproc radixsort $spacetoq($relpath($2-,$1)) $+ : } while (%o) { .bufferproc dirs_add %o $1- dec %o } } alias dirs_add { var %i = $1 tokenize 32 $2- var %subdir,%a = $finddir($2-,*,%i,0) if ($hget(temp,hash.progress)) { nextstep } if (%a) { var %format = $hget(temp,hash.format),%r = $spacetoq($relpath($2-,$1)),%l = $maxhashlen(file,$+(%r,:)),%n = $m.file(0,%r $+ :*) if (!%n) { %n = 1 } var %o = $r.file(%r $+ : $+ %n) var %w = $calc($len(%o) + 1 + $len(%n)) if ((!$hget(temp,hash.exclude)) || (!$hget(temp,hash.excludefolders)) || (!$isfmatch(%a,$hget(temp,hash.excludefolders)))) { if ($gettok(%a,1-,32) == %a) { %subdir = $ [ $+ [ %format ] $+ ] ($gettok(%a,-1,92)) inc %w $calc(1 + $len(%subdir)) if (%w >= %l) { %o = %subdir | inc %n } else { %o = $addtok(%o,%subdir,47) } hadd file %r $+ : $+ %n %o } else { error the directory $cborder(%a) cannot be cached because the path contains multiple adjacent spaces } } } } alias -l dirret { return $1- } alias storedir { if ($isdir($2-)) { .bufferproc files $1- .bufferproc dirsss $1- } } alias -l cachedir { $null($buffinddir($2-,*,0,storedir $uneval($1) $!1-)) .bufferproc storedir $1 $2- .bufferproc secho caching $cborder($2-) } alias updatehash { w.temp hash.ticks $ticks w.temp hash.exclude $inf(fservecache,exclude) w.temp hash.excludefolders $inf(fservecache,exclude.folders) w.temp hash.excludefiles $inf(fservecache,exclude.files) w.temp hash.progress $inf(progress,on) w.temp hash.format $iif(($inf(fservecache,uppercase)),upper,dirret) w.temp hash.totalsize 0 secho $rc(caching,start) $csv(Priority,background) if ($r.temp(hash.progress)) { progress $mountnumbers updating fileserver cache... } .hwipe file rootdir secho $rc(caching,roots) .bufferproc endcache var %a,%o = $dat(mount).num while (%o) { %a = $left($dat(mount,%o).abspath,-1) if ($isdir(%a)) { cachedir %o %a } else { error no such directory $cborder(%a) } dec %o } } alias endcache { hstore file progressend secho $bracket(all done in $calc($ticks - $hget(temp,hash.ticks)) $+ ms) $csv(Cached,$size($calc(1024 * $r.temp(hash.totalsize)))) hdel -w temp hash.* } #fileserver_responsive end on *:signal:cache:{ if (($hget(temp,hash.progress) == 0) || ($window(@progress))) { $1- } elseif ($hget(temp,hash.ticks)) { endcache error caching halted after } } on *:signal:mount:{ if ($1 !isnum 1-) { tokenize 32 1 } if ($hget(temp,cache. $+ $1 $+ .1)) { secho caching $cborder($v1) var %dir,%i = 1,%o = $hget(temp,cache. $+ $1 $+ .0) | while (%i <= %o) { %dir = $hget(temp,cache. $+ $1 $+ . $+ %i) if ($isdir(%dir)) { .signal cache dirsss $1 %dir .signal cache files $1 %dir } inc %i } } if ($1 < $dat(mount).num) { .timer -io 1 0 .signal cache .signal mount $calc(1 + $1) } else { .signal cache endcache secho all done in } } alias -l endcache { hdel -w temp cache.* hstore file progressend $1 $bracket($2- $calc($ticks - $hget(temp,hash.ticks)) $+ ms) $csv(Cached,$size($calc(1024 * $r.temp(hash.totalsize)))) hdel -w temp hash.* } alias -l files { if (($hget(temp,hash.exclude)) && ($hget(temp,hash.excludefolders)) && ($isfmatch($2-,$v1))) { nextbstep $findfile($2-,*.*,0,0) return } var %file,%size,%i = 1,%a = $findfile($2-,*.*,%i,0),%o,%r = $spacetoq($relpath($2-,$1)),%l = $maxhashlen(file,$+(%r,/)),%n = $calc($m.file(0,%r $+ /*) + 1) var %w = $len(%n) while (%a) { if ($hget(temp,hash.progress)) { nextstep } if ((!$hget(temp,hash.exclude)) || (!$hget(temp,hash.excludefiles)) || (!$ismatch($nopath(%a),$hget(temp,hash.excludefiles)))) { if ($gettok(%a,1-,32) == %a) { %size = $iif(($file(%a).size !== $null),$v1,0) hinc temp hash.totalsize $innt($calc(%size / 1024)) %file = $nopath(%a) $size(%size) inc %w $calc(1 + $len(%file)) if (%w >= %l) { hadd file %r $+ / $+ %n %o | inc %n | var %o,%w = $calc($len(%n) + (1 + $len(%file))) } %o = $addtok(%o,%file,47) } else { error the file $cborder(%a) cannot be cached because the filename contains multiple adjacent spaces } } inc %i %a = $findfile($2-,*.*,%i,0) } if (%o !== $null) { hadd file %r $+ / $+ %n %o } .radixsort %r $+ / } alias -l dirsss { if (($hget(temp,hash.exclude)) && ($hget(temp,hash.excludefolders)) && ($isfmatch($2-,$v1))) { nextstep return } var %subdir,%format = $hget(temp,hash.format),%i = 1,%a = $finddir($2-,*,%i,0),%o,%r = $spacetoq($relpath($2-,$1)),%l = $maxhashlen(file,$+(%r,:)),%n = $calc($m.file(0,%r $+ :*) + 1) var %w = $len(%n) while (%a) { if ($hget(temp,hash.progress)) { nextstep } if ((!$hget(temp,hash.exclude)) || (!$hget(temp,hash.excludefolders)) || (!$isfmatch(%a,$hget(temp,hash.excludefolders)))) { if ($gettok(%a,1-,32) == %a) { %subdir = $ [ $+ [ %format ] $+ ] ($gettok(%a,-1,92)) inc %w $calc(1 + $len(%subdir)) if (%w >= %l) { hadd file %r $+ : $+ %n %o | inc %n | var %o,%w = $calc($len(%n) + (1 + $len(%subdir))) } %o = $addtok(%o,%subdir,47) } else { error the directory $cborder(%a) cannot be cached because the path contains multiple adjacent spaces } } inc %i %a = $finddir($2-,*,%i,0) } if (%o !== $null) { hadd file %r $+ : $+ %n %o } radixsort %r $+ : } alias -l dirret { return $1- } alias -l storedir { hinc temp cache. $+ $1 $+ .0 hadd temp cache. $+ $1 $+ . $+ $hget(temp,cache. $+ $1 $+ .0) $2- } alias -l cachedir { storedir $1 $2- return $finddir($2-,*,0,storedir [ [ $1 ] ] $1-) } alias updatehash { w.temp hash.ticks $ticks w.temp hash.exclude $inf(fservecache,exclude) w.temp hash.excludefolders $inf(fservecache,exclude.folders) w.temp hash.excludefiles $inf(fservecache,exclude.files) w.temp hash.progress $inf(progress,on) w.temp hash.format $iif(($inf(fservecache,uppercase)),upper,dirret) w.temp hash.totalsize 0 secho $rc(caching,start) $csv(Priority,foreground) if ($r.temp(hash.progress)) { progress $mountnumbers updating fileserver cache... } .hwipe file hdel -w temp cache.* rootdir secho $rc(caching,roots) var %i = 1,%o = $dat(mount).num,%a while (%i <= %o) { %a = $left($dat(mount,%i).abspath,-1) if ($isdir(%a)) { cachedir %i %a } else { error no such directory $cborder(%a) } inc %i } .signal mount } alias mountnumbers { var %i = 1,%k = 0,%o = $dat(mount).num while (%i <= %o) { inc %k $findfile($dat(mount,%i).abspath,*,0) inc %k $finddir($dat(mount,%i).abspath,*,0) inc %i } return %k } alias -l relpath { return $gettok($replace($1 $+ \,$dat(mount,$2).abspath,$dat(mount,$2).relpath),1-,92) } alias abspath { var %i = 1,%rel,%abs,%d = $deltok($1-,-1,32),%o = $dat(mount).num while (%i <= %o) { %rel = $dat(mount,%i).relpath %abs = $dat(mount,%i).abspath if ((%rel isin %d) && ($isfile($replace(%d,%rel,%abs)))) { return $replace(%d,%rel,%abs) $gettok($1-,-1,32) } inc %i } return $1- } alias -l rootdir { var %a,%d,%dirn,%i = 1,%o = $dat(mount).num,%upper = $inf(fservecache,uppercase) while (%i <= %o) { %a = $left($gettok($dat(mount,%i).relpath,1-,47),-1) if (%a) { %d = $numtok(%a,92) if (%upper) { %dirn = $upper($gettok(%a,1,92)) } else { %dirn = $gettok(%a,1,92) } hadd file /:1 $sorttok($addtok($hget(file,/:1),%dirn,47),47) var %h = 1,%n while (%h < %d) { %n = $hget(file,/ $+ $spacetoq($gettok(%a,1- [ $+ [ %h ] ] ,92)) $+ :1) if (%upper) { %dirn = $upper($gettok(%a,$calc(%h +1),92)) } else { %dirn = $gettok(%a,$calc(%h +1),92) } hadd file / $+ $spacetoq($gettok(%a,1- [ $+ [ %h ] ] ,92)) $+ :1 $sorttok($addtok(%n,%dirn,47),47) inc %h } } inc %i } } alias -l ismatch { var %i = 1,%o = $numtok($2-,1) | while (%i <= %o) { if ($gettok($2-,%i,1) iswm $1) { return $true } | inc %i } } alias -l isfmatch { var %i = 1,%o = $numtok($2-,1) | while (%i <= %o) { if ($wildtok($1,$gettok($2-,%i,1),0,92)) { return $true } | inc %i } } ; --- fserve cache sorting algorithm alias radixsort { var %last,%section,%i = 1,%d,%c,%l = $maxhashlen(file,$1),%n = 1,%o = $m.file(0,$1 $+ *) while (%i <= %o) { var % [ $+ [ %i ] ] $sorttok($hget(file,$1 $+ %i),47) | inc %i } hdel -w file $1 $+ * var %w = $len(%n) while (%o) { var %i = 1,%q = $chr(255) while (%i <= %o) { if ($show) { %section = $gettok(% [ $+ [ %i ] ] ,1,47) } else { %section = $nosize($gettok(% [ $+ [ %i ] ] ,1,47)) } if (%section == %last) { if ($gettok(% [ $+ [ %i ] ] ,2-,47)) { % [ $+ [ %i ] ] = $v1 } else { % [ $+ [ %i ] ] = % [ $+ [ %o ] ] | dec %o } continue } if (%section < %q) { %q = $v1 | %c = %i } inc %i } if (%q == $chr(255)) { break } %last = %q %q = $gettok(% [ $+ [ %c ] ] ,1,47) inc %w $calc($len(%q) + 1) if (%w >= %l) { hadd file $1 $+ %n %d | inc %n | var %d,%w = $calc($len(%n) + (1 + $len(%q))) } %d = $addtok(%d,%q,47) } if (%d !== $null) { hadd file $1 $+ %n %d } } alias -l nosize { ; $1- = files with sizes var %k $null($regsub(def,$1-,/\s[^\s]+(\/|$)/g,\1,%k)) return %k } ; --- used in dlgs alias bind { ; $1 = path, $?2- = path return $gettok($1,1-,92) $+ $iif($1 !== /,\) $+ $gettok($2-,1-,92) } ; --- show items on *:signal:show.stats:{ fservestats $1- } alias fservestats { ; $1- = output $1- $bracket($rc(fservestats,title)) $1- $+($c(1),$csv($rc(fservestats,logins),$ifna($inf(stats,access)))) $1- $+($c(1),$csv($rc(fservestats,filessent),$ifna($inf(stats,send.total)))) $1- $+($c(1),$csv($rc(fservestats,bytessent),$size($inf(stats,send.bytes)))) $1- $+($c(1),$csv($rc(fservestats,sendfails),$ifna($inf(stats,send.fails)))) $1- $+($c(1),$csv($rc(fservestats,recordcps),$size($inf(stats,record.cps)) $+ /s by $inf(stats,record.cps.nick))) $1- $+($c(1),$msgdrive)