aIRC — File Browser

aIRCv0.8.69 / aIRCv0.8.69 / addons / fserve2.mrc

fserve2.mrc — 30.17 KB — Download this file

;/**********************************************************************
; *
; * aIRC
; * File Server - file2
; *
; **********************************************************************/
;
alias _fserve.setup {
  _dialog -m _fserve.setup _fserve.setup
  var %i = 10
  while (%i <= 18) {
    if (%i == 12) { %i = 15 }
    if ($did(_fserve.setup,%i).text == $1-) { did -c _fserve.setup %i }
    inc %i
  }
}
dialog _fserve.setup {
  size -1 -1 250 130
  option dbu
  title "File Server Setup"

  tab "Setup",10,5 1 240 105
  tab "Advertising",11
  tab "Commands",15
  tab "Stats",16
  tab "Users",17
  tab "Bans",18
  tab "@find",19

  ; TAB 10

  box "",1234,10 17 73 83,tab 10
  check "Use &userlist",31,15 28 50 8,tab 10
  radio  "&Leech",32,15 38 26 8,tab 10
  radio  "&Ratio       1:",33,15 48 37 8,tab 10
  edit "",37,55 46 25 10,tab 10
  text "Initial credits:",27,15 60 40 10,tab 10
  edit "",38,55 58 25 10,autohs tab 10
  text "Max Users:",39,15 72 31 10,tab 10
  edit "",40,55 70 25 10,tab 10


  box "",41,82 17 157 83,tab 10
  box "",42,82 17 157 22,tab 10
  text "&Description:",45,85 27 30 10,right tab 10
  edit "",46,120 24 115 12,autohs tab 10
  text "&Triggers:",43,85 44 30 10,right tab 10
  combo 44,120 42 80 100,drop tab 10
  text "&Home dir:",47,85 59 30 10,right tab 10
  button "",48,120 57 115 12,tab 10
  text "&Welcome:",49,85 74 30 10,right tab 10
  button "",50,120 72 103 12,tab 10
  button "edit",51,223 72 12 12,tab 10
  button "add",52,202 42 15 10,tab 10
  button "del",53,220 42 15 10,tab 10
  list 54,100 100 100 100,hide
  list 55,100 100 100 100,hide
  check "Only in chans:",56,85 88 42 8,tab 10
  edit "",57,128 86 106 10,tab 10

  ; TAB 11

  box "",76,10 17 230 80,tab 11

  check "Only in these channels:",71,20 43 63 8,tab 11
  edit "",73,85 41 150 10,tab 11 autohs

  ;;;;;;;;; mIRC BUG here!
  check "Advert channels every",84,20 30 65 8,tab 11
  edit "10",86,85 28 15 10,tab 11 autohs
  text "minutes",2114,103 30 18 8,tab 11
  check "On Join Notice",80,135 30 50 8,tab 11
  check "Advert on !list",81,185 30 50 8,tab 11

  text "Message",91,15 55 180 8,tab 11
  edit "",92,15 63 215 10,tab 11 autohs
  button "!",94,231 63 7 10,tab 11

  ; TAB 15

  list 1031,10 28 75 75,extsel sort tab 15
  button "-->",1032,93 50 15 15, tab 15
  button "<--",1033,93 75 15 15, tab 15
  list 1034,115 28 75 75,extsel sort  tab 15
  text "Active:",1035,115 20 25 8, tab 15
  text "On invalid command:",1036,193 30 50 8,tab 15
  check "Send Help",1037,195 40 47 8,tab 15

  ; TAB 16

  box "",1201,10 17 230 80,tab 16
  text "Logins:",1211,15 30 50 8,tab 16 right
  edit "",1212,70 28 50 10,tab 16 autohs
  text "Snagged Files:",1213,15 42 50 8,tab 16 right
  edit "",1214,70 40 50 10,tab 16 autohs
  text "Snagged Bytes:",1215,15 54 50 8,tab 16 right
  edit "",1216,70 52 50 10,tab 16 autohs
  text "Record CPS:",1217,15 66 50 8,tab 16 right
  edit "",1218,70 64 50 10,tab 16 autohs
  text "Record CPS by:",1219,15 78 50 8,tab 16 right
  edit "",1220,70 76 50 10,tab 16 autohs
  button "Reset ALL",1221,140 50 35 15,tab 16

  ; TAB 17

  box "",1301,10 17 230 80,tab 17
  box "Handles",1302,10 17 77 80,tab 17
  list 1303,13 27 70 70,tab 17
  list 1304,13 27 70 70,hide
  text "Credits:",1305,87 27 47 8,tab 17 right
  edit "",1306,135 25 45 10,tab 17 autohs
  text "Logins:",1307,87 38 47 8,tab 17 right
  edit "",1308,135 36 45 10,tab 17 autohs
  text "Uploaded Files:",1309,87 49 47 8,tab 17 right
  edit "",1310,135 47 45 10,tab 17 autohs
  text "Uploaded Bytes:",1311,87 60 47 8,tab 17 right
  edit "",1312,135 58 45 10,tab 17 autohs
  text "Downloaded Files:",1313,87 71 47 8,tab 17 right
  edit "",1314,135 69 45 10,tab 17 autohs
  text "Downloaded Bytes:",1315,87 82 47 8,tab 17 right
  edit "",1316,135 80 45 10,tab 17 autohs
  check "Leech",1317,185 47 35 8,tab 17
  check "BANNED",1318,185 58 35 8,tab 17


  ; TAB 18

  box "",1401,10 17 230 80,tab 18
  list 1402,13 27 140 70,tab 18 extsel
  button "Add",1403,155 27 30 15,tab 18
  button "Remove",1404,155 45 30 15,tab 18

  ; TAB 19

  box "Options",1501,10 15 211 87,tab 19
  box "Flood Prot",1502,115 15 106 87,tab 19
  check "Enable @find @locator",1503,15 23 100 10,tab 19
  text "Max matches:",1504,20 37 70 10,tab 19
  edit "",1506,85 35 15 10,tab 19 autohs
  check "Trigger after",1507,120 25 70 8,tab 19
  edit "",1508,130 35 15 10,tab 19 autohs
  text "requests in...",1509,148 37 60 8,tab 19
  edit "",1510,130 47 15 10,tab 19 autohs
  text "seconds, ignore...",1511,148 49 60 8,tab 19
  edit "",1512,130 59 15 10,tab 19 autohs
  text "seconds",1513,148 61 60 8,tab 19
  check "After a succesful @find, ignore",1514,120 73 100 10,tab 19
  text "requests",1515,130 85 20 10,tab 19
  edit "",1516,152 83 20 10,tab 19
  text "seconds",1517,174 85 25 10,tab 19

  text "text presets",2980,45 114 30 8
  combo 2981,75 113 75 100,drop
  combo 2982,75 113 75 100,drop hide
  button "save",2983,153 113 15 10

  check "File Server",2990,5 114 40 8

  button "OK",241,180 112 30 15,ok
  button "Cancel",242,215 112 30 15,cancel

  edit "0",497,999 999 1 1,hide
  edit "",498,999 999 1 1,hide
  list 499,999 999 1 1,hide
  edit "",500,999 999 1 1,hide
  button "help button",2999,-100 -100 1 1
}
alias _fserve.checkadvertmsg {
  if ($_rinitxt(_fservemsg) == $null) || ($1) { _winitxt _fservemsg Fserve- triggers[<TRIGGER>] snagged[<SNAGGEDFILES> files/<$_size(<SNAGGEDBYTES>)>] users[<USERS_CURR>/<USERS_MAX>] slots[<SENDS_CURR>/<SENDS_MAX>] ques[<QUEUE_CURR>/<QUEUE_MAX>] [next send: <NEXTSEND>] [cps in use: <CURRENT_CPS>] logins[<LOGINS>] record[<RECORDCPS>cps by <RECORDBY>] <FSERVE_DESC> (aIRC) }
}
alias _fserve.getlogins {
  if ($round($_getsetup(fserve,logins),0)) { return $ifmatch }
  return 0
}
alias _fserve.getrecordcps {
  if ($round($_getsetup(fserve,recordcps),0)) { return $ifmatch }
  return 0
}
alias _fserve.getrecordby {
  if ($_getsetup(fserve,recordby) != $null) { return $ifmatch }
  return ???
}

