multi-fserve — File Browser

multi-fservev1.011 / multi-fservev1.011 / fserve.mrc

fserve.mrc — 119.39 KB — Download this file

; multi-fserve[v1.011]

; to load this script, type
; //load -rs $findfile(c:\,fserve.mrc,1)

; see changes.txt for a list of revisions
; visit http://nuncio.hypermart.net for the latest version

on 1:load: {
  window @initial
  clear @initial
  aline $colour(info) @initial $fserve_version
  aline $colour(back) @initial -
  echo @initial This is a one-time window with some info for new users.
  echo @initial Most fserve setup options can be reached through the menubar item  $+ $remove( [ $readini [ $readini [ $mircini ] pfiles n4 ] bpopup n0 ] ,&) $+  and submenu fserve.
  aline $colour(back) @initial -
  echo @initial Channel-specific options can be reached by right-clicking in the channel window.
  aline $colour(back) @initial -
  echo @initial If you're stuck or simply need clarification on some point, it's recommended you read the file fserve_h.txt or visit $fserve_version $+ 's official webpage at http://nuncio.hypermart.net
  aline $colour(back) @initial -
  echo @initial Just so it's cleared up, this fserve is not designed to be colorful or glitzy.  The colors included are function related.  The display is meant to be clean and compliant w/ the restraints and color configurations of all mIRC users.
  aline $colour(back) @initial -
  echo @initial If you desperately need help, you can email me at nuncio_gen@hotmail.com
}
on 1:start: {
  set %fserves $readini fserve.ini main servers
  set %pointer $gettok(%fserves,0,32)
  :continue_fserve_scan
  if (%pointer < 1) { goto fserve_scan_complete }
  set %fserve $gettok(%fserves,%pointer,32) $+ .ini
  remini %fserve users
  dec %pointer 1
  goto continue_fserve_scan
  :fserve_scan_complete
  unset %fserves %pointer %fserve
  remini fserve.ini sockets
  if ($window(@initial) == $null) { ugly_titlebar_thing }
}
menu menubar {
  &fserve
  .&users { users_window }
  .&stats { files_window }
  .-
  .&configure { config_fserve }
  .&advertisement construction { config_adverts }
}
alias f7 { users_window }
alias f8 { files_window }
alias sf7 {
  set %ip $sock(fserve_*_*,$sock(fserve_*_*,0)).ip
  set %info $readini fserve.ini sockets %ip
  set %fserve $deltok($deltok($gettok(%info,1,32),1,95),$gettok($deltok($gettok(%info,1,32),1,95),0,95),95)
  set %temp $gettok(%info,2,32) %ip %fserve
  unset %fserve %info %ip
  if (%temp) { full_user_info %temp }
  else { echo $colour(info) -a *** no matching user }
}
alias config_fserve {
  unset %fserve
  if ($left($1,3) == ) { set %fserve $remove($1,) | set %fserve.d %fserve $+ _data }
  set %parms $2-
  if ($1 == [add) {
    ; add new fserve
    set %servers $readini fserve.ini main servers
    set %new $$?="enter name of new fserve"
    if (%new == fserve) { unset %servers %new | unset %parms | goto skip_create }
    set %servers $addtok(%servers,$gettok( [ %new ] ,1,32),32)
    writeini fserve.ini main servers %servers
    writeini fserve.ini [ [ %new ] $+ _data ] description no description
    writeini fserve.ini [ [ %new ] $+ _data ] password password
    writeini fserve.ini [ [ %new ] $+ _data ] directory $mircdir
    writeini fserve.ini [ [ %new ] $+ _data ] trigger ! $+ %new
    writeini fserve.ini [ [ %new ] $+ _data ] max.users 1
    writeini fserve.ini [ [ %new ] $+ _data ] max.gets 1
    writeini fserve.ini [ [ %new ] $+ _data ] ratio 0
    writeini fserve.ini [ [ %new ] $+ _data ] credits 0
    writeini fserve.ini [ [ %new ] $+ _data ] file.types *.wav *.jpeg *.jpg *.gif
    writeini fserve.ini [ [ %new ] $+ _data ] time.out 300
    .remove [ [ %new ] $+ .ini ]
    unset %fserve %parms %new
  }
  :skip_create
  if ($gettok(%parms,1,32) == description) { writeini fserve.ini %fserve.d description $fserve_inifilter(in [ $replace($$?="enter new description",$chr(44),$chr(255)) ] ) }
  if ($gettok(%parms,1,32) == admin) { writeini fserve.ini %fserve.d password $$?="enter new admin password" }
  if ($gettok(%parms,1,32) == directory) { writeini fserve.ini %fserve.d directory $$sdir="select directory" [ $readini fserve.ini [ %fserve.d ] directory ] | .remove [ [ %fserve ] $+ .ini ] }
  if ($gettok(%parms,1,32) == trigger) { writeini fserve.ini %fserve.d trigger $$?="enter new trigger" }
  if ($gettok(%parms,1,32) == max && $gettok(%parms,2,32) == users) { writeini fserve.ini %fserve.d max.users $$?="enter max users (0 for no limit)" }
  if ($gettok(%parms,1,32) == max && $gettok(%parms,2,32) == gets) { writeini fserve.ini %fserve.d max.gets $$?="enter max gets per user (0 for no limit)" }
  if ($gettok(%parms,1,32) == ratio) { writeini fserve.ini %fserve.d ratio $$?="enter new byte ratio (0 for no ratio) [1:?]" }
  if ($gettok(%parms,1,32) == initial) { writeini fserve.ini %fserve.d credits $$?="enter new initial byte credits" }
  if ($gettok(%parms,1,32) == idle) { writeini fserve.ini %fserve.d time.out $$?="enter idle timeout in seconds (0 for no timeout)" }
  if ($gettok(%parms,1,32) == type) { writeini fserve.ini %fserve.d [ r. $+ [ $gettok(%parms,3,32) ] ] $$?="enter ratio for file type $gettok(%parms,3,32) (0 for default) [1:?]" }
  if ($gettok(%parms,1,32) == [add) {
    set %file.types $readini fserve.ini %fserve.d file.types
    set %file.types $addtok(%file.types,$gettok($$?="enter new file type",1,32),32)
    writeini fserve.ini %fserve.d file.types %file.types
    unset %file.types
  }
  if ($gettok(%parms,1,32) == greeting) { writeini fserve.ini %fserve.d greet $$dir [ $readini fserve.ini [ %fserve.d ] directory ] }
  if ($gettok(%parms,1,32) == [compile) { flushini fserve.ini | compile_dirstruct [ $readini fserve.ini %fserve.d directory ] }
  window -l @fserve @fserve
  clear @fserve
  titlebar @fserve %fserve
  if (%fserve == $null) {
    if ( [ $readini -n fserve.ini main servers ] != $null) {
      aline $colour(info) @fserve choose fserve to configure
      aline $colour(info) @fserve to delete an fserve, select it and right click
      aline $colour(list) @fserve -
    }
    else { aline $colour(info) @fserve you have no fserves configured }
    set %fserves $readini fserve.ini main servers
    set %pointer $gettok(%fserves,0,32)
    :test_fserves_complete
    if (%pointer < 1) { goto list_fserves_complete }
    aline $colour(high) @fserve  $+ $gettok(%fserves,%pointer,32) - [ $fserve_inifilter(out [ $readini fserve.ini [ [ $gettok(%fserves,%pointer,32) ] $+ _data ] description ] ) ]
    dec %pointer 1
    goto test_fserves_complete
    :list_fserves_complete
    aline $colour(list) @fserve -
    aline $colour(high) @fserve [add new fserve]
  }
  if (%fserve != $null) {
    aline $colour(high) @fserve description : $fserve_inifilter(out [ $readini fserve.ini [ %fserve.d ] description ] )
    aline $colour(high) @fserve admin password : $readini fserve.ini %fserve.d password
    aline $colour(list) @fserve -
    aline $colour(high) @fserve directory : $readini fserve.ini %fserve.d directory
    aline $colour(high) @fserve trigger : $readini fserve.ini %fserve.d trigger
    set %max.users $readini fserve.ini %fserve.d max.users
    if ( [ $readini fserve.ini %fserve.d max.users ] == 0) { set %max.users no limit }
    aline $colour(high) @fserve max users : %max.users
    set %max.gets $readini fserve.ini %fserve.d max.gets
    if ( [ $readini fserve.ini %fserve.d max.gets ] == 0) { set %max.gets no limit }
    aline $colour(high) @fserve max gets per user : %max.gets
    set %ratio [1: $+ $readini fserve.ini %fserve.d ratio $+ $chr(93)
    if ( [ $readini fserve.ini %fserve.d ratio ] == 0) { set %ratio full leech }
    aline $colour(high) @fserve ratio : %ratio
    aline $colour(high) @fserve initial credits : $readini fserve.ini %fserve.d credits
    aline $colour(list) @fserve -
    set %time.out $duration( [ $readini fserve.ini [ %fserve.d ] time.out ] )
    if ( [ $readini fserve.ini %fserve.d time.out ] == 0) { set %time.out no time out }
    aline $colour(high) @fserve idle timeout : %time.out
    set %file.types $readini fserve.ini %fserve.d file.types
    aline $colour(list) @fserve -
    if (%file.types != $null) {
      aline $colour(info) @fserve accepted file types
      set %pointer $gettok(%file.types,0,32)
      :inc_filetypes
      set %ratio $readini fserve.ini %fserve.d [ r. $+ [ $gettok(%file.types,%pointer,32) ] ]
      if (%ratio) { set %ratio ratio[1: $+ %ratio $+ $chr(93) }
      else { unset %ratio | remini fserve.ini %fserve.d [ r. $+ [ $gettok(%file.types,%pointer,32) ] ] }
      aline $colour(other) @fserve type : $gettok(%file.types,%pointer,32) %ratio
      dec %pointer 1
      if (%pointer > 0) { goto inc_filetypes }
      aline $colour(info) @fserve to remove a file type, select it and right-click
    }
    else {
      aline $colour(info) @fserve there are currently no accepted file types
    }
    aline $colour(high) @fserve [add file type]
    aline $colour(list) @fserve -
    set %greeting.file $readini fserve.ini %fserve.d greet
    if (%greeting.file == $null) { set %greeting.file no greeting file }
    aline $colour(high) @fserve greeting file : %greeting.file
    if ($exists( [ [ %fserve ] $+ .ini ] ) == $true) { aline $colour(info) @fserve subdirectory structure compiled }
    else { aline $colour(high) @fserve [compile subdirectory structure] }
    aline $colour(list) @fserve -
    aline $colour(high) @fserve [complete]
    unset %ratio %max.users %file.types %pointer %greeting.file
    if (%parms == [complete]) { .timer -m 1 1 config_fserve }
  }
  unset %fserves %fserve %parms %servers %fserve.d
}
menu @fserve {
  dclick {
    if ($window(@fserve).title != $null) { config_fserve  $+ $window(@fserve).title $sline($active,1) }
    else { config_fserve $sline($active,1) }
  }
  $del_fserve {
    set %fserve $remove($gettok($sline($active,1),1,32),) 
    set %servers $remtok( [ $readini fserve.ini main servers ] ,%fserve,1,32)
    if ($exists( [ [ %fserve ] $+ .ini ] ) == $true) { .remove [ [ %fserve ] $+ .ini ] }
    if (%servers != $null) { writeini fserve.ini main servers %servers }
    else { remini fserve.ini main servers }
    remini fserve.ini [ [ %fserve ] $+ _data ]
    unset %fserve %servers
    config_fserve
  }
  $del_filetype {
    set %file.types $readini fserve.ini [ [ $window($active).title ] $+ _data ] file.types
    set %file.types $remtok(%file.types,$gettok($sline($active,1),3,32),1,32)
    remini fserve.ini [ [ $window($active).title ] $+ _data ] [ r. $+ [ $gettok($sline($active,1),3,32) ] ]
    if (%file.types != $null) { writeini fserve.ini [ [ $window($active).title ] $+ _data ] file.types %file.types }
    else { remini fserve.ini [ [ $window($active).title ] $+ _data ] file.types }
    unset %file.types
    config_fserve  $+ $window($active).title
  }
  $del_greeting(no greeting file) {
    remini fserve.ini [ [ $window($active).title ] $+ _data ] greet
    config_fserve  $+ $window($active).title
  }
  -
  $del_greeting(edit greeting file) {
    run notepad [ $readini fserve.ini [ [ $window($active).title ] $+ _data ] greet ]
    config_fserve  $+ $window($active).title
  }
}
alias del_fserve { if ($left($sline($active,1),3) == ) { return delete fserve : $remove($gettok($sline($active,1),1,32),) } }
alias del_filetype { if ($window($active).title != $null && $left($sline($active,1),4) == type) { return delete file type : $gettok($sline($active,1),3,32) } }
alias del_greeting { if ($window($active).title != $null && $left($sline($active,1),8) == greeting && $gettok($sline($active,1),4,32) != no) { return $1- } }
alias compile_dirstruct {
  set %fserve $window($active).title
  titlebar @fserve please wait... (compiling)
  if ($exists( [ [ %fserve ] $+ .ini ] ) == $true) { .remove [ [ %fserve ] $+ .ini ] }
  write -c [ [ %fserve ] $+ .ini ]
  set %pointer 1
  :continue_dir_build
  set %f $nofile($findfile($1-,*,%pointer))
  if (%f != $null) {
    set %dir $remove(%f,$1-)
    if (%dir != $null && %dir. [ $+ [ $replace($replace($replace(%dir,$chr(32),ÿ),$chr(91),þ),$chr(93),ý) ] ] == $null) {
      if ($gettok(%dir,0,92) > 1) {
        set %subdir %dir
        :continue_tree_chop
        set %subdir $deltok(%subdir,$gettok(%subdir,0,92),92) $+ \
        if (%dir. [ $+ [ $replace($replace($replace(%subdir,$chr(32),ÿ),$chr(91),þ),$chr(93),ý) ] ] == $null && %subdir != \) {
          set %sub.d subdir_ $+ $deltok(%subdir,$gettok(%subdir,0,92),92)
          set %subdirs $readini [ [ %fserve ] $+ .ini ] %sub.d dirs
          inc %subdirs 1
          writeini [ [ %fserve ] $+ .ini ] %sub.d dirs %subdirs
          writeini [ [ %fserve ] $+ .ini ] %sub.d [ subdir $+ [ %subdirs ] ] $gettok(%subdir,$gettok(%subdir,0,92),92)
          titlebar @fserve DIR : $gettok(%subdir,$gettok(%subdir,0,92),92) (compiling)
          set %dir. [ $+ [ $replace($replace($replace(%subdir,$chr(32),ÿ),$chr(91),þ),$chr(93),ý) ] ] 1
          goto continue_tree_chop
        }
      }
      set %sub.d subdir_ $+ $deltok(%dir,$gettok(%dir,0,92),92)
      set %subdirs $readini [ [ %fserve ] $+ .ini ] %sub.d dirs
      set %t.pointer %subdirs
      inc %subdirs 1
      writeini [ [ %fserve ] $+ .ini ] %sub.d dirs %subdirs
      writeini [ [ %fserve ] $+ .ini ] %sub.d [ subdir $+ [ %subdirs ] ] $gettok(%dir,$gettok(%dir,0,92),92)
      titlebar @fserve DIR : $gettok(%dir,$gettok(%dir,0,92),92) (compiling)
      set %dir. [ $+ [ $replace($replace($replace(%dir,$chr(32),ÿ),$chr(91),þ),$chr(93),ý) ] ] 1
    }
    inc %pointer 1
    goto continue_dir_build
  }
  titlebar @fserve %fserve
  unset %pointer %dir %dir.* %subdir %subdirs %sub.d
}
alias config_adverts {
  window -el @adverts @adverts
  unset %advert
  if ($left($1,3) == ) { set %advert $strip($1) | set %parms $2- }
  else { set %parms $1- }
  if ($gettok(%parms,1,32) == [add) {
    set %adverts $readini fserve.ini main adverts
    set %adverts $addtok(%adverts,$$?="enter label for new advert",32)
    writeini fserve.ini main adverts %adverts
    unset %adverts
  }
  clear @adverts
  if (%advert == $null) {
    if ( $gettok( [ $readini fserve.ini main adverts ] ,1,32) == $null) { aline $colour(info) @adverts no advertisements configured }
    else {
      aline $colour(info) @adverts choose advert to configure
      aline $colour(info) @adverts to delete an advert, select it and right click
      aline $colour(list) @adverts -
      set %adverts $readini fserve.ini main adverts
      set %pointer $gettok(%adverts,0,32)
      :dec_adverts
      aline $colour(high) @adverts  $+ $gettok(%adverts,%pointer,32)
      dec %pointer 1
      if (%pointer > 0) { goto dec_adverts }
    }
    aline $colour(list) @adverts -
    aline $colour(high) @adverts [add new advert]
  }
  else {
    if (%parms == [enclosers]) { show_fserve_advert_build enclosers %advert }
    if (%parms == [tokens]) { show_fserve_advert_build tokens %advert }
    if (%parms == [clear]) { remini fserve.ini [ advert_ $+ [ $window(@adverts).title ] ] }
    if (%parms == [complete]) { .timer -m 1 1 titlebar @adverts | .timer -m 1 1 config_adverts }
    titlebar @adverts %advert
    editbox @adverts $fserve_inifilter(out [ $readini fserve.ini [ advert_ $+ [ %advert ] ] text ] )
    aline $colour(high) @adverts [enclosers]
    aline $colour(high) @adverts [tokens]
    aline $colour(list) @adverts -
    aline $colour(info) @adverts preview( $+ $gettok( [ $readini fserve.ini main servers ] ,1,32) $+ ) : $fserve_advert( [ $window(@adverts).title ] [ $gettok( [ $readini fserve.ini main servers ] ,1,32) ] )
    aline $colour(high) @adverts [clear]
    aline $colour(list) @adverts -
    aline $colour(high) @adverts [complete]
  }
}
menu @adverts {
  dclick {
    if ($window($active).title) { config_adverts  $+ $window($active).title $sline($active,1) }
    else { config_adverts $sline($active,1) }
  }
  $del_advert {
    set %adverts $readini fserve.ini main adverts
    set %adverts $remtok(%adverts, [ $remove($sline($active,1),) ] ,1,32)
    if (%adverts != $null) { writeini fserve.ini main adverts %adverts }
    else { remini fserve.ini main adverts }
    unset %adverts
    config_adverts
  }
  $edit_advert(advert text) { }
  -
  $edit_advert(encloser)
  .none { add_encloser $window($active).title none }
  .-
  .'%% fade
  ..violet { add_encloser $window($active).title '%% 1 }
  ..cold { add_encloser $window($active).title '%% 2 }
  ..hot { add_encloser $window($active).title '%% 3 }
  ..marine { add_encloser $window($active).title '%% 4 }
  ..earthy { add_encloser $window($active).title '%% 5 }
  ..deep earthy { add_encloser $window($active).title '%% 6 }
  .<> fade
  ..violet { add_encloser $window($active).title <> 1 }
  ..cold { add_encloser $window($active).title <> 2 }
  ..hot { add_encloser $window($active).title <> 3 }
  ..marine { add_encloser $window($active).title <> 4 }
  ..earthy { add_encloser $window($active).title <> 5 }
  ..deep earthy { add_encloser $window($active).title <> 6 }
  .bracket fade
  ..violet { add_encloser $window($active).title bracket 1 }
  ..cold { add_encloser $window($active).title bracket 2 }
  ..hot { add_encloser $window($active).title bracket 3 }
  ..marine { add_encloser $window($active).title bracket 4 }
  ..earthy { add_encloser $window($active).title bracket 5 }
  ..deep earthy { add_encloser $window($active).title bracket 6 }
  $edit_advert(add token)
  .fserve name { add_token $window($active).title fserve }
  .description of fserve { add_token $window($active).title description }
  .trigger { add_token $window($active).title trigger }
  .ratio { add_token $window($active).title ratio }
  .initial credits { add_token $window($active).title initial }
  .current users { add_token $window($active).title current }
  .max users { add_token $window($active).title max }
  -
  $edit_advert(clear) {
    remini fserve.ini [ advert_ $+ [ $window($active).title ] ] text
    config_adverts  $+ $window($active).title
  }
}
alias del_advert {
  if ($left($sline($active,1),3) == ) { return delete advert : $remove($sline($active,1),) }
}
alias edit_advert {
  if ($window($active).title) { return $1- }
}
on 1:input:@adverts: {
  if ($window($active).title != $null) {
    set %temp $replace($1-,$chr(44),$chr(255))
    set %temp $fserve_inifilter(in [ %temp ] )
    writeini fserve.ini [ advert_ $+ [ $window($active).title ] ] text %temp
    config_adverts  $+ $window($active).title
    halt
  }
}
alias show_fserve_advert_build {
  window -l @advert_options @advert_options
  clear @advert_options
  titlebar @advert_options $1-
  if ($1 == enclosers) {
    aline $colour(high) @advert_options '%% fade
    aline $colour(high) @advert_options <> fade
    aline $colour(high) @advert_options bracket fade
  }
  if ($1 == encloser_'%%) {
    aline $colour(high) @advert_options $encloser('%% 1 violet) !'%% 1
    aline $colour(high) @advert_options $encloser('%% 2 cold) !'%% 2
    aline $colour(high) @advert_options $encloser('%% 3 hot) !'%% 3
    aline $colour(high) @advert_options $encloser('%% 4 marine) !'%% 4
    aline $colour(high) @advert_options $encloser('%% 5 earthy) !'%% 5
    aline $colour(high) @advert_options $encloser('%% 6 deep earthy) !'%% 6
  }
  if ($1 == encloser_<>) {
    aline $colour(high) @advert_options $encloser(<> 1 violet) !<> 1
    aline $colour(high) @advert_options $encloser(<> 2 cold) !<> 2
    aline $colour(high) @advert_options $encloser(<> 3 hot) !<> 3
    aline $colour(high) @advert_options $encloser(<> 4 marine) !<> 4
    aline $colour(high) @advert_options $encloser(<> 5 earthy) !<> 5
    aline $colour(high) @advert_options $encloser(<> 6 deep earthy) !<> 6
  }
  if ($1 == encloser_bracket) {
    aline $colour(high) @advert_options $encloser(bracket 1 violet) !bracket 1
    aline $colour(high) @advert_options $encloser(bracket 2 cold) !bracket 2
    aline $colour(high) @advert_options $encloser(bracket 3 hot) !bracket 3
    aline $colour(high) @advert_options $encloser(bracket 4 marine) !bracket 4
    aline $colour(high) @advert_options $encloser(bracket 5 earthy) !bracket 5
    aline $colour(high) @advert_options $encloser(bracket 6 deep earthy) !bracket 6
  }
  if ($1 == tokens) {
    aline $colour(high) @advert_options fserve name
    aline $colour(high) @advert_options description of fserve
    aline $colour(high) @advert_options trigger
    aline $colour(high) @advert_options ratio
    aline $colour(high) @advert_options initial credits
    aline $colour(high) @advert_options current users
    aline $colour(high) @advert_options max users
  }
}
menu @advert_options {
  dclick {
    if ($gettok($window($active).title,1,32) == enclosers) { show_fserve_advert_build [ encloser_ $+ [ $gettok($sline($active,1),1,32) ] ] $gettok($window($active).title,2,32) }
    if ($left($gettok($window($active).title,1,32),9) == encloser_) {
      set %encloser $gettok($sline($active,1),2,33)
      if (%encloser != $null) {
        add_encloser $gettok($window($active).title,2,32) %encloser
      }
      unset %encloser
    }
    if ($gettok($window($active).title,1,32) == tokens) {
      add_token $gettok($window($active.title),2,32) $gettok($sline($active,1),1,32)
    }
  }
}
alias add_encloser {
  if ($2 == none) {
    remini fserve.ini [ advert_ $+ [ $1 ] ] encloser
  }
  else {
    writeini fserve.ini [ advert_ $+ [ $1 ] ] encloser $2-
  }
  config_adverts  $+ $1
}
alias add_token {
  set %temp $readini fserve.ini [ advert_ $+ [ $1 ] ] text
  set %temp %temp ! $+ $2 $+ !
  writeini fserve.ini [ advert_ $+ [ $1 ] ] text %temp
  unset %temp
  config_adverts  $+ $1
}
alias encloser {
  set %temp $1-
  if ($1 == '%%) {
    if ($2 == 1) { set %temp 13,0'%0,13%,6,13'%13,6%,2,6'%6,2%,1,2'%2,1%,0,1 $3- 2,1'%1,2%,6,2'%2,6%,13,6'%6,13%,0,13'%13,0%, }
    if ($2 == 2) { set %temp 11,0'%0,11%,12,11'%11,12%,2,12'%12,2%,1,2'%2,1%,0,1 $3- 2,1'%1,2%,12,2'%2,12%,11,12'%12,11%,0,11'%11,0%, }
    if ($2 == 3) { set %temp 8,0'%0,8%,4,8'%8,4%,5,4'%4,5%,1,5'%5,1%,0,1 $3- 5,1'%1,5%,4,5'%5,4%,8,4'%4,8%,0,8'%8,0%, }
    if ($2 == 4) { set %temp 15,0'%0,15%,14,15'%15,14%,10,14'%14,10%,0,10 $3- 14,10'%10,14%,15,14'%14,15%,0,15'%15,0%, }
    if ($2 == 5) { set %temp 9,0'%0,9%,3,9'%9,3%,5,3'%3,5%,0,5 $3- 3,5'%5,3%,9,3'%3,9%,0,9'%9,0%, }
  if ($2 == 6) { set %temp 9,0'%0,9%,3,9'%9,3%,5,3'%3,5%,1,5'%5,1%,0,1 $3- 5,1'%1,5%,3,5'%5,3%,9,3'%3,9%,0,9'%9,0%, }  }
  if ($1 == <>) {
    if ($2 == 1) { set %temp 13,0<0,13>6,13<13,6>2,6<6,2>1,2<2,1>0,1 $3- 2,1<1,2>6,2<2,6>13,6<6,13>0,13<13,0> }
    if ($2 == 2) { set %temp 11,0<0,11>12,11<11,12>2,12<12,2>1,2<2,1>0,1 $3- 2,1<1,2>12,2<2,12>11,12<12,11>0,11<11,0> }
    if ($2 == 3) { set %temp 8,0<0,8>4,8<8,4>5,4<4,5>1,5<5,1>0,1 $3- 5,1<1,5>4,5<5,4>8,4<4,8>0,8<8,0> }
    if ($2 == 4) { set %temp 15,0<0,15>14,15<15,14>10,14<14,10>0,10 $3- 14,10<10,14>15,14<14,15>0,15<15,0> }
    if ($2 == 5) { set %temp 9,0<0,9>3,9<9,3>5,3<3,5>0,5 $3- 3,5<5,3>9,3<3,9>0,9<9,0> }
    if ($2 == 6) { set %temp 9,0<0,9>3,9<9,3>5,3<3,5>1,5<5,1>0,1 $3- 5,1<1,5>3,5<5,3>9,3<3,9>0,9<9,0> }
  }
  if ($1 == bracket) {
    if ($2 == 1) { set %temp 13,0[0,13[6,13[13,6[2,6[6,2[1,2[2,1[0,1 $3- 2,1]1,2]6,2]2,6]13,6]6,13]0,13]13,0] }
    if ($2 == 2) { set %temp 11,0[0,11[12,11[11,12[2,12[12,2[1,2[2,1[0,1 $3- 2,1]1,2]12,2]2,12]11,12]12,11]0,11]11,0] }
    if ($2 == 3) { set %temp 8,0[0,8[4,8[8,4[5,4[4,5[1,5[5,1[0,1 $3- 5,1]1,5]4,5]5,4]8,4]4,8]0,8]8,0] }
    if ($2 == 4) { set %temp 15,0[0,15[14,15[15,14[10,14[14,10[0,10 $3- 14,10]10,14]15,14]14,15]0,15]15,0] }
    if ($2 == 5) { set %temp 9,0[0,9[3,9[9,3[5,3[3,5[0,5 $3- 3,5]5,3]9,3]3,9]0,9]9,0] }
    if ($2 == 6) { set %temp 9,0[0,9[3,9[9,3[5,3[3,5[1,5[5,1[0,1 $3- 5,1]1,5]3,5]5,3]9,3]3,9]0,9]9,0] }
  }
  return %temp
}
alias fserve_advert {
  set %fserve $2 $+ _data
  unset %temp
  set %advert.d advert_ $+ $1
  set %temp $readini -n fserve.ini [ %advert.d ] text
  set %temp $fserve_inifilter(out [ %temp ] )
  set %description $readini fserve.ini %fserve description
  set %trigger $readini fserve.ini %fserve trigger
  set %max.users $readini fserve.ini %fserve max.users
  if (%max.users == 0) { set %max.users no limit }
  set %ratio $readini fserve.ini %fserve ratio
  if (%ratio == 0) { set %ratio full leech }
  else { set %ratio 1: $+ %ratio }
  set %credits $readini fserve.ini %fserve credits
  set %file.types $readini fserve.ini %fserve file.types
  set %temp $replace(%temp,!fserve!,$left(%fserve,$calc($len(%fserve) - 5)))
  set %description $replace($fserve_inifilter(out [ %description ] ),$chr(44),$chr(255))
  set %temp $replace(%temp,!current!,$calc( [ $readini [ [ $2 ] $+ .ini ] users total ] ))
  set %temp $replace(%temp,!description!,%description)
  set %temp $replace(%temp,!trigger!,%trigger)
  set %temp $replace(%temp,!max!,%max.users)
  set %temp $replace(%temp,!ratio!,%ratio)
  set %temp $replace(%temp,!initial!,%credits)
  set %temp $replace(%temp,!file!,%file.types)
  set %temp $replace(%temp,$chr(44),$chr(255))
  set %encloser $readini fserve.ini %advert.d encloser
  if (%encloser != $null) { set %temp $encloser( [ %encloser ] [ %temp ] ) }
  set %temp $replace(%temp,$chr(255),$chr(44))
  unset %encloser %advert.d %fserve %description %trigger %max.users %ratio %credits %file.types
  return %temp
}
alias fserve_inifilter {
  set %f.temp $2-
  set %bad.chars $chr(123) $chr(124) $chr(125) $chr(91) $chr(93) $chr(22) $chr(2) $chr(31) $chr(3) $chr(15) $chr(44)
  set %convert 255
  set %f.pointer $gettok(%bad.chars,0,32)
  :dec_again
  if ($1 == out) { set %f.temp $replace(%f.temp,$chr(%convert),$gettok(%bad.chars,%f.pointer,32)) }
  if ($1 == in) { set %f.temp $replace(%f.temp,$gettok(%bad.chars,%f.pointer,32), $chr(%convert)) }
  dec %f.pointer 1
  dec %convert 1
  if (%f.pointer > 0) { goto dec_again }
  unset %f.pointer %convert %bad.chars
  return %f.temp
}
ctcp 1:version:*: { .ctcpreply $nick version $fserve_version $chr(91) $+ $gettok( [ $readini fserve.ini main servers ] ,0,32) $+ : $+ $gettok( [ $readini fserve.ini main adverts ] ,0,32) $+ $chr(93) http://nuncio.hypermart.net }
on 1:text:*:*: {
  set %fserves $readini fserve.ini main servers
  set %pointer $gettok(%fserves,0,32)
  :cont_dec
  if ($1- == [ $readini fserve.ini [ [ $gettok(%fserves,%pointer,32) ] $+ _data ] trigger ] ) {
    if ( [ $readini fserve.ini [ [ # ] $+ _channel ] fserve ] ) {
      set %triggered $readini fserve.ini [ [ # ] $+ _channel ] triggered
      inc %triggered 1
      writeini fserve.ini [ [ # ] $+ _channel ] triggered %triggered
    }
    start_fserve $fulladdress $gettok(%fserves,%pointer,32)
    goto fserve_initiated
  }
  dec %pointer 1
  if (%pointer > 0) { goto cont_dec }
  :fserve_initiated
  unset %fserves %pointer %triggered
}
alias start_fserve {
  if ($2 == $null) { halt }
  if ($findtok( [ $readini fserve.ini main servers ] ,$2,1,32) == $null) { halt }
  set %fsock fserve_ $+ $2
  if ($sock(%fsock) != $null) {
    set %port $sock(%fsock).port
  }
  else {
    :get_port
    set %port $rand(5000,9000)
    if ($portfree(%port) == $false) { goto get_port }
    socklisten %fsock %port
  }
  if ($address($1,5) != $null || $gettok($1,0,33) == 2) {
    if ($address($1,5) != $null) { set %addr $address($1,8) | set %full.address $address($1,5) }
    else { set %addr $mask($1,8) | set %full.address $1 }
    set %fullsocket %fsock $+ _ $+ $rand(a,z) $+ $rand(a,z) $+ $rand(a,z)
    set %checksocket $readini fserve.ini sockets $gettok(%full.address,2,64)
    if ($isip($gettok(%full.address,2,64)) == $false) {     
      if (%checksocket == $null) {
        writeini fserve.ini temp $gettok(%full.address,2,64) %fullsocket %addr
        .enable #fserve.dns
        .dns $gettok($1,1,33)
      }
      else {
        halt
      }
    }
    else {
      if (%checksocket == $null) {
        writeini fserve.ini sockets $gettok(%full.address,2,64) %fullsocket %addr
      }
      else {
        halt
      }
    }
    writeini fserve.ini sockets $fserve_inifilter(in [ $gettok(%full.address,1,33) ] ) $fserve_inifilter(in [ %addr ] ) $2
    .raw privmsg $gettok($1,1,33) : $+ $chr(1) $+ dcc chat chat $longip($ip) %port FSERVE $+ $chr(1)
  }
  else {
    writeini fserve.ini temp $1 $2
    .enable #userhost_lookup
    .raw userhost $1
  }
  unset %port %fsock %credits %pwd %fullsocket %checksocket
}
#userhost_lookup off
raw 302:*: {
  if ( [ $readini fserve.ini sockets [ $gettok($2,2,64) ] ] == $null) {
    start_fserve $gettok($2,1,61) $+ ! $+ $right($gettok($2,2,61),$calc($len($gettok($2,2,61)) - 1)) $readini fserve.ini temp $gettok($2,1,61)
    remini fserve.ini temp $gettok($2,1,61)
  }
  .disable #userhost_lookup
  halt
}
#userhost_lookup end
alias isip { if ($gettok($1,0,46) == 4 && $gettok($1,1,46) isnum && $gettok($1,2,46) isnum && $gettok($1,3,46) isnum && $gettok($1,4,46) isnum) { return $true } | else { return $false } }
#fserve.dns off
on 1:dns: {
  if ($raddress != $null) {
    set %check.addr $readini fserve.ini sockets $iaddress
    if (%check.addr == $null) {
      set %info $readini fserve.ini temp $naddress
      writeini fserve.ini sockets $iaddress %info
      unset %info
    }
    remini fserve.ini temp $naddress
  }
  unset %check.addr
  .disable #fserve.dns
}
#fserve.dns end
on 1:socklisten:fserve_*: {
  sockaccept temp
  set %fullsock $gettok( [ $readini fserve.ini sockets [ $sock(temp).ip ] ] ,1,32)
  set %user $gettok( [ $readini fserve.ini sockets [ $sock(temp).ip ] ] ,2,32)
  if (%fullsock != $null) {
    set %fserve $deltok($sockname,1,95)
    set %users $readini [ [ %fserve ] $+ .ini ] users total
    set %max.users $readini fserve.ini [ [ %fserve ] $+ _data ] max.users
    if (%users >= %max.users && %max.users != 0) {
      sockwrite -n temp error, maximum number of users has been reached
      sockwrite -n temp
      sockwrite -n temp all %max.users slots are filled.
      sockwrite -n temp please wait for a slot to open.
      sockclose temp
      return full
    }
    else {
      if ($sock(%fullsock) == $null) {
        set %banned $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) banned
        if (%banned == $null) {
          inc %users 1
          set %credits $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits
          set %downloads $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) downloads
          set %uploads $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) uploads
          if (%credits == $null) { set %credits $readini fserve.ini  [ [ %fserve ] $+ _data ] credits }
          if (%downloads == $null) { set %downloads 0 0 }
          if (%uploads == $null) { set %uploads 0 0 }
          set %perm.search $chr(91) $+ $fserve_inifilter(in [ %user ] ) $+ $chr(93)
          set %perm.search $read -s $+ %perm.search [ [ %fserve ] $+ .ini ]
          if (%perm.search == $null) {
            set %perm.users $readini [ [ %fserve ] $+ .ini ] perm_user_list total
            inc %perm.users 1
            writeini [ [ %fserve ] $+ .ini ] perm_user_list total %perm.users
            writeini [ [ %fserve ] $+ .ini ] perm_user_list [ u $+ [ %perm.users ] ] %user
          }
          set %pwd $readini fserve.ini [ [ %fserve ] $+ _data ] directory
          writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits %credits
          writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) pwd %pwd
          writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) downloads %downloads
          writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) uploads %uploads
          writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) ip $sock(temp).ip
          writeini [ [ %fserve ] $+ .ini ] users total %users
          writeini [ [ %fserve ] $+ .ini ] users [ u $+ [ %users ] ] $fserve_inifilter(in [ %user ] )
          writeini [ [ %fserve ] $+ .ini ] users $fserve_inifilter(in [ %user ] ) [ u $+ [ %users ] ] 0 0
          if ($window(@users) != $null) {
            set %perm.search @users 1 *f $+ $chr(91) $+ %fserve $+ $chr(93) $chr(9) $+ nick $+ $chr(91) $+ $gettok(%user,1,33) $+ $chr(93) $+ *
            set %perm.search $findline(%perm.search)
            if (%perm.search != $null) { dline @users %perm.search }
            update_user_info %user %fserve
          }
          sockrename $sock(temp) %fullsock
          unset %pwd %credits %uploads %downloads %perm.search
        }
        else {
          sockwrite -n temp error, banned
          sockwrite -n temp
          sockwrite -n temp you have been banned from this fserve.
          sockwrite -n temp for more information, speak to the fserve
          sockwrite -n temp admin.
          sockclose temp
          return banned
        }
      }
      else {
        sockwrite -n temp error, multiple connections detected
        sockwrite -n temp
        sockwrite -n temp please connect only once to only one fserve
        sockclose temp
        return multiple connections
      }
    }
  }
  else {
    sockwrite -n temp error, DNS/nick lookup failed
    sockwrite -n temp
    sockwrite -n temp the fserve could not resolve an IP address for your hostname
    sockwrite -n temp or your connection was unauthorized.
    sockwrite -n temp
    sockwrite -n temp if you're certain your hostname will resolve and that your
    sockwrite -n temp access to this fserve is authorized, please try connecting
    sockwrite -n temp again in a few seconds.
    sockclose temp
    return no DNS/nick entry
  }
  set %fserve $right($sockname,$calc($len($sockname) - 7))
  set %fserve.d %fserve $+ _data
  echo $colour(info) -s *** $gettok($gettok( [ $readini fserve.ini sockets [ $sock(%fullsock).ip ] ] ,2,32),1,33) connected to fserve %fserve
  sockwrite -n %fullsock $fserve_version http://nuncio.hypermart.net
  sockwrite -n %fullsock
  sockwrite -n %fullsock accepted file types[ $+ $readini fserve.ini [ %fserve.d ] file.types $+ $chr(93)
  sockwrite -n %fullsock
  sockwrite -n %fullsock %fserve - $fserve_inifilter(out [ $readini fserve.ini [ %fserve.d ] description ] )
  set %user $gettok( [ $readini fserve.ini sockets [ $sock(%fullsock).ip ] ] ,2,32)
  set %time.out $readini fserve.ini [ [ %fserve ] $+ _data ] time.out
  set %user.timer1 $gettok(%user,1,33) $+ _timer1
  set %user.timer2 $gettok(%user,1,33) $+ _timer2
  .timer [ $+ [ %user.timer1 ] ] 1 %time.out if $chr(40) $+ $chr(36) $+ sock( [ $+ [ %fullsock ] ] $+ $chr(41) $+ $chr(41) $chr(123) sockwrite -n %fullsock *** idle connection closed after $duration(%time.out) inactivity $chr(125) $chr(124) close_fserve %fullsock manual
  if (%time.out > 30) { .timer [ $+ [ %user.timer2 ] ] 1 $calc( [ %time.out ] - 30) if $chr(40) $+ $chr(36) $+ sock( [ $+ [ %fullsock ] ] $+ $chr(41) $+ $chr(41) $chr(123) sockwrite -n %fullsock $chr(124) sockwrite -n %fullsock *** closing idle connection in 30 seconds $chr(125) }
  unset %user.timer1 %user.timer2 %time.out
  set %perm.search $readini fserve.ini %fserve.d greet
  if (%perm.search) { send_file_to_sock %fullsock %perm.search }
  else { sockmark %fullsock ready }
  unset %users %max.users %fserve %perm.search %banned %fserve.d %user
}
alias send_file_to_sock {
  if ($exists($2-) == $true && $sock($1) != $null) {
    sockmark $1 streaming.text 1 $2-
    set %file $2-
    .timer [ $+ [ [ $1 ] $+ .stream ] ] -m $lines(%file) 1 if ($gettok($sock( $+ $1 $+ ).mark,1,32) == streaming.text) $chr(123) set $chr(37) $+ info $chr(36) $+ sock( $+ $1 $+ ).mark $chr(124) set $chr(37) $+ line $chr(36) $+ gettok(%info,2,32) $chr(124) set $chr(37) $+ file $chr(36) $+ gettok(%info,3-,32) $chr(124) set $chr(37) $+ line $chr(36) $+ gettok(%info,2,32) $chr(124) sockwrite -n $1 $chr(36) $+ read -nl $chr(36) $+ + $chr(37) $+ line $chr(37) $+ file $chr(124) inc $chr(37) $+ line 1 $chr(124) sockmark $1 streaming.text $chr(37) $+ line $chr(37) $+ file $chr(124) unset $chr(37) $+ info $chr(37) $+ line $chr(37) $+ file $chr(125)
    .timer [ $+ [ [ $1 ] $+ .streamstop ] ] -m 0 1 if ($gettok($sock( $+ $1 $+ ).mark,2,32) == $calc($lines(%file) + 1) $+ $chr(41) $chr(123) sockmark $1 ready $chr(124) .timer [ $+ [ $1 ] $+ .streamstop ] off $chr(125)
  }
  else { sockmark $1 ready }
  unset %line %file
}
alias send_user_credits {
  set %fserve $deltok($deltok($sockname,$gettok($1,0,95),95),1,95)
  set %user $gettok( [ $readini fserve.ini sockets [ $sock($1).ip ] ] ,2,32)
  sockwrite -n $1
  sockwrite -n $1 credits[ $+ $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits $+ $chr(93)
}
alias send_dir_to_sock {
  set %mark $sock($1).mark
  set %mode $gettok(%mark,2,32)
  set %pointer $gettok(%mark,3,32)
  set %fserve $gettok(%mark,4,32)
  set %spec $gettok(%mark,5,32)
  set %dir $gettok(%mark,6-,32)
  :list_files
  if (%mode == files) {
    inc %pointer 1
    set %file $findfile(%dir,%spec,%pointer)
    if (%file != $null && $nopath(%file) == $remove(%file,%dir)) {
      set %sizes b kb mb gb tb
      set %spointer 1
      set %file.size $lof(%file)
      :dec_again
      if (%file.size > 1024) { set %file.size $calc(%file.size / 1024) | inc %spointer 1 | if (%spointer < 6) { goto dec_again } }
      set %file.size $calc($int($calc(%file.size * 10))/10) $+ $gettok(%sizes,%spointer,32)
      set %comments out $readini [ [ %fserve ] $+ .ini ] comments $replace(%file,$chr(32),$chr(95))
      set %comments $fserve_inifilter(%comments)
      .timer -m 1 1 sockwrite -n $1  $+ $nopath(%file) $str($chr(160),$calc(30 - ($len($nopath(%file)) + $len(%file.size)))) %file.size %comments
    }
    else {
      sockwrite -n $1 $chr(91) $+ $calc(%pointer - 1) $+ $chr(93) matching files
      sockmark $1 ready
      goto dir_complete
    }
  }
  if (%mode == dirs) {
    inc %pointer 1
    set %full.dir $readini fserve.ini [ [ %fserve ] $+ _data ] directory
    set %subdir.h subdir_ $+ $gettok($remove(%dir,%full.dir),1-,92)
    set %subdir $readini [ [ %fserve ] $+ .ini ] %subdir.h [ subdir $+ [ %pointer ] ]
    if (%subdir != $null) { .timer -m 1 1 sockwrite -n $1 DIR[ $+ %subdir $+ $chr(93) }
    else {
      set %mode files
      if (%pointer > 1) { set %pointer 0 | sockwrite -n $1 }
      else { set %pointer 0 | goto list_files }
    }
  }
  set %mark dir %mode %pointer %fserve %spec %dir
  sockmark $1 %mark
  :dir_complete
  unset %mark %file %pointer %fserve %dir %spec %subdir %subdir.h %full.dir %mode %file.size %sizes %spointer %comments
}
on 1:sockwrite:fserve_*: {
  if ($sock($sockname).mark != $null) {
    set %mark $sock($sockname).mark
    if ($gettok(%mark,1,32) == textfile) { send_file_to_sock $sockname }
    if ($gettok(%mark,1,32) == dir) { send_dir_to_sock $sockname }
    unset %mark
  }
}
on 1:sockclose:fserve_*: { close_fserve $sockname automatic }
alias close_fserve {
  set %fserve $deltok($deltok($1,$gettok($1,0,95),95),1,95)
  set %user $gettok( [ $readini fserve.ini sockets [ $sock($1).ip ] ] ,2,32)
  if ($sock($1)) { echo $colour(info) -s *** $gettok(%user,1,33) disconnected from fserve %fserve }
  if ($2 == manual) { sockclose $1 }
  set %userid $readini [ [ %fserve ] $+ .ini ] users $fserve_inifilter(in [ %user ] )
  set %userid $gettok($gettok(%userid,1,32),1,117)
  remini [ [ %fserve ] $+ .ini ] users $fserve_inifilter(in [ %user ] )
  remini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) admin
  remini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) pwd
  remini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) ip
  set %users $readini [ [ %fserve ] $+ .ini ] users total
  set %pointer %userid
  :move_more_users
  set %n.user u $+ $calc(%pointer + 1)
  set %n.user $readini [ [ %fserve ] $+ .ini ] users %n.user
  set %n.user.info $readini [ [ %fserve ] $+ .ini ] users %n.user
  set %n.user.info u $+ %pointer $gettok(%n.user,2-,32)
  if (%n.user != $null) {
    writeini [ [ %fserve ] $+ .ini ] users [ u $+ [ %pointer ] ] %n.user
    writeini [ [ %fserve ] $+ .ini ] users %n.user %n.user.info
    inc %pointer 1
    goto move_more_users
  }
  dec %users 1
  set %f.serve %fserve
  writeini [ [ %fserve ] $+ .ini ] users total %users
  remini [ [ %fserve ] $+ .ini ] users [ u $+ [ %pointer ] ]
  if ($window(@users) != $null) {
    set %userid @users 1 *f $+ $chr(91) $+ %fserve $+ $chr(93) $chr(9) $+ nick $+ $chr(91) $+ $gettok(%user,1,33) $+ $chr(93) $+ *
    set %userid $findline(%userid)
    if (%userid != $null) { dline @users %userid }
    update_user_info %user %fserve
  }
  set %pointer $chan(0)
  :continue_chan_scan
  if (%pointer < 1) { goto chan_scan_complete }
    set %ch.fserve $readini fserve.ini [ [ $chan(%pointer) ] $+ _channel ] fserve
    if (%ch.fserve == %f.serve) {
      set %slotfree $readini fserve.ini [ [ $chan(%pointer) ] $+ _channel ] slotfree
      set %ch.fserve %slotfree %f.serve
      if (%slotfree) { msg $chan(%pointer) $fserve_advert(%ch.fserve) }
    }
  dec %pointer 1
  goto continue_chan_scan
  :chan_scan_complete
  unset %users %fserve %user %userid %n.user %pointer %f.serve %ch.fserve %n.user.info
}
on 1:sockread:fserve_*: {
  if ($sockerr > 0) { return }
  set %fserve $deltok($deltok($sockname,$gettok($sockname,0,95),95),1,95)
  set %user $gettok( [ $readini fserve.ini sockets [ $sock($sockname).ip ] ] ,2,32)
  set %admin $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) admin
  set %win @monitor_ $+ %user
  sockread %command
  if (%command != $null) { post_fserve_command %fserve %user %command }
  if ($sock($sockname).mark == ready) {
    set %pwd $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) pwd
    set %full.dir $readini fserve.ini [ [ %fserve ] $+ _data ] directory
    if ($gettok(%command,1,32) ==  dir/ls) { sockwrite -n $sockname | sockwrite -n $sockname please use dir or ls, not dir/ls | set %command ? dir }
    if ($gettok(%command,1,32) == ? || $gettok(%command,1,32) == help) {
      sockwrite -n $sockname
      if ($gettok(%command,2,32) == $null) {
        sockwrite -n $sockname directory commands   [pwd dir/ls cd]
        sockwrite -n $sockname fserve info          [credits ratio]
        sockwrite -n $sockname transfer             [get read]
        sockwrite -n $sockname miscellaneous        [info say ?/help quit]
        sockwrite -n $sockname assume admin status   [admin]
      }
      if (%admin == true) {
        if ($gettok(%command,2,32) == $null) {
          sockwrite -n $sockname - admin commands -
          sockwrite -n $sockname file info            [comment reset]
          sockwrite -n $sockname file control         [delete rename]
          sockwrite -n $sockname user control         [who kill timedkill ban unban]
          sockwrite -n $sockname credit control       [give take set]
        }
        if ($gettok(%command,2,32) == comment) { sockwrite -n $sockname [comment <v1> <v2->] set comments for file <v1> (required) to <v2-> (optional) | sockwrite -n $sockname if <v2-> is omitted, current comments are removed }
        if ($gettok(%command,2,32) == reset) { sockwrite -n $sockname [reset <v1>] reset all download statistics for file <v1> (required) }
        if ($gettok(%command,2,32) == delete) { sockwrite -n $sockname [delete <v1>] delete file <v1> (required) }
        if ($gettok(%command,2,32) == rename) { sockwrite -n $sockname [rename <v1> <v2>] rename file <v1> (required) <v2> (required) }
        if ($gettok(%command,2,32) == who) { sockwrite -n $sockname [who] list on-line fserve[ $+ %fserve $+ $chr(93) users }
        if ($gettok(%command,2,32) == kill) { sockwrite -n $sockname [kill <v1> <v2->] kill user <v1> (required) on fserve[ $+ %fserve $+ $chr(93) for reason <v2> (optional) }
        if ($gettok(%command,2,32) == timedkill) { sockwrite -n $sockname [timedkill <v1> <v2> <v3->] kill user <v1> (required) on fserve[ $+ %fserve $+ $chr(93) after <v2> (required) seconds for reason <v3-> (optional) }
        if ($gettok(%command,2,32) == ban) { sockwrite -n $sockname [ban <v1>] ban user <v1> (required) from fserve[ $+ %fserve $+ $chr(93) }
        if ($gettok(%command,2,32) == unban) { sockwrite -n $sockname [unban <v1>] unban user <v1> (required) from fserve[ $+ %fserve $+ $chr(93) }
        if ($gettok(%command,2,32) == give) { sockwrite -n $sockname [give <v1> <v2>] give <v2> (required) credits to user <v1> (required) }
        if ($gettok(%command,2,32) == take) { sockwrite -n $sockname [take <v1> <v2>] take <v2> (required) credits from user <v1> (required) }
        if ($gettok(%command,2,32) == set) { sockwrite -n $sockname [set <v1> <v2>] set user <v1>'s (required) credits to <v2> (required) }
      }
      if ($gettok(%command,2,32) == pwd) { sockwrite -n $sockname [pwd] displays the present working directory }
      if ($gettok(%command,2,32) == dir || $gettok(%command,2,32) == ls || $gettok(%command,2,32) == dir/ls) { sockwrite -n $sockname [dir/ls <v1>] list files in pwd matching <v1> (optional) | sockwrite -n $sockname <v1> can contain wildcard characters * and ? | sockwrite -n $sockname a dir/ls dirs will list only directories }
      if ($gettok(%command,2,32) == cd) { sockwrite -n $sockname [cd <v1>] change directory <v1> (required) | sockwrite -n $sockname you may change to a directory listed in a dir/ls | sockwrite -n $sockname -or- | sockwrite -n $sockname .. one directory down | sockwrite -n $sockname \ root fserve directory }
      if ($gettok(%command,2,32) == credits) { sockwrite -n $sockname [credits] displays the number of credits (bytes) you have available to download }
      if ($gettok(%command,2,32) == ratio) { sockwrite -n $sockname [ratio] displays the current upload bytes:credit ratio for the fserve | sockwrite -n $sockname if the ratio is full leech, no credits are given for file upload or taken for file download }
      if ($gettok(%command,2,32) == get) { sockwrite -n $sockname [get <v1>] get file <v1> (required) | sockwrite -n $sockname you must have sufficient credits to obtain this file | sockwrite -n $sockname to find out how many credits a file requires, use the [info] command }
      if ($gettok(%command,2,32) == read) { sockwrite -n $sockname [read <v1>] sends a text file <v1> (required) directly to your terminal. | sockwrite -n $sockname no credits are required to use this function. }
      if ($gettok(%command,2,32) == info) { sockwrite -n $sockname [info <v1>] displays information about file <v1> (options) | sockwrite -n $sockname included are size (credits required) and comments placed by fserve admin. | sockwrite -n $sockname If filename is omitted, accepted file types are displayed. }
      if ($gettok(%command,2,32) == say) { sockwrite -n $sockname [say <v1->] send message <v1-> (required) to all fserve[ $+ %fserve $+ $chr(93) users }
      if ($gettok(%command,2,32) == ? || $gettok(%command,2,32) == help || $gettok(%command,2,32) == ?/help) { sockwrite -n $sockname [?/help <v1>] online fserve help for topic <v1> (optional) }
      if ($gettok(%command,2,32) == quit) { sockwrite -n $sockname [quit] close fserve link }
      if ($gettok(%command,2,32) == admin) { sockwrite -n $sockname [admin <v1>] assume admin status with password <v1> (required) | sockwrite -n $sockname if password is incorrect, link will be closed. }
    }
    if ($gettok(%command,1,32) == quit) { close_fserve $sockname manual }
    if ($gettok(%command,1,32) == admin) {
      if ($gettok(%command,2,32) != $null) {
        if ($gettok(%command,2-,32) === [ $readini fserve.ini [ [ %fserve ] $+ _data ] password ] ) {
          sockwrite -n $sockname
          sockwrite -n $sockname [password verified] admin
          writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) admin true
          if ($window(%win) != $null) { update_user_info %user %fserve }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [password incorrect] closing link
          close_fserve $sockname manual
        }
      }
      else {
        if (%admin == true) {
          sockwrite -n $sockname
          sockwrite -n $sockname admin status[removed]
          remini [ [ %fserve ] $+ .ini ] %user admin
          if ($window(%win) != $null) { update_user_info %user %fserve }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname error: [no password given]
          sockwrite -n $sockname warning: if password is incorrect , link will close
        }
      }
    }
    if ($gettok(%command,1,32) == read) {
      if ($gettok(%command,2,32) != $null) {
        set %file %pwd $+ $nopath($gettok(%command,2-,32))
        if ($exists(%file) == $true) {
          if ($right(%file,4) == .txt) {
            sockwrite -n $sockname
            sockwrite -n $sockname reading[ $+ $nopath(%file) $+ $chr(93)
            send_file_to_sock $sockname %file
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname invalid extension[ $+ $nopath(%file) $+ $chr(93)
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname no such file[ $+ $nopath(%file) $+ $chr(93)
        }
        unset %file
      }
      else {
        sockwrite -n $sockname
        sockwrite -n $sockname [read <v1>] insufficient parameters
      }
    }
    if ($gettok(%command,1,32) == info) {
      if ($gettok(%command,2,32) != $null) {
        set %file %pwd $+ $nopath($gettok(%command,2-,32))
        if ($exists(%file) == $true) {
          sockwrite -n $sockname
          sockwrite -n $sockname file[ $+ $nopath(%file) $+ $chr(93) bytes[ $+ $lof(%file) $+ $chr(93)
          set %comments out $readini [ [ %fserve ] $+ .ini ] comments $replace(%file,$chr(32),$chr(95))
          if (%comments != $null) { sockwrite -n $sockname comments : $fserve_inifilter(%comments) }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname no such files[ $+ $nopath(%file) $+ $chr(93)
        }
        unset %file %comments
      }
      else {
        sockwrite -n $sockname
        sockwrite -n $sockname accepted file types[ $+ $readini fserve.ini [ [ %fserve ] $+ _data ] file.types $+ $chr(93)
      }
    }
    if (%command == credits) { send_user_credits $sockname }
    if (%command == ratio) { sockwrite -n $sockname | set %ratio $readini fserve.ini [ [ %fserve ] $+ _data ] ratio | if (%ratio == 0) { set %ratio full leech } | else { set %ratio [1: $+ %ratio $+ $chr(93) } | sockwrite -n $sockname ratio %ratio | unset %ratio }
    if ($gettok(%command,1,32) == dir || $gettok(%command,1,32) == ls) {
      set %spec $gettok(%command,2,32)
      if (%spec == $null) { set %spec * }
      sockmark $sockname dir dirs 0 %fserve %spec %pwd
      sockwrite -n $sockname
    }
    if ($gettok(%command,1,32) == say) {
      if ($gettok(%command,2,32)) {
        set %pointer $readini [ [ %fserve ] $+ .ini ] users total
        :continue_internal_user_scan
        if (%pointer < 1) { goto internal_user_scan_complete }
        set %msg.user $readini [ [ %fserve ] $+ .ini ] users [ u $+ [ %pointer ] ]
        set %msg.user $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %msg.user ] ) ip
        set %msg.user $readini fserve.ini sockets %msg.user
        set %msg.user $gettok(%msg.user,1,32)
        set %status :USER
        if (%admin == true) { set %status :rADMIN }
        if ($sock(%msg.user)) { sockwrite -n %msg.user < $+ $gettok(%user,1,33) $+ %status $+ > $gettok(%command,2-,32) }
        dec %pointer 1
        goto continue_internal_user_scan
        :internal_user_scan_complete
        unset %msg.user %status %pointer
      }
      else {
        sockwrite -n $sockname
        sockwrite -n $sockname [say <v1->] insufficient parameters
      }
    }
    ; crappy DOS command emulation
    if (%command == cd..) { set %command cd .. }
    if (%command == cd\) { set %command cd \ }
    if ($gettok(%command,1,32) == cd) {
      if ($gettok(%command,2,32) != $null) {
        set %full.dir $readini fserve.ini [ [ %fserve ] $+ _data ] directory
        if ($gettok(%command,2-,32) == \) { set %pwd %full.dir | goto got_dir }
        if ($gettok(%command,2-,32) == ..) {
          set %temp $deltok(%pwd,$gettok(%pwd,0,92),92) $+ \
          if ($len(%temp) >= $len(%full.dir)) { set %pwd %temp }
          goto got_dir
        }
        set %fserve.d %fserve $+ .ini
        set %pointer 1
        :check_dirs
        set %subdir subdir $+ %pointer
        set %sub.d $readini %fserve.d [ subdir_ $+ [ $gettok($remove(%pwd,%full.dir),1-,92) ] ] %subdir
        if (%sub.d == $gettok(%command,2-,32)) { set %pwd %pwd $+ $gettok(%command,2-,32) $+ \ | goto got_dir }
        if (%sub.d != $null) { inc %pointer 1 | goto check_dirs }
        :got_dir
        writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) pwd %pwd
        unset %subdir %pointer %temp
        set %command pwd
      }
      else {
        sockwrite -n $sockname
        sockwrite -n $sockname [cd <v1>] insufficient parameters
      }
    }
    if (%command == pwd) {
      sockwrite -n $sockname
      sockwrite -n $sockname pwd[\ $+ $remove(%pwd, [ $readini fserve.ini [ [ %fserve ] $+ _data ] directory ] ) $+ $chr(93)
    }
    if ($gettok(%command,1,32) == get) {
      if ($gettok(%command,2,32) != $null) {
        set %ratio $readini fserve.ini [ [ %fserve ] $+ _data ] ratio
        set %pointer 1
        set %sends $fserve_sends($gettok(%user,1,33))
        set %max.sends $readini fserve.ini [ [ %fserve ] $+ _data ] max.gets
        set %credits $readini [ [ %fserve ] $+ .ini ] %user credits
        unset %reason
        sockwrite -n $sockname
        :send.next.file
        set %file $findfile(%pwd,$gettok(%command,2-,32),%pointer)
        if ($chr(92) isin $remove(%file,%pwd) || %file == $null) { goto wildcard.get.complete }
        if (%sends => %max.sends) { set %reason too many sends specified | goto wildcard.get.complete }
        if (%ratio != 0) { dec %credits $lof(%file) }
        if (%credits < 0 && %ratio != 0) { set %reason insufficient credits for all matching files | inc %credits $lof(%file) | goto wildcard.get.complete }
        .dcc send $gettok(%user,1,33) $chr(34) $+ %file $+ $chr(34)
        log_file_send %file
        inc %sends 1
        if (%ratio == 0) { sockwrite -n $sockname $chr(91) $+ %pointer $+ $chr(93) $remove(%file,%pwd) }
        else { sockwrite -n $sockname $chr(91) $+ %pointer $+ $chr(93) $remove(%file,%pwd) credits[ $+ %credits $+ $chr(93) }
        inc %pointer 1
        goto send.next.file
        :wildcard.get.complete
        if (%ratio != 0) { writeini [ [ %fserve ] $+ .ini ] %user credits %credits }
        dec %pointer 1
        if (%reason == $null && %pointer == 0) { set %reason no matching file(s) }
        if (%reason == $null) { set %reason one moment }
        sockwrite -n $sockname sending[ $+ %pointer $+ $chr(93) file(s) $chr(91) $+ %reason $+ $chr(93)
        unset %pointer %sends %max.sends
        .timer -m 1 1 update_user_info %user %fserve
      }
      else {
        sockwrite -n $sockname
        sockwrite -n $sockname [get <v1>] insufficient parameters
      }
    }
    if (%admin == true) {
      set %target.user $gettok(%command,2,32)
      if (%target.user isnum) { set %target.user $readini [ [ %fserve ] $+ .ini ] users [ u $+ [ %target.user ] ] }
      elseif ($gettok(%target.user,0,64) == 1) { set %target.user $gettok( [ $readini fserve.ini sockets [ %target.user ] ] ,1,32) }
      set %target.user $fserve_inifilter(in [ %target.user ] )
      set %target.socket $readini [ [ %fserve ] $+ .ini ] %target.user ip
      if (%target.socket) {
        set %target.socket $readini fserve.ini sockets %target.socket
        set %target.socket $gettok(%target.socket,1,32)
      }
      if ($gettok(%command,1,32) == comment || $gettok(%command,1,32) == comments) {
        if ($gettok(%command,2,32) != $null) {
          set %file %pwd $+ $nopath($gettok(%command,2,32))
          if ($exists(%file) == $true) {
            if ($gettok(%command,3,32) != $null) {
              sockwrite -n $sockname
              sockwrite -n $sockname set comments for file[ $+ $nopath(%file) $+ $chr(93) to $gettok(%command,3-,32)
              set %comments $replace($gettok(%command,3-,32),$chr(44),$chr(255))
              writeini [ [ %fserve ] $+ .ini ] comments $replace(%file,$chr(32),$chr(95)) $fserve_inifilter(in [ %comments ] )
            }
            else {
              remini [ [ %fserve ] $+ .ini ] comments $replace(%file,$chr(32),$chr(95))
              sockwrite -n $sockname
              sockwrite -n $sockname comments for file[ $+ $nopath(%file) $+ $chr(93) deleted
            }
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname no such file[ $+ $nopath(%file) $+ $chr(93)
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [comment <v1>] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == reset) {
        if ($gettok(%command,2,32) != $null) {
          set %file %pwd $+ $nopath($gettok(%command,2-,32))
          if ($exists(%file) == $true) {
            remini [ [ %fserve ] $+ .ini ] downloads $replace(%file,$chr(32),$chr(255))
            sockwrite -n $sockname
            sockwrite -n $sockname reset file[ $+ $nopath(%file) $+ $chr(93)
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname no such file[ $+ $nopath(%file) $+ $chr(93)
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [reset <v1>] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == delete) {
        if ($gettok(%command,2,32)) {
          set %file %pwd $+ $nopath($gettok(%command,2-,32))
          if ($exists(%file) == $true) {
            .remove %file
            if ($exists(%file) == $false) {
              sockwrite -n $sockname
              sockwrite -n $sockname deleted file[ $+ $nopath(%file) $+ $chr(93)
            }
            else {
              sockwrite -n $sockname
              sockwrite -n $sockname unable to delete file[ $+ $nopath(%file) $+ $chr(93)
            }
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname no such file[ $+ $nopath(%file) $+ $chr(93)
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [delete <v1>] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == rename) {
        if ($gettok(%command,3,32)) {
          set %file1 %pwd $+ $nopath($gettok(%command,2,32))
          set %file2 %pwd $+ $nopath($gettok(%command,3,32))
          if ($exists(%file1) == $true) {
            if ($exists(%file2) == $false) {
              .rename $chr(34) $+ %file1 $+ $chr(34) $chr(34) $+ %file2 $+ $chr(34)
              if ($exists(%file1) == $false && $exists(%file2) == $true) {
                sockwrite -n $sockname
                sockwrite -n $sockname renamed $chr(91) $+ $nopath(%file1) $+ $chr(93) to $chr(91) $+ %file2 $+ $chr(93)
              }
              else {
                sockwrite -n $sockname
                sockwrite -n $sockname rename of $chr(91) $+ $nopath(%file1) $+ $chr(93) to $chr(91) $+ %file2 $+ $chr(93) failed
              }
            }
            else {
              sockwrite -n $sockname
              sockwrite -n $sockname conflicting file[ $+ $nopath(%file2) $+ $chr(93)
            }
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname no such file[ $+ $nopath(%file) $+ $chr(93)
          }
          unset %file1 %file2
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [rename <v1> <v2>] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == who) {
        sockwrite -n $sockname
        sockwrite -n $sockname listing users fseve[ $+ %fserve $+ $chr(93)
        set %pointer 1
        set %total $readini [ [ %fserve ] $+ .ini ] users total
        :continue_internal_user_scan
        if (%pointer > %total) { goto internal_user_scan_complete }
        set %msg.user $readini [ [ %fserve ] $+ .ini ] users [ u $+ [ %pointer ] ]
        sockwrite -n $sockname $chr(91) $+ %pointer $+ $chr(93) $gettok(%user,1,33) : %user
        inc %pointer 1
        goto continue_internal_user_scan
        :internal_user_scan_complete
        sockwrite -n $sockname users fserve[ $+ %fserve $+ $chr(93) complete
        unset %msg.user %pointer %total
      }
      if ($gettok(%command,1,32) == kill) {
        if ($gettok(%command,2,32)) {
          if (%target.socket) {
            if ($gettok(%command,3,32)) { set %reason $chr(40) $+ $gettok(%command,3-,32) $+ $chr(41) }
            else { unset %reason }
            sockwrite -n %target.socket *** fserve kill by rADMIN %reason
            close_fserve %target.socket manual
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname *** no valid user specified
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [kill <v1> <v2->] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == timedkill) {
        if ($gettok(%command,3,32)) {
          if (%target.socket) {
            if ($gettok(%command,3,32) isnum) {
              if ($gettok(%command,4-,32)) { set %reason $chr(40) $+ $gettok(%command,4-,32) $+ $chr(41) }
              else { unset %reason }
              sockwrite -n %target.socket *** fserve closing in $duration($gettok(%command,3,32)) %reason
              .timer 1 $gettok(%command,3,32) if ( $+ $chr(36) $+ sock( [ $+ [ %target.socket ] ] $+ )) $chr(123) sockwrite -n %target.socket *** timed kill $chr(124) close_fserve %target.socket manual $chr(125)
            }
            else {
              sockwrite -n $sockname
              sockwrite -n $sockname <v2> is not a valid time value
            }
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname *** no valid user specified
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [timedkill <v1> <v2->] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == ban) {
        if ($gettok(%command,2,32)) {
          if (%target.socket) {
            writeini [ [ %fserve ] $+ .ini ] %target.user banned banned
            sockwrite -n $sockname
            sockwrite -n $sockname banned user[ $+ %target.user $+ $chr(93) from fserve[ $+ %fserve $+ $chr(93)
            update_user_info %target.user %fserve
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname *** no valid user specified
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [ban <v1>] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == unban) {
        if ($gettok(%command,2,32)) {
          if (%target.socket) {
            remini [ [ %fserve ] $+ .ini ] %target.user banned
            sockwrite -n $sockname
            sockwrite -n $sockname unbanned user[ $+ %target.user $+ $chr(93) from fserve[ $+ %fserve $+ $chr(93)
            update_user_info %target.user %fserve
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname *** no valid user specified
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [unban <v1>] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == give) {
        if ($gettok(%command,3,32) != $null) {
          if (%target.socket) {
            if ($gettok(%command,3,32) isnum) {
              set %credits $readini [ [ %fserve ] $+ .ini ] %target.user credits
              inc %credits $gettok(%command,3,32)
              writeini [ [ %fserve ] $+ .ini ] %target.user credits %credits
              sockwrite -n $sockname
              sockwrite -n $sockname *** added $gettok(%command,3,32) credit(s) to $gettok(%target.user,1,33) $+ 's total $chr(91) $+ %credits $+ $chr(93)
            }
            else {
              sockwrite -n $sockname
              sockwrite -n $sockname *** invalid credit increment
            }
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname *** no valid user specified
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [give <v1> <v2>] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == take) {
        if ($gettok(%command,3,32) != $null) {
          if (%target.socket) {
            if ($gettok(%command,3,32) isnum) {
              set %credits $readini [ [ %fserve ] $+ .ini ] %target.user credits
              dec %credits $gettok(%command,3,32)
              writeini [ [ %fserve ] $+ .ini ] %target.user credits %credits
              sockwrite -n $sockname
              sockwrite -n $sockname *** took $gettok(%command,3,32) credit(s) from $gettok(%target.user,1,33) $+ 's total $chr(91) $+ %credits $+ $chr(93)
            }
            else {
              sockwrite -n $sockname
              sockwrite -n $sockname *** invalid credit decrement
            }
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname *** no valid user specified
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [take <v1> <v2>] insufficient parameters
        }
      }
      if ($gettok(%command,1,32) == set) {
        if ($gettok(%command,3,32) != $null) {
          if (%target.socket) {
            if ($gettok(%command,3,32) isnum) {
              writeini [ [ %fserve ] $+ .ini ] %target.user credits $gettok(%command,3,32)
              sockwrite -n $sockname
              sockwrite -n $sockname *** set $gettok(%target.user,1,33) $+ 's credit total to $chr(91) $+ $gettok(%command,3,32) $+ $chr(93)
            }
            else {
              sockwrite -n $sockname
              sockwrite -n $sockname *** invalid credit total
            }
          }
          else {
            sockwrite -n $sockname
            sockwrite -n $sockname *** no valid user specified
          }
        }
        else {
          sockwrite -n $sockname
          sockwrite -n $sockname [set <v1> <v2>] insufficient parameters
        }
      }
      unset %target.user %target.socket
    }
  }
  else {
    sockmark $sockname ready
    .timer -m 1 200 sockwrite -n $sockname transfer interrupted
    .timer -m 1 150 sockwrite -n $sockname
  }
  if (%command != $null) {
    set %time.out $readini fserve.ini [ [ %fserve ] $+ _data ] time.out
    set %user.timer1 $gettok(%user,1,33) $+ _timer1
    set %user.timer2 $gettok(%user,1,33) $+ _timer2
    .timer [ $+ [ %user.timer1 ] ] 1 %time.out if $chr(40) $+ $chr(36) $+ sock( [ $+ [ %fullsock ] ] $+ $chr(41) $+ $chr(41) $chr(123) sockwrite -n %fullsock *** idle connection closed after $duration(%time.out) inactivity $chr(125) $chr(124) close_fserve %fullsock manual
    if (%time.out > 30) { .timer [ $+ [ %user.timer2 ] ] 1 $calc( [ %time.out ] - 30) if $chr(40) $+ $chr(36) $+ sock( [ $+ [ %fullsock ] ] $+ $chr(41) $+ $chr(41) $chr(123) sockwrite -n %fullsock $chr(124) sockwrite -n %fullsock *** closing idle connection in 30 seconds $chr(125) }
    unset %user.timer1 %user.timer2 %time.out
  }
  unset %fserve %command %user %pwd %full.dir %admin %win %file %credits
}
alias log_file_send { }
alias post_fserve_command { if ($window( [ @monitor_ $+ [ $2 ] ] ) != $null) { echo [ @monitor_ $+ [ $2 ] ] > $3- } }
alias files_window {
  window -l20 @statistics @statistics
  clear -l @statistics
  aline -l $colour(high) @statistics [top files]
  aline -l $colour(high) @statistics [top uploaders]
  aline -l $colour(high) @statistics [top downloaders]
  aline -l $colour(high) @statistics [top channels]
  aline -l $colour(list) @statistics -
  aline -l $colour(info) @statistics [x] total
  set %fserves $readini fserve.ini main servers
  set %pointer $gettok(%fserves,0,32)
  :continue_fserve_list
  if (%pointer < 1) { goto fserve_list_complete }
  aline -l $colour(high) @statistics [ ] f[ $+ $gettok(%fserves,%pointer,32) $+ $chr(93)
  dec %pointer 1
  goto continue_fserve_list
  :fserve_list_complete
}
menu @statistics {
  dclick {
    if ($gettok($sline($active,1),2,32) == files]) { top_files }
    if ($gettok($sline($active,1),2,32) == uploaders]) { top_uploaders }
    if ($gettok($sline($active,1),2,32) == downloaders]) { top_downloaders }
    if ($gettok($sline($active,1),2,32) == channels]) { top_channels }
    if ($gettok($sline($active,1),1,32) == [ ]) {
      set %search.line $findline(@statistics -l 1 [x]*)
      set %text $gettok($line(@statistics,%search.line,1),2,32)
      set %search.line2 $sline(@statistics,1).ln
      set %text2 $gettok($sline(@statistics,1),2,32)
      dline -l @statistics %search.line
      iline -l $colour(high) @statistics %search.line [ ] %text
      dline -l @statistics %search.line2
      iline -l $colour(info) @statistics %search.line2 [x] %text2
      unset %search.line %search.line2 %text %text2
    }
  }
}
alias top_files {
  clear @statistics | unset %fserve
  if ($findline(@statistics -l 1 [x]*) > 6) {
    set %fserve $line(@statistics,$findline(@statistics -l 1 [x]*),1)
    set %fserve $left(%fserve,$calc($len(%fserve) - 1))
    set %fserve $right(%fserve,$calc($len(%fserve) - 6))
  }
  if (%fserve != $null) { aline $colour(info2) @statistics top files fserve[ $+ %fserve $+ $chr(93) | set %fserves %fserve }
  else { aline $colour(info2) @statistics top files | set %fserves $readini fserve.ini main servers | set %total true }
  set %f.pointer $gettok(%fserves,0,32)
  :continue_fserve_scan
  if (%f.pointer < 1) { goto fserve_scan_complete }
  set %fserve $gettok(%fserves,%f.pointer,32)
  set %lines $lines( [ [ %fserve ] $+ .ini ] )
  set %pointer 1
  :read_next_line
  set %line $read -nl $+ %pointer [ [ %fserve ] $+ .ini ]
  if (%line == [downloads]) { set %start_line %pointer | inc %pointer 1 }
  elseif (%pointer < %lines) { inc %pointer 1 | goto read_next_line }
  if (%start_line) {
    :continue_post_files
    set %line $read -nl $+ %pointer [ [ %fserve ] $+ .ini ]
    if (%line) {
      set %add.text $gettok(%line,2,61) downloads $chr(91) $+ $replace($gettok(%line,1,61),$chr(255),$chr(32)) $+ $chr(93)
      set %iline $insert_sort(@statistics [ %add.text ] )
      if (%iline != $line(@statistics,0)) { iline -p $colour(info) @statistics %iline %add.text }
      else { aline $colour(info) @statistics %add.text }
      inc %pointer 1
      goto continue_post_files
    }
  }
  dec %f.pointer 1
  goto continue_fserve_scan
  :fserve_scan_complete
  if ($line(@statistics,0) == 1) {
    clear @statistics
    if (%total == true) { aline $colour(info) @statistics *** no files downloaded }
    else { aline $colour(info) @statistics *** no file downloaded from fserve %fserve }
  }
  unset %line %lines %start_line %pointer %fserve %fserves %total %f.pointer %add.text %iline
}
alias top_uploaders {
  clear @statistics | unset %fserve
  if ($findline(@statistics -l 1 [x]*) > 6) {
    set %fserve $line(@statistics,$findline(@statistics -l 1 [x]*),1)
    set %fserve $left(%fserve,$calc($len(%fserve) - 1))
    set %fserve $right(%fserve,$calc($len(%fserve) - 6))
  }
  if (%fserve != $null) { aline $colour(info2) @statistics top uploaders fserve[ $+ %fserve $+ $chr(93) | set %fserves %fserve }
  else { aline $colour(info2) @statistics top uploaders | set %fserves $readini fserve.ini main servers | set %total true }
  set %f.pointer $gettok(%fserves,0,32)
  :continue_fserve_scan
  if (%f.pointer < 1) { goto fserve_scan_complete }
  set %fserve $gettok(%fserves,%f.pointer,32)
  set %pointer $readini [ [ %fserve ] $+ .ini ] perm_user_list total
  :continue_perm_user_scan
  if (%pointer < 1) { goto perm_user_scan_complete }
  set %user $readini [ [ %fserve ] $+ .ini ] perm_user_list [ u $+ [ %pointer ] ]
  set %uploads $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) uploads
  set %add.text $gettok(%uploads,2,32) bytes in $gettok(%downloads,1,32) files
  set %text out $gettok(%user,1,33)
  set %add.text %add.text $+ $str($chr(160),$calc(27 - $len(%add.text)))
  set %text $fserve_inifilter(%text)
  set %add.text %add.text %text
  set %add.text %add.text $+ $str($chr(160),$calc(40 - $len(%add.text)))
  if (%total == true) { set %add.text %add.text f[ $+ %fserve $+ $chr(93) }
  set %iline $insert_sort(@statistics [ %add.text ] )
  if (%iline != $line(@statistics,0)) { iline $colour(info) @statistics %iline %add.text }
  else { aline $colour(info) @statistics %add.text }
  dec %pointer 1
  goto continue_perm_user_scan
  :perm_user_scan_complete
  dec %f.pointer 1
  goto continue_fserve_scan
  :fserve_scan_complete
  if ($line(@statistics,0) == 1) {
    clear @statistics
    if (%total == true) { aline $colour(info) @statistics *** no users configured }
    else { aline $colour(info) @statistics *** no users configured for fserve %fserve }
  }
  unset %fserve %user %pointer %fserves %uploads %text %total %iline
}
alias top_downloaders {
  clear @statistics | unset %fserve
  if ($findline(@statistics -l 1 [x]*) > 6) {
    set %fserve $line(@statistics,$findline(@statistics -l 1 [x]*),1)
    set %fserve $left(%fserve,$calc($len(%fserve) - 1))
    set %fserve $right(%fserve,$calc($len(%fserve) - 6))
  }
  if (%fserve != $null) { aline $colour(info2) @statistics top downloaders fserve[ $+ %fserve $+ $chr(93) | set %fserves %fserve }
  else { aline $colour(info2) @statistics top downloaders | set %fserves $readini fserve.ini main servers | set %total true }
  set %f.pointer $gettok(%fserves,0,32)
  :continue_fserve_scan
  if (%f.pointer < 1) { goto fserve_scan_complete }
  set %fserve $gettok(%fserves,%f.pointer,32)
  set %pointer $readini [ [ %fserve ] $+ .ini ] perm_user_list total
  :continue_perm_user_scan
  if (%pointer < 1) { goto perm_user_scan_complete }
  set %user $readini [ [ %fserve ] $+ .ini ] perm_user_list [ u $+ [ %pointer ] ]
  set %downloads $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) downloads
  set %add.text $gettok(%downloads,2,32) bytes in $gettok(%downloads,1,32) files
  set %text out $gettok(%user,1,33)
  set %add.text %add.text $+ $str($chr(160),$calc(27 - $len(%add.text)))
  set %text $fserve_inifilter(%text)
  set %add.text %add.text %text
  set %add.text %add.text $+ $str($chr(160),$calc(40 - $len(%add.text)))
  if (%total == true) { set %add.text %add.text f[ $+ %fserve $+ $chr(93) }
  set %iline $insert_sort(@statistics [ %add.text ] )
  if (%iline != $line(@statistics,0)) { iline $colour(info) @statistics %iline %add.text }
  else { aline $colour(info) @statistics %add.text }
  dec %pointer 1
  goto continue_perm_user_scan
  :perm_user_scan_complete
  dec %f.pointer 1
  goto continue_fserve_scan
  :fserve_scan_complete
  if ($line(@statistics,0) == 1) {
    clear @statistics
    if (%total == true) { aline $colour(info) @statistics *** no users configured }
    else { aline $colour(info) @statistics *** no users configured for fserve %fserve }
  }
  unset %fserve %user %pointer %fserves %downloads %text %total %iline
}
alias top_channels {
  clear @statistics | unset %fserve
  if ($findline(@statistics -l 1 [x]*) > 6) {
    set %fserve $line(@statistics,$findline(@statistics -l 1 [x]*),1)
    set %fserve $left(%fserve,$calc($len(%fserve) - 1))
    set %fserve $right(%fserve,$calc($len(%fserve) - 6))
  }
  if (%fserve != $null) { aline $colour(info2) @statistics top channels fserve[ $+ %fserve $+ $chr(93) }
  else { aline $colour(info2) @statistics top channels }
  set %channels $remtok( [ $readini fserve.ini main channels ] ,:,1,32)
  set %pointer $gettok(%channels,0,32)
  if (%pointer == $null) {
    aline $colour(info) @statistics no channels configured
  }
  else {
    :continue_chan_scan
    if (%pointer < 1) { goto chan_scan_complete }
    set %add.text $calc( [ $readini fserve.ini [ [ $gettok(%channels,%pointer,32) ] $+ _channel ] triggered ] ) triggers
    set %add.text %add.text $+ $str($chr(160),$calc(12 - $len(%add.text))) $chr(91) $+ $gettok(%channels,%pointer,32) $+ $chr(93)
    if (%fserve == $null) { set %add.text %add.text $+ $str($chr(160),$calc(32 - $len(%add.text))) f[ $+ $readini fserve.ini [ [ $gettok(%channels,%pointer,32) ] $+ _channel ] fserve $+ $chr(93) }
    if ( [ $readini fserve.ini [ [ $gettok(%channels,%pointer,32) ] $+ _channel ] fserve ] == %fserve || %fserve == $null) {
      set %iline $insert_sort(@statistics [ %add.text ] )
      if (%iline != $line(@statistics,0)) { iline $colour(info) @statistics %iline %add.text }
      else { aline $colour(info) @statistics %add.text }
    }
    dec %pointer 1
    goto continue_chan_scan
    :chan_scan_complete
    if ($line(@statistics,0) == 1) { clear @statistics | aline $colour(info) @statistics *** no channels are configured to use fserve %fserve }
  }
  unset %channels %pointer %add.text %fserve
}
alias insert_sort {
  set %listbox 0
  set %text $2-
  if ($2 == -l) { set %listbox 1 | set %text $3- }
  unset %listbox
  set %s.pointer 1
  :continue_scan
  set %line $line( [ $1 ] , [ %s.pointer ] , [ %listbox ] )
  if (%line == $null) { goto scan_complete }
  if (%text > %line) { goto scan_complete }
  inc %s.pointer 1
  goto continue_scan
  :scan_complete
  unset %text %line %listbox
  return %s.pointer
}
ctcp 1:dcc:?: {
  unset %halt
  if ($2 == send) {
    set %fserves $readini fserve.ini main servers
    set %pointer $gettok(%fserves,0,32)
    :continue_fserve_scan
    if (%pointer < 1) { goto fserve_scan_complete }
    set %fserve $gettok( [ $readini fserve.ini main servers ] ,%pointer,32)
    set %user $read -s $+ $chr(91) $+ $fserve_inifilter(in [ $mask($fulladdress,8) ] ) $+ $chr(93) [ [ %fserve ] $+ .ini ]
    if (%user != $null) {
      set %file.types $readini fserve.ini [ [ %fserve ] $+ _data ] file.types
      set %f.pointer $gettok(%file.types,0,32)
      :continue_file_scan
      if (%f.pointer < 1) { goto file_scan_complete }
      if ($gettok(%file.types,%f.pointer,32) iswm $nopath($3)) { goto accept_file }
      dec %f.pointer 1
      goto continue_file_scan
      :file_scan_complete
    }
    dec %pointer 1
    goto continue_fserve_scan
    :fserve_scan_complete
    goto done
    :accept_file
    writeini fserve.ini sockets $fserve_inifilter(in [ $nick ] ) $fserve_inifilter(in [ $mask($fulladdress,8) ] ) %fserve
    set %user $right($left(%user,$calc($len(%user) - 1)),$calc($len(%user) - 2))
    set %socket $readini [ [ %fserve ] $+ .ini ] %user ip
    set %socket $readini fserve.ini sockets %socket
    set %socket $gettok(%socket,1,32)
    if ($findfile($getdir( [ . $+ [ $gettok($3,$gettok($3,0,46),46) ] ] ) ,$nopath($3),1)) {
      if ($sock(%socket)) {
        sockwrite -n %socket
        sockwrite -n %socket error
        sockwrite -n %socket file[ $+ $nopath($3) $+ $chr(93) already exists
      }
      set %halt 1
    }
    else {
      if ($sock(%socket)) {
        sockwrite -n %socket
        sockwrite -n %socket accepting file[ $+ $nopath($3) $+ $chr(93)
        sockwrite -n %socket credits will be added when upload is complete
      }
      .sreq +m auto
      .timer -m 1 1 .sreq -m ask
      :done
    }
    unset %fserve %fserves %pointer %f.pointer %file.types %user %socket
    if (%halt == 1) { unset %halt | halt }
  }
}
on 1:filesent:*: {
  set %socket $readini fserve.ini sockets $get($nick).ip
  if (%socket != $null) {
    set %user $gettok(%socket,2,32)
    set %socket $gettok(%socket,1,32)
    set %fserve $deltok($deltok(%socket,$gettok(%socket,0,95),95),1,95)
  }
  else {
    set %user $readini fserve.ini sockets $fserve_inifilter(in [ $nick ] )
    set %fserve $gettok(%user,2,32)
    set %user $gettok(%user,1,32)
  }
  if (%user) {
    set %user.info $readini [ [ %fserve ] $+ .ini ] users %user
    set %user.info $gettok(%user.info,1,32) $calc( [ $gettok(%user.info,2,32) ] + 1) $gettok(%user.info,3,32)
    writeini [ [ %fserve ] $+ .ini ] users %user %user.info
    set %download.info $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) downloads
    set %download.info $calc( [ $gettok(%download.info,1,32) ] + 1) $calc( [ $gettok(%download.info,2,32) ] + [ $send($nick).size ] )
    writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) downloads %download.info
    set %downloads $readini [ [ %fserve ] $+ .ini ] downloads $replace($filename,$chr(32),$chr(95))
    inc %downloads 1
    writeini [ [ %fserve ] $+ .ini ] downloads $replace($filename,$chr(32),$chr(255)) %downloads
    .timer -m 1 1 update_user_info %user %fserve
    if ($sock(%socket)) {
      sockwrite -n %socket
      sockwrite -n %socket finished sending file[ $+ $nopath($filename) $+ $chr(93)
    }
  }
  unset %socket %user %fserve %user.info %download.info
}
on 1:sendfail:*: {
  set %user $gettok( [ $readini fserve.ini sockets [ $fserve_inifilter(in [ $nick ] ) ] ] ,1,32)
  set %fserve $gettok( [ $readini fserve.ini sockets [ $fserve_inifilter(in [ $nick ] ) ] ] ,2,32)
  set %socket $readini [ [ %fserve ] $+ .ini ] %user ip
  set %socket $gettok( [ $readini fserve.ini sockets [ %ip ] ] ,1,32)
  set %credits $readini [ [ %fserve ] $+ .ini ] %user credits
  inc %credits $lof($filename)
  writeini [ [ %fserve ] $+ .ini ] %user credits %credits
  if ($sock(%socket)) {
    sockwrite -n %socket
    sockwrite -n %socket transfer of $chr(91) $+ $nopath($filename) $+ $chr(93) failed
    sockwrite -n %socket $chr(91) $+ $lof($filename) $+ $chr(93) $+ credits returned
  }
}
on 1:filercvd:*: {
  set %socket $readini fserve.ini sockets $get($nick).ip
  if (%socket != $null) {
    set %user $gettok(%socket,2,32)
    set %fserve $deltok($deltok(%socket,$gettok(%socket,0,95),95),1,95)
    set %socket $gettok(%socket,1,32)
  }
  else {
    set %user $readini fserve.ini sockets $fserve_inifilter(in [ $nick ] )
    set %fserve $gettok(%user,2,32)
    set %user $gettok(%user,1,32)
    set %socket $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) ip
    set %socket $readini fserve.ini sockets %socket
    set %socket $gettok(%socket,1,32)
  }
  if (%user != $null) {
    unset %ratio
    set %file.types $readini fserve.ini [ [ %fserve ] $+ _data ] file.types
    if (%file.types) {
      set %pointer $gettok(%file.types,0,32)
      :continue.type.scan
      if (%pointer < 1) { goto type.scan.complete }
      if ($gettok(%file.types,%pointer,32) iswm $filename) { goto type.scan.complete }
      dec %pointer 1
      goto continue.type.scan
      :type.scan.complete
      if (%pointer != 0) { set %ratio $readini fserve.ini [ [ %fserve ] $+ _data ] [ r. $+ [ $gettok(%file.types,%pointer,32) ] ] }
    }
    unset %file.types %pointer
    if (%ratio == $null) { set %ratio $readini fserve.ini [ [ %fserve ] $+ _data ] ratio }
    if (%ratio != 0) {
      set %credits $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits
      set %inc $lof($filename)
      set %inc $calc(%inc * %ratio)
      inc %credits %inc
      set %uploads $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) uploads
      set %upload.bytes $gettok(%uploads,2,32)
      set %uploads $gettok(%uploads,1,32)
      inc %uploads 1
      inc %upload.bytes $lof($filename)
      set %user.info $readini [ [ %fserve ] $+ .ini ] users $fserve_inifilter(in [ %user ] )
      set %user.info $gettok(%user.info,1,32) $gettok(%user.info,2,32) $calc( [ $gettok(%user.info,3,32) ] + 1)
      writeini [ [ %fserve ] $+ .ini ] users $fserve_inifilter(in [ %user ] ) %user.info
      writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) uploads %uploads %upload.bytes
      writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits %credits
    }
    if ($sock(%socket)) {
      sockwrite -n %socket
      sockwrite -n %socket file[ $+ $nopath($filename) $+ $chr(93) uploaded successfully
      if (%inc) { sockwrite -n %socket $chr(91) $+ %inc $+ $chr(93) $+ credits added }
    }
    .timer -m 1 1 update_user_info $get($nick).ip
    if ($fserve_gets($nick inactive) == $true) { close -g $nick }
    unset %inc %credits %user %fserve %socket %admin %comments
  }
}
on 1:getfail:*: {
  set %user $readini fserve.ini sockets $nick
  if (%user) {
    set %fserve $gettok(%user,2,32)
    set %user $gettok(%user,1,32)
    set %socket $readini [ [ %fserve ] $+ .ini ] %user ip
    set %socket $gettok( [ $readini fserve.ini sockets [ %socket ] ] ,1,32)
    if ($sock(%socket)) {
      sockwrite -n %socket
      sockwrite -n %socket receive of file[ $+ $nopath($filename) $+ $chr(93) failed
      sockwrite -n %socket no credits added
    }
    if ($fserve_gets($nick inactive) == $true) { close -g $nick }
  }
  unset %user %fserve %socket
}
alias update_user_info {
  if ($isip($1)) {
    set %info $readini fserve.ini sockets $1
    set %socket $gettok(%info,1,32)
    set %ip $1
    set %fserve $deltok($deltok(%socket,$gettok(%socket,0,95),95),1,95)
    set %user $gettok(%info,2,32)
  }
  elseif ($gettok($1,0,64) == 2) {
    set %user $1
    set %fserve $2
    set %ip $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) ip
  }
  else { set %info nickname }
  set %nick $gettok(%user,1,33)
  set %line @users 1 *f $+ $chr(91) $+ %fserve $+ $chr(93) $chr(9) $+ nick[ $+ %nick $+ $chr(93) $+ *
  set %line $findline(%line)
  set %info $readini [ [ %fserve ] $+ .ini ] users $fserve_inifilter(in [ %user ] )
  set %history.downloads $gettok( [ $readini [ [ %fserve ] $+ .ini ] [ $fserve_inifilter(in [ %user ] ) ] downloads ] ,1,32)
  set %history.uploads $gettok( [ $readini [ [ %fserve ] $+ .ini ] [ $fserve_inifilter(in [ %user ] ) ] uploads ] ,1,32)
  set %banned $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) banned
  set %win @monitor_ $+ %user
  if ($window(@users) != $null) {
    if (%info != $null) {
      set %iline $calc( [ $findline(@users 1 [on-line users]) ] + 1)
      set %current.uploads $fserve_gets(%nick)
      set %current.downloads $fserve_sends(%nick)
      set %session.downloads $gettok(%info,2,32)
      set %session.uploads $gettok(%info,3,32)
      if (%line == $null) { iline $colour(high) @users %iline f[ $+ %fserve $+ $chr(93) $chr(9) $+ nick[ $+ %nick $+ $chr(93) $chr(9) $+ d[ $+ %current.downloads $+ : $+ %session.downloads $+ : $+ %history.downloads $+ $chr(93) $chr(9) $+ u[ $+ %current.uploads $+ : $+ %session.uploads $+ : $+ %history.uploads $+ $chr(93) $chr(9) $+ %banned $+ $chr(9) %user %ip %fserve }
      else { rline $colour(high) @users %line f[ $+ %fserve $+ $chr(93) $chr(9) $+ nick[ $+ %nick $+ $chr(93) $chr(9) $+ d[ $+ %current.downloads $+ : $+ %session.downloads $+ : $+ %history.downloads $+ $chr(93) $chr(9) $+ u[ $+ %current.uploads $+ : $+ %session.uploads $+ : $+ %history.uploads $+ $chr(93) $chr(9) $+ %banned $+ $chr(9) %user %ip %fserve }
    }
    else {
      set %iline $calc( [ $findline(@users 1 [off-line users]) ] + 1)
      if (%line == $null) { iline $colour(high) @users %iline f[ $+ %fserve $+ $chr(93) $chr(9) $+ nick[ $+ %nick $+ $chr(93) $chr(9) $+ d[ $+ %history.downloads $+ $chr(93) $chr(9) $+ u[ $+ %history.uploads $+ $chr(93) $chr(9) $+ %banned $+ $chr(9) %user disconnected %fserve }
      else { rline $colour(high) @users %line f[ $+ %fserve $+ $chr(93) $chr(9) $+ nick[ $+ %nick $+ $chr(93) $chr(9) $+ d[ $+ %history.downloads $+ $chr(93) $chr(9) $+ u[ $+ %history.uploads $+ $chr(93) $chr(9) $+ %banned $+ $chr(9) %user disconnected %fserve }
    }
  }
  if (%info != $null) { if ($window(%win) != $null) { full_user_info %user %ip %fserve } }
  else { if ($window(%win) != $null) { full_user_info %user disconnected %fserve } }
  unset %socket %user %info %nick %line %banned %win
  unset %current.uploads %current.downloads
  unset %session.uploads %session.downloads
  unset %history.uploads %history.downloads
}
alias users_window {
  window -l -t10,27,37,47,100 @users @users
  set %fserves $readini fserve.ini main servers
  clear @users
  aline $colour(info) @users [on-line users]
  aline $colour(info) @users [off-line users]
  set %fserves $readini fserve.ini main servers
  set %f.pointer $gettok(%fserves,0,32)
  :continue_fserve_scan
  if (%f.pointer < 1) { goto fserve_scan_complete }
  set %f.fserve $gettok(%fserves,%f.pointer,32)
  set %pointer $readini [ [ %f.fserve ] $+ .ini ] perm_user_list total
  :continue_perm_user_scan
  if (%pointer < 1) { goto perm_user_scan_complete }
  set %u.user $readini [ [ %f.fserve ] $+ .ini ] perm_user_list [ u $+ [ %pointer ] ]
  update_user_info %u.user %f.fserve
  dec %pointer 1
  goto continue_perm_user_scan
  :perm_user_scan_complete
  dec %f.pointer 1
  goto continue_fserve_scan
  :fserve_scan_complete
  unset %f.fserve %u.user %pointer %fserves %downloads %text %total
}
menu @users {
  dclick { if ($left($gettok($sline($active,1),1,32),1) == f) { full_user_info $gettok($sline($active,1),6-,32) } }
  $delete_fserve_user {
    set %user $gettok($sline($active,1),6,32)
    set %fserve $gettok($sline($active,1),8,32)
    set %fserve.ini $gettok($sline($active,1),8,32) $+ .ini
    set %pointer $readini %fserve.ini perm_user_list total
    if (%pointer > 0) {
      set %total $calc(%pointer - 1)
      :continue_user_scan
      if (%pointer < 1) { goto user_scan_complete }
      set %checkuser $readini %fserve.ini perm_user_list [ u $+ [ %pointer ] ]
      if (%checkuser == %user) { set %user.marker %pointer | set %pointer 1 }
      dec %pointer 1
      goto continue_user_scan
      :user_scan_complete
      remini %fserve.ini $fserve_inifilter(in [ %user ] )
      set %pointer %user.marker
      :continue_shift_users
      set %read.user $readini %fserve.ini perm_user_list [ u $+ [ $calc(%pointer + 1) ] ]
      if (%read.user != $null) {
        writeini %fserve.ini perm_user_list [ u $+ [ %pointer ] ] %read.user
        inc %pointer 1
        goto continue_shift_users
      }
      remini %fserve.ini perm_user_list [ u $+ [ %pointer ] ]
      writeini %fserve.ini perm_user_list total $calc(%pointer - 1)
      if ($window(@users) != $null) {
        set %search.string @users 1 f[ $+ %fserve $+ $chr(93) $chr(9) $+ nick[ $+ $gettok(%user,1,33) $+ $chr(93) $+ *
        set %search.string $findline(%search.string)
        if (%search.string != $null) { dline @users %search.string }
      }
      if ($window( [ @monitor_ $+ [ %user ] ] ) != $null) { window -c [ @monitor_ $+ [ %user ] ] }
    }
    unset %user %fserve.ini %pointer %checkuser
  }
}
alias delete_fserve_user {
  if ($left($sline($active,1),1) == f) { return delete fserve $right($left($gettok($sline(@users,1),1,32),$calc($len($gettok($sline(@users,1),1,32)) - 1)),$calc($len($gettok($sline(@users,1),1,32)) - 3))) user $right($left($gettok($sline(@users,1),2,32),$calc($len($gettok($sline(@users,1),2,32)) - 1)),$calc($len($gettok($sline(@users,1),2,32)) - 7)) }
}
alias full_user_info {
  set %nick $gettok($1,1,33)
  set %win @monitor_ $+ $1
  window -el17 %win @user_monitor
  titlebar %win $2-
  unset %connected
  if ($isip($2)) { set %connected true }
  set %fserve.ini $3 $+ .ini
  set %user.i $fserve_inifilter(in [ $1 ] )
  clear -l %win
  aline -l $colour(high) %win give credits
  aline -l $colour(high) %win take credits
  aline -l $colour(high) %win credits[ $+ $readini %fserve.ini %user.i credits $+ $chr(93)
  aline -l $colour(list) %win -
  if (%connected) {
    aline -l $colour(high) %win kill user
    aline -l $colour(high) %win timed kill
    aline -l $colour(list) %win -
  }
  set %banned $readini %fserve.ini %user.i banned
  if (%banned == $null) { aline -l $colour(high) %win ban user }
  else { aline -l $colour(high) %win unban user }
  aline -l $colour(list) %win -
  aline -l $colour(info) %win uploads
  if (%connected) {
    set %info $readini %fserve.ini users %user.i
    aline -l $colour(info2) %win current[ $+ $fserve_gets($gettok(%user,1,33)) $+ $chr(93)
    aline -l $colour(info2) %win session[ $+ $gettok(%info,3,32) $+ $chr(93)
  }
  set %uploads $readini %fserve.ini %user.i uploads
  aline -l $colour(info2) %win history[ $+ $gettok(%uploads,1,32) $+ $chr(93)
  aline -l $colour(info) %win total bytes
  aline -l $colour(info2) %win $chr(91) $+ $gettok(%uploads,2,32) $+ $chr(93)
  aline -l $colour(list) %win -
  aline -l $colour(info) %win downloads
  if (%connected) {
    aline -l $colour(info2) %win current[ $+ $fserve_sends($gettok(%user,1,33)) $+ $chr(93)
    aline -l $colour(info2) %win session[ $+ $gettok(%info,2,32) $+ $chr(93)
  }
  set %downloads $readini %fserve.ini %user.i downloads
  aline -l $colour(info2) %win history[ $+ $gettok(%downloads,1,32) $+ $chr(93)
  aline -l $colour(info) %win total bytes
  aline -l $colour(info2) %win $chr(91) $+ $gettok(%downloads,2,32) $+ $chr(93)
  if (%connected) {
    aline -l $colour(list) %win -
    aline -l $colour(info) %win pwd[ $+ $readini %fserve.ini %user.i pwd $+ $chr(93)
    if ($readini %fserve.ini %user.i admin) { aline -l $colour(info) %win admin }
  }
  unset %win %connected %fserve %uploads %downloads %info
}
menu @user_monitor {
  dclick {
    set %command $sline($active,1)
    set %user $right($active,$calc($len($active) - 9))
    set %fserve $gettok($window($active).title,2,32)
    if ($gettok(%command,1,32) == give) {
      set %credits $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits
      inc %credits $$?="add how many credits"
      writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits %credits
      update_user_info %user %fserve
    }
    if ($gettok(%command,1,32) == take) {
      set %credits $readini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits
      dec %credits $$?="remove how many credits"
      writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits %credits
      update_user_info %user %fserve
    }
    if ($left(%command,8) == credits[) {
      writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) credits $$?="enter new credit total"
      update_user_info %user %fserve
    }
    if ($gettok(%command,1,32) == ban) { writeini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) banned banned | update_user_info %user %fserve }
    if ($gettok(%command,1,32) == unban) { remini [ [ %fserve ] $+ .ini ] $fserve_inifilter(in [ %user ] ) banned | update_user_info %user %fserve }
    if ($gettok(%command,1,32) == kill) {
      set %socket $gettok( [ $readini fserve.ini sockets [ $gettok($window($active).title,1,32) ] ] ,1,32)
      sockwrite -n %socket *** fserve kill by ADMIN
      close_fserve %socket manual
      echo $colour(info) $active *** fserve kill by ADMIN
    }
    if ($gettok(%command,1,32) == timed) {
      set %socket $gettok( [ $readini fserve.ini sockets [ $gettok($window($active).title,1,32) ] ] ,1,32)
      set %time $$?="enter number of seconds until kill"
      sockwrite -n %socket *** fserve closing in $duration(%time)
      .timer 1 %time if ($!sock(%socket)) $chr(123) sockwrite -n %socket *** fserve timed kill $chr(91) $+ $duration(%time) $+ $chr(93) $chr(124) close_fserve %socket manual $chr(125)
      echo $colour(info) $active *** timed KILL in $duration(%time)
    }
    unset %command %user %credits %socket %time
  }
}
on 1:input:@monitor_*: {
  if ($left($1,1) != [ $readini [ $mircini ] text commandchar ] ) {
    set %ip $gettok($window($active).title,1,32)
    if ($isip(%ip)) {
      set %socket $gettok( [ $readini fserve.ini sockets [ %ip ] ] ,1,32)
      sockwrite -n %socket < $+ $me $+ :ADMIN> $1-
      echo $colour(own) $active < $+ $me $+ > $1-
    }
    else {
      echo $colour(info) $active *** user is not connected
    }
    unset %socket ^%ip
    halt
  }
}
alias fserve_gets {
  set %g.pointer $get(0)
  set %gets 0
  :continue_gets
  if (%g.pointer < 1) { goto gets_done }
  if ($get(%g.pointer) == $1) { inc %gets 1 }
  if ($2 == inactive && $get(%g.pointer).status == active) { set %gets $false | goto gets_done }
  dec %g.pointer 1
  goto continue_gets
  :gets_done
  if ($2 == inactive && %gets isnum) { set %gets $true }
  return %gets
}
alias fserve_sends {
  set %s.pointer $send(0)
  set %sends 0
  :continue_sends
  if (%s.pointer < 1) { goto sends_done }
  if ($send(%s.pointer) == $1) { inc %sends 1 }
  if ($2 == inactive && $send(%s.pointer).status == active) { set %sends $false | goto sends_done }
  dec %s.pointer 1
  goto continue_sends
  :sends_done
  if ($2 == inactive && %sends isnum) { set %sends $true }
  return %sends
}
alias findline {
  ; $findline(@window [-l] <n> <text>)
  ; @window is the window to search
  ; -l switch specifies side-listbox
  ; <n> returns line number of nth line matching <text>
  ; <text> wildcard search
  set %listbox 0
  set %l.pointer 1
  set %matches 0
  set %find.matches $2
  set %text $3-
  if ($2 == -l) { set %find.matches $3 | set %text $4- | set %listbox 1 }
  :continue_scan
  if (%text iswm $line($1,%l.pointer,%listbox)) {
    inc %matches 1
    if (%matches == %find.matches) { goto done }
  }
  inc %l.pointer 1
  if (%l.pointer <= $line($1,0,%listbox)) { goto continue_scan }
  set %l.pointer $null
  :done
  unset %listbox %matches %find.matches %text
  return %l.pointer
}
alias fserve_version { return multi-fserve[v1.011] }
menu channel {
  -
  $fserve_version { }
  $install_fserve_channel(#)
  .$page_range(# fserve) { }
  .-
  .$page_entry(# 1 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,%pagepointer,32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 2 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 1),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 3 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 2),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 4 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 3),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 5 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 4),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 6 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 5),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 7 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 6),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 8 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 7),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 9 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 8),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .$page_entry(# 10 fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] fserve $gettok( [ $readini fserve.ini main servers ] ,$calc(%pagepointer + 9),32) | writeini fserve.ini main channels $addtok( [ $readini fserve.ini main channels ] ,#,32) | unset %pagepointer }
  .-
  .$prev_10_entries(#) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] pagepointer $calc(%pagepointer - 10) }
  .$next_10_entries(# fserve) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] pagepointer $calc(%pagepointer + 10) }
  .-
  .$check_fserve( [ # ] remove channel fserve) { remini fserve.ini [ [ # ] $+ _channel ] | .timer [ $+ [ # ] ] off | writeini fserve.ini main channels $remtok( [ $readini fserve.ini main channels ] ,#,1,32) }
  $check_fserve(#)
  .on join
  ..$current_advert( [ # ] onjoin) { }
  ..-
  ..$page_range(# advert) { }
  ..-
  ..$page_entry(# 1 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,%pagepointer,32) | unset %pagepointer }
  ..$page_entry(# 2 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 1),32) | unset %pagepointer }
  ..$page_entry(# 3 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 2),32) | unset %pagepointer }
  ..$page_entry(# 4 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 3),32) | unset %pagepointer }
  ..$page_entry(# 5 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 4),32) | unset %pagepointer }
  ..$page_entry(# 6 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 5),32) | unset %pagepointer }
  ..$page_entry(# 7 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 6),32) | unset %pagepointer }
  ..$page_entry(# 8 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 7),32) | unset %pagepointer }
  ..$page_entry(# 9 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 8),32) | unset %pagepointer }
  ..$page_entry(# 10 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] onjoin $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 9),32) | unset %pagepointer }
  ..-
  ..$prev_10_entries(#) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] pagepointer $calc(%pagepointer - 10) }
  ..$next_10_entries(# advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] pagepointer $calc(%pagepointer + 10) }
  ..-
  ..$rem_advert( [ # ] onjoin on join) { remini fserve.ini [ [ # ] $+ _channel ] onjoin }
  .timed { }
  ..$current_advert( [ # ] timed) { }
  ..$repeat_delay(#) {
    writeini fserve.ini [ [ # ] $+ _channel ] timed.delay $$?="enter repeat delay in seconds"
    .timer [ $+ [ # ] ] 0 [ $readini fserve.ini [ [ # ] $+ _channel ] timed.delay ] set $chr(37) $+ fserve $!readini fserve.ini # $+ _channel fserve $chr(124) set $chr(37) $+ advert $!readini fserve.ini # $+ _channel timed $chr(124) msg # $!fserve_advert( $chr(91) $chr(37) $+ advert $chr(93) $chr(91) $chr(37) $+ fserve $chr(93) ) $chr(124) unset $chr(37) $+ fserve $chr(37) $+ advert
  }
  ..-
  ..$page_range(# advert) { }
  ..-
  ..$page_entry(# 1 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,%pagepointer,32) | unset %pagepointer }
  ..$page_entry(# 2 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 1),32) | unset %pagepointer }
  ..$page_entry(# 3 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 2),32) | unset %pagepointer }
  ..$page_entry(# 4 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 3),32) | unset %pagepointer }
  ..$page_entry(# 5 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 4),32) | unset %pagepointer }
  ..$page_entry(# 6 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 5),32) | unset %pagepointer }
  ..$page_entry(# 7 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 6),32) | unset %pagepointer }
  ..$page_entry(# 8 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 7),32) | unset %pagepointer }
  ..$page_entry(# 9 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 8),32) | unset %pagepointer }
  ..$page_entry(# 10 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] timed $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 9),32) | unset %pagepointer }
  ..-
  ..$prev_10_entries(#) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] pagepointer $calc(%pagepointer - 10) }
  ..$next_10_entries(# advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] pagepointer $calc(%pagepointer + 10) }
  ..-
  ..$rem_advert( [ # ] timed timed) { remini fserve.ini [ [ # ] $+ _channel ] timed | .timer [ $+ [ # ] ] off }
  .on slot free { }
  ..$current_advert( [ # ] slotfree) { }
  ..-
  ..$page_range(# advert) { }
  ..-
  ..$page_entry(# 1 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,%pagepointer,32) | unset %pagepointer }
  ..$page_entry(# 2 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 1),32) | unset %pagepointer }
  ..$page_entry(# 3 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 2),32) | unset %pagepointer }
  ..$page_entry(# 4 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 3),32) | unset %pagepointer }
  ..$page_entry(# 5 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 4),32) | unset %pagepointer }
  ..$page_entry(# 6 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 5),32) | unset %pagepointer }
  ..$page_entry(# 7 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 6),32) | unset %pagepointer }
  ..$page_entry(# 8 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 7),32) | unset %pagepointer }
  ..$page_entry(# 9 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 8),32) | unset %pagepointer }
  ..$page_entry(# 10 advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] slotfree $gettok( [ $readini fserve.ini main adverts ] ,$calc(%pagepointer + 9),32) | unset %pagepointer }
  ..-
  ..$prev_10_entries(#) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] pagepointer $calc(%pagepointer - 10) }
  ..$next_10_entries(# advert) { set %pagepointer $readini fserve.ini [ [ # ] $+ _channel ] pagepointer | if (%pagepointer == $null) { set %pagepointer 1 } | writeini fserve.ini [ [ # ] $+ _channel ] pagepointer $calc(%pagepointer + 10) }
  ..-
  ..$rem_advert( [ # ] slotfree slot free) { remini fserve.ini [ [ # ] $+ _channel ] slotfree }
}
alias install_fserve_channel {
  if ( [ $readini fserve.ini [ [ $1 ] $+ _channel ] fserve ] == $null) { return install fserve[ $+ $1 $+ $chr(93) }
  else { return change fserve for[ $+ $1 $+ $chr(93) }
}
alias check_fserve {
  set %temp $readini fserve.ini main channels
  if (%temp == $null) { writeini fserve.ini main channels : }
  unset %temp
  if ( [ $readini fserve.ini [ [ $1 ] $+ _channel ] fserve ] ) {
    if ($2 == $null) { return advertisements for fserve[ $+ $readini fserve.ini [ [ # ] $+ _channel ] fserve $+ $chr(93) }
    else { return $2- }
  }
}
alias current_advert {
  set %advert $readini fserve.ini [ [ $1 ] $+ _channel ] $2
  if (%advert == $null) { set %advert  n o n e  }
  return current advert[ $+ %advert $+ $chr(93)
}
alias rem_advert { if ( [ $readini fserve.ini [ [ $1 ] $+ _channel ] $2 ] != $null) { return remove $3- advertisement } }
alias repeat_delay {
  set %advert $readini fserve.ini [ [ # ] $+ _channel ] timed.delay
  if (%advert < 60 || %advert !isnum) { set %advert 60 }
  set %advert $duration(%advert)
  return repeat delay[ $+ %advert $+ $chr(93)
}
alias page_range {
  if ($2 == fserve) { set %temp $readini fserve.ini main servers }
  if ($2 == advert) { set %temp $readini fserve.ini main adverts }
  if ($gettok(%temp,0,32) == $null) { return no entries }
  set %pagepointer $readini fserve.ini [ [ $1 ] $+ _channel ] pagepointer
  if (%pagepointer == $null) { set %pagepointer 1 }
  set %pagepointer2 $calc(%pagepointer + 9)
  if ($2 == fserve) { if (%pagepointer2 > $gettok( [ $readini fserve.ini main servers ] ,0,32)) { set %pagepointer2 $gettok( [ $readini fserve.ini main servers ] ,0,32) } }
  if ($2 == advert) { if (%pagepointer2 > $gettok( [ $readini fserve.ini main adverts ] ,0,32)) { set %pagepointer2 $gettok( [ $readini fserve.ini main adverts ] ,0,32) } }
  return viewing entries[ $+ %pagepointer $+ - $+ %pagepointer2 $+ $chr(93)
}
alias page_entry {
  set %pagepointer $readini fserve.ini [ [ $1 ] $+ _channel ] pagepointer
  if (%pagepointer == $null) { set %pagepointer 1 }
  if ($3 == fserve) { set %pagepointer $gettok( [ $readini fserve.ini main servers ] ,$calc($2 $+ %pagepointer),32) }
  if ($3 == advert) { set %pagepointer $gettok( [ $readini fserve.ini main adverts ] ,$calc($2 $+ %pagepointer),32) }
  if (%pagepointer) {
    if ($3 == fserve) { return install fserve[ $+ %pagepointer $+ $chr(93) }
    if ($3 == advert) { return use advert[ $+ %pagepointer $+ $chr(93) }
  }
}
alias prev_10_entries {
  if ( [ $readini fserve.ini [ [ $1 ] $+ _channel ] pagepointer ] > 9) { return previous 10 entries }
}
alias next_10_entries {
  set %pagepointer $readini fserve.ini [ [ $1 ] $+ _channel ] pagepointer
  if (%pagepointer == $null) { set %pagepointer 1 }
  if ($2 == fserve) { set %pagepointer2 $gettok( [ $readini fserve.ini main servers ] ,0,32) }
  if ($2 == advert) { set %pagepointer2 $gettok( [ $readini fserve.ini main adverts ] ,0,32) }
  dec %pagepointer2 $calc(%pagepointer - 1)
  if (%pagepointer2 > 10) {
   dec %pagepointer2 10
   if (%pagepointer2 > 10) { set %pagepointer2 10 }
   if (%pagepointer2 > 1) { return next %pagepointer2 entries }
   else { return last entry }
  }
}
alias clean_vars {
  unset %pagepointer %advert %fserve.ini %search.string
  unset %temp %user.marker %total %slotfree %fserve.d
  unset %adverts %current %f.temp %sub.d %perm.users
  unset %pagepointer2 %new.pointer %user.i %new.pointer
  unset %iline %full.address %sockname %l.pointer
  unset %findline %g.pointer %gets %s.pointer %sends
  unset %upload.bytes %perm.users.pointer %perm.user
}
on 1:part:#: { if ($nick == $me) { .timer [ $+ [ # ] ] off } }
on 1:join:#: {
  set %fserve $readini fserve.ini [ [ # ] $+ _channel ] fserve
  if ($nick == $me) {
    set %timed $readini fserve.ini [ [ # ] $+ _channel ] timed
    if (%fserve != $null && %timed != $null) {
      .timer [ $+ [ # ] ] 0 [ $readini fserve.ini [ [ # ] $+ _channel ] timed.delay ] set $chr(37) $+ fserve $!readini fserve.ini # $+ _channel fserve $chr(124) set $chr(37) $+ advert $!readini fserve.ini # $+ _channel timed $chr(124) msg # $!fserve_advert( $chr(91) $chr(37) $+ advert $chr(93) $chr(91) $chr(37) $+ fserve $chr(93) ) $chr(124) unset $chr(37) $+ fserve $chr(37) $+ advert
    }
  }
  else {
    set %onjoin $readini fserve.ini [ [ # ] $+ _channel ] onjoin
    if (%fserve != $null && %onjoin != $null) {
      .notice $nick $fserve_advert( [ %onjoin ] [ %fserve ] )
    }
  }
  unset %fserve %onjoin
}
alias ugly_titlebar_thing {
  set %titlebar $fserve_version
  set %info created [02.98-03.98] mIRC 5.3+
  set %url http://nuncio.hypermart.net
  set %pointer 1
  :continue_titlebar0
  if ($titlebar) {
    titlebar $right($titlebar,$calc($len($titlebar) - 1))
    set %delay 30
    :delay_loop0
    dec %delay 1
    if (%delay > 0) { goto delay_loop0 }
    goto continue_titlebar0
  }
  :continue_titlebar1
  if (%pointer > $len(%titlebar)) { goto titlebar_complete1 }
  titlebar $right(%titlebar,%pointer)
  inc %pointer 1
  set %delay 30 | :delay_loop1 | dec %delay 1 | if (%delay > 0) { goto delay_loop1 }
  goto continue_titlebar1
  :titlebar_complete1
  set %delay 1000 | :delay_loop2 | dec %delay 1 | if (%delay > 0) { goto delay_loop2 }
  set %pointer 1
  :continue_titlebar2
  if (%pointer > $len(%info)) { goto titlebar_complete2 }
  titlebar %titlebar $right(%info,%pointer)
  inc %pointer 1
  set %delay 30 | :delay_loop3 | dec %delay 1 | if (%delay > 0) { goto delay_loop3 }
  goto continue_titlebar2
  :titlebar_complete2
  set %delay 2000 | :delay_loop4 | dec %delay 1 | if (%delay > 0) { goto delay_loop4 }
  set %pointer $len(%info)
  :continue_titlebar3
  if (%pointer < 1) { goto titlebar_complete3 }
  titlebar %titlebar $right(%info,%pointer)
  dec %pointer 1
  set %delay 30 | :delay_loop5 | dec %delay 1 | if (%delay > 0) { goto delay_loop5 }
  goto continue_titlebar3
  :titlebar_complete3
  titlebar %titlebar
  set %delay 750 | :delay_loop6 | dec %delay 1 | if (%delay > 0) { goto delay_loop6 }
  set %pointer 1
  :continue_titlebar4
  if (%pointer > $len(%url)) { goto titlebar_complete4 }
  titlebar %titlebar $right(%url,%pointer)
  inc %pointer 1
  set %delay 30 | :delay_loop7 | dec %delay 1 | if (%delay > 0) { goto delay_loop7 }
  goto continue_titlebar4
  :titlebar_complete4
  unset %titlebar %info %url %delay
}