aIRC — File Browser

aIRCv0.8.69 / aIRCv0.8.69 / addons / fserve1.mrc

fserve1.mrc — 30.32 KB — Download this file

;/**********************************************************************
; *
; * aIRC
; * File Server - file1
; *
; **********************************************************************/
;
alias _fserve.addonver { return 2.1 }
alias _fserve.unload {
}
alias fssetup {
  if ($1 == on) || ($1 == off) { _fserve.turn $1 }
  else { _fserve.setup $1- }
}
alias _fserve.turn {
  if ($1 == off) {
    _setsetup fserve fserve 0
    .disable #_fserve
  }
  elseif ($1) {
    _setsetup fserve fserve 1
    .enable #_fserve
  }
  if ($show) { info.a File Server is $iif($_getsetup(fserve,fserve),ON,OFF) }
  _fserve.init
}
alias _fserve.triggered {
  if ($_flood2(3,__FSERVEnoFSERVE)) || ($2- != $null) { return }
  var %trigger = $1,%reply = _puthelp $nick & _qnotice $nick,%reject = $_not($_getsetup(script,quiet-reject))
  if ($_fserve.isbanned($fulladdress,%++handle)) {  }
  elseif ($fserv($nick)) {
    if (%reject) { %reply FileServer is busy, try again later. }
    _fserve.echo FileServer request by $nick rejected (existing session)
  }
  elseif ($_dcctotal.fserv >= $_getsetup(fserve,maxusers)) {
    if (%reject) { %reply Sorry, my file server is full. Try again later. }
    _fserve.echo FileServer request by $nick rejected (server full)
  }
  elseif ($isdir($_fserve.homedir(%trigger))) {
    if ($_getsetup(fserve,useuserlist)) && (%++handle != $null) {
      var %tmpflags = $_nickflags(%++handle)
      if (x !isincs %tmpflags) {
        if (%reject) { %reply Sorry, you don't have access to my file server. }
        _fserve.echo FileServer request by $nick rejected (handle: %++handle $+ , user doesn't have the +x flag)
        return
      }
      if (N isincs %tmpflags) {
        if (%reject) { %reply Sorry, you don't have access to my file server. }
        _fserve.echo FileServer request by $nick rejected (handle: %++handle $+ , user has the +N flag)
        return
      }
    }
    _delhsection fservetmpusr $nick
    if (%++handle != $null) { _setd fservetmpusr $nick handle $ifmatch }
    _setd fservetmpusr $nick address $fulladdress
    _setd fservetmpusr $nick trigger %trigger
    var %homedir = $shortfn($_fserve.homedir(%trigger)),%welcome = $shortfn($_fserve.welcome(%trigger))
    fserve $nick $null $iif(%homedir,$shortfn(%homedir),$null) $shortfn(%welcome)
  }
}
#_fserve off
ON *:JOIN:#:{
  if ($_getsetup(fserve,triggers) == $null) { return }
  if ($nick == $me) { _fserve.ad.chan $chan }
  elseif ($_getsetup(fserve,advertonjoin)) && ($_fserve.isadvertchan($chan)) && ($fserv($nick).status != active) && ($_not($_fserve.isbanned($fulladdress,%++handle))) && ($_fserve.ad.msg($chan) != $null) { _automsghtchan $chan $nick _puthelp $nick & notice $nick $ifmatch }
}
ON *:TEXT:@find *:#:{ _fserve.@findlocator $nopath($strip($2-)) }
ON *:TEXT:@locator *:#:{ _fserve.@findlocator $nopath($strip($2-)) }
ON *:TEXT:&:#:{
  if ($1- != $null) && ($_getsetup(fserve,triggers) != $null) {
    var %triggers = $ifmatch
    if ($istok(%triggers,$1-,32)) && ($_fserve.isactivetriggerforchan($1-,$chan)) { _fserve.triggered $1- }
    elseif ($1- == !list) && ($fserv($nick).status != active) && ($_getsetup(fserve,advertonlist)) && ($_fserve.isadvertchan($chan)) && ($_not($_fserve.isbanned($fulladdress,%++handle))) {
      if ($_flood2(4,__fserveno!find)) { return }
      if ($_fserve.ad.msg($chan) != $null) { _puthelp $nick & notice $nick $ifmatch }
    }
  }
}
menu query {
  $iif((=* iswm $active) && ($right($active,-1)),fserve):
}
ON *:FILERCVD:*:{
  var %handle = $_get(fservetmpusr,$nick,handle),%size = $file($filename).size
  _setsetup fserve Ufiles $calc($_getsetup(fserve,Ufiles) + 1)
  _setsetup fserve Ubytes $calc($_getsetup(fserve,Ubytes) + %size)
  if ($_getsetup(fserve,useuserlist)) && (%handle != $null) {
    _fserve.setuserfields %handle
    var %ratio = $_getsetup(fserve,ratio),%credits = $calc($_fserve.getuser(%handle,credits) + (%size * %ratio))
    if (%ratio) { _fserve.setuser %handle credits %credits }
    if ($fserv($nick).status == active) && ($_get(fservetmpusr,$nick,logged)) {
      _fservemsg $nick File Received: $^'($nopath($filename)) $^p($_size(%size))
      if (%ratio) { _fservemsg $nick Credits: %credits }
    }
    _fserve.setuser %handle Ufiles $calc($_fserve.getuser(%handle,Ufiles) + 1)
    _fserve.setuser %handle Ubytes $calc($_fserve.getuser(%handle,Ubytes) + %size)
  }
}
ON *:FILESENT:*:{
  var %handle = $_get(fservetmpusr,$nick,handle),%size = $file($filename).size,%sendnum = $send($nick,0),%ttf,%cps = 0
  while (%sendnum) {
    %ttf = $send($nick,%sendnum).path $+ $send($nick,%sendnum).file
    if (%ttf = $filename) { %cps = $send($nick,%sendnum).cps }
    dec %sendnum
  }
  _setsetup fserve Dfiles $calc($_getsetup(fserve,Dfiles) + 1)
  _setsetup fserve Dbytes $calc($_getsetup(fserve,Dbytes) + %size)
  _fserve.toplist $filename
  if (%cps > $_fserve.getrecordcps) {
    _setsetup fserve recordcps %cps
    _setsetup fserve recordby $nick
  }
  if ($fserv($nick).status != active) { return }
  if ($_getsetup(fserve,useuserlist)) && (%handle != $null) {
    _fserve.setuserfields %handle
    if ($fserv($nick).status == active) && ($_get(fservetmpusr,$nick,logged)) { _fservemsg $nick File Sent: $^'($nopath($filename)) $^p($_size(%size)) }
    _fserve.setuser %handle Dfiles $calc($_fserve.getuser(%handle,Dfiles) + 1)
    _fserve.setuser %handle Dbytes $calc($_fserve.getuser(%handle,Dbytes) + %size)
  }
}
ON *:SENDFAIL:*:{
  var %handle = $_get(fservetmpusr,$nick,handle)
  if ($fserv($nick).status != active) { return }
  if ($_getsetup(fserve,useuserlist)) && (%handle != $null) {
    _fserve.setuserfields %handle
    var %size = $file($filename).size,%ratio = $_getsetup(fserve,ratio),%credits = $calc($_fserve.getuser(%handle,credits) + %size)
    if (%ratio) { _fserve.setuser %handle credits %credits }
    if ($fserv($nick).status == active) && ($_get(fservetmpusr,$nick,logged)) {
      if (%ratio) {
        _fservemsg $nick Failed to send: $^'($nopath($filename)) - Your credits will be restored
        _fservemsg $nick Credits: %credits
      }
      else { _fservemsg $nick Failed to send: $^'($nopath($filename)) }
    }
  }
  else { _fservemsg $nick Failed to send: $^'($nopath($filename)) }
}
CTCP *:DCC SEND *:*:{
  if (%+dcc.badcc) { return }
  var %handle = $_get(fservetmpusr,$nick,handle),%trigger = $_get(fservetmpusr,$nick,trigger)
  if (%handle != $null) && ($fserv($nick).status == active) && ($_get(fservetmpusr,$nick,logged)) {
    if ($_dccignore(%+dcc.file)) || (N isincs %++flags) { }
    else {
      var %ext = $iif($count(%+dcc.file,.) > 0,$gettok(%+dcc.file,-1,46)),%extM = $iif($count(%+dcc.file,.) > 0,*. [ $+ [ %ext ] ] )
      if ($_dcctotal.get($nick) > $_getsetup(dcc,maxGuser)) {
        _fservemsg $nick I'm receiving too many files from you. Please try again later.
        halt
      }
      elseif ($_dcctotal.get > $_getsetup(dcc,maxGtotal)) {
        _fservemsg $nick I'm receiving too many files. Please try again later.
        halt
      }
      elseif ($file($findfile($_fserve.homedir(%trigger),%+dcc.file,1)).size >= %+dcc.size) {
        _fservemsg $nick I can't accept $^'(%+dcc.file) It's in my File Server
        halt
      }
      elseif ($file($findfile($getdir(%extM),%+dcc.file,1)).size >= %+dcc.size) {
        _fservemsg $nick I can't accept $^'(%+dcc.file) I already have it
        halt
      }
      else {
        _timer -o 1 0 .sreq $iif($_minio(0,16),+m,-m) $sreq
        .sreq +m auto
        if ($_getsetup(fserve,ratio)) && ($_fserve.getuser(%handle,credits)) {
          _fservemsg $nick Accepting $^'(%+dcc.file)
          _fservemsg $nick $calc(%+dcc.size * $_getsetup(fserve,ratio)) credits will be given upon completion
        }
      }
    }
  }
}
ON *:SERV:*:{
  var %i,%logged = $_get(fservetmpusr,$nick,logged),%handle = $_get(fservetmpusr,$nick,handle),%trigger = $_get(fservetmpusr,$nick,trigger)
  .timer_FSERVELOGINTIMEOUT $+ $nick off

  if ($_not(%logged)) {
    if (%handle == $null) {
      %handle = $1-
      if (%handle == new) && ($_getsetup(script,open-telnets)) {
        _fservemsg $nick You now get to pick a nick to use on the file server,
        _fservemsg $nick and a password so nobody else can pretend to be you.
        _fservemsg $nick Please remember both!
        _fservemsg $nick Enter the nickname you would like to use.
        _setd fservetmpusr $nick newuser 1
        _setd fservetmpusr $nick handle NEW
      }
      elseif ($_isuser(%handle)) {
        var %tmpflags = $_nickflags(%handle)
        _setd fservetmpusr $nick handle %handle
        if ($_fserve.isbanned($null,%handle)) {
          _fservemsg $nick You are banned from my File Server
          _fserve.close $nick
        }
        elseif ($_userpass(%handle) == $null) {
          _fservemsg $nick Can't log in until you have a password set.
          _fserve.close $nick
        }
        elseif (x !isincs %tmpflags) || (N isincs %tmpflags) {
          _fservemsg $nick You don't have access.
          _fserve.close $nick
        }
        else { _fservemsg $nick Enter your password. }
      }
      else {
        _fservemsg $nick You don't have access.
        _fserve.close $nick
      }
      halt
    }
    elseif ($_get(fservetmpusr,$nick,newuser)) {
      if (%handle == new) {
        if ($_isinvalidinitialchar4handle($1-)) {
          _fservemsg $nick You can't start your nick with the character ' $+ $left($1,1) $+ '
          _fservemsg $nick Try another one please:
        }
        elseif ($_not($_isvalidhandle($1-))) {
          _fservemsg $nick You can't use weird symbols in your nick.
          _fservemsg $nick Try another one please:
        }
        elseif ($_isuser($1)) {
          _fservemsg $nick Sorry, that nickname is taken already.
          _fservemsg $nick Try another one please:
        }
        elseif ($1 == $me) { _fservemsg $nick Sorry, can't use my name for a nick. }
        else {
          _fservemsg $nick Okay, now choose and enter a password:
          _setd fservetmpusr $nick handle $1
        }
        _fserve.logintimeout $nick 1
      }
      elseif ($len($1) < 4) {
        _fservemsg $nick Try to use at least 4 characters in your password.
        _fservemsg $nick Choose and enter a password:
        _fserve.logintimeout $nick 1
      }
      elseif ($_not($_isvalidhandle($1,ignorefirstcharacter))) {
        _fservemsg $nick You can't use weird symbols in your password.
        _fservemsg $nick Try another one please:
        _fserve.logintimeout $nick 1
      }
      else {
        var %ident = $gettok($gettok($_address($nick,5),1,64),2,33),%ip = $fserv($nick).ip,%addy = $_get(fservetmpusr,$nick,address)
        _putlog New user via fserve: [[ $+ %handle $+ ]] $+ $iif(%ident != $null,%ident,?) $+ @ $+ %ip $+ / $+ ?
        if ($_getsetup(script,notify-newusers) != $null) {
          var %i = 1,%notify = $replace($ifmatch,$chr(32),$chr(44)),%n = $numtok(%notify,44)
          while (%i <= %n) {
            _cmd.note $null $gettok(%notify,%i,44) introduced to %handle $+ , %ip
            inc %i
          }
        }
        _dummy $_creatinguser(%handle,$_mask(%addy,%_maskuser),$_changemodes($_getsetup(script,default-flags),+xF),$1)
        _fservemsg $nick Remember that!  You'll need it next time you log in.
        _fservemsg $nick You now have an account on $me
        _fserve.setuserfields %handle
        _fserve.login $nick %handle
      }
      halt
    }
    else {
      if ($1- != $null) && ($_isuser(%handle)) && ($_passwdok(%handle,$1-)) {
        if ($_fserve.getuser(%handle,credits) == $null) { _fserve.setuser %handle credits $_getsetup(fserve,initialcredits) }
        _fserve.login $nick %handle
      }
      else {
        _fservemsg $nick Negative on that Houston.
        _fserve.close $nick
      }
      halt
    }
  }
  elseif ($istok(quit bye exit,$1,32)) {
    if (%handle != $null) { _fserve.logout %handle }
  }
  elseif ($1 == help) {
    _fserve.help $nick $2-
    halt
  }
  elseif ($istok(s c,$1-,32)) { }
  elseif ($istok($_getsetup(fserve,commands),$1,32)) {
    if ($1 == read) {  }
    elseif ($istok(search srch find,$1,32)) {
      if ($2- != $null) {
        if (?:\* iswm $remove($_fserve.homedir(%trigger),$fserv($nick).cd)) { var %dir = $fserv($nick).cd }
        else { var %dir = $_fserve.homedir(%trigger) }
        var %file = $findfile(%dir,$nopath($2-),1)
        if (%file != $null) { _fservemsg $nick  $+ $2 $+ : $replace($remove(%file,%dir),\,/) }
        else { _fservemsg $nick  $+ $2 $+ : File not found }
      }
      else { _fserve.help $nick $1 }
      halt
    }
    elseif ($1 == msg) {
      if ($2 == $null) || ($3- == $null) { _fserve.help $nick msg }
      elseif ($fserv($2).status == active) && ($_get(fservetmpusr,$2,logged)) {
        _fservemsg $nick Message sent
        _fservemsg $2 < $+ $nick $+ > $3-
      }
      else { _fservemsg $nick No such user $2 }
      halt
    }
    elseif ($1 == say) {
      if ($2- == $null) { _fserve.help $nick say }
      else {
        var %i = 1,%f = $fserv(0)
        while (%i <= %f) {
          if ($fserv(%i).status == active) && ($_get(fservetmpusr,$fserv(%i),logged)) { _fservemsg $fserv(%i) < $+ $nick $+ > $2- }
          inc %i
        }
      }
      halt
    }
    elseif ($1 == who) {
      _fservemsg $nick current users:
      var %i = 1,%f = $fserv(0),%m,%fs = 0
      while (%i <= %f) {
        if ($fserv(%i).status == active) && ($_get(fservetmpusr,$fserv(%i),logged)) {
          _fservemsg $nick      $+ %i $+ : $fserv(%i)
          inc %fs
        }
        inc %i
      }
      _fservemsg $nick total: $_nsingoplur(%fs,user,users)
      halt
    }
    elseif ($1 == ratio) {
      if ($_getsetup(fserve,useuserlist)) && ($_getsetup(fserve,ratio)) { _fservemsg $nick Fserve ratio: [1: $+ $ifmatch $+ ] }
      else { _fservemsg $nick Fserve ratio: full leech }
      haltdef
    }
    elseif ($1 == credits) {
      if (%handle == $null) || ($_fserve.getuser(%handle,leech)) { _fservemsg $nick You have leech access }
      else {
        if ($_fserve.getuser(%handle,credits) == $null) { _fserve.setuser $nick credits $_getsetup(fserve,initialcredits) }
        var %hcredits = $_fserve.getuser(%handle,credits)
        _fservemsg $nick You have  $+ %hcredits $+  $_singoplur(%hcredits,credit,credits)
      }
      halt
    }
    elseif ($1 == get) {
      _dummy $_fserve.sendrequest($nick,%handle,$cd,$nopath($2-))
      halt
    }
    elseif ($1 == stats) {
      if ($2- == $null) {
        _fservemsg $nick 
        _fservemsg $nick Stats for %trigger
        _fservemsg $nick Current:
        _fservemsg $nick   users: $_dcctotal.fserv $+ / $+ $_getsetup(fserve,maxusers)
        _fservemsg $nick   downloads: $_dcctotal.send $+ / $+ $_getsetup(dcc,maxStotal)
        _fservemsg $nick   uploads: $_dcctotal.get $+ / $+ $_getsetup(dcc,maxGtotal)
        _fservemsg $nick Total:
        _fservemsg $nick   logins: $_fserve.getlogins
        _fservemsg $nick   downloads: $_getsetup(fserve,Dfiles) $^bp($_size($_getsetup(fserve,Dbytes)))
        _fservemsg $nick   uploads: $_getsetup(fserve,Ufiles) $^bp($_size($_getsetup(fserve,Ubytes)))
      }
      else {
        var %file = $cd $+ \ $+ $2-,%size = $file(%file).size,%t = $read -nw"* $+ %file $+ " $_usrdir(fs_sent.log),%l = $readn,%n
        if (%l) { var %t = $read -nl $+ %l $_usrdir(fs_sent.log),%n = $gettok(%t,1,32) }
        if (%n) { _fservemsg $nick $^'($2-) $^bp($_size(%size)) has been downloaded $_nsingoplur(%n,time,times) }
        else { _fservemsg $nick No records for $^'($2-) }
      }
      halt
    }
    elseif ($1 == info) {
      _fservemsg $nick 
      if (%handle != $null) {
        _fservemsg $nick User info for $nick - %handle
        _fservemsg $nick credits: $iif($_fserve.getuser(%handle,credits),$_fserve.getuser(%handle,credits),leech)
      }
      else {
        _fservemsg $nick User info for $nick
        _fservemsg $nick credits: leech
      }
      _fservemsg $nick Current:
      _fservemsg $nick   downloads: $_dcctotal.send($nick) $+ / $+ $_getsetup(dcc,maxSuser)
      _fservemsg $nick   uploads: $_dcctotal.get($nick) $+ / $+ $_getsetup(dcc,maxGuser)
      if (%handle != $null) {
        _fservemsg $nick Total:
        _fservemsg $nick   downloads: $_fserve.getuser(%handle,Dfiles) $^bp($_size($_fserve.getuser(%handle,Dbytes)))
        _fservemsg $nick   uploads: $_fserve.getuser(%handle,Ufiles) $^bp($_size($_fserve.getuser(%handle,Ubytes)))
      }
      halt
    }
    elseif ($1 == top) {
      var %fssentfile = $_usrdir(fs_sent.log),%lines,%topn,%win = @__fileservertop
      _openwins %win
      filter -fwteu 1 32 %fssentfile %win & $cd $+ \*
      %lines = $line(%win,0)
      %topn = %lines
      if (%topn > 10) { %topn = 10 }
      if ($_isint(2-)) && ($2- <= %topn) && ($round($2-,0) == $2-) {
        var %line = $line(%win,$2-),%dls = $gettok(%line,1,32),%file = $_fixfilename($gettok(%line,2-,32))
        if ($_isfile(%file)) { _dummy $_fserve.sendrequest($nick,%handle,$nofile(%file),$nopath(%file)) }
        else { _fservemsg $nick Top file $^'($2) $^p($nopath(%file)) not found }
      }
      elseif (%topn) {
        _fservemsg $nick 
        _fservemsg $nick Top %topn files in %trigger
        _fservemsg $nick 
        _fservemsg $nick $_fillright(4, ,N) $_fillright(7, ,DLs) File
        %i = 1
        while (%i <= %topn) {
          var %line = $line(%win,%i),%dls = $gettok(%line,1,32),%file = $nopath($gettok(%line,2-,32))
          _fservemsg $nick $_fillright(4, ,%i) $_fillright(7, ,%dls) %file
          inc %i
        }
        _fservemsg $nick 
        _fservemsg $nick Type 'top <number>' to download a file
      }
      else { _fservemsg $nick No files downloaded yet in %trigger }
      halt
    }
    elseif ($1 == queue) {
      var %rwin = @__fserveremotequeue,%i = 1,%n = $_nickqueue2win(-n,%rwin,$nick)
      if (%n) {
        _fservemsg $nick You have $_nsingoplur(%n,file,files) queued
        while (%i <= %n) {
          _fservemsg $nick  $+ %i $+ - $line(%rwin,%i)
          inc %i
        }
        close -@ %rwin
      }
      else { _fservemsg $nick You have no files queued. }
      halt
    }
    elseif ($1 == sends) {
      var %i = 1,%n = $_dcctotal.send
      if (%n)  {
        _fservemsg $nick There $_singoplur(%n,is,are) %n dcc $_singoplur(%n,send,sends)
        while (%i <= %n) {
          var %nick = $send(%i),%file = $send(%i).file,%cps = $send(%i).cps,%pc = $send(%i).pc,%sent = $send(%i).sent,%size = $send(%i).size,%left = $calc((%size - %sent) / %cps)
          if ($send(%i).status == active) {
            if (%left) { _fservemsg $nick $chr(35) $+ %i $+ - ' $+ %file $+ ' to  $+ %nick $+  %pc $+ $chr(37) ( $+ $_size(%sent) $+ / $+ $_size(%size) $+ ) $_size(%cps) $+ /s ( $+ $_duration(%left) left) }
            else { _fservemsg $nick $chr(35) $+ %i $+ - ' $+ %file $+ ' to  $+ %nick $+  %pc $+ $chr(37) ( $+ $_size(%sent) $+ / $+ $_size(%size) $+ ) $_size(%cps) $+ /s }
          }
          else { _fservemsg $nick $chr(35) $+ %i $+ - ' $+ %file $+ ' to  $+ %nick $+  %pc $+ $chr(37) ( $+ $_size(%sent) $+ / $+ $_size(%size) $+ ) (Inactive) }
          inc %i
        }
        _fservemsg $nick - End of sends list
      }
      else { _fservemsg $nick There are no dcc sends }
      halt
    }
    elseif ($1 == queues) {
      var %win = @__fservetmpqueues,%i = 1,%n
      _nickqueue2win -i %win * *
      %n = $result
      if (%n) {
        _fservemsg $nick There $_singoplur(%n,is,are) %n waiting $_singoplur(%n,queue,queues)
        while (%i <= %n) {
          var %line = $line(%win,%i),%nick = $gettok(%line,1,32),%file = $gettok(%line,2-,32),%size = $file(%file).size,%nopath = $nopath(%file)
          _fservemsg $nick $chr(35) $+ %i $+ - ' $+ %nopath $+ ' to  $+ %nick $+  ( $+ $_size(%size) $+ )
          inc %i
        }
        _fservemsg $nick - End of queues list
      }
      else { _fservemsg $nick There are no waiting queues }
      close -@ %win
      halt
    }
    elseif ($1 == cancel) {
      var %n = $_sendqueue.removenick($nick,$2-),%left = $_sendqueue.queues($nick)
      if (%left = $null) { %left = 0 }
      %left = ( $+ $_nsingoplur(%left,file,files) left)
      if (%n) {
        if ($2- != $null) && ($_not($_isint($remove($2-,$chr(44),-)))) { _fservemsg $nick You removed $_nsingoplur(%n,file,files) matching ' $+ $2- $+ ' from your queue. %left }
        else { _fservemsg $nick You removed $_nsingoplur(%n,file,files) from your queue. %left }
      }
      elseif ($_isint($remove($2-,$chr(44),-))) { _fservemsg $nick You didn't have queues: $2- }
      elseif ($2- != $null) { _fservemsg $nick You didn't have any files matching ' $+ $2- $+ ' in your queue. }
      else { _fservemsg $nick You didn't have any files in your queue }
      halt
    }
    elseif ($1 == cd) || ($1 == dir) || ($1 == ls) { return }
  }
  else {
    if ($_getsetup(fserve,helponinvalid)) { _fserve.help $nick }
    halt
  }
}
ON *:OPEN:!:{ _fserve.onopen $nick }
#_fserve end
alias _fserve.checkfserves {
  var %i = 1,%n = $fserv(0),%nick,%addy,%handle,%close,%zzz
  while (%i <= %n) {
    var %close = 0,%nick = $fserv(%i),%logged = $_get(fservetmpusr,%nick,logged),%handle = $_get(fservetmpusr,%nick,handle),%addy = $_get(fservetmpusr,%nick,address)
    if (%logged) {
      if ($_fserve.isbanned(%addy,%handle)) { %close = 1 }
    }
    elseif ($_fserve.isbanned(%addy,$null)) { %close = 1 }
    if (%close) && ($istok(%zzz,%nick,32) == $false) {
      _fservemsg %nick You are banned from my File Server
      _fserve.close %nick
      %zzz = $addtok(%zzz,%nick,32)
    }
    inc %i
  }
}
alias _fserve.isbanned {
  var %addy = $1,%handle = $2
  if (%handle == $null) && (%addy != $null) { %handle = $_finduser(%addy) }
  if (%handle != $null) && ($_fserve.getuser(%handle,BAN)) { return 2 }
  if (%addy != $null) && ($hmatch($_list.tablename(fservebans),%addy,1).data) { return 1 }
  return 0
}
alias _fserve.homedir {
  var %t = trigger_ $+ $1,%c = $_getsetup(fserve,%t),%f = $gettok(%c,1,$asc(*)),%h = $gettok(%c,2,$asc(*)),%w = $gettok(%c,3,$asc(*))
  if (%h == $null) {
    if ($_mini(fileserver,homedir)) { _setsetup fserve %t %f * $ifmatch * %w }
  }
  return $gettok($_getsetup(fserve,%t),2,$asc(*))
}
alias _fserve.welcome {
  var %t = trigger_ $+ $1,%c = $_getsetup(fserve,%t),%f = $gettok(%c,1,$asc(*)),%h = $gettok(%c,2,$asc(*)),%w = $gettok(%c,3,$asc(*))
  if (%w == $null) {
    if ($_mini(fileserver,welcome)) { _setsetup fserve %t %f * %h * $ifmatch }
  }
  return $gettok($_getsetup(fserve,%t),3,$asc(*))
}
alias fserve {
  var %maintrigger = $gettok($_getsetup(fserve,triggers),1,32),%welcome = $iif($4,$4,$_fserve.welcome(%maintrigger))
  tokenize 32 $_parameter($1,1,File Server [/fserve],1,$_activequery,Nick:) $iif($2,$2,$iif($_getsetup(dcc,maxGtotal),$_getsetup(dcc,maxGtotal),2)) $iif($3 != $null,$3,$iif($_fserve.homedir(%maintrigger) != $null,$_fserve.homedir(%maintrigger),$null))
  if ($fserv($1)) { info.a There is an existing Fserve session with $1 }
  elseif ($3- == $null) { error.a File Server Root directory not set. }
  elseif ($isdir($3-) == $false) { error.a File Server Root directory $^'($3) not found }
  else {
    if ($nopath(%welcome) == $null) || ($isfile(%welcome) == $false) {
      %welcome = $shortfn($_chfile($_fixfilename($_tmpdir(fstmp.fstmp))))
      write -c " $+ %welcome $+ "
    }
    fserve $1 $2 $shortfn($3-) $shortfn(%welcome)
  }
}

; $_fserve.getuser(<handle>,<field>)
alias _fserve.getuser { return $_ruini($1,$_nospaces(_fserve,$2)) }

; /_fserve.setuser <handle> <field> [content]
alias _fserve.setuser { _wuini $1 _fserve $+ $2 $3- }

alias _fservemsg {
  if ($fserv($1).status == active) { msg = $+ $1 $$2- }
  elseif ($_connected) { _puthelp $1 & _qnotice $1 $$2- }
}

alias _fserve.onopen {
  var %nick = $1,%reply = _fservemsg %nick,%handle,%flags
  %reply 
  %reply 
  %reply $me ( $+ Fserve: aIRC v $+ $_vers $+ +win $+ $bits (c)1997-2001 tabo)
  %reply  $+ $_aircweb
  %reply 
  %reply 
  _fserve.help %nick
  _setd fservetmpusr %nick newuser 0

  if ($_getsetup(fserve,useuserlist)) {
    %handle = $_get(fservetmpusr,%nick,handle)
    %flags = $_nickflags(%handle)
    if (%handle != $null) {
      if ($_fserve.getuser(%handle,credits) == $null) { _fserve.setuser %handle credits $_getsetup(fserve,initialcredits) }
      .timer -mo 1 0 _fserve.login %nick %handle
    }
    else {
      _setd fservetmpusr %nick logged 0
      .timer -mo 1 0 _fserve._onopenask %nick 0
    }
  }
  else { .timer -mo 1 0 _fserve.login %nick }
}
alias _fserve._onopenask {
  _fservemsg $1 Please enter your nickname.
  if ($_getsetup(script,open-telnets)) { _fservemsg $1 (If you are new, enter 'NEW' here.) }
  _fserve.logintimeout $1
}
alias _fserve.logintimeout {
  var %to = $_getsetup(script,connect-timeout)
  if ($_not($_isint(%to))) {
    _setsetup script connect-timeout 15
    %to = 15
  }
  .timer_FSERVELOGINTIMEOUT $+ $1 -o 1 %to _fserve.onlogintimeout $1-
}
alias _fserve.onlogintimeout {
  if ($fserv($1).status == active) {
    if ($2) { _fservemsg $1 Timeout. }
    else { _fservemsg $1 Guess you're not there.  Bye. }
    close -f $1
  }
}
alias _fserve.login {
  if ($_fserve.isbanned($_get(fservetmpusr,$1,address),$2)) {
    msg = $+ $1 You are banned from my file server
    _fserve.close $1
    return
  }
  _setd fservetmpusr $1 logged 1
  _setd fservetmpusr $1 newuser 0
  _setsetup fserve logins $calc($_fserve.getlogins + 1)
  if ($2 != $null) {
    msg = $+ $1 
    msg = $+ $1 Welcome $2
    if ($_getsetup(fserve,ratio)) {
      var %tmp = Ratio 1: $+ $ifmatch
      if ($_fserve.getuser($2,credits) > 0) { %tmp = %tmp - credits: $ifmatch }
      msg = $+ $1 %tmp
    }
    _fserve.setuser $2 lastlogin $ctime
    _fserve.setuser $2 logins $calc($round($_fserve.getuser($2,logins),0) + 1)
  }
}
alias _fserve.logout { _fserve.setuser $1 lastlogout $ctime }
alias _fserve.close {
  close -f $1
  _delhsection fservetmpusr $1
}
alias _fserve.setuserfields {
  if ($_fserve.getuser($1,credits) !isnum) { _fserve.setuser $1 credits $_getsetup(fserve,initialcredits) }
  _fserve.setuser $1 connections
  _fserve._setuser $1 leech 0
  _fserve._setuser $1 Ufiles 0
  _fserve._setuser $1 Ubytes 0
  _fserve._setuser $1 Dfiles 0
  _fserve._setuser $1 Dbytes 0
  _fserve._setuser $1 logins 0
  _fserve._setuser $1 lastlogin 0
  _fserve._setuser $1 lastlogout 0
  _fserve._setuser $1 BAN 0
}
alias _fserve._setuser {
  if ($_fserve.getuser($1,$2) == $null) { _fserve.setuser $1- }
}
alias _fserve.toplist {
  var %fssentfile = $_usrdir(fs_sent.log),%t,%l,%n,%i,%max,%maxl,%win1 = @__fsnfs1,%win2 = @__fsnfs2
  if ($isfile(%fssentfile) == $false) { write -c %fssentfile }
  if ($1- != $null) {
    var %t = $read -nw"* $+ $1- $+ " %fssentfile,%l = $readn
    if (%l) { var %t = $read -nl $+ %l %fssentfile,%n = $calc($gettok(%t,1,32) + 1) }
    else { %n = 1 }
    write $iif(%l,-l [ $+ [ %l ] ] ) %fssentfile %n $1-
  }
}
alias fssay {
  tokenize 32 $_parameter($1-,1,Fserve Say [/fssay],normal,$null,Message:)
  var %i = 1,%f = $fserv(0),%fs = 0
  while (%i <= %f) {
    if ($fserv(%i).status == active) && ($_get(fservetmpusr,$fserv(%i),logged)) {
      _fservemsg $fserv(%i) <@ $+ $me $+ > $1-
      inc %fs
    }
    inc %i
  }
  if (%fs) { info.a Fserve message: $1- }
  else { error.a No active fserve sessions }
}
alias _fserve.echo { info.a $1- }
alias -l _fserve.parm2wc {
  var %string = * $+ $1- $+ *
  while (** isin %string) { %string = $replace(%string,**,*) }
  return %string
}
alias -l _fserve.@findlocator {
  if ($_fserve.isbanned($fulladdress,%++handle)) { return }
  if ($1- == $null) || ($_not($_getsetup(fserve,@find@locator))) || ($_fserve.@prot(0)) { return }
  var %wc = $_fserve.parm2wc($1-),%wint = @__findlocatortmp,%found,%i = 1,%maxf = $_getsetup(fserve,@maxmatches),%reply = _puthelp $nick & _qprivmsg $nick,%echo
  if ($len(%wc) <= 5) { return }
  if ($_not($_isint(%maxf))) { %maxf = 6 }
  %echo = Fserve Search request from $nick ( $+ $address $+ ) in $chan : " $+ $1- $+ "
  _openwins %wint
  %found = $_fserve.wc2win(%wc,%wint,$chan)
  if (%found) {
    if (%found > %maxf) { %echo = %echo - Found too many matches! ( $+ %found $+ ). Sending the first %maxf matches. }
    else { %echo = %echo - Found $_nsingoplur(%found,match,matches) $+ . }
    %reply Found $_nsingoplur(%found,match,matches) for ' $+ $1- $+ ' - Join the desired fserve to request a file - slots[ $+ $_dcctotal.send $+ / $+ $_getsetup(dcc,maxStotal) $+ ] ques[ $+ $_sendqueue.queues $+ / $+ $_getsetup(dcc,maxQtotal) $+ ]
    var %i = 1,%tfile
    while (%i <= %found) && (%i <= %maxf) {
      %tfile = $gettok($line(%wint,%i),2-,32)
      %reply %i $+ :  $+ $nopath(%tfile) $+  [ $+ $_size($file(%tfile).size) $+  ] trigger[ $+ $gettok($line(%wint,%i),1,32) $+ ]
      inc %i
    }
    if (%found > %maxf) { %reply There are  $+ $calc(%found - %maxf) $+  more files matching ' $+ $1- $+ ' }
    _dummy $_fserve.@prot(1)
  }
  else { %echo = %echo - No matches. }
  info.a %echo
  close -@ %wint
}
alias -l _fserve.wc2win {
  var %wc = $1,%win = $2,%chan = $3,%ftriggers,%striggers = $_getsetup(fserve,triggers),%i = $numtok(%striggers,32),%t,%y,%dir
  while (%i) {
    var %t = $gettok(%striggers,%i,32),%y = triggerchan_ $+ %t,%y = $_getsetup(fserve,%y)
    if ($_not($gettok(%y,1,32))) || ($istok($gettok(%y,2-,32),%chan,32)) {
      %dir = $_fserve.homedir(%t)
      if ($isdir(%dir)) { _dummy $findfile(%dir,%wc,0,aline %win %t $1-) }
    }
    dec %i
  }
  return $line(%win,0)
}
alias -l _fserve.@prot {
  if (%__fserveno@find@locator.1) { return 1 }
  if ($1) {
    if (%__fserveno@find@locator.2) { return 1 }
    if ($_getsetup(fserve,@secondsprot.state)) && ($_isint($_getsetup(fserve,@secondsprot.secs)) > 0) {
      set -u [ $+ [ $ifmatch ] ] %__fserveno@find@locator.2 1
      return 1
    }
  }
  var %state = $_getsetup(fserve,@floodprot.state),%reqs = $round($_getsetup(fserve,@floodprot.reqs),0),%secs = $round($_getsetup(fserve,@floodprot.secs),0),%ignt = $round($_getsetup(fserve,@floodprot.ignt),0)
  if (%state) && (%reqs) && (%secs) && (%ignt) && ($_flood.main(1,0,%reqs,0,%secs,__fservenocount@find@locator,l)) {
    set -u [ $+ [ %ignt ] ] %__fserveno@find@locator.1 1
    return 1
  }
  return 0
}