ON *:DIALOG:_fserve.setup:*:*:{
  if ($devent == init) {
    var %d = $dname
    _mdx.init $_icofile(fserve.ico,$scriptdir) title border sysmenu
    _mdx.SetControlMDX dialog.mdx $dname 2999 ContextHelp nocontrol
    _fserve.d.initpresets
    if ($_getsetup(fserve,fserve)) { did -c $dname 2990 }
    if ($_getsetup(fserve,useuserlist)) { did -c $dname 31 }
    if ($_isint($_getsetup(fserve,ratio))) {
      did -c $dname 33
      did -o $dname 37 1 $ifmatch
    }
    else {
      did -c $dname 32
      did -o $dname 37 1 3
    }
    if ($_getsetup(fserve,initialcredits) != $null) { did -o $dname 38 1 $ifmatch }
    if ($_getsetup(fserve,maxusers) != $null) { did -o $dname 40 1 $ifmatch }
    if ($_getsetup(fserve,description) != $null) { did -o $dname 46 1 $ifmatch }

    var %a = $_getsetup(fserve,triggers),%n = $numtok(%a,32),%i = 1,%t,%z,%y
    while (%i <= %n) {
      var %t = $gettok(%a,%i,32),%z = trigger_ $+ %t,%y = triggerchan_ $+ %t,%~ = $_getsetup(fserve,%y)
      did -a $dname 44 %t
      did -a $dname 54 %t $_getsetup(fserve,%z)
      if ($gettok(%~,1,32) isin 01) { did -a $dname 55 %~ }
      else { did -a $dname 55 0 }
      inc %i
    }
    did -c $dname 44 1

    did $iif($_getsetup(fserve,advertall),-u,-c) $dname 71
    if ($_fixchans($_getsetup(fserve,chanlist)) != $null) { did -o $dname 73 1 $ifmatch }
    if ($_getsetup(fserve,advertonjoin)) { did -c $dname 80 }
    if ($_getsetup(fserve,advertonlist)) { did -c $dname 81 }
    if ($_getsetup(fserve,advertimed)) { did -c $dname 84 }
    var %delay = $_getsetup(fserve,adverttimedelay),%mdelay = $round($calc(%delay / 60),0)
    did -o $dname 86 1 %mdelay
    _fserve.checkadvertmsg
    if ($_rinitxt(_fservemsg) != $null) { did -o $dname 92 1 $ifmatch }

    var %acom = $_getsetup(fserve,commands),%commands = cancel cd credits dir find get info ls msg queue queues quit ratio read say search srch sends stats top who,%i,%tc
    %i = $numtok(%commands,32)
    while (%i) {
      %tc = $gettok(%commands,%i,32)
      did -a $dname $iif($istok(%acom,%tc,32),1034,1031) %tc
      dec %i
    }
    did $iif($_getsetup(fserve,helponinvalid),-c,-u) $dname 1037

    did -o $dname 1212 1 $_fserve.getlogins
    did -o $dname 1214 1 $_getsetup(fserve,Dfiles)
    did -o $dname 1216 1 $_getsetup(fserve,Dbytes)
    did -o $dname 1218 1 $_fserve.getrecordcps
    did -o $dname 1220 1 $_fserve.getrecordby

    did -b $dname 1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318
    var %file = $_userinifile,%i = 1,%n = $ini(%file,0),%handle
    while (%i <= %n) {
      %handle = $ini(%file,%i)
      if ($_fserve.getuser(%handle,logins)) {
        _fserve.setuserfields %handle
        did -a $dname 1303 %handle
        did -a $dname 1304 $_fserve.getuser(%handle,credits) $_fserve.getuser(%handle,ufiles) $_fserve.getuser(%handle,ubytes) $_fserve.getuser(%handle,dfiles) $_fserve.getuser(%handle,dbytes) $_fserve.getuser(%handle,leech) $_fserve.getuser(%handle,ban) $_fserve.getuser(%handle,logins)
      }
      inc %i
    }
    var %i = 1,%n = $_list.total(fservebans)
    while (%i <= %n) {
      did -a $dname 1402 $_list.get(fservebans,%i)
      inc %i
    }

    did $iif($_getsetup(fserve,@find@locator),-c,-u) %d 1503
    if ($_isint($_getsetup(fserve,@maxmatches))) { did -o %d 1506 1 $ifmatch }
    else { did -o %d 1506 1 6 }
    did $iif($_getsetup(fserve,@floodprot.state),-c,-u) %d 1507
    if ($_isint($_getsetup(fserve,@floodprot.reqs))) { did -o %d 1508 1 $ifmatch }
    else { did -o %d 1508 1 4 }
    if ($_isint($_getsetup(fserve,@floodprot.secs))) { did -o %d 1510 1 $ifmatch }
    else { did -o %d 1510 1 10 }
    if ($_isint($_getsetup(fserve,@floodprot.ignt))) { did -o %d 1512 1 $ifmatch }
    else { did -o %d 1512 1 20 }
    did $iif($_getsetup(fserve,@secondsprot.state),-c,-u) %d 1514
    if ($_isint($_getsetup(fserve,@secondsprot.secs))) { did -o %d 1516 1 $ifmatch }
    else { did -o %d 1516 1 8 }

    _dummy $_lang.loaddialog($dname,$dname,00086969,fserve.lang,$scriptdir)

    _fserve.setup.refreshfiledir
  }
  elseif ($devent == sclick) {
    if ($did == 33) { _dummy $_warndlg(File Server,Please note that if you enable<CRLF>the fserve ratio<COMMA> the users won't<CRLF>be able to queue transfers) }
    elseif ($did == 44) { _fserve.setup.refreshfiledir }
    elseif ($did == 48) { _fserve.setup.askdir }
    elseif ($did == 50) { _fserve.setup.askwelcome }
    elseif ($did == 51) {
      if ($did(50).text != $null) && ($isfile($did(50).text)) { _notepad $did(50).text }
    }
    elseif ($did == 52) { _fserve.setup.addtrigger }
    elseif ($did == 53) { _fserve.setup.deltrigger }
    elseif ($did == 56) { _fserve.setup.savebufchans }
    elseif ($did == 94) { _txtpreviewin $dialog($dname).x 1 $dialog($dname).w 80 $dname 92 92 - _fserve.winprev }
    elseif ($did == 241) { _fserve.savesetup }
    elseif ($did == 242) {  }
    elseif ($did == 1032) { _dialog.move $dname 1031 1034 }
    elseif ($did == 1033) { _dialog.move $dname 1034 1031 }
    elseif ($did == 1221) {
      did -o $dname 1212,1214,1216,1218 1 0
      did -o $dname 1220 1 ???
    }
    elseif ($did == 1303) {
      var %tmp = $did($dname,1304,$did($dname,1303).sel)
      did -e $dname 1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318
      did -o $dname 1306 1 $gettok(%tmp,1,32)
      did -o $dname 1310 1 $gettok(%tmp,2,32)
      did -o $dname 1312 1 $gettok(%tmp,3,32)
      did -o $dname 1314 1 $gettok(%tmp,4,32)
      did -o $dname 1316 1 $gettok(%tmp,5,32)
      did $iif($gettok(%tmp,6,32),-c,-u) $dname 1317
      did $iif($gettok(%tmp,7,32),-c,-u) $dname 1318
      did -o $dname 1308 1 $gettok(%tmp,8,32)
    }
    elseif (13?? iswm $did) { _fserve.setup.saveusrbuf }
    elseif ($did == 1403) {
      _dialog.add $dname 1402 $_fixmask($_parameter($null,1,File Server Setup [/fssetup],ismask,$null,Enter address to ban from the file server: nick!ident@host<CRLF>Wildcards allowed))
      did -o $dname 497 1 1
    }
    elseif ($did == 1404) { _dialog.delsels $dname 1402 }
    elseif ($did == 2981) { _fserve.d.txtpreset $did($dname,2982,$did($dname,2981).sel) }
    elseif ($did == 2983) {
      _addontextscheme.save $dname Fserve fsts 92,_fservemsg,+
      if ($result != $null) { _fserve.d.initpresets $ifmatch }
    }
    elseif ($did == 2999) {
      ;;; ths GPF mIRC when used without timers... why?
      .timer -o 1 0 help File Server
    }
  }
  elseif ($devent == dclick) {
    if ($did == 1031) { _dialog.move $dname 1031 1034 }
    elseif ($did == 1034) { _dialog.move $dname 1034 1031 }
  }
  elseif ($devent == edit) {
    if ($did == 57) { _fserve.setup.savebufchans }
    elseif (13?? iswm $did) { _fserve.setup.saveusrbuf }
  }
  if ($did($dname,31).state) {
    did -e $dname 32,33,27,38
    did $iif($did($dname,33).state,-e,-b) $dname 37
  }
  else {
    did -c $dname 32
    did -bu $dname 33,37,27,38
  }
  did $iif($did($dname,56).state,-e,-b) $dname 57
  did $iif($did($dname,84).state,-e,-b) $dname 86
  did $iif($did($dname,71).state,-e,-b) $dname 73
}
alias -l _fserve.d.initpresets {
  var %d = _fserve.setup
  if ($dialog(%d) == $null) { return }
  did -r %d 2981,2982
  did -o %d 2981,2982 1 Default
  _dummy $findfile($mircdiraddons\tschemes\,*.fsts,0,1,_fserve.d._initpresets $1-)
  if ($didwm(%d,2982,$1,1)) { did -c %d 2981 $ifmatch }
}
alias -l _fserve.d._initpresets {
  var %d = _fserve.setup,%file = " $+ $1- $+ ",%name = $read -nsschemename %file ,%author = $read -nsauthor %file
  if (%name != $null) {
    if (%author != $null) { did -a %d 2981 %name ( $+ %author $+ ) }
    else { did -a %d 2981 %name }
    did -a %d 2982 $nopath(%file)
  }
}
alias -l _fserve.d.txtpreset {
  var %d = _fserve.setup,%default,%evangelion,%file
  if ($dialog(%d) == $null) { return 1 }
  %default = Fserve- triggers[<TRIGGER>] snagged[<SNAGGEDFILES> files/<$_size(<SNAGGEDBYTES>)>] users[<USERS_CURR>/<USERS_MAX>] slots[<SENDS_CURR>/<SENDS_MAX>] ques[<QUEUE_CURR>/<QUEUE_MAX>] [next send: <NEXTSEND>] [cps in use: <CURRENT_CPS>] logins[<LOGINS>] record[<RECORDCPS>cps by <RECORDBY>] <FSERVE_DESC> (aIRC)
  if ($1- == default) { %evangelion = %default }
  else {
    %file = "addons\tschemes\ $+ $1- $+ "
    if ($isfile(%file)) { %evangelion = $read -ns_fservemsg %file }
  }
  if (%evangelion == $null) { %evangelion = %default }
  did -o $dname 92 1 %evangelion
}
alias _fserve.winprev {
  var %triggers = $_getsetup(fserve,triggers)
  if (%triggers == $null) { %triggers = $didtok($dname,44,32) }
  if (%triggers == $null) { %triggers = !trigger !aIRC }
  return $_evaltext($replace($1-,<TRIGGERS>,<TRIGGER>,<TRIGGER>,%triggers,<USERS_CURR>,$_dcctotal.fserv,<USERS_MAX>,$_getsetup(fserve,maxusers),<FSERVE_DESC>,$_getsetup(fserve,description),<LOGINS>,$_fserve.getlogins,<SNAGGEDFILES>,$_getsetup(fserve,Dfiles),<SNAGGEDBYTES>,$_getsetup(fserve,Dbytes),<RECORDCPS>,$_fserve.getrecordcps,<RECORDBY>,$_fserve.getrecordby,<FSERVE_RATIO>,$_fserve.longratio))
}
alias _fserve.longratio {
  if ($_getsetup(fserve,ratio)) { return 1: $+ $ifmatch }
  return leech
}
alias -l _fserve.setup.fixsaveusrbuf {
  var %sel = $9,%old = $did($dname,1304,%sel)
  return $iif($_isint($1),$1,$gettok(%old,1,32)) $iif($_isint($2),$2,$gettok(%old,2,32)) $iif($_isint($3),$3,$gettok(%old,3,32)) $iif($_isint($4),$4,$gettok(%old,4,32)) $iif($_isint($5),$5,$gettok(%old,5,32)) $iif($6 isin 01,$6,$gettok(%old,6,32)) $iif($7 isin 01,$7,$gettok(%old,7,32)) $iif($_isint($8),$8,$gettok(%old,8,32))
}
alias -l _fserve.setup.saveusrbuf {
  var %sel = $did($dname,1303).sel
  if (%sel) {
    did -o $dname 1304 %sel $_fserve.setup.fixsaveusrbuf($did(1306),$did(1310),$did(1312),$did(1314),$did(1316),$did(1317).state,$did(1318).state,$did(1308),%sel)
    did -o $dname 497 1 1
  }
}
alias -l _fserve.setup.refreshfiledir {
  var %d = _fserve.setup,%sel,%48,%50,%56,%57
  if ($dialog(%d)) {
    if ($did(%d,44,1).sel) {
      %sel = $ifmatch
      %48 = $gettok($did(%d,54,%sel),2,$asc(*))
      %50 = $gettok($did(%d,54,%sel),3,$asc(*))
      %56 = $gettok($did(%d,55,%sel),1,32)
      %57 = $gettok($did(%d,55,%sel),2-,32)
    }
    if (%48 != $null) { did -o %d 48 1 $ifmatch }
    else { did -r %d 48 }
    if (%50 != $null) { did -o %d 50 1 $ifmatch }
    else { did -r %d 50 }
    did $iif(%56,-c,-u) %d 56
    if (%57 != $null) { did -o %d 57 1 $ifmatch }
    else { did -r %d 57 }
  }
}
alias _fserve.setup.askdir {
  var %d = _fserve.setup,%t,%z
  if ($dialog(%d)) && ($did(%d,44,1).sel) {
    var %sel = $ifmatch,%t = $did(%d,44,%sel),%c = trigger_ $+ %t,%c = $_getsetup(fserve,%c),%z = $_text($gettok(%c,2,$asc(*)))
    if ($did(%d,48) != $null) { did -r %d 48 }
    else { _dialog.dir %d 48 $iif(%z != $null,%z,$mircdir) $+ $chr(9) $+ Fserve home directory for %t : }
    if ($dialog(%d)) { did -o %d 54 %sel _* $did(%d,48) * $gettok($did(%d,54,%sel),3,$asc(*)) }
  }
}
alias _fserve.setup.askwelcome {
  var %d = _fserve.setup,%t,%z
  if ($dialog(%d)) && ($did(%d,44,1).sel) {
    var %sel = $ifmatch,%t = $did(%d,44,%sel),%c = trigger_ $+ %t,%c = $_getsetup(fserve,%c),%z = $gettok(%c,3,$asc(*))
    if ($did(%d,50) != $null) { did -r %d 50 }
    else { _dialog.file %d 50 $iif(%z != $null,%z,$mircdir*.*) $+ $chr(9) $+ Fserve Welcome file for %t : }
    if ($dialog(%d)) { did -o %d 54 %sel _* $gettok($did(%d,54,%sel),2,$asc(*)) * $did(%d,50) }
  }
}
alias _fserve.setup.savebufchans {
  var %d = _fserve.setup,%t,%z
  if ($dialog(%d)) && ($did(%d,44,1).sel) {
    var %sel = $ifmatch
    did -o %d 55 %sel $did(%d,56).state $did(%d,57)
  }
}
alias _fserve.setup.addtrigger {
  var %d = _fserve.setup,%trigger = $_parameter($null,1,Fserve Setup [/fssetup],1,$null,Enter new trigger:),%dir
  if ($dialog(%d)) {
    dialog -v %d
    if ($findtok($didtok(%d,44,32),%trigger,1,32)) { did -c %d 44 $ifmatch }
    else {
      %dir = $sdir="Fserve home directory for %trigger :" $mircdir
      if ($dialog(%d) == $null) || ($isdir(%dir) == $false) { return }
      did -ac %d 44 %trigger
      did -a %d 54 %trigger _* %dir $+ *
    }
    _fserve.setup.refreshfiledir
  }
}
alias _fserve.setup.deltrigger {
  var %d = _fserve.setup,%sel,%lines
  if ($dialog(%d)) {
    %sel = $did(%d,44,1).sel
    if (%sel) {
      did -d %d 44,54.55 %sel
      %lines = $did(%d,44).lines
      if (%sel <= %lines) { did -c %d 44 %sel }
      else { did -c %d 44 $calc(%sel - 1) }
    }
    _fserve.setup.refreshfiledir
  }
}
alias _fserve.savesetup {
  var %d = $dname
  _settsetup fserve useuserlist $did($dname,31).state
  if ($did(32).state) { _settsetup fserve ratio 0 }
  elseif ($did(37).text isnum) && ($did(37).text > 0) { _settsetup fserve ratio $did(37).text }
  if ($did(38).text isnum) && ($did(38).text > 0) { _settsetup fserve initialcredits $did(38).text }
  if ($did(40).text isnum) && ($did(40).text > 0) { _settsetup fserve maxusers $did(40).text }
  _settsetup fserve description $strip($did(46).text)

  var %a = $_getsetup(fserve,triggers),%n = $numtok(%a,32),%i = 1,%t,%z
  while (%i <= %n) {
    var %t = $gettok(%a,%i,32),%z = trigger_ $+ %t,%y = triggerchan_ $+ %t
    _settsetup fserve %z
    _settsetup fserve %y
    inc %i
  }

  var %a,%n = $did(54).lines,%i = 1,%t,%z
  while (%i <= %n) {
    var %t = $did(44,%i),%z = trigger_ $+ %t,%y = triggerchan_ $+ %t,%a = %a %t
    _settsetup fserve %z $did(54,%i)
    _settsetup fserve %y $gettok($did(55,%i),1,32) $_fixchans($gettok($did(55,%i),2-,32))
    inc %i
  }
  _settsetup fserve triggers %a

  _settsetup fserve advertall $_not($did($dname,71).state)
  if ($_fixchans($did($dname,73)) != $null) { _settsetup fserve chanlist $ifmatch }
  _settsetup fserve advertonjoin $did(80).state
  _settsetup fserve advertonlist $did(81).state
  _settsetup fserve advertimed $did(84).state
  var %delay = $_text($strip($did(86).text))
  if ($_isint(%delay)) { _settsetup fserve adverttimedelay $calc(%delay * 60) }
  if ($did(92).text != $null) { _winitxt _fservemsg $ifmatch }
  _settsetup fserve commands $didtok($dname,1034,32)
  _settsetup fserve helponinvalid $did(1037).state

  if ($_isint($did($dname,1212,1))) { _settsetup fserve logins $ifmatch }
  if ($_isint($did($dname,1214,1))) { _settsetup fserve Dfiles $ifmatch }
  if ($_isint($did($dname,1216,1))) { _settsetup fserve Dbytes $ifmatch }
  if ($_isint($did($dname,1218,1))) { _settsetup fserve recordcps $ifmatch }
  var %t = $did($dname,1220,1)
  if (%t != $null) && (%t != ???) { _settsetup fserve recordby %t }

  var %i = 1,%n = $did($dname,1303).lines,%handle,%tmp
  while (%i <= %n) {
    var %handle = $did($dname,1303,%i),%tmp = $did($dname,1304,%i)
    if ($_isuser(%handle)) {
      _fserve.setuser %handle credits $gettok(%tmp,1,32)
      _fserve.setuser %handle ufiles $gettok(%tmp,2,32)
      _fserve.setuser %handle ubytes $gettok(%tmp,3,32)
      _fserve.setuser %handle dfiles $gettok(%tmp,4,32)
      _fserve.setuser %handle dbytes $gettok(%tmp,5,32)
      _fserve.setuser %handle leech $gettok(%tmp,6,32)
      _fserve.setuser %handle BAN $gettok(%tmp,7,32)
      _fserve.setuser %handle logins $gettok(%tmp,8,32)
    }
    inc %i
  }

  ._list.flush fservebans
  var %i = 1,%n = $did($dname,1402).lines
  while (%i <= %n) {
    _list.add fservebans $did($dname,1402,%i)
    inc %i
  }

  _setsetup fserve @find@locator $did(%d,1503).state
  if ($_isint($did(%d,1506,1)) >= 1) { _setsetup fserve @maxmatches $ifmatch }
  else { _setsetup fserve @maxmatches 6 }
  _setsetup fserve @floodprot.state $did(%d,1507).state
  if ($_isint($did(%d,1508,1)) >= 1) { _setsetup fserve @floodprot.reqs $ifmatch }
  else { _setsetup fserve @floodprot.reqs 4 }
  if ($_isint($did(%d,1510,1)) >= 1) { _setsetup fserve @floodprot.secs $ifmatch }
  else { _setsetup fserve @floodprot.secs 10 }
  if ($_isint($did(%d,1512,1)) >= 1) { _setsetup fserve @floodprot.ignt $ifmatch }
  else { _setsetup fserve @floodprot.ignt 20 }
  if ($_isint($did(%d,1516,1)) >= 1) { _setsetup fserve @secondsprot.secs $ifmatch }
  else { _setsetup fserve @secondsprot.secs 3 }
  _setsetup fserve @secondsprot.state $did(%d,1514).state

  if ($did($dname,497,1)) { _fserve.checkfserves }

  __hashsavebuf _aircsetup script.dat

  if ($did($dname,2990).state) { ._fserve.turn on }
  else { ._fserve.turn off }
}
alias _fserve.ad.allchans {
  .timer_fserveadvert.* off
  if ($_connected) && ($_getsetup(fserve,fserve)) && ($_getsetup(fserve,triggers)) && ($_getsetup(fserve,advertimed)) {
    var %i = $chan(0)
    while (%i) {
      _fserve.ad.chan $chan(%i)
      dec %i
    }
  }
}
alias _fserve.ad.chan {
  var %chan = $1,%int,%last
  .timer_fserveadvert. $+ %chan off
  if ($_connected) && ($me ison %chan) && ($_getsetup(fserve,fserve)) && ($_getsetup(fserve,triggers)) && ($_getsetup(fserve,advertimed)) && ($_fserve.isadvertchan(%chan)) && ($_isint($_getsetup(fserve,adverttimedelay))) {
    %int = $ifmatch
    %last = $_get(junk,fserve.ad.last,%chan)
    if (%last > $ctime) { %last = $ctime - 60 }
    if (%last == $null) || ($calc(%last + %int) < $ctime) { _fserve.ad.send %chan }
    else { .timer_fserveadvert. $+ %chan 1 $calc(%int - $ctime + %last) _fserve.ad.send %chan }
  }
}
alias _fserve.ad.send {
  var %chan = $1,%int,%last
  .timer_fserveadvert. $+ %chan off
  if ($_connected) && ($me ison %chan) && ($_getsetup(fserve,fserve)) && ($_getsetup(fserve,triggers)) && ($_getsetup(fserve,advertimed)) && ($_fserve.isadvertchan(%chan)) {
    if ($_fserve.ad.msg(%chan) != $null) {
      _puthelp %chan c& msg %chan $ifmatch
      _setd junk fserve.ad.last %chan $ctime
    }
    if ($_isint($_getsetup(fserve,adverttimedelay))) { .timer_fserveadvert. $+ %chan 1 $ifmatch _fserve.ad.send %chan }
  }
}
; $_fserve.ad.msg(<channel>)
; if there are no triggers for the channel, returns $null
alias _fserve.ad.msg {
  var %triggers = $_fserve.gettriggersforchan($1)
  if (%triggers != $null) && ($_evaltext($replace($_rinitxt(_fservemsg),<TRIGGERS>,<TRIGGER>,<TRIGGER>,%triggers,<USERS_CURR>,$_dcctotal.fserv,<USERS_MAX>,$_getsetup(fserve,maxusers),<FSERVE_DESC>,$_getsetup(fserve,description),<LOGINS>,$_fserve.getlogins,<SNAGGEDFILES>,$_getsetup(fserve,Dfiles),<SNAGGEDBYTES>,$_getsetup(fserve,Dbytes),<RECORDCPS>,$_fserve.getrecordcps,<RECORDBY>,$_fserve.getrecordby,<FSERVE_RATIO>,$_fserve.longratio)) != $null) { return $ifmatch }
  ; just in case...
  return $null
}
; $_fserve.gettriggersforchan(<channel>)
alias _fserve.gettriggersforchan {
  var %chan = $1,%ftriggers,%striggers = $_getsetup(fserve,triggers),%i = $numtok(%striggers,32),%t,%y
  while (%i) {
    var %t = $gettok(%striggers,%i,32),%y = triggerchan_ $+ %t,%y = $_getsetup(fserve,%y)
    if ($_not($gettok(%y,1,32))) || ($istok($gettok(%y,2-,32),%chan,32)) { %ftriggers = $addtok(%ftriggers,%t,32) }
    dec %i
  }
  return %ftriggers
}
; $_fserve.isactivetriggerforchan(<trigger>,<channel>)
alias _fserve.isactivetriggerforchan {
  var %t = $1,%chan = $2,%y = triggerchan_ $+ %t,%y = $_getsetup(fserve,%y)
  if ($_not($gettok(%y,1,32))) || ($istok($gettok(%y,2-,32),%chan,44)) { return 1 }
  return 0
}
alias _fserve.isadvertchan {
  if ($_getsetup(fserve,advertall)) { return 1 }
  if ($istok($_fixchans($_getsetup(fserve,chanlist)),$1,44)) { return 1 }
  return 0
}
alias _fserve.init {
  $iif($_getsetup(fserve,fserve),.enable,.disable) #_fserve
  _fserve.ad.allchans
}
alias _fserve.sendrequest {
  var %file,%credits,%size,%queue,%(send),%(queue)

  if ($4- == $null) {
    _fservemsg $1 No filename specified.
    halt
  }
  if ($2 != $null) {
    _fserve.setuserfields $2
    %credits = $_fserve.getuser($2,credits)
  }
  %file = $3 $+ \ $+ $4-
  while (\\ isin %file) { %file = $replace(%file,\\,\) }
  %size = $file(%file).size
  if ($2 == $null) || ($_not($_getsetup(fserve,ratio))) || ($_fserve.getuser($2,leech)) || (%credits >= %size) {
    if ($_getsetup(fserve,ratio)) {
      .timer -o 1 0 _setsetup dcc sendqueue $_getsetup(dcc,sendqueue)
      _setsetup dcc sendqueue 0
    }
    %queue = $_dccsend($1,%file)
    %(send) = ( $+ $_dcctotal.send $+ / $+ $_getsetup(dcc,maxStotal) $+ )
    %(queue) = ( $+ $_sendqueue.queues $+ / $+ $_getsetup(dcc,maxQtotal) $+ )
    if (%queue == ERR_nofile) { _fservemsg $1 File not found: $^'($4-) }
    elseif (%queue == ERR_insend) { _fservemsg $1 You are already getting: $^'($4-) }
    elseif (%queue == ERR_inqueue) { _fservemsg $1 You already have $^'($4-) in my queue }
    elseif (%queue == ERR_nocomchan) { _fservemsg $1 Send slots full %(send) $+ . Queue slots available %(queue) but you must be in one of my channels in order to queue. }
    elseif (%queue == ERR_maxQtotal) { _fservemsg $1 Queue slots full %(queue) }
    elseif (%queue == ERR_maxQuser) { _fservemsg $1 You can't queue any more files. Your queues: ( $+ $_sendqueue.queues($1) $+ / $+ $_getsetup(dcc,maxQuser) $+ ) }
    elseif (%queue == ERR_maxStotal) { _fservemsg $1 There are too many get sessions %(send) }
    elseif (%queue == ERR_maxSuser) { _fservemsg $1 You have too many get sessions ( $+ $_dcctotal.send($1) $+ / $+ $_getsetup(dcc,maxSuser) $+ ) }
    elseif (ERR_* iswm %queue) { _fservemsg $1 Unknown Error. Can't send you $^'($4-) }
    elseif (%queue) { _fservemsg $1 Your request is now in my queue ( $+ %queue $+ / $+ $_getsetup(dcc,maxQtotal) $+ ) }
    elseif ($2 == $null) || ($_not($_getsetup(fserve,ratio))) || ($_fserve.getuser($2,leech)) { _fservemsg $1 Sending file: $^'($nopath(%file)) $^p($_size(%size)) }
    else {
      %credits = $calc(%credits - %size)
      _fserve.setuser $2 credits %credits
      _fservemsg $1 Sending file: $^'($nopath(%file)) $^p($_size(%size)) Credits: %credits
    }
  }
  else { _fservemsg $1 Not enough credits $^bp(%credits) Upload files to gain more. }
}
alias _fserve.help {
  var %known = $_getsetup(fserve,commands),%nick = $1,%com = $2
  if (%com == $null) { _fservemsg %nick Commands: %known help quit $+ $crlf $crlf $+ For detailed help: help <command> }
  elseif ($istok(quit bye exit,%com,32)) { _fservemsg %nick Usage: %com $crlf terminates the connection }
  elseif (%com == help) { _fservemsg %nick Usage: help [command] }
  elseif ($istok(%known,%com,32)) {
    if (%com == read) { _fservemsg %nick Usage: read [-lines] <file> $crlf reads the specified text file. }
    elseif ($istok(search srch find,%com,32)) { _fservemsg %nick Usage: %com <file|wildcard> $crlf searchs a file }
    elseif (%com == ratio) { _fservemsg %nick Usage: ratio $crlf displays the current fserve ratio }
    elseif (%com == credits) { _fservemsg %nick Usage: credits $crlf displays your current credits }
    elseif (%com == get) { _fservemsg %nick Usage: get <file> $crlf asks the fileserver to DCC Send the specified file }
    elseif (%com == stats) { _fservemsg %nick Usage: stats [file] $crlf shows stats for a file or the fserve }
    elseif (%com == info) { _fservemsg %nick Usage: info $crlf shows your user info }
    elseif (%com == top) { _fservemsg %nick Usage: top [number] $crlf shows the top10 downloaded files, a top file can be downloaded using: top <number> }
    elseif (%com == cd) { _fservemsg %nick Usage: cd [dir|..] $crlf changes the current directory }
    elseif (%com == dir) { _fservemsg %nick Usage: dir [[-b|-k]|[/w] [-#]] [file|wildcard] $crlf lists files in the current directory }
    elseif (%com == ls) { _fservemsg %nick Usage: ls [-#] [file|wildcard] $crlf lists files in the currenty directory using a wide listing }
    elseif (%com == who) { _fservemsg %nick Usage: who $crlf sends a list of who is connected }
    elseif (%com == say) { _fservemsg %nick Usage: say <message> $crlf sends a message to all the file server users }
    elseif (%com == msg) { _fservemsg %nick Usage: msg <nick> <message> $crlf sends a message to another file server user }
    elseif (%com == queue) { _fservemsg %nick Usage: queue $crlf shows your queue status }
    elseif (%com == sends) { _fservemsg %nick Usage: sends $crlf shows the active dcc sends }
    elseif (%com == queues) { _fservemsg %nick Usage: queues $crlf shows the active waiting queues }
    elseif (%com == cancel) { _fservemsg %nick Usage: cancel [string|N] $crlf cancels pending queues }
  }
  else { _fservemsg %nick Unknown command: %com }
}
menu menubar {
  &fserve
  .$`ifmm($_getsetup(fserve,fserve)) &turn $iif($_getsetup(fserve,fserve),off,on):{ fssetup $iif($_getsetup(fserve,fserve),off,on) }
  .&setup...:{ fssetup }
}