SQ-Script — File Browser

SQ-Scriptv3.5 / SQ-Scriptv3.5 / SQ-Script / sq-script.mrc

sq-script.mrc — 242.56 KB — Download this file

;version 3.5 built 5
;best viewed on font: fixedsys :)
;#######################################################################################
;# SQ-Script                                                                           #
;# http://SQ-Script.tech.nu - http://SQ-Script.cjb.net                                 #
;# Do only distribute the original ZIP/RAR-file                                        #
;# Please read the readme for help on this script                                      #
;#                                                                                     #
;# To configure just use ctrl+F1 or rightclick in any channel                          #
;# Don't touch anything below !                                                        #
;#######################################################################################

; General;No variable refers to accounts not managed by SQ-Script#You do not need to leave spaces between the normal text and a variables of SQ-script# Example: My server on ^IP:^port#Avoid using the semicolon, it will cause a the text to be splitted into two lines (same as ENTER)#Regular identifiers from the mIRC scripting language will also be evaluated !#Recommendation: Make a constant use of the preview buttons, but don't forget to use "Apply" afterwards#Although none of the variables is case sensitive you should preserve the case for better overview# #If you still need some variable tell me, so I'll add it
; IP;Your current IP resolved by mIRC#Example: My current IP is ^IP #=> My current IP is 127.0.0.1#If ^IP is a network-IP you might need to setup the mIRC-settings right:#Connect => Local Info#Set "on connect always get" Local Host and IP to enabled#Set "Lookup method" to SERVER# #This variable is the same as $IP it only bares the advantage of all SQ-Script variables
; Port;The port your server is listening to#Example: My Server is listening on port ^port #=> My Server is listening on port 21#This variable is always equal to the port that SQ-script uses to log to your server#If you decide to change your servers port you need to run selfconfiguration again #or enter the new value in the menu
; nick;The nick calling your trigger or @find#Example: You are ^nick and used my trigger #=> You are chatty and used my trigger #This works only in the triggers (ftp,stats) and @find#Whenever you use it somewhere else it returns your nick
; loggedup;The number of users currently logged to your server for upload#Example: There are currently ^loggedup uploaders on my server #=> There are currently 3 uploaders on my server#This refers to the total number of useraccounts created by SQ-script
; loggeddown;The number of users currently logged to your server for download#Example: There are currently ^loggeddown downloaders on my server #=> There are currently 3 downloaders on my server#This refers to the total number of useraccounts created by SQ-script
; logged;The total number of users currently logged to your server#Example: There are currently ^logged users on my server #=> There are currently 3 users on my server#This refers to the total number of users not regarding wether SQ-script made the account or not#Note that SQ-script will never count itself though it also logs in at the server as a user
; maxuserup;The maximum number of upload accounts SQ-script will create#Example: I can have up to ^maxuserup uploaders#=> I can have up to 2 uploaders#it returns the value you entered in the FTP server tab in SQ menu
; maxuserdown;The maximum number of download accounts SQ-script will create#Example: I can serve for up to ^maxuserdown downloaders#=> I can serve for up to 2 downloaders#it returns the value you entered in the FTP server tab in SQ menu
; users;Displays the nicks of all users on your server#Example: Right now there is ^users on my server #=> Right now there is chatty, hacker, overlord on my server#This variable will always return in the format: user, user, ..., user #this variable tries to keep up with netsplits,# meaning if someone got lost in an netsplit it will still return his nick#if nobody is on your server it returns <nobody>
; userup;Displays the nicks of users uploading on your server#Example: Right now there is ^userup uploading to my server #=> Right now there is hacker uploading to my server#This variable will always return in the format: user, user, ..., user #this variable tries to keep up with netsplits,# meaning if someone got lost in an netsplit it will still return his nick#if nobody is on your server it returns <nobody>
; userdown;Displays the nicks of users downloading on your server#Example: Right now there is ^userdown downloading from my server #=> Right now there is chatty, overlord downloading from my server#This variable will always return in the format: user, user, ..., user #this variable tries to keep up with netsplits,# meaning if someone got lost in an netsplit it will still return his nick#if nobody is on your server it returns <nobody>
; list;The triggertext to request your files list#Example: You can get my complete list of files by typing ^list#=> You can get my complete list of files by typing /msg <yournick> !filelist#This returns the trigger to request your fileslist used in @find#it is equal to the setting in the SQ-script menu
; trigger;The triggertext that displays your site info#Example: Get the information to access my site with ^trigger#=>Get the information to access my site with !siteinfo#This returns the setting you made in the SQ-script menu#NOTE: If you enabled listen for /ctcp <yournick> this variable will include it
; SYSuptime;The time your system is running since last reboot#Example: My PC has been up for ^SYSuptime#=> My PC has been up for 5days 10hrs 57mins 15secs#
; recorduptime;Your longest uptime period logged by SQ-script#Example: The longest period Wincrap didn't hang up was ^recorduptime#=> The longest period Wincrap didn't hang up was 1wk 4days 13hrs 46mins#Of course this will only return the longest uptime of your system since SQ-script was installed#for output format see mIRC help on $duration
; recorddownload;Displays the best download speed an the nick logged by SQ-script#Example: The download was ^recorddownload#=> The fastest download was 1,7kBytes/s by Mantaray#It always returns the fastest download in format: <speed> kBytes/s by <nick>#if nobody downloaded since you were using SQ-script it returns not set yet
; recordupload;Displays the best upload speed an the nick logged by SQ-script#Example: The upload was ^recordupload#=> The fastest upload was 8,3kBytes/s by Overmind#The same usage as ^bestdownload
; SQ;The version of SQ-script running on your mIRC#Example: I'm a proud user of SQ-script v^SQ #=> I'm a proud user of SQ-script v2.85#Examples may be used :)
; ServingFiles;The number of files found in your fileslist#Example: I have ^ServingFiles files to download from my server#=> I have 163 files to download from my server#it only returns the right value if you made your filelist with SQ-script#else it returns the number of lines of your current fileslist for @find
; ServingData;The amount of data of the files found in your fileslist#Example: I have ^ServingData to download from my server#=> I have 70,8MB to download from my server#it only returns the right value if you made your filelist with SQ-script#else it returns 0
; matches;The number of matches that were found on the "@find filename" request#Example: I found ^matches files that matched your @find request#=>I found 3 files that matched your @find request#This only works on the @find message else it returns 0
; searchword;The searchword that was used in "@find searchword"#Example: Wuhahah ! You were looking for ^searchword#=> Wuhahah ! You were looking for *smurfs*#as ^matches only works in the @find message else it returns No @find used
; @findresults;This shows the results of an @find request#Multi-line example:# I have found these files for your request:#^@findresults#That's all i have.#=>#I have found these files for your request:#D:\games\UT\maps\ShOwDoWn.umod#That's all i have# #^@findresults must stand alone in one line, no colors, bolds,etc.#If it is not used in an @find request it returns <@findresults>#If it does not appear in the @find message no results will be shown at all
; accountomat;This enables the account creation engine in SQ#Multi-line example:#Welcome to my server#^accountomat#ftp://^login:^password@^ip:^port/#=>Welcome to my server#SQ-script will now ask you some questions to create an account for you#Please enter what you want to do on my server [upload/download]# (user answers) upload#You are required to use this host to log in: user.host.isp.com#Account was successfully created. You have 2minutes to log in#ftp://SQ1:sfefs@235.3.45.3:21/# #The part after this variable will only be displayed if an account was successfully created#Login and Password are generated by SQ-script and are shown in the ^login and ^password variables#If not used in a trigger or previewed it returns <accountmaker>
; bandwidthdown;This displays your current downstream bandwidth usage#Example: There are ^bandwidthdown kb/s of my 80kb/s downstream used#=> There are 42,507 kb/s of my 80kb/s downstream used#it does only count the amount used by accounts made by SQ-Script# #Remeber:Downstream = way from the internet down to your PC
; bandwidthup;This displays your current upstream bandwidth usage#Example: There are ^bandwidthup kb/s of my 12kb/s upstream used#=> There are 10,302 kb/s of my 12kb/s upstream used#it does only count the amount used by accounts made by SQ-Script# #Remeber:UPstream = way from your PC UP to the internet
; NewOnServer;Displays radnom selection from new stuff on server#Example: I have ^NewOnServer brandnew on my server#=> I have UT: ToTaLdEsTrUcTiOn.umod brandnew on my server#You must set up the messages first using the button below
; ConnectionsUp;The number of connections to your server sinc it is running#Example: I had ^connectionsUp people looking at my server since it is running#=> I had 34 people looking at my server since it is running#This is a variable set by the server. It must be enabled in the SQ-script menu#it always starts at 1
; Connections24;The number of connections to your server in the last 24 hours#Example There were ^connections24 people on my server today#=> There were 5 people on my server today#This is a variable set by the server. It must be enabled in the SQ-script menu
; ServerUptimeMM;The minutes your server is running#Example: My Server is running the ^ServerUptimeDD.day for ^ServerUptimeHH hours and ^ServerUptimeMM minutes#=> My Server is running the 11.day for 2hours and 7 minutes#This is a variable set by the server. It must be enabled in the SQ-script menu
; ServerUptimeHH;The hours your server is running#Example: My Server is running the ^ServerUptimeDD.day for ^ServerUptimeHH hours and ^ServerUptimeMM minutes#=> My Server is running the 11.day for 2hours and 7 minutes#This is a variable set by the server. It must be enabled in the SQ-script menu
; ServerUptimeDD;The number of days your server is running#Example: My Server is running the ^ServerUptimeDD.day for ^ServerUptimeHH hours and ^ServerUptimeMM minutes#=> My Server is running the 11.day for 2hours and 7 minutes#This is a variable set by the server. It must be enabled in the SQ-script menu
; ServerUptimetotal;The time your server has been running since installation#Example: My Server has been running ^ServerUptimetotal since I installed it#=> My Server has been running 2d08:51:37 since i installed it#This is a variable set by the server. It must be enabled in the SQ-script menu
; serverUP;The amount of data uploaded to your server since installation#Example: Generous people uploaded ^serverUP since I installed my server#=> Generous people uploaded 3,01G since i installed my server#This variable autoadjusts its length to 3 digits plus suffix#This is a variable set by the server. It must be enabled in the SQ-script menu
; serverDOWN;The amount of data downloaded from your server since installation#Example: ^serverDown has been downloaded since i installed my server#=> 24.3G have been downloaded since i installed my server#same rules as ^serverUP
; serverMOVED;The the amount of data moved by your server since installation#Example: My server moved ^servermoved since i installed it#=>My server moved 214G since i installed it#Always returns ^serverUP + ^serverDown#same rules as ^serverUP
; SstartUP;The amount of data uploaded to your server since the server is running#Example: My server has recieved ^SstartUP since it is running#=> My server has recieved 530KB since it is running#same rules as ^serverUP
; SstartDOWN;The amount of data downloaded from your server since the server is running#Example: I have served ^SstartDown since i started the server#=> I have served 2,60G since i started the server#same rules as ^serverUP
; SstartMOVED;The amount of data moved by your server since the server is running#Example: My server has moved ^SstartMoved since it is running#=> My server has moved 23MB since it is running#same rules as ^serverMoved
; SstartFILESup;The amount of files uploaded to your server sonce it is runnging#Example: People have uploaded ^SstartFILESup files since i started the server#=> People have uploaded 3 files since i started the server#This is a variable set by the server. It must be enabled in the SQ-script menu
; SstartFILESdown;The amount of files downloaded from your server since it is running#Example: I have served ^SstartFILESdown files since i started the server#=> I have served 706 files since i started the server#same rules as ^SstartFILESup
; SstartFILESmoved;The amount of files moved by your server since it is running#Example: My server has handled ^SstartFILESmoved since it is running#=> My server has handled 708 files since it is running# always returns ^SstartFILESup + ^SstartFILESdown#same rules as ^SstartFILESup
; serverversion;Returns the version of your server#Example: I'm running ^serverversion#=> I'm running BulletProof FTP Server v2.15#This Variable is set by the server and must be enabled in the SQ-script menu else it returns nothing
; RAM;Returns your RAM total#Example: My computer has ^RAM RAM#=> My computer has 127MB RAM#same rules as ^serverversion
; CPU;Returns information about your CPU#My hamster in his wheel is ^CPU#=> My hamster in his wheel is 1xIntel Pentium III 597 Mhz#same rules as ^serverversion
; OSversion;Returns inforation about your operating system#My computer is infected with ^OSversion#=> My computer is infected with Windows 98 4.10 A#same rules as ^serverversion# #Comment: My system hang up upon writing this example :(
; diskfree[drive];Returns how much free space you have on the specified fixed drive#Example: You can fill up to ^diskfree[d] on my D drive#=> You can fill up to 766MB on my D drive#If you do not specify a fixed drive it returns not available#This variable is refreshed every 60secs
; disksize[drive];Returns the size of the specified fixed drive#Example: My C drive is ^disksize[c] big#=> My C drive is 81MB big#same rules as ^discfree[drive]
; diskfill[drive];Returns the amount of data stored on the specified drive#Example: I'm serving ^diskfill[d] from my D drive#=> I'm serving 23.6G from my D drive#always returns ^disksize[drive] - ^diskfree[drive]#same rules as ^diskfree[drive]
; diskfreetotal;Returns how much free space you have on all fixed drives together#Example: I have ^diskfreetotal free on drives#=> I have 506KB free on my drives#same rules as ^diskfree[drive]
; disksizetotal;Returns the total available size of your fixed drives#Example: My total diskspace is ^disksizetotal#=> My total diskspace is 129G#same rules ^diskfree[drive]
; diskfilltotal;Returns the total amount of data on all your fixed drives#Example: I have ^diskfilltotal junk on my drives#=> I have 128G junk on my drives#same rules as ^diskfree[drive]
; downloads24h;Returns the amount of data downloaded over the last 24h#Example: I have served ^downloads24h during the last 24h#=> I have served 24.3MB during the last 24h#The same works with ^downloads168h and ^downloads720h which is one week and one month
; uploads24h;Returns the amount of data uploaded over the last 24h#Example: I got uploaded ^uploads24h during the last 24h#=> I got uploaded 24.3MB during the last 24h#The same works with ^uploads168h and ^uploads720h which is one week and one month

;##################################Debug Help##################################

alias sq.version {
  var %vers = $read(" $+ $script $+ ",1)
  return $gettok(%vers,2,32) $+ . $+ $gettok(%vers,4,32)
}

;##################################Menu Section##################################

Menu Channel,status,menubar,query,chat {
  -
  $iif(!$sq.get(sq.lock) && !$sq.get(lock),SQ-Script)
  .$iif($sq.get(sq.newversion),Update Script):sq.checkupdate
  .Menu (Ctrl+F1):SQ.menu
  .$iif($sq.istok(eggdrop.channel,$chan) && $me isreg $chan,OP/Voice me):SQ.automode $chan
  .$iif($away && $server,Back):SQ.away
  .$iif(!$away && $server,Away):SQ.away
  .Play Sound:SQ.sound
  .Open Telnet:sq.telnet
  .$iif($sq.istok(request.channel,$active),Request files):{
    var %tempchan = $active
    window -dhk0oCl36 +bt @SQ-req 300 300 297 100
    renwin @SQ-req @SQ-request Click to force requesting 
    var %count = 1
    while (%count <= $sq.num(request.address)) { 
      if ($ial($sq.tok(request.address,%count)).nick ison %tempchan) { aline -l @SQ-request  $ial($sq.tok(request.address,%count)).nick $+  }
      elseif ($sq.tok(request.nick,%count) ison %tempchan) { aline -l @SQ-request  $sq.tok(request.nick,%count) $+  }
      inc %count 1
    }
  }
  .Sound Control (F12):dialog -mdo vol vol
  .$iif($chan && $sq.get(@find.status),Search):sq.searchfiles $chan
}
menu @SQ-request { 
  lbclick:{ 
    var %nick = $strip($sline(@SQ-request,1))
    if ($sq.istok(request.nick,$strip($sline(@SQ-request,1)))) {
      sq.requestall %nick
    }
    else {
      var %count = 1
      while (%count <= $sq.num(request.address)) { 
        echo -st $sq.tok(request.address,%count) iswm $address(%nick,5)
        if ($sq.tok(request.address,%count) iswm $address(%nick,5)) {
          sq.requestall %nick
          break
        }
        inc %count 1
      }
    }
    window -c @SQ-request 
  } 
}
menu nicklist,query {
  $iif($ini($sq.dir $+ SQftp.log,$address($1,3),0) && !$sq.get(sq.lock) && !$sq.get(lock),Display FTP history):sq.ftplogview
  $iif($fline(@sq-hidden,$address($1,1) $+ *,0),Connect to FTP):sq.net.connect $1
}
menu @SQ-Script! {
  lbclick:{ if ($sq.get(sq.lock) || $sq.get(lock)) { halt } | sq.set 60 lb.selected $1 | sq.set 60 lb.nick $sq.tok(ftpnick,$sq.get(lb.selected)) }
  $iif($sq.get(sq.newversion),Update Script):sq.checkupdate
  $iif(!$sq.get(sq.lock) && !$mouse.lb,Menu (Crtl + F1)):SQ.menu
  $iif(!$sq.get(sq.lock) && !$mouse.lb && $away && $server,Back):SQ.away
  $iif(!$sq.get(sq.lock) && !$mouse.lb && !$away && $server,Away):SQ.away
  $iif(!$sq.get(sq.lock) && !$mouse.lb && $sq.get(ftp.status),Update Userlist (Crtl + F5)):SQ.ftp.check
  $iif(!$sq.get(sq.lock) && !$sq.get(ftp.status) && $sq.get(ftp.configured),Connect to server):SQ.ftp.check
  $iif(!$sq.get(sq.lock) && !$mouse.lb,Sound Control (F12)):dialog -mdo vol vol
  $iif(!$sq.get(sq.lock) && $mouse.lb && $sq.get(lb.selected),$sq.tok(ftpnick,$sq.get(lb.selected))):clipboard $sq.tok(ftpnick,$sq.get(lb.selected))
  $iif(!$sq.get(sq.lock) && $mouse.lb && $sq.get(lb.selected),$sq.tok(ftpip,$sq.get(lb.selected))):clipboard $sq.tok(ftpip,$sq.get(lb.selected))
  $iif(!$sq.get(sq.lock) && $mouse.lb && $sq.get(lb.selected),$sq.tok(ftphost,$sq.get(lb.selected))):clipboard $sq.tok(ftphost,$sq.get(lb.selected))
  $iif(!$sq.get(sq.lock) && !$mouse.lb,sfv-Checker):dialog -m sq.sfvlog sq.sfvlog
  -
  $iif(!$sq.get(sq.lock) && $mouse.lb && $SQ.get(lb.selected),Summary):sq.summary $sq.get(lb.selected)
  $iif(!$sq.get(sq.lock) && $mouse.lb && $sq.get(lb.selected),Kick):{
    sq.delaccount $remove($sq.tok(ftpaccount,$sq.get(lb.selected)),SQ) You just got kicked
    sq.sysmsg Kicked user from server. Please wait until screen is updated
    .timerSQ.event -o 1 10 sq.event
  }
  $iif(!$sq.get(sq.lock) && $mouse.lb && $sq.get(lb.selected),Ban):{
    sq.delaccount $remove($sq.tok(ftpaccount,$sq.get(lb.selected)),SQ) You just got banned
    sq.ftp.deny $sq.get(lb.nick)
    sq.sysmsg Baned user from server. Please wait while updateing screen
    .timerSQ.event -o 1 10 sq.event
  }
  $iif(!$sq.get(sq.lock) && $mouse.lb && $sq.get(lb.selected),Ignore and Ban):{ 
    ignore $sq.get(lb.nick) 1
    sq.delaccount $remove($sq.tok(ftpaccount,$sq.get(lb.selected)),SQ) You just got banned/ignored
  }
  $iif(!$sq.get(sq.lock) && $mouse.lb && $comchan($sq.get(lb.nick),0) && $sq.get(ftpip),IRC options):
  .Query:query $sq.get(lb.nick)
  .CTCP
  ..Ping:ctcp $sq.get(lb.nick) ping
  ..Time:ctcp $sq.get(lb.nick) time
  ..Version:ctcp $sq.get(lb.nick) version
  .DCC
  ..Send:dcc send $sq.get(lb.nick)
  ..Chat:dcc chat $sq.get(lb.nick)
  .Userinfo:uwho $sq.get(lb.nick)
  .DNS:dns $sq.get(lb.nick)
  $iif(!$sq.get(sq.lock),Display FTP history):sq.ftplogview
  $iif(!$sq.get(sq.lock) && !$mouse.lb && !$sq.get(lock),Open Telnet):sq.telnet
  $iif(!$sq.get(sq.lock) && !$mouse.lb && !$sq.get(lock),Lock SQ-script):sq.lock $input(Enter a key to lock SQ-script. $crlf $+ To unlock enter that key in the SQ log window,1,SQ LOCK)
  $iif(!$sq.get(sq.lock) && !$mouse.lb,Force Scriptupdate):{ sq.checkupdate | sq.set forceupdate 1 }
}
alias SQ.menu { 
  if ($dialog(sq)) { dialog -v sq }
  elseif (!$sq.get(sq.lock) && !$sq.get(lock)) {
    if ($calc($ctime - $sq.get(lastupdate)) > 86400) {
      sq.set lastupdate $ctime
      sq.checkupdate
    }
    sq.set temptime $ticks
    SQ.sysmsg Calling menu.....
    if ($SQ.get(window.state) == normal) { window -a @SQ-Script! }
    if (!$dialog(SQ)) { dialog -dmr SQ SQ }
  }
}
on *:close:@SQ-script!:{ .timerreopen 1 1 sq.reopen }
alias sq.reopen { SQ.sysmsg Please don't close this window | sq.event }
alias cF1 { sq.menu }
alias cF5 { sq.event }

;#########################################Misc section################################################

alias SQ.away {
  if (!$server) { halt }
  if ($away) && ($1 != recon) { 
    if (!$SQ.get(away.silent)) { 
      var %tempcount = 1
      while (%tempcount <= $chan(0)) {
        if ($chan(%tempcount) !isin $SQ.get(away.exclude) && !$sq.istok(request.channel,$chan(%tempcount))) { describe $chan(%tempcount) is back from: $awaymsg (gone for $duration($awaytime) $+ ) } 
        inc %tempcount
      }
    }
    .away 
    resetidle
  }
  elseif (!$away) && ($1 == recon) { .away $SQ.get(msg.away) }
  else {
    if (!$away) && ($1 == autoaway) { sq.set msg.away Autoaway after $SQ.get(away.autoaway.time) minutes idle | sq.set away.autoaway.status $true }
    elseif (!$away) && (!$1) { sq.set msg.away $$input(Enter your awayreason,1,Away,sleep) }
    .away $sq.get(msg.away)
    if (!$SQ.get(away.silent)) { 
      var %tempcount = 1
      while (%tempcount <= $chan(0)) {
        if ($chan(%tempcount) !isin $SQ.get(away.exclude) && !$sq.istok(request.channel,$chan(%tempcount))) { describe $chan(%tempcount) is now away: $sq.get(msg.away) (gone $asctime(HH:nn) $+ ) } 
        inc %tempcount 1
      }
    }
    sq.set away.time $ctime
  }
}
raw 305:*:{ 
  sq.del away.time msg.away
  SQ.sysmsg You're set to back from away 
  haltdef
}
raw 306:*:{
  if ($sq.get(away.tray)) { showmirc -t }
  SQ.sysmsg You're set to away 
  haltdef
}
alias SQ.sound {
  var %tempsound = $$sfile($mircdir $+ Sounds\,Choose the sound you want to play,Play)
  var %message $input(Enter a message to the sound,1,OK)
  sound $active %tempsound %message
}
on *:getfail:*.*:{ 
  if ($sq.istok(soundrequestfile,$nopath($filename))) { 
    .remove $filename 
    sq.rem soundrequestfile $nopath($filename)
  } 
}
on *:input:*:{
  if (/* !iswm $1-) {
    if ($away && $sq.get(away.autoaway.status)) { sq.away }
    elseif ($away && @ !isin $active) { echo $active 5,9Don't forget to cancel your away ! }
    if (@Telnet-* iswm $active) {
      if ($sq.get(sq.lock) || $sq.get(lock)) { halt }
      if (/* !iswm $1-) {
        if ($sq.istok(eggdrop.nick,$remove($active,@Telnet-))) { var %remote = $sq.findtok(eggdrop.nick,$remove($active,@Telnet-)) }
        else { var %remote = $remove($active,@Telnet-) }
        if ($sock(sq.telnet $+ %remote)) {
          sq.writetelnet %remote $1-
        }
        else { echo -am Not connected to remote }
        halt
      }
    }
    if ($active == @SQ-script!) {
      if ($1- == $sq.get(sq.lock) || $1- == $sq.get(lock)) { 
        sq.sysmsg SQ-script unlocked
        sq.del sq.lock
        sq.del lock
        halt
      }
      elseif ($sq.get(sq.lock) || $sq.get(lock)) { halt }
      if ($sq.get(ftp.status) && $sq.get(ftp.configured) == G6) {
        var %nick = $sq.findtok(ftpnick,$1)
        if (!%nick) { sq.sysmsg Cannot send msg to $1 (not found on server) }
        else {
          sq.ftp.tell $sq.tok(ftpaccount,%nick) prvcht $2-
          sq.sysmsg -> $+ $1 $+ <- $2-
        }
      }
      elseif ($sq.get(ftp.status) && $sq.get(ftp.configured) == Raiden) {
        sq.set ftpdirect 1
        sockwrite -n sq.ftp $1-
      }
      else { sq.sysmsg Cannot send msg (not connected) }
      halt
    }
    elseif ($sq.get(gimick)) { say $sq.gimick($1-) | haltdef }
  }
}
on *:open:?:*:{ 
  if (!$away && $SQ.get(sound.onquery)) { 
    if (!$sq.istok(request.nick,$nick) && !$sq.istok(request.address,$address($nick,3)) && !$sq.get(soundplaying)) {
      if ($sq.get(sound.silence)) {
        var %start = $sq.get(sound.silence.begin),%stop = $sq.get(sound.silence.stop)
        if ( %start < %stop ) && ($asctime(HH) > %start && $asctime(HH) < %stop) { halt }
        elseif ( %start > %stop ) && ($asctime(HH) > %start || $asctime(HH) < %stop) { halt }
      }

      if (!$sq.get(queryflood)) { .timerSQ.sound 1 3 .splay " $+ $SQ.get(sound.query) $+ " }
      else { .timersq.sound off }
      sq.set 5 queryflood 1 
      sq.set 20 soundplaying $nick
    }
  } 
  elseif ($away && $SQ.get(away.time) && $sq.get(away.notice)) { .notice $nick I'm currently away: $awaymsg (gone for $duration($awaytime) $+ ) }
}
on *:active:?:{
  if ($active == $sq.get(soundplaying)) {
    .timerSQ.sound off
    splay stop
  }
}

;##################################CTCP-FloodProtection & Sound#################################

ctcp *:*:*:{
  if ($sq.istok(noflood.ctcp.ignore,$1)) { halt }
  if ($1 != dcc) && ($1 != Sound) && ($SQ.get(floodprot) == 1) { sq.inc floodprot }
  elseif ($1 != dcc) && ($1 != Sound) && ($SQ.get(floodprot) == 2) { sq.inc floodprot | .ignore -ut60 $nick 4 }
  elseif ($1 != dcc) && ($1 != Sound) && ($SQ.get(floodprot) == 3) { 
    .ignore -tknu60 * | echo $active  | echo -at 5,9 SQ-Script Floodprotection activated by $nick with $1 ! All ctcps,colors and notices will be blocked | echo $active  | sq.del floodprot | halt 
  }
  elseif ($1 != dcc) && ($1 != Sound) && ($SQ.get(noflood.protecttime) != 0) { sq.set $SQ.get(noflood.protecttime) floodprot 1 }
  if ($away) && ($1 != dcc) && ($SQ.get(status.ctcpblock)) { haltdef }
  elseif ($away) && ($1 == dcc) && ($SQ.get(status.dccblock)) { haltdef }
  if ($1 == FTP && $longip($2) && $3) {
    if (!$SQ.get(trigger.status) || $sq.istok(ftp.denynick,$nick) || $sq.istok(ftp.denyaddress,$address($nick,3))) { halt }
    if ($sq.get(triggerbusy)) { .notice $nick I'm busy right now with $gettok($sq.get(triggerbusy),1,32) $+ . Please wait }
    elseif (!$SQ.get(ftp.status)) { .notice $nick FTP is down...sorry }
    else {
      var %count = 1,%found = 0,%type 
      while (%count <= $comchan($nick,0) && !%found) {
        sq.set tempchan $comchan($nick,%count)
        if ($SQ.get(msg.triggerO $+ $sq.get(tempchan)) && $nick isop $sq.get(tempchan)) { %found = 1 | %type = O }
        elseif ($sq.get(msg.triggerV $+ $sq.get(tempchan)) && $nick isvo $sq.get(tempchan)) { %found = 1 | %type = V }
        elseif ($sq.get(msg.triggerR $+ $sq.get(tempchan)) && $nick isreg $sq.get(tempchan)) { %found = 1 | %type = R }
        elseif ($sq.get(msg.triggerA $+ $sq.get(tempchan))) { %found = 1 | %type = A }
        inc %count 1
      }
      if (!%found) { 
        sq.del tempchan
        .notice $nick You may not use this trigger 
        halt
      }
      if ($3 == download) {
        if ($sq.gotaccount) { 
          .notice $nick You may only have one account. Aborting account creation
          sq.del tempchan
          halt
        }
        var %var = $remove($sq.tok(msg.trigger $+ %type $+  $+ $sq.get(tempchan),1),>)
        if ($sq.get(ftp.maxuserdown) <= $sq.ftpdownloaders || ($gettok(%var,6,47) && $gettok(%var,6,47) <= $sq.ftpdownloaders)) {
          .notice $nick Sorry downloads are full. try again later
          sq.del tempchan
          halt
        }
      }
      elseif ($3 == upload) {
        if ($sq.get(ftp.maxuserUP) <= $sq.ftpuploaders) {
          .notice $nick Sorry uploads are full. try again later
          sq.del tempchan
          halt
        }
      }
      sq.set triggerbusy $nick $sq.get(tempchan) %type $3
      sq.accountomat $nick $2 $4
    }
    halt
  }
  elseif ($1 == $sq.get(trigger.ftp) && $sq.get(trigger.ctcp)) {
    if (!$SQ.get(trigger.status) || $sq.istok(ftp.denynick,$nick) || $sq.istok(ftp.denyaddress,$address($nick,3))) { halt }
    if ($sq.get(triggerbusy)) { .notice $nick I'm busy right now with $gettok($sq.get(triggerbusy),1,32) $+ . Please wait }
    elseif (!$SQ.get(ftp.status)) { .notice $nick FTP is down...sorry }
    else {
      var %count = 1,%found = 0
      while (%count <= $comchan($nick,0) && !%found) {
        sq.set tempchan $comchan($nick,%count)
        if ($SQ.get(msg.triggerO $+ $sq.get(tempchan)) && $nick isop $sq.get(tempchan)) { %found = 1 | sq.trigger O }
        elseif ($sq.get(msg.triggerV $+ $sq.get(tempchan)) && $nick isvo $sq.get(tempchan)) { %found = 1 | sq.trigger V }
        elseif ($sq.get(msg.triggerR $+ $sq.get(tempchan)) && $nick isreg $sq.get(tempchan)) { %found = 1 | sq.trigger R }
        elseif ($sq.get(msg.triggerA $+ $sq.get(tempchan))) { %found = 1 | sq.trigger A }
        inc %count 1
      }
      if (!%found) { .notice $nick You may not use this trigger }
    }
    halt
  }
  elseif ($sq.get(@find.ctcp) && $1 == @find) { 
    if (!$2) { return }
    var %count = 1
    while (%count <= $sock(sq.@find*,0)) {
      sockwrite -n $sock(sq.@find*,%count) $comchan($nick,1) $nick $2-
      inc %count 1
    }
    dec %count 1
    if (%count > 1) { .notice $nick Looking up %count servers }
    halt
  }
  if ($1-2 == DCC SEND) {
    if ($sq.istok(request.address,$address($nick,3))) { var %tmpnick = $sq.tok(request.nick,$sq.findtok(request.address,$address($nick,3))) }
    elseif ($sq.istok(request.nick,$nick)) { var %tmpnick = $nick }
    if (%tmpnick) { 
      SQ.request $nick 
      var %file = $remove($gettok($3-,$calc($numtok($3-,32) -3),32),"),%nickpath = $replace(%tmpnick,<,_,>,_,:,_,\,_,/,_,|,_,*,_,?,_)
      var %path = $getdir(" $+ %file $+ ")
      if ($isfile(" $+ %path $+ complete\ $+ %nickpath $+ \ $+ %file $+ ")) {
        var %line = $read($sq.request.accfile(%tmpnick),w,* $+ $replace(%file,$chr(95),*,$chr(32),*) $+ *)
        if ($readn) { write -l $+ $readn $sq.request.accfile(%tmpnick) <success> ! $+ %tmpnick %file }
        halt 
      }
    }
  }
  if ($1 == sound) {
    if ($sq.get(sound.silence)) {
      var %start = $sq.get(sound.silence.begin),%stop = $sq.get(sound.silence.stop)
      if ( %start < %stop ) && ($asctime(HH) > %start && $asctime(HH) < %stop) { 
        echo 3 -t $target < $+ $nick $+ > $1 $+ : $2 (silenced) $3-
        halt
      }
      elseif ( %start > %stop ) && ($asctime(HH) > %start || $asctime(HH) < %stop) { 
        echo 3 -t $target < $+ $nick $+ > $1 $+ : $2 (silenced) $3-
        halt
      }
    }
    if ($away || $sq.get(sound.block) || !$appactive) { halt }
    if (!$3) {
      echo 4 -t $target < $+ $nick $+ > $1 $+ : $2
      if ($target != $active) { echo 4 -at < $+ $nick $+ / $+ $target $+ > $1 $+ : $2 }
      if ($isfile(" $+ $getdir(" $+ $2 $+ ") $+ $2 $+ ")) {
        if ($appactive) { splay " $+ $getdir(" $+ $2 $+ ") $+ $2 $+ " }
        haltdef
      }
      else {
        if (!$sq.istok(soundrequestfiles,$nopath($filename))) {
          if (!$away) && ($SQ.get(sound.request)) { .msg $nick ! $+ $nick $2 | sq.add soundrequestfile $nopath($2) } 
          elseif ($away) && ($SQ.get(sound.request)) && ($SQ.get(status.dccblock)) { .msg $nick ! $+ $nick $2  | sq.add soundrequestfile $nopath($2) }
        }
        haltdef
      }
    }
  }
}

;##################################@find Section##################################

alias sq.@findchecksockets {
  if (!$sock(sq.@srv) && $portfree(17000)) { sq.del @find.connection | socklisten sq.@srv 17000 }
  if (!$sock(sq.searchbot) && $sq.get(@find.connection.host)) { sockopen sq.searchbot $sq.get(@find.connection.host) 17000 | .timersq.search 1 10 sockclose sq.searchbot }
  if (!$sq.get(@find.connection.host)) { sq.sysmsg 4Cannot connect to @find server: No IP given }
}
on *:socklisten:sq.@srv:{
  var %rand = $rand(1,65535)
  while ($sq.istok(@find.connection,%rand)) { %rand = $rand(1,65535) }
  sockaccept sq.@find $+ %rand
  var %ip = $sock(sq.@find $+ %rand).ip
  if (%ip != 127.0.0.1 && %ip != $ip) { sq.sysmsg @find server accepted client from %ip }
}
on *:text:@find *:#:{
  if ($sq.get(@find.ctcp) || !$2 || $len($1-) < 9) { return }
  var %count = 1
  while (%count <= $sock(sq.@find*,0)) {
    sockwrite -n $sock(sq.@find*,%count) $comchan($nick,1) $nick $2-
    inc %count 1
  }
  dec %count 1
  if (%count > 1) { .notice $nick Looking up %count servers }
}
on *:text:!list:#:{
  if ($sq.get(ftp.!list) && $istok($sq.get(trigger.bannerchannel),$chan,44)) { .notice $nick $SQ.SetVariables($replace($sq.get(msg.banner),$chr(44),::)) 3 $+ $chr(443) $+ SQ $+ - $+ Script $+ $chr(427) }
}
on *:sockclose:sq.@find*:{ sq.deltok @find.connection $sq.findtok(@find.connection,$remove($sockname,@find)) }
on *:sockopen:sq.searchbot:{
  if ($sockerr == 3) { sq.sysmsg No @find server running on $sq.get(@find.connection.host) }
  elseif ($sockerr) { sq.sysmsg Could not connect to @find server }
  else { .timersq.search off | sq.sysmsg Connection to @find server established }
}
on *:sockclose:sq.searchbot:{ sq.sysmsg Connection to @find server lost }
on *:sockread:sq.searchbot:{
  if (!$SQ.get(@find.status) || !$SQ.get(@find.fileslist) || !$SQ.get(trigger.files)) { return }
  var %text
  sockread %text
  var %chan = $gettok(%text,1,32),%nick = $gettok(%text,2,32),%searched = $gettok(%text,3-,32)
  if (%nick == $me) { return }
  if ($comchan(%nick,0) > 1) {
    var %n = 1
    while (%n <= $comchan(%nick,0)) {
      %chan = $comchan(%nick,%n)
      if ($istok($sq.get(@find.channel),%chan,44)) { break }
      inc %n 1
    }
  }
  if (!$istok($sq.get(@find.channel),%chan,44)) { return }
  if (!$SQ.get(@findbusy)) {
    sq.set 40 @findbusy $true
    sq.set 40 @findrequester %nick
    set -u0 %@findsearchword * $+ $replace(%searched,$chr(32),$chr(42)) $+ *
    filter -ffc " $+ $SQ.get(@find.fileslist) $+ " SQ.tempfiles.txt %@findsearchword
    if ($filtered == 0) { 
      sq.del @findbusy @findrequester
      .remove SQ.tempfiles.txt 
    }
    elseif ($filtered > $SQ.get(@find.fileshits)) { 
      .msg $SQ.get(@findrequester) Too many hits on 4 $+ %@findsearchword $+  ( $+ $filtered matches $+ ) !
      if (!$sq.get(@find.sendmatches)) { .msg $SQ.get(@findrequester) Better get my fileslist on $SQ.get(trigger.files) }
      else { 
        var %file = Matches-SearchID $+ $rand(1,65535) $+ .txt
        while ($isfile($sq.dir $+ %file)) { %file = Matches-SearchID $+ $rand(1,65535) $+ .txt }
        .copy SQ.tempfiles.txt $SQ.dir $+ %file
        if ($lock(dll)) {
          sq.sysmsg Could not compress @find results. Please enable the use of DLLs in the mIRC options
          .dcc send $SQ.get(@findrequester) $sq.dir $+ %file
          .timer -o 1 300 .remove $sq.dir $+ %file
        }
        elseif ($dll($sq.dir $+ ngzipn.dll,zip,$sq.dir $+ %file)) { 
          %file = %file $+ .gz
          .dcc send $SQ.get(@findrequester) %file 
          .timer -o 1 300 .remove $sq.dir $+ %file
        }
        .msg $SQ.get(@findrequester) The matches will be sent to you as a file called %file $+ , please accept it. (use winzip to unpack)
      }
      if ($sq.get(@find.verbose)) { SQ.sysmsg Search for 5 $+ %@findsearchword $+  by 5 $+ $SQ.get(@findrequester) $+  has been flooded with 4 $+ $filtered $+  matches! }
      sq.del @findbusy @findrequester
      .remove SQ.tempfiles.txt
    }
    else { 
      set -u0 %@findhits $filtered
      var %tempcount = 1
      if ($sq.get(@find.verbose)) { SQ.sysmsg Search for 5 $+ %@findsearchword $+  by 5 $+ $SQ.get(@findrequester) $+  has been finished with 5 $+ $filtered $+  match(es)! }
      while (%tempcount <= $sq.num(msg.@find)) {
        if ($sq.tok(msg.@find,%tempcount) != ^@findresults) { .msg $sq.get(@findrequester) $SQ.SetVariables($replace($sq.tok(msg.@find,%tempcount),$chr(44),::)) }
        else { sq.set @findline %tempcount | .play $SQ.get(@findrequester) SQ.tempfiles.txt 1500 | break }
        inc %tempcount 1
      }
      if (%tempcount > $sq.num(msg.@find)) { .remove SQ.tempfiles.txt | sq.del @findbusy @findrequester @findline }
    }
    else { sq.del @findbusy }
  }
  else { .notice %nick 4SQ-script is busy with @find request from $SQ.get(@findrequester) $+ . Please wait }
}
on *:playend:{ 
  if (SQ.tempfiles.txt == $nopath($filename)) { 
    .remove SQ.tempfiles.txt 
    var %tempcount = $sq.get(@findline)
    inc %tempcount 1
    while (%tempcount <= $sq.num(msg.@find)) { 
      .msg $sq.get(@findrequester) $SQ.SetVariables($replace($sq.tok(msg.@find,%tempcount),$chr(44),::))
      inc %tempcunt 1
    }
    sq.del @findbusy @findrequester @findline
  } 
}

;##################################ON DNS###################################

on *:dns:{
  if ($iaddress) {
    if ($len($sq.get(hostlist)) >= 800) { sq.del hostlist dnslist }
    if (!$sq.istok(dnslist,$iaddress)) {
      sq.set dnslist $addtok($sq.get(hostlist),$iaddress,59)
      if ($naddress) { sq.add hostlist $naddress }
      else { sq.add hostlist $iaddress }
    }
    if ($sq.istok(dnslist,$iaddress) && !$sq.istok(hostlist,$nadress)) { sq.set hostlist $puttok($sq.get(hostlist),$naddress,$sq.findtok(dnslist,$iaddress),59) }
    if ($sq.istok(tempegg,$nick)) {
      var %count = $sq.findtok(tempegg,$nick)
      var %action1 = $gettok($sq.tok(tempeggaction,%count),1,32)
      var %action2 = $gettok($sq.tok(tempeggaction,%count),2,32)
      sq.rem tempegg $nick
      sq.set tempeggaction $remtok($sq.get(tempeggaction),%action1 %action2,1,59)
      if ($iaddress == $gettok($sq.tok(eggdrop.ip,%action1),1,58)) {
        if (%action2 == chat) { 
          var %active = $active
          sq.app tempchat %action1
          .dcc chat $sq.tok(eggdrop.nick,%action1) 
          if ($window(%active)) { window -a %active }
        }
        elseif (%action2 == telnet) { sq.telnet %action1 }
        elseif (%action == msg) { .msg $nick voice $sq.decrypt(@,$sq.tok(eggdrop.pass,%action1)) }
      }
      else { sq.sysmsg 4 $+ $nick $+ 's (eggdrop) resolved IP did did not match saved IP }
    }
  }
}
alias sq.listhost { return $iif($longip($1) && $sq.istok(dnslist,$1),$true,$false) }
alias sq.dnsip {
  if (@ isin $1) { var %host = $mid($1,$calc($pos($1,@) +1)) }
  else { var %host = $1 }
  if ($longip(%host)) { return %host }
  else { return $sq.tok(dnslist,$sq.findtok(hostlist,%host)) }
}
alias sq.dnshost { return $sq.tok(hostlist,$sq.findtok(dnslist,$1)) }
alias sq.iplookup {
  sockopen sq.checkip checkip.dyndns.org 80
  .timersq.checkip 1 15 sockclose sq.checkip
}
on *:sockopen:sq.checkip:{
  .timersq.checkip off
  if ($sockerr) { return }
  write -c temp.txt
  sockwrite -n $sockname GET / HTTP/1.0
  sockwrite -n $sockname Accept: */* 
  sockwrite -n $sockname Host: checkip.dyndns.org 
  sockwrite -n $sockname 
}
on *:sockread:sq.checkip:{ 
  sockread 4096 &d
  while ($sockbr) {
    bwrite temp.txt -1 -1 &d
    sockread 4096 &d
  }
}
on *:sockclose:sq.checkip:{
  sq.set currentip $gettok($read(temp.txt,12),4,32)
  .remove temp.txt
}
alias sq.ip { return $sq.get(currentip) }

;##################################Loader Section#################################

alias SQ.loadscript {
  if (!$sq.get(tempbusy)) { 
    var %sel *.ini,*.mrc
    var %tempscript = $$sfile($mircdir $+ %sel,Choose the Script you want to load !,Load)
    sq.set 5 tempbusy $true  
    .load -rs " $+ %tempscript $+ "
    SQ.sysmsg " $+ $nopath(%tempscript) $+ " has been loaded ! 
    if ($dialog(SQ)) {
      var %tempcount = 1
      var %counter = 1
      while (%tempcount <= $script(0)) { if (sq-script !isin $script(%tempcount)) { did -o SQ 428 %counter $nopath($script(%tempcount)) | inc %counter 1 } | inc %tempcount 1 }
    }
  }
}

;##################################Stats Section#################################

alias SQ.stats {
  var %tempcount = 1
  while (%tempcount <= $sq.num(msg.stat)) {
    var %tempmsg = $SQ.SetVariables($replace($sq.tok(msg.stat,%tempcount),$chr(44),::))
    if ($nick) { .msg $nick %tempmsg }
    else { say %tempmsg }
    inc %tempcount 1
  }
}
on *:connect:{
  if ($hget(sq.temps)) { hfree SQ.temps | hmake sq.temps 50 }
  If ($SQ.get(msg.away)) { SQ.away recon }
  .mode $me +i
  .timer 1 20 SQ.banner
  sq.iplookup
  var %n = 1
  while (%n <= $sq.num(request.channel)) {
    .timer 1 $calc(%n * 10) sq.requestjoin $sq.tok(request.channel,%n)
    inc %n 1
  }
}
on *:disconnect:{
  hsave -bo SQ.messages $sq.dir $+ SQ-hash.dat
  hsave -o sq.uploads $sq.dir $+ SQuploads.dat
  hsave -o sq.downloads $sq.dir $+ SQdownloads.dat
}
on *:load:{
  url -n http://sq-script.tech.nu/readme.htm
}
on *:start:{
  if ($version < 6.14) { 
    echo 4 -s Your mIRC is too old to run SQ-Script. Please update to 6.14 or higher 
    echo 4 -s SQ-Script will be unloaded.
    .timer 1 1 .unload -rs " $+ $script $+ "
    return
  }
  if (!$isfile($sq.dir $+ Squirrel.jpg)) { var %incomplete = 1 }
  if (!$isfile($sq.dir $+ ngzipn.dll)) { var %incomplete = 1 }
  if (%incomplete) {
    echo 4 -s Please unpack all files from the original archive. 
    echo 4 -s SQ-Script will be unloaded.
    .timer 1 1 .unload -rs " $+ $script $+ "
    return
  }
  .ctcps on | .ignore on | .ial on | .raw on | .pdcc on
  if (!$hget(sq.uploads)) { hmake SQ.uploads 20 }
  if (!$hget(sq.downloads)) { hmake SQ.downloads 100 }
  if (!$hget(sq.messages)) { hmake SQ.messages 10 }
  if (!$hget(sq.temps)) { hmake sq.temps 50 }
  if (!$hget(sq.vars)) { 
    hmake sq.vars 50 
    sq.ini2hash
  }
  if ($isfile($sq.dir $+ SQ-hash.dat)) { hload -b SQ.messages $sq.dir $+ SQ-hash.dat }
  if ($isfile($sq.dir $+ SQdownloads.dat)) { hload SQ.downloads $sq.dir $+ SQdownloads.dat }
  if ($isfile($sq.dir $+ SQuploads.dat)) { hload SQ.uploads $sq.dir $+ SQuploads.dat }
  .echo -q $findfile($sq.dir,Matches-SearchID*,0,.remove $+(",$1-,"))
  .echo -q $findfile($sq.dir,SQ.tempfiles*,0,.remove $+(",$1-,"))
  .echo -q $findfile($sq.dir,* Fileslist *,0,.remove $+(",$1-,"))
  var %num = 1,%time = $calc($ctime -604800)
  while (%num <= $hget(sq.downloads,0).item) {
    var %var = $hget(sq.downloads,%num).item
    if (%var < %time) { hdel sq.downloads %var }
    else { inc %num 1 }
  }
  var %num = 1
  while (%num <= $hget(sq.uploads,0).item) {
    var %var = $hget(sq.uploads,%num).item
    if (%var < %time) { hdel sq.uploads %var }
    else { inc %num 1 }
  }
  .timer -o 1 2 SQ.event
  if ($SQ.get(window.state) == normal) { window -al15e @SQ-script! 200 200 700 400 }
  else { window -al15dh @SQ-script! 200 200 700 400 }
  sq.sysmsg SQ-Script v $+ $sq.version running....
  if ($sq.get(sq.lock)) { sq.sysmsg SQ-script is locked | sq.set lock $sq.get(sq.lock) }
  if ($server) { sq.iplookup | sq.banner }
  if ($sq.get(sound.winamp.wakeup)) { .timersq.wakeup -o $sq.get(sound.winamp.hour) $+ : $+ $sq.get(sound.winamp.minutes) 1 1 sq.wakeup }
}
on *:Exit:{ 
  hsave -bo SQ.messages $sq.dir $+ SQ-hash.dat
  hsave -o sq.uploads $sq.dir $+ SQuploads.dat
  hsave -o sq.downloads $sq.dir $+ SQdownloads.dat
  if ($sq.get(lock)) { sq.set sq.lock $sq.get(lock) }
  if ($sq.get(ftp.status) && $sq.get(ftp.killserver)) { SQ.runftp -EXIT } 
}

;##################################ON TEXT Section#########################################

on ^*:text:$($sq.get(trigger.stat)):?:{ if ($SQ.get(stat.status)) { SQ.stats | haltdef } }
on *:text:!free &:#:{
  if ($1 == !free && $sq.get(ftp.!free)) {
    if ($2 == download && $sq.setvariables(^freedown)) { .notice $nick I can accept $sq.setvariables(^freedown) more users for download on $sq.get(trigger.ftp) }
    elseif ($2 == upload && $sq.setvariables(^freeup)) { .notice $nick I can accept $sq.setvariables(^freeup) more users for upload on $sq.get(trigger.ftp) }
  }
}
on *:text:$($SQ.get(trigger.FTP)):#:{
  if (!$sq.get(trigger.ctcp) && $SQ.get(trigger.status) && !$sq.istok(ftp.denynick,$nick) && !$sq.istok(ftp.denyaddress,$address($nick,3))) {
    if ($sq.get(triggerbusy)) { .notice $nick I'm busy right now with $gettok($sq.get(triggerbusy),1,32) $+ . Please wait }
    elseif (!$SQ.get(ftp.status)) { .notice $nick FTP is down...sorry }
    elseif ($SQ.get(msg.triggerO $+ $chan) && $nick isop $chan) { sq.trigger O }
    elseif ($sq.get(msg.triggerV $+ $chan) && $nick isvo $chan) { sq.trigger V }
    elseif ($sq.get(msg.triggerR $+ $chan) && $nick isreg $chan) { sq.trigger R }
    elseif ($sq.get(msg.triggerA $+ $chan)) { sq.trigger A }
    else { .notice $nick You may not use this trigger }
  }
}
on *:text:$($SQ.get(trigger.files)):#:{
  if (!$isfile($sq.get(@find.fileslist))) { return }
  var %name = $me Fileslist [ $+ $asctime($file($sq.get(@find.fileslist)).mtime,dd.mm.yy) $+ ].txt.gz
  if ($lock(dll)) {
    sq.sysmsg Could not compress Fileslist. Please enable the use of DLLs in the mIRC options
    .dcc send $nick $sq.get(@find.fileslist)
  }
  elseif ($isfile($+(",$sq.dir,%name,"))) {
    .notice $nick Sending you %name (Use WinZIP to unpack)3»SQ-Script«
    .dcc send $nick $+(",$sq.dir,%name,")
    .timerremovefileslist -o 1 300 .remove $+(",$sq.dir,%name,")
  }
  elseif ($dll($sq.dir $+ ngzipn.dll,zip,$sq.get(@find.fileslist))) {
    .rename $sq.get(@find.fileslist) $+ .gz $+(",$sq.dir,%name,")
    .notice $nick Sending you %name (Use WinZIP to unpack)3»SQ-Script«
    .dcc send $nick $+(",$sq.dir,%name,")
    .timerremovefileslist -o 1 300 .remove $+(",$sq.dir,%name,")
  }
}

on *:text:$(* $+ $me $+ *):#:{
  if ($len($me) <= 4 && (!$istok($remove($strip($1-),@,+),$me,32) || $me != $mid($1,$calc($int($calc($len($remove($1,:)) /2 - $len($me) /2)) +1),$len($me))) || »SQ-Script« isin $strip($1-)) { return }
  if ($istok($sq.get(sq.notifier.nolisten),$chan,44)) { return }
  if ($sq.istok(request.nick,$nick) || $sq.istok(request.address,$address($nick,3))) { 
    if ($sq.istok(request.address,$address($nick,3))) { var %num = $sq.findtok(request.address,$address($nick,3)) }
    else { var %num = $sq.findtok(request.nick,$nick) }
    if ($sq.tok(request.chan,%num) != $chan) { return }
    echo #  $+ $timestamp < $+ $nick $+ > $1-
    var %silent = 1
  }
  if (($chan != $active || !$appactive) && !$away) {
    if ($SQ.get(sq.notifier)) { 
      var %active = $active
      sq.set messengerchan $chan
      window -dh0roap +Lsb @SQ-Messenger 0 0 480 23
      .timerSQ.close.messenger -o 1 7 window -c @SQ-Messenger
      drawfill @sq-messenger $gettok($SQ.get(color.notifier),2,44) 5 0 0 480 23
      drawtext -c @SQ-Messenger $gettok($SQ.get(color.notifier),1,44) fixedsys 9 1 0 480 23 You were mentioned by $nick in $chan
      if ($appactive && $window(%active) && !$gettok(%active,2,32)) { window -a %active }
      elseif ($gettok(%active,2,32)) { window -a " $+ %active $+ " }
    }
    if ($SQ.get(sound.onnick)) { .splay " $+ $SQ.get(sound.nick) $+ " }
  }
  var %temptext = 4 $+ $me $+ 
  if ($away && $nick !isin $SQ.get(notelist) && $SQ.get(away.time) && $sq.get(away.notice) && !%silent) { 
    .notice $nick I'm currently away: $awaymsg (gone for $duration($awaytime) $+ ) 
    sq.set 300 notelist $addtok($SQ.get(notelist),$nick,59) 
  }
  if ($away) && ($SQ.get(sq.messenger) == AWAY) { SQ.sysmsg ( $+ $nick $+ / $+ $chan $+ ) $replace($1-,$me,%temptext) }
  elseif ($SQ.get(sq.messenger) == ALWAYS) { SQ.sysmsg ( $+ $nick $+ / $+ $chan $+ ) $replace($1-,$me,%temptext) }
}
menu @sq-messenger {
  sclick:{
    window -a $sq.get(messengerchan) 
    .timerSQ.close.messenger -o 1 0 window -c @SQ-Messenger
    splay stop
  }
  rclick:{
    window -a $sq.get(messengerchan) 
    .timerSQ.close.messenger -o 1 0 window -c @SQ-Messenger
    splay stop
  }
}
;#########################################Trigger section##############################################

alias sq.unsettriggerbusy {
  if ($sq.get(triggerbusy)) {
    if ($sock(sq.dcc)) sockclose sq.dcc
    if ($sock(sq.chat)) sockclose sq.chat
    sq.del triggerbusy breakpoint
  }
}
alias sq.dcc {
  if ($sock(sq.dcc) || $sock(sq.chat)) { return }
  if ($sq.get(trigger.chatport)) {
    if ($sq.get(trigger.chatport) isnum) {
      var %port = $sq.get(trigger.chatport)
    }
    else {
      var %port = $rand( [ $replace($sq.get(trigger.chatport),$chr(45),$chr(44)) ] )
    }
  }
  else {
    var %port = $rand(50000,65000)
  }
  while (!$portfree(%port)) { 
    if ($sq.get(trigger.chatport) == %port) {
      sq.sysmsg 4Error opening port %port to establish a DCC CHAT connection to $1
      sq.sysmsg 4Please fix your settings.
      .notice $1 Some connection error occured. Please wait until this problem has been fixed.
      return
    }
    else {
      if ($sq.get(trigger.chatport)) {
        if ($sq.get(trigger.chatport) isnum) {
          var %port = $sq.get(trigger.chatport)
        }
        else {
          var %port = $rand( [ $replace($sq.get(trigger.chatport),$chr(45),$chr(44)) ] )
        }
      }
      else {
        var %port = $rand(50000,65000)
      }
    }
  }
  socklisten sq.dcc %port
  .msg $1 $chr(1) $+ DCC CHAT chat $longip($ip) %port $+ $chr(1)
  .notice $1 You have a DCC CHAT pending. timeout in 60secs
  .timersq.dcc_close 1 60 sockclose sq.dcc
}
on *:socklisten:sq.dcc:{
  sockaccept sq.chat
  sockclose sq.dcc
  .timersq.dcc_close off
  .timerunsetbusy -o 1 120 sq.unsettriggerbusy $scriptline
  var %chan = $gettok($sq.get(triggerbusy),2,32),%type = $gettok($sq.get(triggerbusy),3,32)
  var %tempcount = 2
  while (%tempcount <= $sq.num(msg.trigger $+ %type $+  $+ %chan)) {
    if (^accountomat isin $sq.tok(msg.trigger $+ %type $+  $+ %chan,%tempcount)) { sq.set breakpoint %tempcount %chan %type | break }
    sq.chatmsg $SQ.SetVariables($replace($sq.tok(msg.trigger $+ %type $+  $+ %chan,%tempcount),$chr(44),::))
    inc %tempcount 1
  }
  if (!$sq.get(breakpoint)) { sq.unsettriggerbusy $scriptline }
  else {
    var %point = $gettok($sq.get(breakpoint),1,32)
    sq.chatmsg $sq.setvariables($replace($sq.tok(msg.trigger $+ %type $+  $+ %chan,%point),^accountomat,Please enter what you want to do on my server [upload/download],$chr(44),::))
  }
}
on *:sockread:sq.chat:{
  if ($sockerr > 0) return
  var %temp,%nick = $gettok($sq.get(triggerbusy),1,32)
  sockread %temp
  if (download isin %temp) {
    if ($sq.gotaccount(%nick)) { 
      sq.chatmsg You may only have one account. Aborting account creation
      sq.unsettriggerbusy $scriptline
      return
    }
    var %point = $gettok($sq.get(breakpoint),1,32),%chan = $gettok($sq.get(breakpoint),2,32),%type = $gettok($sq.get(breakpoint),3,32)
    var %var = $remove($sq.tok(msg.trigger $+ %type $+  $+ %chan,1),>)
    if ($sq.get(ftp.maxuserdown) <= $sq.ftpdownloaders || ($gettok(%var,6,47) && $gettok(%var,6,47) <= $sq.ftpdownloaders)) {
      sq.chatmsg $sq.setvariables($replace($sq.tok(msg.trigger $+ %type $+  $+ %chan,%point),^accountomat,Sorry downloads are full. try again later,$chr(44),::))
      sq.unsettriggerbusy $scriptline
      return
    }
    var %text = $replace($sq.tok(msg.trigger $+ %type $+  $+ %chan,%point),$chr(44),$chr(1))
    if ($sq.get(ftp.restricthost)) { sq.chatmsg $sq.setvariables($replace(%text,^accountomat,You are required to use this IP to log in: $sock($sockname).ip,$chr(44),::)) }
    sq.set triggerbusy $sq.get(triggerbusy) download
    sq.accountomat %nick $sock($sockname).ip
    sq.unsettriggerbusy $scriptline
    return
  }
  elseif (upload isin %temp) {
    var %point = $gettok($sq.get(breakpoint),1,32),%chan = $gettok($sq.get(breakpoint),2,32),%type = $gettok($sq.get(breakpoint),3,32)
    if ($sq.get(ftp.maxuserUP) <= $sq.ftpuploaders) {
      sq.chatmsg $sq.setvariables($replace($sq.tok(msg.trigger $+ %type $+  $+ %chan,%point),^accountomat,Sorry uploads are full. try again later,$chr(44),::))
      sq.unsettriggerbusy $scriptline
      return
    }
    var %text = $replace($sq.tok(msg.trigger $+ %type $+  $+ %chan,%point),$chr(44),$chr(1))
    if ($sq.get(ftp.restricthost)) { sq.chatmsg $sq.setvariables($replace(%text,^accountomat,You are required to use this IP to log in: $sock($sockname).ip,$chr(44),::)) }
    sq.set triggerbusy $sq.get(triggerbusy) upload
    sq.accountomat %nick $sock($sockname).ip
    sq.unsettriggerbusy $scriptline
    return
  }
}
alias sq.chatmsg {
  if (!$sock(sq.chat)) { return }
  sockwrite -n sq.chat $1-
}
on *:sockclose:sq.chat:{
  sq.del triggerbusy breakpoint
  .timerunsetbusy off
}
alias sq.trigger {
  var %chan = $iif($sq.get(tempchan),$sq.get(tempchan),$chan)
  sq.del tempchan
  sq.set triggerbusy $nick %chan $1
  .timerunsetbusy -o 1 90 sq.unsettriggerbusy $scriptline
  sq.dcc $nick
}
alias sq.accountomat {
  var %pass,%count = 1
  var %point = $gettok($sq.get(breakpoint),1,32),%chan = $gettok($sq.get(triggerbusy),2,32),%type = $gettok($sq.get(breakpoint),3,32)
  while (%count < 6) {
    %pass = %pass $+ $rand(a,z)
    inc %count 1
  }
  if ($3) { %pass = $3 }
  var %var = $remove($sq.tok(msg.trigger $+ $gettok($sq.get(triggerbusy),3,32) $+  $+ $gettok($sq.get(triggerbusy),2,32),1),>)
  if ($gettok($sq.get(triggerbusy),4,32) == upload) {
    var %group = $sq.get(ftp.uploadgroup),%minspeed = 0,%slowcounter = 0,%limitfiles = 0,%limitmb = 0
  }
  else {
    var %group = $gettok(%var,3,58)
    var %minspeed = $gettok($gettok(%var,2,58),1,47)
    var %slowcounter = $gettok($gettok(%var,2,58),2,47)
    var %limitfiles = $gettok(%var,4,58)
    var %limitMB = $gettok(%var,5,58)
  }
  if (!$sq.get(ftp.restricthost)) { var %host = * }
  else { var %host = $2 }
  var %result = $sq.makeaccount($1,%pass,%host,%group,%chan,%minspeed,%slowcounter,%limitfiles,%limitMB)
  if ($gettok(%result,1,32)) {
    if (%point) {
      sq.chatmsg $replace($sq.tok(msg.trigger $+ %type $+  $+ %chan,%point),^accountomat,Account was successfully created. You have $sq.get(ftp.nouser) minutes to login)
      sq.set ftplogin SQ $+ %result
      sq.set ftppass %pass
      var %tempcount = %point
      inc %tempcount 1
      while (%tempcount <= $sq.num(msg.trigger $+ %type $+  $+ %chan)) {
        sq.chatmsg $SQ.SetVariables($replace($sq.tok(msg.trigger $+ %type $+  $+ %chan,%tempcount),$chr(44),::))
        inc %tempcount 1
      }
      ;sq.chatmsg 14Closing session in 30 secs
    }
    else {
      .notice $1 Account was successfully created. You have $sq.get(ftp.nouser) minutes to login
      .notice $1 ftp:// $+ SQ $+ %result $+ : $+ %pass $+ @ $+ $iif($sq.get(currentip),$sq.get(currentip),$ip) $+ : $+ $sq.setvariables(^port) $+ /
      .timer 1 1 sq.del triggerbusy breakpoint
    }
    SQ.sysmsg An account for $gettok($sq.get(triggerbusy),4,32) has been successfully created for $1 on %chan
  }
  else {
    .notice $1 An error occured while account creation. An errorlog has been created. Sorry for this inconvenience
    sq.sysmsg 4Error on account creation for $nick $+ : $gettok(%result,2-,32)
    sq.sysmsg 4This often happens when you didn't associate an ICR group with a group on your server
    sq.sysmsg 4 $1 - %pass - $2 - %group - %chan - %minspeed - %slowcounter - %limitfiles - %limitMB
    sq.sysmsg 4 NICK - PASS - ADDRESS - GROUP - CHAN - MINSPEED - SLOWCOUNT - FILELIMIT - MBLIMIT
  }
  sq.del ftplogin ftppass
}
on ^*:text:&:?:{ 
  if (!$sq.get(querytext)) { 
    if ($sq.noquerytext($1-)) { haltdef }
  }
  else { sq.del querytext }
}
alias sq.noquerytext {
  if ($1 == $SQ.get(trigger.files)) { 
    if (!$isfile($sq.get(@find.fileslist))) { return }
    var %name = $me Fileslist [ $+ $asctime($file($sq.get(@find.fileslist)).mtime,dd.mm.yy) $+ ].txt.gz
    if ($lock(dll)) {
      sq.sysmsg Could not compress Fileslist. Please enable the use of DLLs in the mIRC options
      .dcc send $nick $sq.get(@find.fileslist)
    }
    elseif ($isfile($+(",$sq.dir,%name,"))) {
      .notice $nick Sending you %name 3»SQ-Script«
      .dcc send $nick $+(",$sq.dir,%name,")
      .timerremovefileslist -o 1 300 .remove $+(",$sq.dir,%name,")
    }
    elseif ($dll($sq.dir $+ ngzipn.dll,zip,$sq.get(@find.fileslist))) {
      .rename $sq.get(@find.fileslist) $+ .gz $+(",$sq.dir,%name,")
      .notice $nick Sending you %name 3»SQ-Script«
      .dcc send $nick $+(",$sq.dir,%name,")
      .timerremovefileslist -o 1 300 .remove $+(",$sq.dir,%name,")
    }
    return 1 
  }
  elseif ($sq.get(trigger.stat) == $1- && $SQ.get(stat.status)) { SQ.stats $nick | return 1 }
}
alias SQ.banner {
  if ($SQ.get(trigger.bannerstatus) && $SQ.get(trigger.bannerchannel) && $SQ.get(trigger.bannerdelay) isnum && $SQ.get(msg.banner) && $server) { 
    var %counter = 1
    if (($sq.get(trigger.bannershow) && $sq.get(trigger.status)) || !$sq.get(trigger.bannershow)) {
      while (%counter <= $numtok($sq.get(trigger.bannerchannel),44)) {
        if ($me ison $gettok($SQ.get(trigger.bannerchannel),%counter,44)) {
          var %tempcount = 1
          while (%tempcount < $sq.num(msg.banner)) {
            msg $gettok($SQ.get(trigger.bannerchannel),%counter,44) $SQ.SetVariables($replace($sq.tok(msg.banner,%tempcount),$chr(44),::))
            inc %tempcount
          }
          msg $gettok($SQ.get(trigger.bannerchannel),%counter,44) $SQ.SetVariables($replace($sq.tok(msg.banner,%tempcount),$chr(44),::)) 3 $+ $chr(443) $+ SQ $+ - $+ Script $+ $chr(427) 
        }
        else { SQ.sysmsg You are not on channel: $gettok($SQ.get(trigger.bannerchannel),%counter,44) | SQ.sysmsg FTP-add will not be sent there ! }
        inc %counter 1
      }
    }
    .timerSQ.banner 1 $sq.get(trigger.bannerdelay) SQ.banner
  }
  elseif ($dialog(SQ)) {
    did -u SQ 515
    did -o SQ 515 1 OFF 
    sq.set ftp.bannerstatus $false
  }
}

;#################################Configuartion Section#############################

alias SQ.serverconfig {
  .disable #bpftp
  .disable #raidenftpd
  sq.set configuringftp $true
  sq.set ftp.configured $false
  if ($sock(sq.ftp)) { sockclose SQ.ftp  }
  .timersq.ftp.check off
  var %step = 1
  Sq.sysmsg Starting FTPserver configuration with mIRC $version
  SQ.sysmsg Step %step $+ : Set FTPserver-directory
  inc %step 1
  var %tempfile = $+(",$$sfile(c:\*.exe,Choose the servers EXE files,OK),")
  if (G6FTPsrv.exe isin %tempfile) { 
    SQ.sysmsg      Checking version 
    var %version = $shortfn($nofile(%tempfile) $+ version.txt)
    if ($isfile(%version)) {
      var %read = $read(%version,s,Version)
      if (%read >= 2.15) {
        SQ.sysmsg      Found server BPFTPsrv Version %read
        .echo -q $input(Please disable the password encryption now if used $+ $chr(44) else all existing accounts will become useless afterwards ! $crlf $crlf $+ Make shure the server is NOT running when clicking on OK,4,Warning)
        .enable #bpftp
      }
      else {
        SQ.sysmsg Version check failed. Check the Developers Site www.bpftpserver.com for updates. Aborting 
        return
      }
    }
    else {
      sq.sysmsg Could not check version.txt for version information. Aborting
      return
    }
  }
  elseif (RaidenFTPd.exe isin %tempfile) { 
    SQ.sysmsg      Checking version 
    var %version = $shortfn($nofile(%tempfile) $+ Whatsnew.txt)
    if ($isfile(%version)) {
      var %read = $read(%version,1)
      if ($gettok(%read,2,32) > 2.2 || ($gettok(%read,2,32) == 2.2 && $gettok(%read,4,32) >= 1285)) {
        SQ.sysmsg      Found server RaidenFTPd %read
        .enable #raidenftpd
      }
      else {
        SQ.sysmsg Version check failed. Check the Developers Site www.raidenftpd.com for updates. Aborting 
        return
      }
    }
    else {
      sq.sysmsg Could not check whatsnew.txt for version information. Aborting
      return
    }
  }
  else {
    sq.sysmsg Unsupported server
    return
  }
  sq.set ftp.directory $nofile(%tempfile)
  SQ.FTPsetup %step
  sq.menu
}

;#####################################Event section############################################

alias SQ.event {
  .timerSQ.event -o 1 60 SQ.event
  sq.setnickcolors
  if ($sq.get(ftp.configured)) { sq.ftp.check minutepassed }
  if ($SQ.get(away.autoaway.status) && $idle >= $calc($SQ.get(away.autoaway.time) * 60) && !$away) { SQ.away autoaway }
  if ($away && !$sq.get(msg.away)) { sq.set msg.away $awaymsg }
  if ($asctime($calc($ctime - $file($sq.get(@find.fileslist)).mtime),dd) > $sq.get(@find.fileslist.refresh) && $sq.get(@find.fileslist.refreshstatus)) { sq.fileslist.refresh }
  if ($sq.get(sq.nickkeeper) && $me != $readini($mircini,mirc,nick)) { .nick $readini($mircini,mirc,nick) }
  sq.setstats
  sq.checkoldnos
  sq.@findchecksockets
}

;####################################General alias section#####################################

raw 433:*:if ($sq.get(sq.nickkeeper)) && ($me != $readini($mircini,mirc,nick)) { haltdef }
alias sq.process {
  dline -l @SQ-script! 1-
  var %count = 1
  while (%count <= $ini($sq.dir $+ SQftp.log,0)) {
    var %address = $ini($sq.dir $+ SQftp.log,%count)
    if ($ial(%address,1)) { .cnick $ial(%address,1).nick $sq.get(color.beenonftp) }
    inc %count 1
  }
  %count = 1
  while (%count <= $sq.num(ftpip)) {
    var %account = $mid($sq.tok(ftpaccount,%count),3),%ip = $sq.tok(ftpip,%count),%action = $sq.tok(ftpaction,%count),%speed = $sq.tok(ftpspeed,%count),%time = $sq.tok(ftptime,%count),%nick = $sq.tok(ftpnick,%count),%netsplit = $sq.tok(ftpnetsplit,%count)
    var %chan = $sq.tok(ftpchan,%count),%ident = $sq.tok(ftpident,%count),%minspeed = $sq.tok(ftpminspeed,%count),%slow = $sq.tok(ftpslow,%count),%burc = $null
    var %failedup = $sq.tok(ftpfailedup,%count),%filesup = $sq.tok(ftpfilesup,%count),%filesdown = $sq.tok(ftpfilesdown,%count),%kbup = $sq.tok(ftpkbup,%count),%kbdown = $sq.tok(ftpkbdown,%count)
    var %slowcounter = $sq.tok(ftpslowcounter,%count),%limitfiles = $sq.tok(ftplimitfiles,%count),%limitMB = $sq.tok(ftplimitMB,%count)
    if (%nick !ison %chan) { %burc = %burc $+  }
    if (%failedup > 0) { var %burc = %burc $+  }
    if (%netsplit > $sq.get(ftp.netsplit) && %nick !ison %chan && %action != uploading) {
      sq.sysmsg %nick was removed from server for not comming back to %chan within $sq.get(ftp.netsplit) mins
      sq.delaccount %account You should have stayed in %chan
      inc %count 1    
      continue
    }
    elseif (%limitmb && %kbdown > $calc(%limitMB * 1024)) { 
      sq.sysmsg %nick was removed from server for exceeding downloadlimit of %limitMB MB
      sq.delaccount %account Download limit of %limitMB MB exceeded
      inc %count 1
      continue
    }
    elseif (%limitfiles && %filesdown > %limitfiles) { 
      sq.sysmsg %nick was removed from server for exceeding downloadlimit of %limitfiles files
      sq.delaccount %account Download limit of %limitfiles files exceeded
      inc %count 1
      continue
    }
    elseif (%slow > %slowcounter) {
      sq.ftp.tell %account Time is up you snail. Get a faster connection next time !
      sq.sysmsg %nick has been removed from server for beeing to slow ( $+ %speed kb/s $+ ) %slow times in a row
      sq.delaccount %account
      inc %count 1
      continue
    }
    elseif (%speed < %minspeed && %action == Downloading) { 
      if (!$fline(@SQ-script!,* $+ $mid($asctime(HH:nn),1,4) $+ * $+ %nick is $lower(%action) with*,1)) { SQ.sysmsg %nick is $lower(%action) with4 %speed kBytes/s }
      %burc = %burc $+  $+ $SQ.get(color.downloading.slow)
      rline -l @SQ-script! %count %burc $+  $+ %nick
      .cnick %nick $SQ.get(color.downloading.slow)
    }
    elseif (%action == Downloading) {
      %burc = %burc $+  $+ $SQ.get(color.downloading.ok)
      rline -l @SQ-script! %count %burc $+  $+ %nick
      .cnick %nick $SQ.get(color.downloading.ok)
    }
    elseif (%action == idle) || (%action == logged) {
      if ($calc($ctime - %time) < 60) { window -g1 @SQ-script! } 
      %burc = %burc $+  $+ $SQ.get(color.idle)
      rline -l @SQ-script! %count %burc $+  $+ %nick
      .cnick %nick $SQ.get(color.idle)
    }
    elseif (%action == uploading) {
      %burc = %burc $+  $+ $SQ.get(color.uploading)
      rline -l @SQ-script! %count %burc $+  $+ %nick
      .cnick %nick $SQ.get(color.uploading)
    }
    inc %count 1
  }
}

;###################################alias section####################################

alias sq.ini2hash {
  if (!$isfile($sq.dir $+ sq-script.ini)) { 
    sq.sysmsg Could not find existing config file. Loading defaults (on new load this is ok)
    sq.setdefault
  }
  else {
    var %count1 = 1,%count2 = 1,%ini = " $+ $sq.dir $+ SQ-script.ini $+ ",%section,%item
    while ($ini(%ini,%count1)) {
      %section = $ini(%ini,%count1)
      %count2 = 1
      while ($ini(%ini,%count1,%count2)) {
        %item = $ini(%ini,%count1,%count2)
        hadd -m sq.vars %section $+ . $+ %item $readini(%ini,n,%section,%item)
        inc %count2 1
      }
      inc %count1 1
    }
  }
}
alias sq.set { 
  if ($len($2-) > 850) { echo 4 -ta SQ-script Critical var-length for: $1 $len($2-) }
  if ($sq.get(updateonly) && $sq.get($1) != $null) { return }
  if ($istok(away.color.sq.eggdrop.window.ftp.@find.sound.trigger.request.noflood.stat,$gettok($1,1,46),46)) {
    if ($2- == $null) { sq.del $1 }
    elseif ($2- != $sq.get($1)) { 
      writeini $sq.dir $+ SQ-script.ini $gettok($1,1,46) $gettok($1,2-,46) $2- 
      hadd -m sq.vars $1 $2-
    }
  }
  elseif ($istok(msg,$gettok($1,1,46),46)) { hadd -m SQ.messages $gettok($1,2-,46) $2- }
  elseif ($1 isnum) { hadd -mu [ $+ [ $1 ] ] SQ.temps $2 $3- }
  else { hadd -m SQ.temps $1 $2- }
}
alias sq.inc {
  if ($istok(away.color.sq.eggdrop.window.ftp.@find.sound.trigger.request.noflood.stat,$gettok($1,1,46),46)) {
    hinc sq.vars $1 1
    writeini $sq.dir $+ SQ-script.ini $gettok($1,1,46) $gettok($1,2-,46) $sq.get($1)
  }
  else { hinc SQ.temps $1 $iif($2-,$2-,1) }
}
alias sq.min {
  return $iif($1 < $2,$1,$2)
}
alias sq.dec {
  if ($istok(away.color.sq.eggdrop.window.ftp.@find.sound.trigger.request.noflood.stat,$gettok($1,1,46),46)) {
    hdec sq.vars $1 1
    writeini $sq.dir $+ SQ-script.ini $gettok($1,1,46) $gettok($1,2-,46) $sq.get($1)
  }
  else { hdec SQ.temps $1 $2- }
}
alias sq.app { sq.set $1 $sq.get($1) $+ ; $+ $2- }
alias sq.tok { return $gettok($sq.get($1),$2,59) }
alias sq.num { return $numtok($sq.get($1),59) }
alias sq.findtok {
  if (!$3) { return $findtok($sq.get($1),$2,1,59) }
  else { return $findtok($sq.get($1),$2,$3,59) }
}
alias sq.istok { return $istok($sq.get($1),$2,59) }
alias sq.add { sq.set $1 $addtok($sq.get($1),$2,59) }
alias sq.deltok { sq.set $1 $deltok($sq.get($1),$2,59) }
alias sq.rem { sq.set $1 $remtok($sq.get($1),$2,1,59) }
alias sq.put { sq.set $1 $puttok($sq.get($1),$2,$3,59) }
alias sq.get { 
  if ($istok(away.stat.color.sq.eggdrop.window.ftp.@find.sound.trigger.request.noflood,$gettok($1,1,46),46)) {
    return $hget(sq.vars,$1)
  }
  elseif ($istok(msg,$gettok($1,1,46),46)) { return $hget(SQ.messages,$gettok($1,2-,46)) }
  else { return $hget(SQ.temps,$1) }
}
alias sq.del { 
  var %delcounter = 1
  while (%delcounter <= $0) {
    if ($chr(42) isin $gettok($1-,%delcounter,32)) { hdel -w sq.temps $gettok($1-,%delcounter,32) }
    elseif ($istok(away.color.stat.sq.eggdrop.window.ftp.@find.sound.trigger.request.noflood,$gettok($gettok($1-,%delcounter,32),1,46),46)) {
      hdel sq.vars $ [ $+ [ %delcounter ] ]
      remini $sq.dir $+ SQ-script.ini $gettok($gettok($1-,%delcounter,32),1,46) $gettok($gettok($1-,%delcounter,32),2-,46)
    }
    elseif ($istok(msg,$gettok($gettok($1-,%delcounter,32),1,46),46)) {
      hdel SQ.messages $gettok($gettok($1-,%delcounter,32),2-,46)
    }
    else { hdel SQ.temps $gettok($1-,%delcounter,32) }
    inc %delcounter 1
  }
}
alias sq.info { 
  var %temp,%count = 1
  while ($chan(%count)) { %temp = $addtok(%temp,$chan(%count),59) | inc %count }
  return $me $network $server %temp 
}
alias SQ.sysmsg {
  if (!$window(@SQ-script!)) { 
    if ($sq.get(window.state) == desktop) { 
      window -al15dh @SQ-script! 200 200 700 400
    }
    else { window -l15e @SQ-script! 200 200 700 400 }
  }
  else { background -x @SQ-Script! }
  if ($1 == -f) { echo $SQ.get(color.logging) -fi8 @SQ-script! 9,5[ $+ $asctime(HH:nn) $+ ] $1- }
  echo $SQ.get(color.logging) -ni8 @SQ-script! 9,5[ $+ $asctime(HH:nn) $+ ] $1-
}
alias sq.encrypt {
  var %count = 1
  var %text = $2-
  %count = 1
  while (%count <= $len(%text)) {
    if ($asc($mid(%text,%count,1)) == 32) {
      %text = $mid(%text,1,$calc(%count -1)) $+ $mid(%text,$calc(%count -1),1) $+ $mid(%text,$calc(%count +1),1) $+ $mid(%text,$calc(%count +1))
    }
    inc %count 1
  }
  if ($1 == @) { var %tmpseed = $mid($file($mircexe).ctime,3,7) }
  else {
    while (%count <= $len($1)) {
      var %tmpseed = %tmpseed $+ $asc($mid($1,%count,1))
      inc %count 1
    }
  }
  %tmpseed = $right(%tmpseed,19)
  var %temp = $null
  while ($len(%temp) <= $len(%text)) {
    %tmpseed = $remove($abs($cos($remove($abs($log(%tmpseed)),0))),.)
    %temp = %temp $+ $remove(%tmpseed,0)
  }
  %tmpseed = %temp
  %count = 1
  while (%count <= $len(%text)) {
    if ($isbit($mid(%tmpseed,%count,1),$mid(%tmpseed,$calc(%count + 1),1))) { var %temptext = %temptext $+ $chr($calc($asc($mid(%text,%count,1)) + $mid(%tmpseed,%count,1))) }
    else { var %temptext = %temptext $+ $chr($calc($asc($mid(%text,%count,1)) - $mid(%tmpseed,%count,1))) 
    }
    inc %count 1
  }
  return $replace(%temptext,;,$chr(1))
}
alias sq.decrypt {
  if ($1 == @) { var %tmpseed = $mid($file($mircexe).ctime,3,7) }
  else {
    var %count = 1
    while (%count <= $len($1)) {
      var %tmpseed = %tmpseed $+ $asc($mid($1,%count,1))
      inc %count
    }
  }
  %tmpseed = $right(%tmpseed,19)
  var %temp = $null
  while ($len(%temp) < $len($2-)) {
    %tmpseed = $remove($abs($cos($remove($abs($log(%tmpseed)),0))),.)
    %temp = %temp $+ $remove(%tmpseed,0)
  }
  %tmpseed = %temp
  var %text = $replace($2-,$chr(1),;)
  var %count = 1
  while (%count <= $len(%text)) {
    if ($isbit($mid(%tmpseed,%count,1),$mid(%tmpseed,$calc(%count + 1),1))) { var %temptext = %temptext $+ $replace($chr($calc($asc($mid(%text,%count,1)) - $mid(%tmpseed,%count,1))),$chr(32),$chr(1)) }
    else { var %temptext = %temptext $+ $replace($chr($calc($asc($mid(%text,%count,1)) + $mid(%tmpseed,%count,1))),$chr(32),$chr(1)) }
    inc %count 1
  }
  var %out = $replace(%temptext,$chr(1),$chr(32))
  %count = 1
  while (%count < $len(%out)) {
    if ($mid(%out,%count,1) == $mid(%out,$calc(%count -1),1)) && ($mid(%out,$calc(%count +1),1) == $mid(%out,$calc(%count +2),1)) && ($mid(%out,$calc(%count +1),1) != $mid(%out,%count,1)) {
      %out = $mid(%out,1,$calc(%count -1)) $mid(%out,$calc(%count +2))
    }
    inc %count 1
  }
  return %out
}
alias sq.setstats {
  if ($ticks > $calc($SQ.get(stat.ticksrecord) +0)) { sq.set stat.ticksrecord $ticks } 
  sq.set stat.disk.free ;
  sq.set stat.disk.size ;
  var %tempdrive = 99
  while (%tempdrive < 120 && $disk($chr(%tempdrive $+ :)).type == fixed) {
    sq.app stat.disk.free $disk($chr(%tempdrive $+ :)).free
    sq.app stat.disk.size $disk($chr(%tempdrive $+ :)).size
    inc %tempdrive 1
  }
  sq.set stat.disk.num $calc(%tempdrive - 99)
}
alias sq.setnickcolors {
  while ($cnick(1)) { .cnick -r $cnick(1) }
  if ($sq.get(gimick)) {
    var %count = 1
    while (%count <= $ial(*,0)) {
      .cnick $ial(*,%count) $gettok(3.5.7.9.10,$rand(1,5),46)
      inc %count 1
    }
  }
}
alias sq.reminisection {
  window -h @sq.tmp
  loadbuf @sq.tmp $1
  var %n = $fline(@sq.tmp,$chr(91) $+ $2 $+ $chr(93),1)
  dline @sq.tmp %n
  while ($chr(91) $+ * $+ $chr(93) !iswm $line(@sq.tmp,%n) && %n <= $line(@sq.tmp,0)) {
    dline @sq.tmp %n
  }
  savebuf @sq.tmp $1
  window -c @sq.tmp
}

alias SQ.SetVariables {
  var %tempmsg = $1-
  %tempmsg = $replace(%tempmsg,::,$chr(44))
  if ($1- == ^@findresults) { %tempmsg = <@findresults> }
  while (^diskfill[ isin %tempmsg) {
    var %tempdisk = $asc($mid($mid(%tempmsg,$calc($pos(%tempmsg,^diskfill[) + 10)),1,$calc($pos($mid(%tempmsg,$calc($pos(%tempmsg,^diskfill[) + 10)),]) -1)))
    if (%tempdisk < 89) && (%tempdisk > 66) { var %tempdisk = $calc(%tempdisk - 66) }
    else { var %tempdisk = $calc(%tempdisk - 98) }
    if (%tempdisk > $sq.get(stat.disk.num)) { %tempmsg = $replace(%tempmsg,^diskfill[ $+ $chr($calc(%tempdisk + 98)) $+ ],<not available>) }
    else { %tempmsg = $replace(%tempmsg,^diskfill[ $+ $chr($calc(%tempdisk + 98)) $+ ],$bytes($calc($sq.tok(stat.disk.size,%tempdisk) - $sq.tok(stat.disk.free,%tempdisk)),3).suf) }
  }
  while (^diskfree[ isin %tempmsg) {
    var %tempdisk = $asc($mid($mid(%tempmsg,$calc($pos(%tempmsg,^diskfree[) + 10)),1,$calc($pos($mid(%tempmsg,$calc($pos(%tempmsg,^diskfree[) + 10)),]) -1)))
    if (%tempdisk < 89) && (%tempdisk > 66) { var %tempdisk = $calc(%tempdisk - 66) }
    else { var %tempdisk = $calc(%tempdisk - 98) }
    if (%tempdisk > $sq.get(stat.disk.num)) { %tempmsg = $replace(%tempmsg,^diskfree[ $+ $chr($calc(%tempdisk + 98)) $+ ],<not available>) }
    else { %tempmsg = $replace(%tempmsg,^diskfree[ $+ $chr($calc(%tempdisk + 98)) $+ ],$bytes($sq.tok(stat.disk.free,%tempdisk),3).suf) }
  }
  while (^disksize[ isin %tempmsg) {
    var %tempdisk = $asc($mid($mid(%tempmsg,$calc($pos(%tempmsg,^disksize[) + 10)),1,$calc($pos($mid(%tempmsg,$calc($pos(%tempmsg,^disksize[) + 10)),]) -1)))
    if (%tempdisk < 89) && (%tempdisk > 66) { var %tempdisk = $calc(%tempdisk - 66) }
    else { var %tempdisk = $calc(%tempdisk - 98) }
    if (%tempdisk > $sq.get(stat.disk.num)) { %tempmsg = $replace(%tempmsg,^disksize[ $+ $chr($calc(%tempdisk + 98)) $+ ],<not available>) }
    else { %tempmsg = $replace(%tempmsg,^disksize[ $+ $chr($calc(%tempdisk + 98)) $+ ],$bytes($sq.tok(stat.disk.size,%tempdisk),3).suf) }
  }
  if (^diskfreetotal isin %tempmsg) {
    var %counter = 1
    while (%counter <= $sq.get(stat.disk.num)) { var %tmp.msg = $calc(%tmp.msg + $sq.tok(stat.disk.free,%counter)) | inc %counter 1 }
    %tempmsg = $replace(%tempmsg,^diskfreetotal,$bytes(%tmp.msg,3).suf)
  }
  if (^disksizetotal isin %tempmsg) {
    var %counter = 1
    unset %tmp.msg
    while (%counter <= $sq.get(stat.disk.num)) { var %tmp.msg = $calc(%tmp.msg + $sq.tok(stat.disk.size,%counter)) | inc %counter 1 }
    %tempmsg = $replace(%tempmsg,^disksizetotal,$bytes(%tmp.msg,3).suf)
  }
  if (^diskfilltotal isin %tempmsg) {
    var %counter = 1
    unset %tmp.msg
    while (%counter <= $sq.get(stat.disk.num)) { 
      var %tmp.msg = $calc(%tmp.msg + $sq.tok(stat.disk.size,%counter) - $sq.tok(stat.disk.free,%counter)) 
      inc %counter 1 
    }
    %tempmsg = $replace(%tempmsg,^diskfilltotal,$bytes(%tmp.msg,3).suf)
  }
  if (!$nick) { %tempmsg = $replace(%tempmsg,^nick,$me) } 
  else { %tempmsg = $replace(%tempmsg,^nick,$nick) } 
  if (^matches isin %tempmsg && %@findhits) { %tempmsg = $replace(%tempmsg,^matches,%@findhits) }
  elseif (^matches isin %tempmsg) { %tempmsg = $replace(%tempmsg,^matches,0) }
  if (^searchword isin %tempmsg) && (%@findsearchword) { %tempmsg = $replace(%tempmsg,^searchword,%@findsearchword) }
  elseif (^searchword isin %tempmsg) { %tempmsg = $replace(%tempmsg,^searchword,(No @find used)) }
  if (^users isin %tempmsg) {
    var %tmp.count = 1
    unset %tmp.msg
    while (%tmp.count <= $sq.num(ftpnick)) { 
      if ($numtok(%tmp.msg,32) > 0) { var %tmp.msg = %tmp.msg $+ $chr(44) }
      var %tmp.msg = %tmp.msg $sq.tok(ftpnick,%tmp.count) 
      inc %tmp.count 1
    }
    if (%tmp.msg) { %tempmsg = $replace(%tempmsg,^users,%tmp.msg) }
    else { %tempmsg = $replace(%tempmsg,^users,<nobody>) }
  }
  if (^userup isin %tempmsg) {
    var %tmp.count = 1
    var %acc = $sq.ftpuploaders(1)
    unset %tmp.msg
    while (%tmp.count <= $sq.num(ftpnick)) { 
      if ($numtok(%tmp.msg,32) > 0 && $istok(%acc,$sq.tok(ftpaccount,%tmp.count),59)) { var %tmp.msg = %tmp.msg $+ $chr(44) }
      if ($istok(%acc,$sq.tok(ftpaccount,%tmp.count),59)) { var %tmp.msg = %tmp.msg $sq.tok(ftpnick,%tmp.count) }
      inc %tmp.count 1
    }
    if (%tmp.msg) { %tempmsg = $replace(%tempmsg,^userup,%tmp.msg) }
    else { %tempmsg = $replace(%tempmsg,^userup,<nobody>) }
  }
  if (^userdown isin %tempmsg) {
    var %tmp.count = 1
    var %acc = $sq.ftpdownloaders(1)
    unset %tmp.msg
    while (%tmp.count <= $sq.num(ftpnick)) { 
      if ($numtok(%tmp.msg,32) > 0 && $istok(%acc,$sq.tok(ftpaccount,%tmp.count),59)) { var %tmp.msg = %tmp.msg $+ $chr(44) }
      if ($istok(%acc,$sq.tok(ftpaccount,%tmp.count),59)) { var %tmp.msg = %tmp.msg $sq.tok(ftpnick,%tmp.count) }
      inc %tmp.count 1
    }
    if (%tmp.msg) { %tempmsg = $replace(%tempmsg,^userdown,%tmp.msg) }
    else { %tempmsg = $replace(%tempmsg,^userdown,<nobody>) }
  }
  if (^newonserver isin %tempmsg) {
    var %file = $sq.dir $+ sq.NoS.txt
    if ($sq.get(newonservercount) >= $lines(%file)) { sq.set newonservercount 1 }
    elseif ($sq.get(ftp.nosrand)) { sq.set newonservercount $rand(1,$lines(%file)) }
    else  { sq.inc newonservercount }
    var %line = $gettok($read(%file,$sq.get(newonservercount)),2-,59)
    %tempmsg = $replace(%tempmsg,^newonserver,$iif(%line,%line,<nothing new>))
  }
  if (^downloads24h isin %tempmsg) {
    var %num = 1,%time = $calc($ctime -86400),%data = 0
    if (!$hget(sq.downloads)) { hmake sq.downloads 20 }
    while (%num <= $hget(sq.downloads,0).item) {
      var %var = $hget(sq.downloads,%num).item
      if (%var >= %time) { inc %data $hget(sq.downloads,%var) }
      inc %num 1
    }
    %tempmsg = $replace(%tempmsg,^downloads24h,$bytes($calc(%data *1024),3).suf)
  }
  if (^downloads168h isin %tempmsg) {
    var %num = 1,%time = $calc($ctime -604800),%data = 0
    if (!$hget(sq.downloads)) { hmake sq.downloads 20 }
    while (%num <= $hget(sq.downloads,0).item) {
      var %var = $hget(sq.downloads,%num).item
      if (%var >= %time) { inc %data $hget(sq.downloads,%var) }
      inc %num 1
    }
    %tempmsg = $replace(%tempmsg,^downloads168h,$bytes($calc(%data *1024),3).suf)
  }
  if (^downloads720h isin %tempmsg) {
    var %num = 1,%time = $calc($ctime -2592000),%data = 0
    if (!$hget(sq.downloads)) { hmake sq.downloads 20 }
    while (%num <= $hget(sq.downloads,0).item) {
      var %var = $hget(sq.downloads,%num).item
      if (%var >= %time) { inc %data $hget(sq.downloads,%var) }
      inc %num 1
    }
    %tempmsg = $replace(%tempmsg,^downloads720h,$bytes($calc(%data *1024),3).suf)
  }
  if (^uploads24h isin %tempmsg) {
    var %num = 1,%time = $calc($ctime -86400),%data = 0
    if (!$hget(sq.downloads)) { hmake sq.downloads 20 }
    while (%num <= $hget(sq.uploads,0).item) {
      var %var = $hget(sq.uploads,%num).item
      if (%var >= %time) { inc %data $hget(sq.uploads,%var) }
      inc %num 1
    }
    %tempmsg = $replace(%tempmsg,^uploads24h,$bytes($calc(%data *1024),3).suf)
  }
  if (^uploads168h isin %tempmsg) {
    var %num = 1,%time = $calc($ctime -604800),%data = 0
    if (!$hget(sq.downloads)) { hmake sq.uploads 20 }
    while (%num <= $hget(sq.uploads,0).item) {
      var %var = $hget(sq.uploads,%num).item
      if (%var >= %time) { inc %data $hget(sq.uploads,%var) }
      inc %num 1
    }
    %tempmsg = $replace(%tempmsg,^uploads168h,$bytes($calc(%data *1024),3).suf)
  }
  if (^uploads720h isin %tempmsg) {
    var %num = 1,%time = $calc($ctime -2592000),%data = 0
    if (!$hget(sq.downloads)) { hmake sq.uploads 20 }
    while (%num <= $hget(sq.uploads,0).item) {
      var %var = $hget(sq.uploads,%num).item
      if (%var >= %time) { inc %data $hget(sq.uploads,%var) }
      inc %num 1
    }
    %tempmsg = $replace(%tempmsg,^uploads720h,$bytes($calc(%data *1024),3).suf)
  }
  %tempmsg = $replace(%tempmsg,^bandwidthdown,$calc($sq.get(ftpbandwidthup) +0))
  %tempmsg = $replace(%tempmsg,^bandwidthup,$calc($sq.get(ftpbandwidthdown) +0))
  %tempmsg = $replace(%tempmsg,^maxuserup,$sq.get(ftp.maxuserup))
  %tempmsg = $replace(%tempmsg,^maxuserdown,$sq.get(ftp.maxuserdown))
  %tempmsg = $replace(%tempmsg,^freeup,$calc($sq.get(ftp.maxuserup) - $sq.ftpuploaders))
  %tempmsg = $replace(%tempmsg,^freedown,$calc($sq.get(ftp.maxuserdown) - $sq.ftpdownloaders))
  %tempmsg = $replace(%tempmsg,^port,$sq.get(ftp.port)) 
  %tempmsg = $replace(%tempmsg,^SQ,$sq.version) 
  %tempmsg = $replace(%tempmsg,^list,/msg $me $SQ.get(trigger.files))
  %tempmsg = $replace(%tempmsg,^ServingFiles,$lines($SQ.get(@find.fileslist)))
  %tempmsg = $replace(%tempmsg,^ServingData,$iif($sq.get(stat.servingdata),$bytes($sq.get(stat.servingdata),3).suf,0))
  %tempmsg = $replace(%tempmsg,^loggedup,$sq.ftpuploaders)
  %tempmsg = $replace(%tempmsg,^loggeddown,$sq.ftpdownloaders)
  %tempmsg = $replace(%tempmsg,^logged,$SQ.get(ftplogged)) 
  %tempmsg = $replace(%tempmsg,^IP,$iif($sq.get(currentip),$sq.get(currentip),$ip))
  %tempmsg = $replace(%tempmsg,^accountomat,<accountmaker>) 
  %tempmsg = $replace(%tempmsg,^runHH,$asctime($calc($ticks / 1000 + $timezone),HH))
  %tempmsg = $replace(%tempmsg,^runMM,$asctime($calc($ticks / 1000 + $timezone),nn)) 
  %tempmsg = $replace(%tempmsg,^runSS,$asctime($calc($ticks / 1000 + $timezone),ss)) 
  %tempmsg = $replace(%tempmsg,^runDD,$asctime($calc($ticks / 1000 + $timezone),dd)) 
  %tempmsg = $replace(%tempmsg,^runMO,$asctime($calc($ticks / 1000 + $timezone),mm)) 
  %tempmsg = $replace(%tempmsg,^recorduptime,$duration($calc($SQ.get(stat.ticksrecord) / 1000),2)) 
  %tempmsg = $replace(%tempmsg,^recorddownload,$sq.get(stat.bestdownload))
  %tempmsg = $replace(%tempmsg,^recordupload,$sq.get(stat.bestupload))
  %tempmsg = $replace(%tempmsg,^trigger,$iif($sq.get(trigger.ctcp),/ctcp $me $SQ.get(trigger.ftp),$SQ.get(trigger.ftp)))
  %tempmsg = $replace(%tempmsg,^connectionsup,$SQ.get(stat.call))
  %tempmsg = $replace(%tempmsg,^connections24,$SQ.get(stat.c24h))
  %tempmsg = $replace(%tempmsg,^serveruptimeMM,$SQ.get(stat.suptimenn))
  %tempmsg = $replace(%tempmsg,^serveruptimeHH,$SQ.GET(stat.suptimehh))
  %tempmsg = $replace(%tempmsg,^serveruptimeDD,$SQ.get(stat.suptimedd))
  %tempmsg = $replace(%tempmsg,^serveruptimetotal,$SQ.get(stat.suptimetotal))
  %tempmsg = $replace(%tempmsg,^serverup,$SQ.get(stat.sup))
  %tempmsg = $replace(%tempmsg,^serverdown,$SQ.get(stat.sdown))
  %tempmsg = $replace(%tempmsg,^servermoved,$SQ.get(stat.sall))
  %tempmsg = $replace(%tempmsg,^sstartup,$SQ.get(stat.upup))
  %tempmsg = $replace(%tempmsg,^sstartdown,$SQ.get(stat.updown))
  %tempmsg = $replace(%tempmsg,^sstartmoved,$SQ.get(stat.upall))
  %tempmsg = $replace(%tempmsg,^sstartFILESup,$SQ.get(stat.upfilesup))
  %tempmsg = $replace(%tempmsg,^sstartFILESdown,$SQ.get(stat.upfilesdown))
  %tempmsg = $replace(%tempmsg,^sstartFILESmoved,$SQ.get(stat.upfilesall))
  %tempmsg = $replace(%tempmsg,^serverversion,$SQ.get(stat.g6version))
  %tempmsg = $replace(%tempmsg,^sysuptime,$duration($calc($ticks /1000)))
  %tempmsg = $replace(%tempmsg,^login,$iif($sq.get(ftplogin),$sq.get(ftplogin),LOGIN))
  %tempmsg = $replace(%tempmsg,^password,$iif($sq.get(ftppass),$sq.get(ftppass),PASSWORD))
  %tempmsg = $replace(%tempmsg,^RAM,$SQ.get(stat.ram))
  %tempmsg = $replace(%tempmsg,^CPU,$SQ.get(stat.cpu))
  %tempmsg = $replace(%tempmsg,^OSversion,$iif($SQ.get(stat.osver),$SQ.get(stat.osver),$OS))
  return $eval(%tempmsg,2)
}
alias sq.gimick {
  var %count = 1,%buf,%txt = $strip($replace($1,$chr(32),$chr(1))),%color = $iif($2,$2,3 5 7 9 10)
  while (%count <= $len(%txt) && %count < 150) {
    %buf = %buf $+  $+ $gettok(%color,$rand(1,$numtok(%color,32)),32) $+  $+ $mid(%txt,%count,1)
    inc %count 1
  }
  return $replace(%buf,$chr(1),$chr(32))
}
alias sq.seconds {
  var %secs
  inc %secs $calc($gettok($1,1,58) *3600)
  inc %secs $calc($gettok($1,2,58) *60)
  inc %secs $gettok($1,3,58)
  return %secs
}
alias sq.dir { return $shortfn($scriptdir) }

;############################################sfv checker#############################################

alias sq.sfvchecker {
  var %count = 1,%dir = $nofile($1),%result,%checked
  while (%count <= $lines(" $+ $1 $+ ")) {
    %read = $read(" $+ $1 $+ ",%count)
    if ($mid(%read,1,1) != $chr(59) && $len($gettok(%read,$numtok(%read,32),32)) == 8) {
      var %file = %dir $+ $gettok(%read,1- $+ $calc($numtok(%read,32) -1),32)
      inc %checked 1
      if ($istok($2,%checked,59) || ($isfile(" $+ %file $+ ") && $crc(" $+ %file $+ ") == $gettok(%read,$numtok(%read,32),32))) { 
        if ($isfile(" $+ %file $+ -missing")) { .remove " $+ %file $+ -missing" }
        if ($isfile(" $+ %file $+ -incomplete")) { .remove " $+ %file $+ -incomplete" }
        %result = %result 0 $+ %count 
      }
      elseif ($isfile(" $+ %file $+ ")) { 
        if ($isfile(" $+ %file $+ -missing")) { .remove " $+ %file $+ -missing" }
        if (!$isfile(" $+ %file $+ -incomplete")) { write -c " $+ %file $+ -incomplete" }
        %result = %result 1 $+ %count 
      }
      else { 
        if (!$isfile(" $+ %file $+ -missing")) { write -c " $+ %file $+ -missing" }
        if ($isfile(" $+ %file $+ -incomplete")) { .remove " $+ %file $+ -incomplete" }
        %result = %result 2 $+ %count 
      }
    }
    inc %count 1
  }
  return %result
}
alias sq.lock {
  if ($1) { 
    sq.set sq.lock $1 
    sq.set lock $1
    sq.sysmsg SQ-script locked
  }
}
alias sq.sfvmonitor {
  if (!$sq.get(ftp.usesfv)) { return }
  var %tempcount = 1,%address
  while (%tempcount <= $ini($sq.dir $+ SQsfvmonitor.log,0)) {
    var %sect = $ini($sq.dir $+ SQsfvmonitor.log,%tempcount),%address = $readini($sq.dir $+ SQsfvmonitor.log,%sect,address),%lastfile = $readini($sq.dir $+ SQsfvmonitor.log,%sect,sfvfile),%ok,%nick = $readini($sq.dir $+ SQsfvmonitor.log,%sect,nick)
    if ($ial(%address,1) || $ial($mask(%address,3),1) || %nick) {
      while ($readini($sq.dir $+ SQsfvmonitor.log,%sect,%count)) {
        if (uploaded successfully ! isin $readini($sq.dir $+ SQsfvmonitor.log,%sect,%count)) { %ok = $addtok(%ok,%count,59) }
        inc %count 1
      }
      %count = 1
      var %result = $sq.sfvchecker(%lastfile,%ok),%count = 1,%dirty = 0,%nick = $iif($ial(%address,1).nick,$ial(%address,1).nick,%nick),%dir = $nofile(%lastfile)
      while (%count <= $numtok(%result,32)) {
        var %status = $mid($gettok(%result,%count,32),1,1),%line = $mid($gettok(%result,%count,32),2),%checked = $read(" $+ %lastfile $+ ",%line)
        if (%status == 0) { writeini -n $sq.dir $+ SQsfvmonitor.log %sect %count " $+ $mid(%checked,1,$calc($len(%checked) -9)) $+ " uploaded successfully ! }
        elseif (%status == 1) { writeini -n $sq.dir $+ SQsfvmonitor.log %sect  %count " $+ $mid(%checked,1,$calc($len(%checked) -9)) $+ " (CRC failed) | inc %dirty }
        else { writeini -n $sq.dir $+ SQsfvmonitor.log %sect %count " $+ $mid(%checked,1,$calc($len(%checked) -9)) $+ " (File not found) | inc %dirty }
        inc %count 1
      }
      if (!%dirty) { 
        var %n = $finddir(%dir,FileStatus *,1,.rmdir " $+ $1- $+ ")
        sq.sysmsg %nick successfully uploaded all files to $nofile(%lastfile) $+ . All CRC ok 
        $sq.reminisection($sq.dir $+ SQsfvmonitor.log,%sect)
        if ($isdir(" $+ $gettok(%dir,1-,92) - INCOMPLETE")) { rmdir " $+ $gettok(%dir,1-,92) - INCOMPLETE" }
        dec %tempcount 1
      }
      else {
        dec %count
        var %percent = $int($calc((%count - %dirty) / %count * 100))
        var %n = $finddir(%dir,FileStatus *,1,.rmdir " $+ $1- $+ ")
        mkdir " $+ %dir $+ FileStatus $chr(91) $+ $str($chr(35),$int($calc(%percent /5))) $+ $str(_,$calc(20- $int($calc(%percent /5)))) $+ $chr(93) %percent $+ $chr(37) OK"
        if (!$isdir(" $+ $gettok(%dir,1-,92) - INCOMPLETE")) { mkdir " $+ $gettok(%dir,1-,92) - INCOMPLETE" }

      }
    }
    inc %tempcount 1
  }
}
alias sq.checkoldnos {
  if (!$sq.get(status.deloldnos)) { return }
  var %count = 1,%file = $sq.dir $+ sq.NoS.txt
  While (%count <= $Lines(%file)) {
    var %line = $read(%file,%count)
    if ($calc($ctime - $gettok(%line,1,59)) > $sq.seconds($sq.get(trigger.nosdelage) $+ :00:00)) { write -d $+ %count %file }
    else { inc %count }
  }
}

;#####################################Default settings#####################################

alias SQ.setdefault {
  .disable #bpftp
  .disable #raidenftpd
  if ($hget(sq.messages)) { hfree sq.messages | hmake SQ.messages 10 }
  sq.set msg.@find I found ^matches match(es) on ^searchword in my Database!My siteinfo on ^trigger / My fileslist on ^list;^@findresults
  sq.set noflood.ctcp.ignore SLOTS;MP3;MPG;AVI;ASF;MPEG | sq.set color.idle 1 | sq.set color.uploading 3 | sq.set color.downloading.ok 12 
  sq.set color.downloading.slow 4 | sq.set trigger.bannerchannel #advertize_here | sq.set trigger.bannerdelay 3600 
  sq.set msg.banner Login to my FTP with ^trigger (or whatever text you like) | sq.set trigger.ftp ! $+ $me 
  sq.set trigger.files ! $+ $me $+ -list | sq.set trigger.stat !stats $me | sq.set @find.channel #chan | sq.set @find.fileshits 20 
  sq.set color.logging 3 | sq.set color.notifier 5,9 | sq.set stat.refresh 60 | sq.set away.autoaway.time 15 
  sq.set noflood.protecttime 3 | sq.set away.exclude #noawaymsg | sq.set ftp.netsplit 20 | sq.set ftp.nouser 5 
  sq.set ftp.maxuserup 2 | sq.set ftp.maxuserdown 2 | sq.set trigger.status 0 | sq.set ftp.status 0 
  sq.set @find.status 0 | sq.set stat.status 0 | sq.set trigger.bannerstatus 0 | sq.set ftp.login 0 
  sq.set away.silent $true | sq.set sound.request $true | sq.set away.autoaway.status 0 | sq.set noflood.dccblock $true 
  sq.set noflood.ctcpblock $true | sq.set ftp.startserver 1 | sq.set away.tray $true | sq.set ftp.killserver 0 
  sq.set sq.nickkeeper 0 | sq.set stat.status.ftp 0 | sq.set ftp.deloldlog $true | sq.set ftp.!free $true 
  sq.set sound.onquery 0 | sq.set window.backgrnd 0 | sq.set sound.onnick 0 | sq.set sq.notifier 1 
  sq.set eggdrop.status 0 | sq.set eggdrop.fastrevenge 0 | sq.set eggdrop.kickondeopme 0 
  sq.set eggdrop.protect.kick 0 | sq.set eggdrop.reop 0 | sq.set eggdrop.banondeopme 0 | sq.set eggdrop.protect.ban 0 
  sq.set eggdrop.protect 0 | sq.set eggdrop.formodes 0 | sq.set eggdrop.keepcon $true | sq.set eggdrop.onlycon 0 
  sq.set sq.messenger Away | sq.set window.state normal | sq.set ftp.port 23 | sq.set trigger.ctcp 0
  sq.set ftp.sqlogin SQ-script | sq.set ftp.sqpass SQ-script | sq.set request.status 0 | sq.set ftp.configured 0 
  sq.set ftp.directory 0 | sq.set msg.stat My PC is running the ^runDD.day for ^runHH:^runMM:^runSS | sq.set @find.ctcp 0
  sq.del @find.fileslist | sq.set status.fileslists.refresh 7
  sq.set @find.fileslist.refresh 0 | write -c $sq.dir $+ sq.NoS.txt | sq.set trigger.nosdelage 48 
  sq.set ftp.removeoldnos 0 | sq.set away.notice 0 | sq.set color.beenonftp 3 | sq.set @find.fileslist.refresh 7
  sq.set ftp.maxservstatus 0 | sq.set ftp.maxserv 5120 | sq.set sound.silence.begin 22 | sq.set sound.silence.stop 8 | sq.set ftp.restricthost 1
  sq.set sound.winamp.hour 8 | sq.set sound.winamp.minutes 0 | sq.set @find.connection.host 127.0.0.1 | sq.set noflood.spam.ignore *http:*;*sex*;*girls*
  sq.set trigger.chatport 50000-65000
  if ($isfile($sq.dir $+ mask.conf)) {
    var %count = 1,%file = $sq.dir $+ mask.conf
    while (%count <= $ini(%file,default,0)) {
      $readini(%file,default,%count)
      inc %count 1
    }
  }
  if ($dialog(sq)) { sq.loaddialog 1 }
}

;########################################Checkupdate######################################################

alias sq.checkupdate {
  if ($sock(sq.checkupdate)) { return }
  .timersq.checkupdate 1 10 sockclose sq.checkupdate
  sockopen sq.checkupdate jumpins.dyndns.org 80
  if ($1 == get && $lock(dll)) { 
    sq.sysmsg You cannot use "hot update". Please enable the use of DLL's in the mIRC options
    return 
  }
  if ($1) { sq.set 60 getupdate $1 }
}
on *:sockopen:sq.checkupdate:{
  .timersq.checkupdate off
  if ($sockerr) { return }
  sq.set checkupdate 0 
  if ($sq.get(getupdate) == get) {
    window -a @SQ-script!
    write -c $sq.dir $+ new.sq-script.mrc.gz
    .remove $sq.dir $+ new.sq-script.mrc
    sockwrite -n $sockname GET /scripts/sq-script.mrc.gz HTTP/1.0 $sq.info $sq.version
    sockwrite -n $sockname Accept: */* 
    sockwrite -n $sockname Host: jumpins.dyndns.org 
    sockwrite -n $sockname 
    sq.sysmsg downloading update, please wait
    window -aCpdoh +lef @sq-download 1 1 110 60
    drawfill @sq-download 15 15 1 1
    drawtext @sq-download 1 arial 12 10 3 Filesize:
  }
  else {
    write -c $sq.dir $+ tempversion.txt
    sockwrite -n $sockname GET /version.txt HTTP/1.0 $sq.info $sq.version
    sockwrite -n $sockname Accept: */* 
    sockwrite -n $sockname Host: jumpins.dyndns.org
    sockwrite -n $sockname 
  }
}
on *:sockread:sq.checkupdate:{
  if (!$sq.get(checkupdate)) {
    var %header 
    sockread %header
    while ($sockbr) { 
      if (Content-length: * iswm %header) {
        sq.set downloadlength $gettok(%header,2,32)
        if ($window(@sq-download)) { drawtext @sq-download 1 arial 12 10 3 Filesize: $bytes($sq.get(downloadlength),3).suf }
      }
      if (* !iswm %header) { 
        sq.set checkupdate 1 
        sq.set downloadoffset $sock($sockname).rcvd
        break 
      } 
      sockread %header 
    }
  }
  else { 
    sockread &d 
    while ($sockbr) { 
      if ($sq.get(getupdate) == get) { 
        bwrite $sq.dir $+ new.sq-script.mrc.gz -1 &d 
        var %done = $round($calc(100 * ($sock($sockname).rcvd - $sq.get(downloadoffset)) / $sq.get(downloadlength)),1)
        drawrect -f @sq-download 12 15 1 20 %done 40
      }
      else { bwrite $sq.dir $+ tempversion.txt -1 &d }
      sockread &d 
    }
  }
}
on *:sockclose:sq.checkupdate:{
  sq.del checkupdate
  window -c @sq-download
  if ($sq.get(getupdate) == get) { 
    sq.del getupdate
    if ($isfile($sq.dir $+ ngzipn.dll)) { sq.sysmsg Using $dll($sq.dir $+ nGZIPn,version,0) }
    else { sq.sysmsg Could not find nGZIPn.dll in SQ-Script directory, cannot decompress new version | return }
    if ($dll($sq.dir $+ ngzipn.dll,unzip,$sq.dir $+ new.sq-script.mrc)) { sq.sysmsg Update was successfully decompressed }
    else { sq.sysmsg Error on decompressing update | return }
    var %version = $read($sq.dir $+ new.sq-script.mrc,1)
    .remove $sq.dir $+ new.sq-script.mrc.gz
    if ($remove($gettok(%version,2,32),.) $+ . $+ $gettok(%version,4,32) >= $remove($gettok($sq.version,1-2,46),.) $+ . $+ $gettok($sq.version,3,46)) {
      sq.sysmsg Applying update, please wait
      .timersq.updated 1 2 sq.updated $sq.version
      .remove " $+ $script $+ "
      .rename $sq.dir $+ new.sq-script.mrc " $+ $script $+ "
      .reload -rs " $+ $script $+ "
    }
    else {
      sq.sysmsg Downloaded version is not newer than current version, aborting update 
      .remove $sq.dir $+ new.sq-script.mrc
    }
  }
  else { 
    if (!$sq.get(newversion)) { .timersq.latest -m 1 100 sq.latest $read($sq.dir $+ tempversion.txt,1) }
    .remove $sq.dir $+ tempversion.txt 
  }
}
alias sq.updated {
  if ($1 <= $sq.version) { 
    sq.sysmsg SQ-Script was successfully updated to $sq.version
    sq.del sq.newversion
  } 
  else { sq.sysmsg Something went wrong on updateing from $1- to $sq.version }
}
alias sq.latest {
  if ($1 != $sq.version && !$sq.get(newversion)) { 
    sq.set sq.newversion 1
    sq.sysmsg There is a new Version of SQ-Script available from www.sq-script.tech.nu : $1- 
    sq.sysmsg Your Version is: $sq.version
    if ($input(There is a newer Version than yours. $+ $crlf $+ Do you want to update ?,yi,Update)) { 
      if ($dialog(sq)) { dialog -x sq }
      sq.set getupdate get
      .timer 1 1 sq.checkupdate get 
    }
  }
  elseif ($sq.get(forceupdate)) {
    .timer 1 1 sq.checkupdate get 
    sq.del forceupdate
  }
  else { sq.del getupdate sq.newversion }
}
menu @sq-download {
  sclick:{
    window -c @sq-download
    sq.sysmsg 4Download aborted. Please get the update manually from http://sq-script.tech.nu
    sockclose sq.checkupdate
    .remove $sq.dir $+ new.sq-script.mrc.gz
  }
}

;###################################Dialog Section#######################################

dialog SQ {
  title SQ-Script $sq.version
  option dbu
  size -1 -1 294 300
  tab "Trigger/@Find", 1,  1 1 292 280
  tab "Stats", 3  
  tab "Misc", 4
  tab "FTP server",5
  tab "Messenger/DCC request",6
  tab "Eggdrop",2
  link "WWW",98, 17 287 20 18
  button "Ok",99, 49 282 61 18, ok
  button "Apply",97, 110 282 61 18
  button "Undo",96, 171 282 61 18
  button "Cancel",95, 232 282 62 18, cancel
  list 94,1 1 1 1,hide
  list 93,1 1 1 1,hide
  box "",92,1 279 48 21
  ;tab1 -------------------------------------------------------------------------------------------------------------------------------------------------------
  text "Connect to FTPserver",100,190 26 55 10, tab 1
  check "OFF",101,245 25 20 10, tab 1 push
  text "on the channel",102,108 67 60 10, tab 1
  combo 103,150 66 40 40, drop size tab 1
  box "FTP",104, 10 17 278 135, tab 1
  text "Connection to FTP",105, 20 26 45 10, tab 1
  radio "OFFline",106, 70 25 30 10, tab 1
  check "Verbose @find matches",107 ,200 265 65 10,tab 1
  text "Trigger Status",108, 102 26 40 10, tab 1
  check "OFF",109, 140 25 20 10, tab 1 push
  text "Triggermsg for",110,18 67 60 10, tab 1
  combo 111, 62 66 40 40, drop size tab 1
  edit "",112, 65 40 60 10, tab 1 autohs 
  text "Your FTP-Trigger:",113, 15 41 45 10, tab1
  edit "",114, 175 40 60 10, tab 1 autohs
  text "Your List-Trigger:",115, 130 41 42 10, tab 1
  box "Trigger message",116, 12 55 274 93, tab 1
  edit "",117, 15 82 270 52, tab 1 multi return autovs vsbar autohs limit 800
  check "",118,200 137 80 7,tab 1
  text "! Don't touch the <Header>-line !",119,200 68 85 10,tab 1
  text "Chat port",120, 20 136 25 10,tab 1
  edit "50000-65000",121, 45 135 40 10,tab 1

  box "@find",124, 10 153 278 122, tab 1
  text "@find-Status",125, 15 207 40 10, tab 1
  check "OFF",126, 50 205 20 10, tab 1 push
  text "Your Files-list:",127, 15 220 40 10, tab 1
  button "files-list",128, 50 218 140 10, tab 1 
  text "Channels, @find is working in; separate with comma ('',''):",129, 15 230 75 20, tab 1
  edit "@find-channels",130, 90 233 95 10, tab1 autohs
  text "Number of matches to be displayed:",131 , 15 247 90 10, tab 1
  text "",132,102 247 6 10,center tab 1
  icon 133, 200 195 80 80, [ $shortfn([ $scriptdir $+ SQuirrel.jpg ]) ] , 1 , tab 1 noborder
  button "Preview Triggermsg as sysmsg",134, 90 136 100 10, tab 1
  edit "",135, 15 160 270 42, tab 1 multi return autovs vsbar autohs limit 800
  button "Preview @findmsg as sysmsg",136, 90 205 100 10, tab 1
  button "Make list",137,135 246 40 10, tab 1
  scroll "",138,107 246 10 10, range 50 tab 1
  check "Send matches as txt-file if exceedes limit",139,15 257 106 7,tab 1
  check "Connect to @find server",140,125 258 63 15,tab 1 push
  check "",141,15 265 105 8,tab 1
  ;tab3-----------------------------------------------------------------------------------------------
  box "Server- and PC-statistics",301, 10 20 280 258, tab 3
  text "Stats-trigger Status",302, 20 35 50 10, tab 3
  check "OFF",303, 70 33 20 10, tab 3 push
  text "Enter stats-trigger",304, 100 35 50 10, tab3
  combo 305, 85 50 60 100, tab 3 drop size
  list 306, 13 70 270 80, tab 3
  text "Choose a variable",307, 20 51 60 10, tab 3
  button "Setup ^NewOnServer Variable",308,20 150 100 10, tab 3
  text "mins",309, 83 260 15 10, tab 3
  text "",310,210 35 60 14,tab 3

  button "Preview as system-msg",321, 130 229 100 10, tab 3
  edit "",322, 13 170 270 55, tab 3 multi return autovs autohs vsbar
  text "You can send this text above to the active window by typing /sq.stats",323, 20 230 100 20, tab 3
  check "Enable Server- and PC-stat variables (only BPFTPserver)",324, 20 248 150 10, tab 3
  text "Refresh every",325, 30 260 40 10, tab 3
  text "",326,65 260 9 10, tab 3 center
  edit "!stats",327, 150 34 60 10, tab 3
  scroll "",328,72 258 10 10,tab 3 range 180
  ;tab4-----------------------------------------------------------------------------------------------------------------
  box "Misc Settings",401, 10 20 280 258, tab 4
  button "Reset all values to default",402,20 85 80 15, tab 4
  text "Color for users been on server",403 , 20 225 100 10, tab 4
  button "Load Script",404, 20 35 80 15, tab 4
  edit "3",405, 100 224 10 10, tab 4 center
  button "Unload SQ-Script",406, 20 60 80 15, tab 4
  check "Minimize mIRC to tray on away",407,20 120 120 10, tab 4
  text "Set the security level of the CTCP-floodprotection (10 = Paranoid / 1 = overconfident / 0 = OFF)",408, 13 105 125 14, tab 4
  text "",409, 140 109 10 10, tab 4 center
  edit "#channel",410, 120 130 60 10, tab 4 autohs
  check "Silent away - else excluded channels :",411, 20 130 100 10, tab 4
  check "Request Sounds",412, 20 140 60 10, tab 4
  check "Block DCCs while away (Will disable soundrequests, too)",413, 20 150 160 10, tab 4
  check "Block CTCPs while away",414, 20 160 100 10, tab 4
  check "Enable Nickkeeper",415, 20 180 80 10, tab 4
  check "Enable >!free upload/download< lookup",416,20 170 120 10, tab 4
  check "Send away notice if someone mentiones your nick",417,20 190 140 10, tab 4
  check "Play this Sound, if someone opens a query to you:",418, 20 210 130 10, tab 4
  button "",419,150 210 100 10, tab 4
  text "Color for users idle on server",420 , 20 235 100 10, tab 4
  edit "1,0",421, 100 234 10 10, tab 4 center
  text "Color for users uploading",422, 20 245 100 10, tab 4
  edit "11,0",423, 100 244 10 10, tab 4 center
  text "Color for users downloading",424, 20 255 100 10, tab 4
  edit "7,0",425, 100 254 10 10, tab 4 center
  text "Color for users beeing too slow",426, 20 265 100 10, tab 4
  edit "4,0",427, 100 264 10 10, tab 4 center
  list 428, 120 40 60 40, tab 4 hsbar
  button "Unload Script",429, 120 72 60 20, tab 4
  text "Other loaded scripts:",430, 120 30 60 10, tab 4
  check "Enable Auto-away after",431, 20 200 70 10, tab 4
  text "",432, 88 201 9 10, tab 4 center
  scroll "",433,95 199 10 10,tab 4 range 180
  text "minutes",434, 107 201 30 7, tab 4
  text "Ignore CTCP:",435, 120 230 40 10, tab 4
  edit "",436, 160 229 50 10, tab 4
  button "Add to CTCP-ignore-list     -=>",437, 120 240 90 10, tab 4
  list 438, 220 229 60 45, tab 4 autovs
  text "Doubleclick on any item to remove it from the list",439, 120 255 60 15, tab 4
  scroll "",440,150 107 10 10,tab 4 range 10
  box "MusicWakeUp",441,186 30 102 70,tab 4
  check "Wake me up at",442,190 40 47 10,tab 4
  text "00",443,237 42 7 10,tab 4 right
  scroll "",444,246 40 7 10,tab 4 range 23
  text ":",445,254 42 2 10,tab 4
  text "00",446,256 42 7 10,tab 4 center
  scroll "",447,265 40 7 10,tab 4 range 59
  check "Exclude weekends",448,190 50 60 10,tab 4
  combo 449,190 60 95 40,tab 4 drop size
  check "Music is getting louder",450,190 75 70 10,tab 4
  button "Reset player location",451,205 85 70 10,tab 4
  box "",452,15 218 100 58,tab 4
  box "",453,117 218 171 58,tab 4
  box "Spamblocker",454, 186 102 102 107,tab 4
  check "Enable Spamblocker",456, 190 110 60 10,tab 4
  text "Enter a text you want to be blocked from your query. You can use wildcards",457,190 120 90 21,tab 4
  edit "",458,190 145 90 10,tab 4
  Button "Add to SpamList",459, 190 155 90 10,tab 4
  list 460, 190 165 90 44,tab 4 autovs
  ;tab5-------------------------------------------------------------------------------------------------------------
  box "FTP server integration",500, 10 20 280 255, tab 5
  text "for",501,81 140 10 10, tab 5
  button "Setup FTP server integration",502, 90 30 100 20, tab 5
  box "Account settings",503,13 115 130 80, tab 5
  text "Choose IRCgroup:",504,17 125 50 10, tab 5
  combo 505,65 124 70 40, tab 5 drop size
  text "Minimum kbytes/s",506,17 140 50 10, tab 5
  edit "",507,65 139 15 10, tab 5 center
  text "Associated FTPgroup:",508,17 155 55 10, tab 5
  combo 509,70 154 50 40, tab 5 drop size
  text "Below you can enter any message to advertize in channels. You can use all variables provided by SQ-Script",510, 20 200 270 10, tab 5
  edit "",511, 15 210 270 20, tab 5 hsbar autohs multi autovs limit 300
  text "How many secs should be between each addvertizing:",512, 13 245 140 10, tab 5
  edit "3600",513, 145 243 20 10, tab 5
  text "Ad Status",514, 233 244 25 10, tab 5 right
  check "OFF",515, 259 243 20 10, tab 5 push
  text "Enter all channels you want to advertize in separate with comma ('','')",516, 15 255 100 20, tab 5
  edit "#",517, 120 258 160 10, tab 5 autohs
  button "Preview ad as sysmsg",525, 20 232 100 10, tab 5
  edit "localhost",526, 190 113 40 10, tab 5 center read
  edit "",527, 232 113 20 10, tab 5 center read
  text ":",528, 230 115 2 10, tab 5
  text "IP:Port =",529, 165 114 25 10, tab 5
  text "Login/Pass =",530, 155 129 35 10, tab 5
  edit "",531, 190 128 29 10, tab 5 center read
  text "/",532, 220 129 3 10, tab 5
  edit "",533, 224 128 29 10, tab 5 center read
  box "Server settings for SQ-script",534, 150 103 120 40, tab 5
  text "SQ-script Banlist",535,150 145 60 10, tab 5
  list 536, 150 155 130 48, tab 5 hsbar
  edit "",539,92 139 15 10, tab 5 center
  text "Netsplit timeout:",540, 13 86 40 10, tab 5
  text "",541,60 86 9 10, tab 5 center
  text "mins",542,82 86 13 10, tab 5
  check "Start FTP server when needed",543, 13 65 100 10, tab 5 disabled
  check "Close FTP server when closing mIRC",544, 13 75 110 10, tab 5 disabled
  text "times",545,109 140 15 10, tab 5
  text "No-User timeout",546,13 96 40 10, tab 5
  text "",547,60 96 9 7, tab 5 center
  text "mins",548,82 96 13 10, tab 5
  text "Max users upload:",549,13 106 45 10, tab 5
  text "",550,58 106 6 10, tab 5 center
  text "Limit transfer",551,17 170 40 10, tab 5
  edit "",552,60 168 20 10, tab 5 right
  text "files",553,81 170 10 10, tab 5
  edit "",554,100 168 20 10, tab 5 right
  text "MBytes",555,121 170 20 10, tab 5
  check "Delete old FTP logfiles",556,13 55 100 10, tab 5
  text "Max users download:",557,76 106 51 10, tab 5
  text "",558,128 106 6 10, tab 5 center
  text "Max Users",559,17 183 40 10, tab 5
  edit "",560,60 181 15 10, tab 5 center
  scroll "",561,70 84 10 10,tab 5 range 60
  scroll "",562,70 94 10 10,tab 5 range 10
  scroll "",563,64 104 10 10,tab 5 range 50
  scroll "",564,135 104 10 10,tab 5 range 50
  check "Enable speedlimit for serving",565,150 55 77 10,tab 5 disabled
  edit "",566,230 55 25 10,tab 5 center disabled
  text "bytes/s",567,256 57 20 10,tab 5
  check "Display changed speedlimit to users",568,150 65 100 10, tab 5 disabled
  check "Show ad only when Trigger is enabled",569,185 232 100 10, tab 5
  check "Listen for !list",570,185 243 45 10,tab 5
  check "Restrict login to IRC-host",571, 150 75 100 10,tab 5 disabled
  check "Enable sfv-check for uploads",572, 150 85 100 10,tab 5 disabled
  ;tab 6-----------------------------------------------------------------------------
  box "Messenger Settings",601, 10 20 280 120, tab 6
  check "Enable Notifier",602, 20 35 60 10, tab 6

  check "Enable Logging",604, 20 55 48 10, tab 6 3state
  text "Whenever your nick was mentioned while away the line will be logged in the SQ-Script window",605, 100 55 130 14, tab 6
  check "Show @SQ-Script window as separate window in Taskbar",606, 20 95 180 10, tab 6
  text "Enter a value for the logging color",608, 20 70 100 10, tab 6
  edit "",609, 105 69 10 10, tab 6 center
  check "Play this Sound, if someone mentiones your nick:",610, 20 115 127 10, tab 6
  button "",611,150 114 100 10, tab 6
  text "Enter colorcode for notifierwindow:",612, 100 30 90 10, tab 6
  edit "",613, 205 29 15 10, tab 6 center
  text "(OFF)",614, 70 56 30 10, tab 6
  box "DCC requests",615, 10 145 280 130, tab 6
  text "Choose the channel where to request files:",616, 12 155 115 10, tab 6
  combo 617, 20 164 65 60, tab 6 size drop 
  text "Choose the nick you want to request from:",618, 12 175 115 10, tab 6
  combo 619, 20 184 65 40, tab 6 size drop 
  text "How many files are allowed in queue:",620 , 12 195 110 10, tab 6
  edit "0",621, 20 204 20 10, tab 6 center 
  text "Choose the requests list",622, 12 214 160 10, tab 6
  button "Requests-list",623, 12 233 59 15, tab 6 
  check "START REQUESTING NOW",625, 125 250 120 20, tab 6 push
  text "Request only *.",628, 20 223 40 10, tab 6
  edit "zip",629, 57 221 20 10, tab 6 left
  text "files",630, 78 223 20 10, tab 6
  list 624, 125 155 160 95,tab 6 size hsbar 
  button "Add to list",631, 72 233 50 15, tab 6
  button "Edit MaxQue",632,250 250 35 20,tab 6 disabled
  check "Don't log sucessfull receipts",633,20 252 80 10,tab 6
  check "Autojoin Channels on connect",634,20 262 100 10,tab 6
  text "Do not listen on channels (komma limited)",635,100 40 100 10,tab6
  edit "#nolisten",636,205 39 80 10,tab 6
  ;tab6/2----------------------------------------------------------------------------------------------------------
  box "Eggdrop Tools",200,10 20 280 258, tab 2
  text "Eggdrop Tools Status",201,13 35 60 10,tab 2
  check "OFF",202,70 33 20 10, tab 2 push
  text "Eggdrops list: (doubleclick to remove)",203,20 50 100 10, tab 2
  list 204,13 60 270 90,tab 2
  text "Channel",205,15 150 50 10, tab 2
  combo 206,15 160 50 50, tab 2 drop
  text "Nick",207,70 150 40 10,tab2
  combo 208,70 160 50 50, tab 2 drop
  text "Method",211,130 150 40 10,tab 2
  combo 212,130 160 40 40,tab 2 drop
  text "Login",213, 175 150 40 10,tab 2
  edit "",214, 175 160 40 11, tab 2
  text "Password",215,220 150 40 10, tab 2
  edit "", 216, 220 160 40 11, tab 2 pass
  text "Rating",217, 265 150 22 10, tab 2
  combo 218,265 160 22 40, tab 2 drop
  button "Add to List" 219, 13 175 275 10, tab 2
  check "Keep permanent connection to chat/telnet bots",220,20 190 125 10, tab 2
  check "On deop/kick/ban you reop immediately",221,20 200 120 10,tab 2
  check "Revenge: Kick first",222,30 210 100 10, tab 2
  check "Revenge: Ban first",223,30 220 100 10, tab 2
  check "Protect eggdrops against deop/kick/ban",225,20 240 120 10, tab 2
  check "Revenge: Kick bad user first",226,30 250 100 10, tab 2
  check "Revenge: Ban bad user first",227,30 260 100 10,tab 2
  check "Make all mode changes via chat/telnet",228,150 190 120 10, tab 2
  check "Choose fastest method for revenge",229,160 200 100 10,tab 2
  check "Connect only (no OP)",230,150 220 100 10, tab 2
}

;##########################################init section######################################################

alias sq.setscroll {
  if ($did < 100 || $did == 402) {
    var %counter = 1
    did -r sq 93
    while (%counter <= $0) {
      var %var = $gettok($ [ $+ [ %counter ] ],4,59),%text = $gettok($ [ $+ [ %counter ] ],1,59),%scroll = $gettok($ [ $+ [ %counter ] ],2,59),%range = $gettok($ [ $+ [ %counter ] ],3,59)
      did -r sq %text
      did -o sq %text 1 $sq.get(%var)
      did -c sq %scroll $calc(%range - $sq.get(%var))
      did -a sq 93 %scroll %text %range %var
      inc %counter 1
    }
  }
  else {
    var %count = 1
    while (%count <= $did(sq,93).lines && $gettok($did(sq,93,%count).text,1,32) != $did) { inc %count 1 }
    if (%count > $did(sq,93).lines) { return }
    var %range = $gettok($did(sq,93,%count).text,3,32),%text = $gettok($did(sq,93,%count).text,2,32)
    did -o sq %text 1 $calc(%range - $did($did).sel)
  }
}
alias sq.tokdialog {
  var %tempcount = 1
  while (%tempcount <= $0) {
    did -r SQ $gettok($gettok($1-,%tempcount,32),1,59)
    didtok SQ $gettok($gettok($1-,%tempcount,32),1,59) 59 $sq.get($gettok($gettok($1-,%tempcount,32),2,59))
    inc %tempcount 1
  }
}
alias sq.wdialog {
  var %tempcount = 1
  while (%tempcount <= $0) {
    did -o SQ $gettok($gettok($1-,%tempcount,32),1,59) 1 $sq.get($gettok($gettok($1-,%tempcount,32),2,59))
    inc %tempcount 1
  }
}
alias sq.setbutton {
  var %tempcount = 1
  while (%tempcount <= $0) {
    if ($sq.get($gettok($gettok($1-,%tempcount,32),2,59))) {
      did -c SQ $gettok($gettok($1-,%tempcount,32),1,59) 
      if ($gettok($gettok($1-,%tempcount,32),3,59)) {
        did -o SQ $gettok($gettok($1-,%tempcount,32),1,59) 1 ON
      }
    }
    else {
      did -u SQ $gettok($gettok($1-,%tempcount,32),1,59) 
      if ($gettok($gettok($1-,%tempcount,32),3,59)) {
        did -o SQ $gettok($gettok($1-,%tempcount,32),1,59) 1 OFF
      }
    }
    inc %tempcount 1
  }
}
alias sq.filltok {
  var %count = 1
  while (%count <= $0) {
    did -r sq $gettok($gettok($1-,%count,32),1,59)
    var %tempcount = 2
    while (%tempcount <= $numtok($gettok($1-,%count,32),59)) {
      did -o sq $gettok($gettok($1-,%count,32),1,59) $calc(%tempcount - 1) $gettok($gettok($1-,%count,32),%tempcount,59)
      inc %tempcount 1
    }
    inc %count 1
  }
}
on *:dialog:SQ:init:0:{ sq.loaddialog }
on *:dialog:SQ:sclick:96:{ sq.loaddialog }
alias sq.loaddialog {
  sq.setscroll 132;138;50;@find.fileshits 326;328;180;stat.refresh 432;433;181;away.autoaway.time 409;440;10;noflood.protecttime 541;561;60;ftp.netsplit 547;562;10;ftp.nouser 550;563;50;ftp.maxuserup 558;564;50;ftp.maxuserdown 443;444;23;sound.winamp.hour 446;447;59;sound.winamp.minutes
  sq.tokdialog 135;msg.@find 322;msg.stat 438;noflood.ctcp.ignore 460;noflood.spam.ignore
  sq.wdialog 421;color.idle 423;color.uploading 425;color.downloading.ok 427;color.downloading.slow 405;color.beenonftp 121;trigger.chatport
  sq.wdialog 517;trigger.bannerchannel 513;trigger.bannerdelay 511;msg.banner 112;trigger.ftp 114;trigger.files 327;trigger.stat
  sq.wdialog 130;@find.channel 609;color.logging 613;color.notifier 410;away.exclude 566;ftp.maxserv 636;sq.notifier.nolisten
  sq.setbutton 109;trigger.status;ON 126;@find.status;ON 303;stat.status;ON 515;trigger.bannerstatus;ON 101;ftp.login;ON 140;@find.connect 569;trigger.bannershow
  sq.setbutton 411;away.silent 412;sound.request 431;away.autoaway.status 413;noflood.dccblock 414;noflood.ctcpblock 543;ftp.startserver 139;@find.sendmatches 634;request.autojoin
  sq.setbutton 544;ftp.killserver 415;sq.nickkeeper 324;stat.status.ftp 556;ftp.deloldlog 416;ftp.!free 565;ftp.maxservstatus 568;sq.setmaxserv 141;@find.ctcp 633;request.log
  sq.setbutton 418;sound.onquery 610;sound.onnick 602;sq.notifier 407;away.tray 417;away.notice 442;sound.winamp.wakeup 448;sound.winamp.weekend 456;noflood.spamblock
  sq.setbutton 202;eggdrop.status;ON 229;eggdrop.fastrevenge 222;eggdrop.kickondeopme 226;eggdrop.protect.kick 221;eggdrop.reop 450;sound.winamp.loud 570;ftp.!list 571;ftp.restricthost 572;ftp.usesfv
  sq.setbutton 223;eggdrop.banondeopme 227;eggdrop.protect.ban 225;eggdrop.protect 228;eggdrop.formodes 220;eggdrop.keepcon 230;eggdrop.onlycon 118;trigger.ctcp 107;@find.verbose
  if ($sq.get(ftp.status)) { did -o sq 106 1 ONline | did -c sq 106 }
  if ($sq.get(ftp.configured) == G6) { did -e sq 565,566,568,543,544,324,571,572 }
  did -e sq 617 | ;did -b 141,118
  did -b Sq 619,621,629,623,631,208,212,214,216,218,219,509
  did -r sq 305,306,214,216,617,619,206,208,214,216,624,204,507,117,539,536,552,554,509,560
  did -m sq 507,539,552,554,560,117
  did -u sq 509,505
  did -o sq 118,141 1 Listen for /ctcp $me
  did -o sq 310 1 The trigger only listenes for /msg $me
  if ($sq.get(request.status)) { 
    did -o SQ 625 1 Requests in progress 
    did -c sq 625
  }
  else { did -o SQ 625 1 START REQUESTING NOW }
  if ($SQ.get(sq.messenger) == Away) { did -c SQ 604 | did -o SQ 614 1 (AWAY) }
  elseif ($SQ.get(sq.messenger) != OFF) { did -uc SQ 604 | did -o SQ 614 1 (ALWAYS) }
  if ($SQ.get(window.state) == desktop) { did -c SQ 606 }
  var %tempcount = 1
  var %counter = 1
  while (%tempcount <= $script(0)) { if (sq-script !isin $script(%tempcount)) { did -o SQ 428 %counter $nopath($script(%tempcount)) | inc %counter 1 } | inc %tempcount 1 }
  didtok sq 449 59 Playlist;Radiostation; $+ $sq.get(sound.winamp.play)
  did -c sq 449 3
  if ($SQ.get(@find.fileslist)) { 
    did -o sq 94 1 $SQ.get(@find.fileslist)
    did -o SQ 128 1 $nopath($longfn($did(94,1).text)) 
  }
  else { 
    did -o sq 94 1 0
    did -o SQ 128 1 Choose Fileslist 
  }
  if ($SQ.get(sound.nick)) { 
    did -o sq 94 2 $SQ.get(sound.nick)
    did -o SQ 611 1 $nopath($longfn($did(94,2).text))
  }
  else {
    did -o sq 94 2 0
    did -o SQ 611 1 Choose soundfile 
  }
  if ($sq.get(sound.query)) { 
    did -o sq 94 3 $sq.get(sound.query)
    did -o SQ 419 1 $nopath($longfn($did(94,3).text)) 
  }
  else {
    did -o sq 94 3 0
    did -o SQ 419 1 Choose soundfile 
  }
  if ($sq.get(ftp.configured)) { sq.wdialog 527;ftp.port 531;ftp.sqlogin 533;ftp.sqpass }
  else { did -h SQ 526,527,528,529,530,531,532,533,534 }
  did -o sq 306 1
  didtok SQ 306 35 $gettok($read($script,n,13),2,59)
  var %count = 1
  while (%count <= $chan(0)) { did -i sq 617,206 1 $chan(%count) | inc %count 1 }
  unset %tempcount
  set -u0 %tempcount 1
  while (%tempcount <= $sq.num(request.nick)) {
    sq.getslash 624 request nick address channel maxqueue count
    inc %tempcount 1
  }
  did -z sq 624
  .echo -q $findfile($sq.dir,SQrequest.*.txt,0,sq.checkoldreq $1-)
  var %count = 13
  while ($read($script,%count)) {
    did -o sq 305 $calc(%count -12) $gettok($read($script,%count),1,59)
    inc %count 1
  } 
  set -u0 %tempcount 1
  while (%tempcount <= $sq.num(eggdrop.nick)) {
    sq.getslash 204 eggdrop channel nick ip address method login pass rating
    inc %tempcount 1
  }
  did -c sq 305 1
  sq.filltok 218;1st;2nd;3rd 111;OP;Voice;Regular;All 509; $+ $sq.ftpgroups
  %count = 1
  while (%count <= $hmatch(sq.messages,trigger*,0)) {
    var %chan = $addtok(%chan,$gettok($hmatch(sq.messages,trigger*,%count),3,1),59)
    inc %count 1
  }
  %count = 1
  while (%count <= $chan(0)) {
    var %chan = $addtok(%chan,$chan(%count),59)
    inc %count 1
  }
  did -r sq 103,505
  didtok sq 103 59 %chan
  var %count = 1,%tok
  while (%count <= $hmatch(sq.messages,trigger*,0)) {
    var %txt = $hmatch(sq.messages,trigger*,%count)
    if ($gettok(%txt,2,1) == O) { %tok = %tok $+ ; $+ OP }
    elseif ($gettok(%txt,2,1) == V) { %tok = %tok $+ ; $+ Voice }
    elseif ($gettok(%txt,2,1) == R) { %tok = %tok $+ ; $+ Regular }
    elseif ($gettok(%txt,2,1) == A) { %tok = %tok $+ ; $+ All }
    %tok = %tok on $gettok(%txt,3,1) $+ ;
    inc %count 1
  }
  didtok sq 505 59 %tok
  did -a sq 505 upload
  %count = 1
  while (%count <= $sq.num(ftp.denynick)) {
    did -o sq 536 %count $sq.tok(ftp.denynick,%count) ( $+ $sq.tok(ftp.denyaddress,%count) $+ )
    inc %count 1
  }
  if ($isfile($sq.dir $+ mask.conf)) {
    var %count = 1,%file = $sq.dir $+ mask.conf
    while (%count <= $ini(%file,menu,0)) {
      $readini(%file,menu,%count)
      inc %count 1
    }
  }
  if ($sq.get(temptime)) { SQ.sysmsg Loaded in: $calc($ticks - $sq.get(temptime)) msecs }
  sq.del temptime
}

alias sq.getslash {
  var %count = 4
  var %temptext = $sq.tok($2 $+ . $+ $3,%tempcount)
  while (%count <= $0) {
    %temptext = %temptext $+ / $+ $sq.tok($2 $+ . $+ $ [ $+ [ %count ] ],%tempcount)
    inc %count 1
  }
  did -o sq $1 %tempcount %temptext
}
;#####################################OK Button############################

on *:dialog:sq:sclick:99:{ sq.savedialog }
on *:dialog:sq:sclick:97:{ sq.savedialog | sq.loaddialog | sq.sysmsg Settings applied }
alias sq.untokdialog {
  var %tempcount = 1
  while (%tempcount <= $0) {
    sq.set $gettok($gettok($1-,%tempcount,32),2,59) $didtok(SQ,$gettok($gettok($1-,%tempcount,32),1,46),59)
    inc %tempcount 1
  }
}
alias sq.rdialog {
  var %tempcount = 1
  while (%tempcount <= $0) {
    sq.set $gettok($gettok($1-,%tempcount,32),2,59) $sq.txt($gettok($gettok($1-,%tempcount,32),1,59))
    inc %tempcount 1
  }
}
alias sq.getbutton {
  var %tempcount = 1
  while (%tempcount <= $0) {
    sq.set $gettok($gettok($1-,%tempcount,32),2,59) $did(SQ,$gettok($gettok($1-,%tempcount,32),1,59)).state
    inc %tempcount 1
  }
}
alias sq.savedialog {
  if ($did(565).state != $sq.get(ftp.maxservstatus) && $sq.get(ftp.configured)) { sq.setmaxserv $did(565).state }
  sq.untokdialog 135;msg.@find 322;msg.stat 438;noflood.ctcp.ignore 460;noflood.spam.ignore
  sq.rdialog 421;color.idle 423;color.uploading 425;color.downloading.ok 427;color.downloading.slow 405;color.beenonftp 566;ftp.maxserv
  sq.rdialog 517;trigger.bannerchannel 513;trigger.bannerdelay 511;msg.banner 112;trigger.ftp 114;trigger.files 327;trigger.stat
  sq.rdialog 130;@find.channel 132;@find.fileshits 609;color.logging 613;color.notifier 326;stat.refresh 432;away.autoaway.time
  sq.rdialog 410;away.exclude 541;ftp.netsplit  547;ftp.nouser 550;ftp.maxuserup 558;ftp.maxuserdown 409;noflood.protecttime
  sq.rdialog 443;sound.winamp.hour 446;sound.winamp.minutes 449;sound.winamp.play 636;sq.notifier.nolisten 121;trigger.chatport
  sq.getbutton 109;trigger.status;ON 126;@find.status;ON 303;stat.status;ON 515;trigger.bannerstatus;ON 101;ftp.login 139;@find.sendmatches 569;trigger.bannershow 107;@find.verbose
  sq.getbutton 411;away.silent 412;sound.request 431;away.autoaway.status 413;noflood.dccblock 414;noflood.ctcpblock 543;ftp.startserver 407;away.tray 140;@find.connect
  sq.getbutton 544;ftp.killserver 415;sq.nickkeeper 324;stat.status.ftp 556;ftp.deloldlog 416;ftp.!free 565;ftp.maxservstatus 568;sq.setmaxserv 141;@find.ctcp 633;request.log
  sq.getbutton 418;sound.onquery 610;sound.onnick 602;sq.notifier 202;eggdrop.status 417;away.notice 442;sound.winamp.wakeup 448;sound.winamp.weekend 570;ftp.!list 571;ftp.restricthost 572;ftp.usesfv
  sq.getbutton 202;eggdrop.status 229;eggdrop.fastrevenge 222;eggdrop.kickondeopme 226;eggdrop.protect.kick 221;eggdrop.reop 450;sound.winamp.loud 456;noflood.spamblock
  sq.getbutton 223;eggdrop.banondeopme 227;eggdrop.protect.ban 225;eggdrop.protect 228;eggdrop.formodes 220;eggdrop.keepcon 230;eggdrop.onlycon 118;trigger.ctcp 634;request.autojoin
  if ($did(SQ,604).state == 1) { sq.set sq.messenger Away }
  elseif ($did(SQ,604).state == 0) { sq.set sq.messenger OFF }
  else { sq.set sq.messenger Always }
  if ($did(SQ,606).state == 1) { sq.set window.state desktop }
  else { sq.set window.state normal }
  sq.del eggdrop.channel eggdrop.nick eggdrop.address eggdrop.method eggdrop.login eggdrop.pass eggdrop.rating eggdrop.ip
  unset %tempcount
  set -u0 %tempcount 1
  while (%tempcount <= $did(sq,204).lines) {
    sq.writeegg channel 1
    sq.writeegg nick 2
    sq.writeegg ip 3
    sq.writeegg address 4
    sq.writeegg method 5
    sq.writeegg login 6
    sq.writeegg pass 7
    sq.writeegg rating 8
    inc %tempcount 1
  }
  if ($sq.get(ftp.configured)) { sq.rdialog 527;ftp.port 531;ftp.sqlogin 533;ftp.sqpass }
  sq.del request.nick request.address request.channel request.maxqueue request.count
  set -u0 %tempcount 1
  while (%tempcount <= $did(SQ,624).lines) {
    sq.writereq nick 1
    sq.writereq address 2
    sq.writereq channel 3
    sq.writereq maxqueue 4
    sq.writereq count 5
    inc %tempcount 1
  }
  if ($sq.get(newrequest) && $sq.get(request.status) && $did(SQ,625).state == 1) {
    var %count = 1
    while (%count <= $sq.num(newrequest)) { 
      if ($sq.istok(request.nick,$sq.tok(newrequest,%count))) { sq.requestall $sq.tok(newrequest,%count) }
      inc %count 1 
    }
  }
  if (!$sq.get(request.status) && $did(SQ,625).state == 1) {
    sq.set request.status 1
    var %count = 1
    while (%count <= $sq.num(request.nick)) {
      var %tempcount = 1
      while (%tempcount <= $sq.tok(request.maxqueue,%count)) { 
        SQ.request $sq.tok(request.nick,%count)
        inc %tempcount 1 
        sq.put request.count $calc($sq.tok(request.count,%count) +1) %count 
      }
      inc %count 1
    }
  }
  elseif ($did(SQ,625).state == 0) { sq.set request.status 0 }
  if ($sq.txt(103) && $sq.txt(111) && $sq.txt(117)) {
    if (<Header* !iswm $didtok(sq,117,59)) { sq.set msg.trigger $+ $mid($sq.txt(111),1,1) $+  $+ $did(103).text <Header>; $+ $didtok(sq,117,59) }
    else { sq.set msg.trigger $+ $mid($sq.txt(111),1,1) $+  $+ $did(103).text $didtok(sq,117,59) }
  }
  elseif ($sq.txt(103) && $sq.txt(111) && !$sq.txt(117)) {
    sq.del msg.trigger $+ $mid($sq.txt(111),1,1) $+  $+ $did(103).text
  }
  if ($sq.txt(505) && $sq.txt(507) isnum && $sq.txt(539) isnum && $sq.txt(509) && $sq.txt(552) isnum && $sq.txt(554) isnum && $sq.txt(560) isnum) {
    if ($sq.txt(505) == upload) {
      sq.set ftp.uploadgroup $sq.txt(509)
    }
    else {
      var %txt = msg.trigger $+ $mid($sq.txt(505),1,1) $+  $+ $gettok($sq.txt(505),3,32)
      sq.set %txt $puttok($sq.get(%txt),<Header: $+ $sq.txt(507) $+ / $+ $sq.txt(539) $+ : $+ $sq.txt(509) $+ : $+ $sq.txt(552) $+ : $+ $sq.txt(554) $+ : $+ $sq.txt(560) $+ >,1,59)
    }
  }
  sq.set @find.fileslist $did(94,1).text
  sq.set sound.query $did(94,3).text
  sq.set sound.nick $did(94,2).text
  .echo -q $findfile($sq.dir,SQrequest.*.txt,0,sq.checkoldreq $1-)
  sq.del newrequest
  hsave -bo SQ.messages $sq.dir $+ SQ-hash.dat
  if ($sq.get(sound.winamp.wakeup)) { .timersq.wakeup -o $sq.get(sound.winamp.hour) $+ : $+ $sq.get(sound.winamp.minutes) 1 1 sq.wakeup }
  else { .timersq.wakeup off }
}
alias sq.writereq {
  sq.set request. $+ $1 $sq.get(request. $+ $1) $+ ; $+ $gettok($did(SQ,624,%tempcount).text,$2,47)
}
alias sq.writeegg {
  sq.set eggdrop. $+ $1 $sq.get(eggdrop. $+ $1) $+ ; $+ $gettok($did(SQ,204,%tempcount).text,$2,47)
}
alias sq.txt {
  return $did(sq,$1).text
}

;#####################################did section##############################

alias sq.status {
  if ($did($did).state == 1) { did -o SQ $did 1 ON }
  else { did -o SQ $did 1 OFF }
}
alias sq.preview {
  var %tempcount = 1
  while (%tempcount <= $numtok($didtok(sq,$1,59),59)) {
    SQ.sysmsg $SQ.SetVariables($replace($gettok($didtok(sq,$1,59),%tempcount,59),$chr(44),::))
    inc %tempcount 1
  }
}
on *:dialog:sq:scroll:*:{
  sq.setscroll
}
on *:dialog:sq:sclick:*:{ 
  if ($did == 5) {
    did -r sq 505
    var %count = 1,%tok
    while (%count <= $hmatch(sq.messages,trigger*,0)) {
      var %txt = $hmatch(sq.messages,trigger*,%count)
      if ($gettok(%txt,2,1) == O) { %tok = %tok $+ ; $+ OP }
      elseif ($gettok(%txt,2,1) == V) { %tok = %tok $+ ; $+ Voice }
      elseif ($gettok(%txt,2,1) == R) { %tok = %tok $+ ; $+ Regular }
      elseif ($gettok(%txt,2,1) == A) { %tok = %tok $+ ; $+ All }
      %tok = %tok on $gettok(%txt,3,1) $+ ;
      inc %count 1
    }
    didtok sq 505 59 %tok
    did -a sq 505 upload
  }
  elseif ($did == 140) {
    if ($did(140).state) {
      var %remote = $input(Enter the address of the remote host,1)
      if (!%remote) { did -u sq 140 | sq.set @find.connection.host 127.0.0.1 }
      else { sq.set @find.connection.host %remote }
      dialog -v sq
    }
    else { sq.set @find.connection.host 127.0.0.1 }
    if ($sock(sq.searchbot)) { sockclose sq.searchbot }
  }
  elseif ($did == 451) {
    sq.del sound.winamp.location
    did -u sq 442
  }
  elseif ($did == 442) {
    if (!$did(442).state || $isfile($sq.get(sound.winamp.location))) { return }
    sq.set sound.winamp.location $$sfile(c:\*.exe,Please select the players exe file)
    dialog -v sq
  }
  elseif ($did == 449) { 
    if ($did(449).sel == 1) {
      var %sel = *.pls,*.m3u
      var %playlist = " $+ $sfile($mircdir $+ %sel) $+ "
      did -oc sq 449 3 %playlist
    }
    else { 
      var %station = $input(Please enter the URL for the radio-station,1,ok)
      did -oc sq 449 3 %station
    }
    dialog -v sq
  }
  elseif ($did == 505) {
    if ($sq.txt(505) == upload) { 
      did -o sq 507,539,552,554,560 1 0
      did -m sq 507,539,552,554,560
      did -ce sq 509 $findtok($sq.ftpgroups,$sq.get(ftp.uploadgroup),1,59)
    }
    else {
      did -n sq 507,539,552,554,560
      var %txt = $remove($sq.tok(msg.trigger $+ $mid($sq.txt(505),1,1) $+  $+ $gettok($sq.txt(505),3,32),1),>)
      did -r sq 507,539,552,554,560
      did -ue sq 509
      IF ($sq.txt(505)) {
        if ($gettok(%txt,2,58)) { 
          did -o sq 507 1 $gettok($gettok(%txt,2,58),1,47) 
          did -o sq 539 1 $gettok($gettok(%txt,2,58),2,47)
          did -o sq 552 1 $gettok(%txt,4,58)
          did -o sq 554 1 $gettok(%txt,5,58)
          did -o sq 560 1 $gettok(%txt,6,58)
        }
        else { did -o sq 507,552,554,560 1 0 | did -o sq 539 1 3 }
        did -c sq 509 $findtok($sq.ftpgroups,$gettok(%txt,3,58),1,59)
      }
      else { 
        did -m sq 507,539,552,554,560 
        did -b sq 509
      }
    }
  }
  elseif ($did == 111 || $did == 103) {
    if ($sq.txt(111) && $sq.txt(103)) {
      did -rn sq 117
      didtok sq 117 59 $sq.get(msg.trigger $+ $mid($sq.txt(111),1,1) $+  $+ $did(103).text)
    }
    else { did -m sq 117 }
  }
  elseif ($did == 324) {
    if ($sq.get(ftp.configured) == G6) {
      var %tmpfile = $+(",$sq.get(ftp.directory),stat.mdl,")
      if ($did(sq,324).state == 1) {
        write -c %tmpfile ;%call;%c24h;%servermins;%serverhours;%serverdays;%servertotuptime
        write %tmpfile ;%serverkbup;%serverkbdown;%serverkball
        write %tmpfile ;%sessionkbup;%sessionkbdown;%sessionkball;%sessionfilesup;%sessionfilesdown;%sessionfilesall
        write %tmpfile ;%serverversion;%PCproc;%PCram;%osver
        sq.ftp.stat.update
      }
      else { .remove %tmpfile }
    }
    else { did -u sq 324 }
  }
  elseif ($did == 206) {
    did -efr sq 208
    while ($did(sq,208).lines < $nick($sq.txt($did),0,o)) {
      did -o sq 208 $calc($did(sq,208).lines + 1) $nick($sq.txt($did),$calc($did(sq,208).lines + 1),o)
    }
  }
  elseif ($did == 208) { sq.filltok 212;Chat;Telnet | did -ef sq 212 | .dns $sq.txt(208) | .userhost $sq.txt(208) }
  elseif ($did == 212) { did -re sq 214,216 }
  elseif ($did == 218) { did -ef sq 219 }
  elseif ($did == 219) { 
    if ($did(sq,204).lines >= 8) { .echp -aq $input(SQ-script supports currently only up to 8 eggdrops,4,Error) | sq.menu }
    elseif ($sq.txt(212) != telnet) {
      did -o sq 204 $calc($did(sq,204).lines + 1) $sq.txt(206) $+ / $+ $sq.txt(208) $+ / $+ $sq.dnsip($address($sq.txt(208),1)) $+ / $+ $address($sq.txt(208),1) $+ / $+ $sq.txt(212) $+ / $+ $sq.txt(214) $+ / $+ $sq.encrypt(@,$sq.txt(216)) $+ / $+ $sq.txt(218)
      did -b sq 208,212,214,216,218,219
      did -f sq 204
    }
    else {
      var %tempport = $input(Please enter port number for telnet connection,1,Telnet)
      if (%tempport isnum) {
        did -o sq 204 $calc($did(sq,204).lines + 1) $sq.txt(206) $+ / $+ $sq.txt(208) $+ / $+ $sq.dnshost($address($sq.txt(208),1)) $+ : $+ %tempport $+ / $+ $address($sq.txt(208),1) $+ / $+ $sq.txt(212) $+ / $+ $sq.txt(214) $+ / $+ $sq.encrypt(@,$sq.txt(216)) $+ / $+ $sq.txt(218)
        did -b sq 208,212,214,216,218,219
        did -f sq 204
      }
    }
  }
  elseif ($did == 402) { 
    if ($input(Do you want to reset all settings from SQ-script to default ? You cannot undo this operation !,8,Question)) { sq.setdefault } 
    sq.menu
  }
  elseif ($did == 137) { if (!$dialog(sq.list)) { dialog -drom sq.list sq.list } }
  elseif ($istok(109.126.202.303.101,$did,46)) { sq.status }
  elseif ($did == 515) { 
    sq.status
    if ($did(SQ,515).state == 0) { .timerSQ.banner off } 
    else { .timersq.banner 1 $sq.get(trigger.bannerdelay) sq.banner }
  }
  elseif ($did == 604) { 
    if ($did(604).state == 1) { did -o SQ 614 1 (AWAY) }
    elseif ($did(604).state == 0) { did -o SQ 614 1 (OFF) }
    else { did -o SQ 614 1 (ALWAYS) }
  }
  elseif ($did == 606) {
    if ($did(606).state == 1) { sq.set window.state desktop | window -c @SQ-Script! | SQ.sysmsg changed window state } 
    else { sq.set window.state normal |  window -c @SQ-Script! | SQ.sysmsg changed window state } 
  }
  elseif ($did == 437) { 
    var %temptext = $addtok($didtok(SQ,438,59),$sq.txt(436),59)
    did -r SQ 438,436
    didtok sq 438 59 %temptext
  }
  elseif ($did == 459) { 
    var %temptext = $addtok($didtok(SQ,460,59),$sq.txt(458),59)
    did -r SQ 460,458
    didtok sq 460 59 %temptext
  }
  elseif ($did == 128) { 
    did -o sq 94 1 $shortfn($sfile($mircdir $+ *.txt,Choose your fileslist,USE)) 
    did -o SQ 128 1 $nopath($longfn($did(94,1).text))
    if (!$did(94,1).text) { did -o sq 128 1 Choose fileslist }
  }
  elseif ($did == 419) { 
    did -o sq 94 3 $shortfn($sfile($mircdir $+ Sounds\,Choose your Querysound,USE))
    did -o SQ 419 1 $nopath($longfn($did(94,3).text))
    if (!$did(94,3).text) { did -o sq 419 1 Choose soundfile }
  }
  elseif ($did == 611) { 
    did -o sq 94 2 $shortfn($sfile($mircdir $+ Sounds\,Choose your Notifysound,USE)) 
    did -o SQ 611 1 $nopath($longfn($did(94,4).text)) 
    if (!$did(94,4).text) { did -o SQ 611 1 Choose soundfile }
  }
  elseif ($did == 321) { sq.preview 322 }
  elseif ($did == 404) { SQ.loadscript SQ }
  elseif ($did == 406) { 
    if (!$input(Really unload ?,8,Unload Script)) { sq.menu | return }
    dialog -x SQ
    sockclose SQ.ftp
    .timerSQ.* off
    if ($input(Do you want to erase all settings $+ $chr(44) too?,8,Erase settings)) { 
      .remove $sq.dir $+ SQ-script.ini 
      .remove $sq.dir $+ SQ-hash.dat 
      hfree sq.vars
      hfree sq.messages
      hfree sq.temps
    }
    else { hsave -bo SQ.messages $sq.dir $+ SQ-hash.dat }
    window -c @SQ-script! 
    .timer 1 1 echo -at 4SQ-script has been unloaded successfully
    .timer 1 2 echo -at 4Please email me at JumpinS@gmx.net to solve the problems you had. Thank you
    .unload -rs " $+ $script $+ "
  }
  elseif ($did == 134) { sq.preview 117 }
  elseif ($did == 136) { sq.preview 135 }
  elseif ($did == 502) {
    if ($lock(run)) { .echo -q $input(You disabled the /run command for scripts. This is an essential part for SQ-script to communicate with the server. $crlf $+ Please enable it and try again.,4,Error) | sq.menu | return }
    sq.savedialog
    dialog -x SQ
    SQ.serverconfig
  }
  elseif ($did == 133) { 
    sq.sysmsg $decode(TWFueSB0aGFua3MgdG86,m) 
    sq.sysmsg $decode(H2JFRG1hbh8gYXMgbXkgYmVzdCBhbmQgbW9zdCBjb25maWRlbnQgYmV0YSB0ZXN0ZXI=,m)
    sq.sysmsg $decode(H3IwMHRiMHkfIGZvciBhbGwgdGhlIGtub3dsZWRnZSBoZSBzaGFyZWQgd2l0aCBtZQ==,m)

    sq.sysmsg $decode(H3N3ZWsfIGZvciBlbmNvdXJhZ2luZyBtZSB0byBzdGFydCBzY3JpcHRpbmc=,m)
    sq.sysmsg $decode(H0RlbW9uR2F3ZB8gZm9yIGhpcyBwYXRpZW5jZSBvbiB0cm91Ymxlc2hvb3Rpbmc=,m)
    sq.sysmsg $decode(YW5kIHRoZSB3d3cubWlyY3NjcmlwdHMub3JnIHRlYW0gZm9yIHRoZWlyIGdyZWF0IHNpdGU=,m)

    if (!$sq.get(gimick)) {
      sq.sysmsg $sq.gimick($decode(U1FVSVJSRUxTREFZIQ==,m))
      sq.set gimick $true
    }
    else { sq.del gimick }
    .timer 1 1 sq.event
  }
  elseif ($did == 305) { did -r sq 306 | did -o sq 306 1 | didtok SQ 306 35 $gettok($read($script,n,$calc($did(305).sel +12)),2,59) }
  elseif ($did == 525) { sq.preview 511 }
  elseif ($did == 429) {
    if ($SQ.get(unloadbusy)) || (!$did(428).sel) { return }
    sq.set 5 unloadbusy $true
    var %count = 1
    While ($did(428).seltext !isin $script(%count)) && (%count <= $script(0)) { inc %count }
    if (!$input(Do you really want to unload [ $nopath($script(%count)) ] ?,8,Unload Script)) { return }
    sq.menu
    SQ.sysmsg " $+ $nopath($script(%count)) $+ " has been unloaded
    .unload -rs " $+ $script(%count) $+ "
    unset %count
    if ($dialog(SQ)) {
      var %tempcount = 1
      var %counter = 1
      did -r SQ 428
      while (%tempcount <= $script(0)) { if (sq-script !isin $script(%tempcount)) { did -o SQ 428 %counter $nopath($script(%tempcount)) | inc %counter 1 } | inc %tempcount 1 }
    }
  }
  elseif ($did == 617) { 
    var %tempcount = 1
    did -ref SQ 619
    while (%tempcount <= $nick($sq.txt(617),0)) { 
      did -o SQ 619 %tempcount $nick($sq.txt(617),%tempcount) 
      inc %tempcount 1 
    }
  }
  elseif ($did == 619) {
    did -e SQ 629,623,621
  }
  elseif ($did == 623) { 
    if ($sq.txt(629) == $null || $chr(42) isin $sq.txt(629) || $chr(63) isin $sq.txt(629)) { .echo -q $input(Filetype may not be blank or contain wildcards,wo,Error) | sq.menu }
    else {
      if ($getdir(*. $+ $sq.txt(629)) == $getdir) { .echo -q $input(Please specify an own DCC GET folder for $sq.txt(629) files in the mIRC options (DCC->Folders) and disable sort by nickname,wo,Warning) }
      var %temp.file = " $+ $$sfile($getdir(*.txt) $+ *.txt,Choose your requests list,Read) $+ "
      if ($lines(%temp.file) > 1000 && !$input(The list you chose contains very large amount of data. $crlf $crlf $+ This will cause mIRC to freeze for a while and you might become disconnected from IRC! $crlf $crlf $+ Load anyways ?,wy,Warning)) { 
        dialog -v sq
        return 
      }
      dialog -v sq
      did -o SQ 623 1 $nopath($longfn(%temp.file)) 
      window -adohpC +Ltfe @PleaseWait -1 -1 300 100
      drawtext @PleaseWait 1 Arial 40 20 10 Please Wait
      drawtext @PleaseWait 1 Arial 16 20 55 Checking for requestable files...
      SQ.sysmsg Reading requests file, this may take a while....
      window -h @sq.temp
      window -h @sq.temp2
      filter -fwc %temp.file @sq.temp ! $+ $sq.txt(619) $+ * $+ . $+ $sq.txt(629) $+ *
      var %last = $remove($gettok($line(@sq.temp,1),$numtok($line(@sq.temp,1),32),32),.)
      var %tempcount = 1,%text,%line,%file,%existed = 0
      window -h @sq.temp3
      var %Nick = $replace($sq.txt(619),<,_,>,_,:,_,\,_,/,_,|,_,*,_,?,_)
      %text = $line(@sq.temp,1)
      if ($filtered) { var %filepath = $getdir($left(%text,$pos(%text,. $+ $sq.txt(629))) $+ $sq.txt(629)) }
      if ($filtered && $isdir(%filepath $+ complete\ $+ %nick)) {
        clear @PleaseWait
        drawtext @PleaseWait 1 Arial 40 20 10 Please Wait
        drawtext @PleaseWait 1 Arial 16 20 55 Found existing downloads folder. Skipping exiting files...
        .echo -q $findfile(%filepath $+ complete\ $+ %nick,*,0,1,aline @sq.temp3 $1-)
      }
      var %stepping = $calc($line(@sq.temp,0) / 300 /2)
      var %counter = 0,%size = 0
      clear @PleaseWait
      while (%tempcount <= $line(@sq.temp,0)) {
        inc %counter 1
        if (%counter > %stepping) {
          %counter = 0
          inc %size 2
          drawrect -f @pleasewait 12 1 0 0 %size 100
          drawtext @PleaseWait 1 Arial 40 20 10 Please Wait
          drawtext @PleaseWait 1 Arial 16 20 55 Writing requests list...
        }
        %text = $line(@sq.temp,%tempcount)
        %line = $left(%text,$pos(%text,. $+ $sq.txt(629))) $+ $sq.txt(629)
        %file = $gettok(%Line,2-,32)
        if (!$fline(@sq.temp3,* $+ $replace(%file,$chr(32),*,_,*) $+ *,1)) { aline @sq.temp2 %line }
        else { inc %existed 1 }
        inc %tempcount 1
      }
      window -c @PleaseWait
      if (!$line(@sq.temp2,0)) { 
        SQ.sysmsg Could not find any files to request from $sq.txt(619) on $sq.txt(617) 
        did -o SQ 623 1 Choose requests file 
        .remove $sq.request.accfile($sq.txt(619)) 
        did -b SQ 631 
      }
      else { 
        SQ.sysmsg Done. Found $line(@sq.temp2,0) out of $filtered files to request ( $+ %existed already existed) 
        did -ef SQ 631 
      }
      savebuf @sq.temp2 $sq.request.accfile($sq.txt(619))
      window -c @sq.temp
      window -c @sq.temp2
      window -c @temp
      .whois $sq.txt(619)
    }
  }
  elseif ($did == 625) { 
    if ($did(625).state == 1) { 
      sq.set request.status 1
      did -o SQ 625 1 Requests in progress
      var %chan = 1
      while (%chan <= $chan(0)) {
        var %count = 1
        while (%count <= $sq.num(request.nick)) {
          if ($sq.tok(request.nick,%count) ison $chan(%chan)) && ($sq.tok(request.channel,%count) == $chan(%chan)) { .timer 1 $rand(0,30) sq.request $sq.tok(request.nick,%count) }
          elseif ($sq.tok(request.channel,%count) == $chan) { .timer 1 $rand(0,30) sq.request $sq.tok(request.nick,%count) }
          inc %count 1
        }
        inc %chan 1
    }    }

    else { 
      sq.set request.status 0
      did -o SQ 625 1 START REQUESTING NOW 
    }
  }
  elseif ($did == 308) { dialog -omdr sq.newonserver sq.newonserver }
  elseif ($did == 98) { url -n http://sq-script.tech.nu/ }
  elseif ($did == 631) { 
    if ($did(sq,624).lines >= 13) { .echo -q $input(SQ-script does only support up to 13 requests at once right now,4,Error) | sq.menu }
    else {
      did -b SQ 623
      if ($sq.txt(619) !ison $sq.txt(617) || !$sq.txt(617) || $sq.txt(621) !isnum || !$sq.txt(623) || $address($sq.txt(619),3) $+ * iswm $SQ.get(request.address)) {
        ;did -b SQ 621,629,619
        ;did -ef SQ 617
        sq.sysmsg Some error encountered. Check your settings.
        echo -a $sq.txt(619) !ison $sq.txt(617) || $sq.txt(617) || $sq.txt(621) !isnum || $sq.txt(623) || $address($sq.txt(619),3) $+ * iswm $SQ.get(request.address)
        if (!$address($sq.txt(619),3)) { sq.sysmsg Perform a /whois lookup on the chosen nick and try again }
      }
      else {
        did -oz sq 624 $calc($did(sq,624).lines + 1) $sq.txt(619) $+ / $+ $address($sq.txt(619),3) $+ / $+ $sq.txt(617) $+ / $+ $sq.txt(621) $+ / $+ 1
        sq.add newrequest $sq.txt(619)
      }
    }
  }
  elseif ($did == 624) {
    did -e sq 632
  }
  elseif ($did == 632 && $did(624).sel) {
    var %temp = $input(Please enter the new limit for the serverqueue,1,Edit Queue limit,$sq.tok(request.maxqueue,$did(624).sel))
    dialog -v sq
    if (0) { }
    if (%temp) { 
      sq.put request.maxqueue %temp $did(624).sel
      set -u0 %tempcount 1
      while (%tempcount <= $sq.num(request.nick)) {
        sq.getslash 624 request nick address channel maxqueue count
        inc %tempcount 1
      }
    }
  }
}
On *:dialog:SQ:dclick:*:{ 
  if ($did == 204) {
    var %temptext = $deltok($didtok(SQ,204,59),$did(sq,204).sel,59)
    did -r sq 204
    didtok sq 204 59 %temptext
  }
  elseif ($did == 438) { 
    var %temptext = $deltok($didtok(SQ,438,59),$did(sq,438).sel,59)
    did -r sq 438
    didtok sq 438 59 %temptext
  }
  elseif ($did == 460) { 
    var %temptext = $deltok($didtok(SQ,460,59),$did(sq,460).sel,59)
    did -r sq 460
    didtok sq 460 59 %temptext
  }
  elseif ($did == 133) { url -n http://SQ-script.tech.nu }
  elseif ($did == 624) { 
    var %temptext = $deltok($didtok(SQ,624,59),$did(624).sel,59)
    did -r sq 624
    didtok SQ 624 59 %temptext
    did -z sq 624
  }
  elseif ($did == 536) {
    var %count = 1,%num = $did(536).sel
    sq.deltok ftp.denynick %num
    sq.deltok ftp.denyaddress %num
    did -r sq 536
    while (%count <= $sq.num(ftp.denynick)) {
      did -o sq 536 %count $sq.tok(ftp.denynick,%count) ( $+ $sq.tok(ftp.denyaddress,%count) $+ )
      inc %count 1
    }
  }
}
on *:dialog:sq:edit:*:{
  if ($did == 214 || $did == 216) { did -e sq 218 }
}

;#############################DCC request section#####################################

alias SQ.remove.request {
  var %count = $sq.findtok(request.nick,$1)
  sq.deltok request.nick %count
  sq.deltok request.channel %count
  sq.deltok request.address %count
  sq.deltok request.maxqueue %count
  sq.deltok request.count %count
  if ($dialog(sq)) { 
    did -r SQ 624
    while (%tempcount <= $sq.num(request.nick)) {
      did -oz SQ 624 $sq.tok(request.nick,%tempcount) $+ / $+ $sq.tok(request.address,%tempcount) $+ / $+ $sq.tok(request.channel,%tempcount) $+ / $+ $sq.tok(request.maxqueue,%tempcount) $+ / $+ $sq.tok(request.count,%tempcount)
      inc %tempcount 1
    }
  }
}
alias sq.requestjoin {
  if ($me !ison $1) { join $1 }
}
alias sq.requestall {
  var %count = 1,%subcount = 1,%regnick
  if ($chr(35) isin $1) {
    while (%count <= $sq.num(request.channel)) {
      if ($sq.tok(request.channel,%count) == $1) {
        .timersq.req $+ %count $sq.min($lines($sq.request.accfile(%regnick)),$sq.tok(request.maxqueue,%count)) $calc(40 + %count) sq.request $sq.tok(request.nick,%count)
      }
      inc %count 1
    }
  }
  elseif (@ isin $1) {
    while (%count <= $sq.num(request.nick)) {
      %regnick = $sq.tok(request.nick,%count)
      if ($sq.tok(request.address,%count) iswm $1) { .timersq.req $+ %count $sq.min($lines($sq.request.accfile(%regnick)),$sq.tok(request.maxqueue,%count)) 40 sq.request %regnick }
      inc %count 1
    }
  }
  else {
    if ($sq.findtok(request.nick,$1)) { 
      %count = $sq.findtok(request.nick,$1) 
      %regnick = $sq.tok(request.nick,%count)
      .timersq.req $+ %count $sq.min($lines($sq.request.accfile(%regnick)),$sq.tok(request.maxqueue,%count)) 40 sq.request $1 
    }
    if ($sq.tok(request.maxqueue,%count) == 0) { sq.set req $+ %count 0 }
  }
}
alias SQ.request {
  if ($SQ.get(request.status)) { 
    if ($sq.istok(request.nick,$1)) { var %tmppnt = $sq.findtok(request.nick,$1) }
    elseif ($sq.istok(request.address,$address($1,3))) { var %tmppnt = $sq.findtok(request.address,$address($1,3)) }
    var %line = $sq.tok(request.count,%tmppnt)
    var %regnick = $sq.tok(request.nick,%tmppnt),%true = 1,%currentnick = $ial($sq.tok(request.address,%tmppnt),1).nick
    if (!%currentnick) { %currentnick = $1 }
    if ($timer(sq.req $+ %tmppnt)) { 
      sq.inc req $+ %tmppnt 
      if ($sq.get(req $+ %tmppnt) > $lines($sq.request.accfile(%regnick))) { .timersq.req $+ %tmppnt off }
    }
    while (%true)  {
      var %tempread = $read($sq.request.accfile(%regnick),s,! $+ %regnick,%line)
      if (%tempread && $isfile($sq.request.file(%tmppnt,$replace(%tempread,$chr(32),$chr(95)),$scriptline))) { 
        sq.sysmsg File > $+ %tempread $+ < from $1 already exists. Skipped....
        write -l $+ $readn $sq.request.accfile(%regnick) <success> $read($sq.request.accfile(%regnick),$readn)
        inc %line 1
        if (%line > $lines($sq.request.accfile(%regnick)) && %true != 2) { 
          if ($timer(sq.req $+ %tmppnt).reps == 0) { .timersq.req $+ %tmppnt off }
          %line = 1 
          %true = 2 
        }
        elseif (%line > $lines($sq.request.accfile(%regnick)) && %true == 2) { %true = 0 | %tempread = $null }
      }
      else { %true = 0 }
    }
    %line = $readn
    if (%tempread && %currentnick ison $sq.tok(request.channel,%tmppnt)) { 
      msg $sq.tok(request.channel,%tmppnt) ! $+ %currentnick %tempread 
      ;3 $+ $chr(443) $+ AutoRequest by SQ-Script $+ $chr(427)
      inc %line 1
      sq.set request.count $puttok($SQ.get(request.count),%line,%tmppnt,59)
    }
    elseif (%currentnick ison $sq.tok(request.channel,%tmppnt)) {
      filter -xffc $sq.request.accfile(%regnick) tempfiles.txt <success>*
      iF ($timer(sq.skipreq $+ %tmppnt)) { .timersq.skipreq $+ %tmppnt off }
      if ($Filtered == 0) {
        SQ.sysmsg Finished requesting all files from %regnick
        msg $sq.tok(request.channel,%tmppnt) @ $+ %currentnick $+ -remove
        window -g1 @SQ-script!
        SQ.remove.request %regnick 1
        .remove tempfiles.txt
        .remove $sq.request.accfile(%regnick)
      }
      else {
        .remove $sq.request.accfile(%regnick)
        .rename tempfiles.txt $sq.request.accfile(%regnick)
        sq.set request.count $puttok($SQ.get(request.count),1,%tmppnt,59) 
        var %text = $read($sq.request.accfile(%regnick),w,!*)
        if (!%text) { 
          sq.sysmsg only failed requests are left for %currentnick 
          sq.sysmsg better check $sq.request.accfile(%regnick)
        }
        elseif ($sq.tok(request.maxqueue,%tmppnt) == 0) { sq.set req $+ %tmppnt $filtered }
        elseif (!$timer(sq.skipreq $+ %tmppnt)) { .timersq.rerequest 1 10 sq.request $1 }
        sq.sysmsg Finished requesting list from %regnick $+ . Proceeding failed DCCs...
        sq.sysmsg Files left: $filtered 
        if ($timer(sq.req $+ %tmppnt)) { sq.dec req $+ %tmppnt }
      }
    }
    else {
      var %delay = $timer(sq.req $+ %tmppnt).delay
      .timersq.req $+ %tmppnt off
      if (%delay < 3000) { .timersq.req $+ %tmppnt $sq.min($lines($sq.request.accfile(%regnick)),$sq.tok(request.maxqueue,%tmppnt)) $calc(%delay * 10) sq.request %regnick }

    }
  }
}
alias sq.request.file {
  var %nickpath = $replace($sq.tok(request.nick,$1),<,_,>,_,:,_,\,_,/,_,|,_,*,_,?,_),%path = $getdir($2)
  if (%path) {
    if (!$isdir(" $+ %path $+ complete $+ ")) { mkdir " $+ %path $+ complete $+ " }
    if (!$isdir(" $+ %path $+ complete\ $+ %nickpath $+ ")) { mkdir " $+ %path $+ complete\ $+ %nickpath $+ " }
  }
  return " $+ %path $+ complete\ $+ %nickpath $+ \ $+ $nopath($2) $+ "
}
on *:filercvd:*:{
  if ($sq.istok(soundrequestfile,$nopath($filename))) { 
    sq.rem soundrequestfile $nopath($filename)
  } 
  if ($sq.istok(request.address,$address($nick,3))) { var %tmpnick = $sq.tok(request.nick,$sq.findtok(request.address,$address($nick,3))) }
  elseif ($sq.istok(request.nick,$nick)) { var %tmpnick = $nick }
  if (%tmpnick) {
    var %count = $sq.findtok(request.nick,%tmpnick),%file = $nopath($filename)
    var %line = $read($sq.request.accfile(%tmpnick),w,* $+ $replace(%file,$chr(95),*,$chr(32),*) $+ *)
    if (!$readn) { return }
    if (!$sq.get(request.log)) { 
      SQ.sysmsg Successfull DCC get %file from $nick 
      SQ.sysmsg Files done: $round($calc($readn / $lines($sq.request.accfile(%tmpnick)) * 100),1) $+ $chr(37) 
      window -g2 @SQ-script!
    }
    if (!$isfile($sq.request.file(%count,$filename,$scriptline))) { .rename " $+ $filename $+ " $sq.request.file(%count,$filename,$scriptline) }
    else { 
      sq.sysmsg %file has not been copied to complete dir. Already existed 
      .remove " $+ $filename $+ "
    }
    write -l $+ $readn $sq.request.accfile(%tmpnick) <success> ! $+ %tmpnick %file
    if (!$read($sq.request.accfile(%tmpnick),s,! $+ %tmpnick)) { sq.request $nick }
  }
}
on *:join:#:{
  if ($nick == $me && $sq.istok(eggdrop.channel,$chan)) { .timer 1 1 sq.automode $chan }
  if ($sq.istok(request.channel,$chan)) {
    if ($nick == $me) { .timer 1 60 sq.requestall $chan }
    elseif ($sq.istok(request.nick,$nick) || $sq.istok(request.address,$address($nick,3))) { sq.requestall $nick }
  }
}
on *:nick:{
  if ($sq.istok(request.channel,$chan) && !$sq.istok(request.address,$address($newnick,3)) && $sq.istok(request.nick,$newnick)) {
    .timer 1 30 sq.requestall $newnick
  }
}
on ^*:open:?:*:{
  if ($1- == $sq.get(trigger.stat)) { if ($SQ.get(stat.status)) { SQ.stats } | haltdef }
  if (!$2) {
    sq.set 1 querytext 1 
    if ($sq.noquerytext($1-)) { haltdef }
  }
  if ($sq.get(noflood.spamblock)) {
    var %count = 1
    while (%count <= $sq.num(noflood.spam.ignore)) {
      if ($sq.tok(noflood.spam.ignore,%count) iswm $1-) { haltdef }
      inc %count 1
    }
  }
  sq.request.info $1-
}
on ^*:notice:*:?:{
  if (!$sq.request.info($1-) && $sq.findtok(request.address,$address($nick,3)) || $sq.findtok(request.nick,$nick)) {
    if ($sq.istok(request.nick,$nick)) { var %pos = $sq.findtok(request.nick,$nick) }
    elseif ($sq.istok(request.address,$address($nick,3))) { var %pos = $sq.findtok(request.address,$address($nick,3)) }
    echo 14 -t $sq.tok(request.channel,%pos) < $+ $nick $+ > $strip($1-)
    haltdef 
  }
  if ($sq.get(noflood.spamblock)) {
    var %count = 1
    while (%count <= $sq.num(noflood.spam.ignore)) {
      if ($sq.tok(noflood.spam.ignore,%count) iswm $1-) { haltdef }
      inc %count 1
    }
  }

}
on ^*:text:*:?:sq.request.info $1-
alias sq.request.info {
  if (You already have isin $1- || You are already isin $1- || not accepting requests isin $1- || too slow isin $1- || I don't have isin $1- || maxed out isin $1- || check your spelling isin $1- || maximum number of files isin $1-) {
    if ($sq.istok(request.address,$address($nick,3))) { var %tmpnick = $sq.tok(request.nick,$sq.findtok(request.address,$address($nick,3))) }
    elseif ($sq.istok(request.nick,$nick)) { var %tmpnick = $nick }
    if (%tmpnick) {
      var %tmppnt = $sq.findtok(request.nick,%tmpnick)
      if (not accepting requests isin $1- || maxed out isin $1-) { 
        .timersq.request $+ %tmpnick 1 1800 SQ.request $nick 
        sq.put request.count $calc($sq.tok(request.count,%tmppnt) -1) %tmppnt 
        .timersq.req $+ %tmppnt off
        var %notshow = 1
      }
      elseif (too slow !isin $1-) {
        if (I don't have isin $1- || check your spelling isin $1- ) { 
          var %pos = $calc($sq.tok(request.count,%tmppnt) +1)
          var %line = $read($sq.request.accfile(%tmpnick),%pos)
          %line = $+(*,$replace($gettok($mid(%line,$pos(%line,!,1)),2-,32),$chr(32),*),*)
          while (%pos > $calc($sq.tok(request.count,%tmppnt) -20) && %line !iswm $1-) {
            dec %pos 1
            %line = $read($sq.request.accfile(%tmpnick),%pos)
            %line = $+(*,$replace($gettok($mid(%line,$pos(%line,!,1)),2-,32),$chr(32),*),*)
          }
          sq.sysmsg error getting $gettok($read($sq.request.accfile(%tmpnick),%pos),2-,32) from $nick
          write -l $+ %pos $sq.request.accfile(%tmpnick) <error> $read($sq.request.accfile(%tmpnick),%pos)
          var %counter = 1
          while ($timer(sq.fail $+ %tmpnick).reps < %counter) { inc %counter 1 }
          .timersq.fail $+ %tmpnick %counter 20 sq.request %tmpnick 
          var %notshow = 1
        }
        elseif (*you*already*have*.*queue* iswm $strip($1-)) {
          if ($sq.tok(request.maxqueue,%tmppnt) == 0) { sq.put request.maxqueue $sq.get(req $+ %tmppnt) %tmppnt }
          elseif ($sq.tok(request.count,%tmppnt) != 1) { .timersq.skipreq $+ %tmppnt 1 10 sq.request %tmpnick }
          var %notshow = 1
        }
        else {
          if ($timer(sq.req $+ %tmppnt) && $sq.get(req $+ %tmppnt)) {
            sq.dec req $+ %tmppnt
            if ($sq.tok(request.maxqueue,%tmppnt) == 0) { sq.put request.maxqueue $sq.get(req $+ %tmppnt) %tmppnt }
            sq.sysmsg Reached queue limit for $nick after $sq.get(req $+ %tmppnt) files
            sq.del req $+ %tmppnt
          }
          .timersq.req $+ %tmppnt $+ * off
          sq.put request.count $calc($sq.tok(request.count,%tmppnt) -1) %tmppnt
        }
        if (!%notshow) { echo 14 -t $sq.tok(request.channel,$sq.findtok(request.nick,%tmpnick)) < $+ $Nick $+ > $strip($1-) }
      }
      if (!%notshow) { sq.sysmsg 14 $+ $nick $strip($1-) }
      haltdef
      return 1
    }
  }
}
alias sq.checkoldreq {
  if (!$sq.istok(request.nick,$sq.request.accname($1)) && !$sq.istok(newrequest,$sq.request.accname($1))) { 
    if ($input(Found old requests queue for $sq.request.accname($1) $+ . $crlf $+ Do you want to remove all unsuccessful requests ?,8)) {
      var %line = 1,%file,%pos
      window -h @temp
      window -h @temp2
      filter -ffx $1 temp.temp <success>*
      loadbuf @temp2 temp.temp
      %file = $read($1,s,! $+ $sq.request.accname($1))
      .echo -q $findfile($getdir(%file),*,0,1,aline @temp $1-)
      while (%line <= $line(@temp,0)) {
        %pos = 0
        %file = $nopath($line(@temp,%line))
        if ($fline(@temp2,* $+ $replace($nopath(%file),$chr(95),$chr(42)) $+ *)) {
          .remove -b " $+ $line(@temp,%line) $+ "
          sq.sysmsg Removed %file
        }
        inc %line 1
      }
      window -c @temp
      window -c @temp2
      .remove temp.temp
    }
    sq.sysmsg Finished clearing up requests
    .remove $1-
  }
}
alias sq.request.accfile { return $sq.dir $+ SQrequest. $+ $replace($1,\,§1§,/,§2§,:,§3§,*,§4§,?,§5§,",§6§,<,§8§,>,§9§,|,§0§) $+ .txt }
alias sq.request.accname { return $gettok($nopath($replace($1,§1§,\,§2§,/,§3§,:,§4§,*,§5§,?,§6§,",§8§,<,§9§,>,§0§,|)),2,46) }

;###########################################Fileslister Section##########################################

dialog SQ.list {
  title SQ-Script $sq.version FILESLIST MAKER
  option dbu
  size -1 -1 300 100
  button "OK",1,130 88 40 10, ok
  button "Cancel",100, 172 88 40 10, cancel
  text "Choose the directories you're serving files from.",2, 5 5 140 10
  text "SQ-script will add all files from this directory recursively. If you mounted other directories to your servers filesystem, you can add them, too.",3, 5 15 140 21
  text "To remove an item from the list simply doubleclick on it",4, 5 35 140 10
  button "Add directory",5, 10 45 60 10
  list 6, 160 10 130 80
  check "Refresh Fileslist every",7, 5 60 65 10
  edit "2",8, 70 60 10 10, center
  text "days",9, 81 62 20 10
  check "Include filesizes",10,5 70 65 10
  text "Put this in front of each filename:",11,5 83 80 10
  edit "",12,86 82 30 10
}
on *:dialog:sq.list:init:0:{
  didtok sq.list 6 59 $sq.get(ftp.directories)
  did -o sq.list 8 1 $sq.GET(@find.fileslist.refresh)
  did -o sq.list 12 1 $sq.get(msg.fileslist.header)
  if ($sq.get(@find.fileslist.includesize)) { did -c sq.list 10 }
  if ($SQ.get(@find.fileslist.refreshstatus)) { did -c SQ.list 7 }
  dialog -o sq.list
}

on *:dialog:sq.list:dclick:6:{
  var %temptext = $deltok($didtok(SQ.list,6,59),$did(sq.list,6).sel,59)
  did -r sq.list 6
  didtok sq.list 6 59 %temptext
}
on *:dialog:sq.list:sclick:5:{
  var %dir = $sdir(c:,Choose a directory)
  if (%dir) {
    dialog -n sq.list
    if ($input(Do you want to list all files $+ $chr(44) else only directories will be listed,8,List Files)) { var %temptext = $addtok($didtok(sq.list,6,59),%dir,59) }
    else { var %temptext = $addtok($didtok(sq.list,6,59),onlydirs %dir,59) }
    dialog -o sq.list
    did -r SQ.list 6
    didtok sq.list 6 59 %temptext
  }
}
on *:dialog:sq.list:sclick:1:{ 
  sq.set @find.fileslist.refreshstatus $did(sq.list,7).state
  sq.set @find.fileslist.includesize $did(sq.list,10).state
  sq.set @find.fileslist.refresh $did(sq.list,8).text
  sq.set msg.fileslist.header $did(sq.list,12).text
  sq.set ftp.directories $didtok(sq.list,6,59)
  sq.fileslist.refresh
}
alias sq.fileslist.refresh {
  if ($dialog(sq)) { 
    did -o sq 94 1 $sq.dir $+ sq.fileslist.txt 
    did -o SQ 128 1 $nopath($longfn($did(sq,94,1).text))
  }
  sq.set @find.fileslist $sq.dir $+ sq.fileslist.txt
  if ($isfile($sq.dir $+ sq.fileslist.txt)) { .remove $sq.dir $+ sq.fileslist.txt }
  sq.del stat.servingdata
  sq.sysmsg Writing Fileslist, please wait.....
  if ($active != @SQ-script!) { echo 3 -ta Writing Fileslist, please wait..... }
  write $sq.dir $+ sq.fileslist.txt Created at $asctime(HH:nn) on $date
  var %tempcount = 1
  while (%tempcount <= $sq.num(ftp.directories)) { 
    if ($gettok($sq.tok(ftp.directories,%tempcount),1,32) != onlydirs) { .echo -q $findfile($sq.tok(ftp.directories,%tempcount),*.*,0,sq.writefileslist $1- ) }
    else { .echo -q $finddir($gettok($sq.tok(ftp.directories,%tempcount),2-,32),*,0,write $sq.dir $+ sq.fileslist.txt $sq.get(msg.fileslist.header) $1-) }
    inc %tempcount 1 
  }
  sq.sysmsg Writing fileslist done. Files/directories found: $lines($sq.dir $+ sq.fileslist.txt) $iif($bytes($sq.get(stat.servingdata),3).suf,in $bytes($sq.get(stat.servingdata),3).suf) 
  if ($active != @SQ-script!) { echo 3 -ta Writing fileslist done. Files/directories found: $lines($sq.dir $+ sq.fileslist.txt) $iif($bytes($sq.get(stat.servingdata),3).suf,in $bytes($sq.get(stat.servingdata),3).suf) }
}
alias sq.writefileslist {
  var %size = $file($1-).size,%ext1 = $gettok($1-,$numtok($1-,46),46),%ext2 = $gettok($1-,$calc($numtok($1-,46) -1),46)
  sq.set stat.servingdata $calc($sq.get(stat.servingdata) + %size)
  if (r?? iswm %ext1 && $mid(%ext1,2) isnum) || (part* iswm %ext2 && %ext2 != part1) { return }
  if ($sq.get(@find.fileslist.includesize)) {
    write $sq.dir $+ sq.fileslist.txt $sq.get(msg.fileslist.header) $1- $bytes(%size,3).suf $iif(%ext2 == part1 || %ext1 == rar,Other multipart volumes are not listed)
  }
  else { write $sq.dir $+ sq.fileslist.txt $sq.get(msg.fileslist.header) $1- }
}
;#####################################sfv-checker logviewer###################################

dialog sq.sfvlog {
  size -1 -1 300 200
  option dbu
  title SQ-Script sfv-checker log
  button "Close",1,90 188 20 10, ok
  list 2,3 20 40 150,hsbar size
  list 3,45 15 250 170,vsbar size
  text "Doubleclick to remove item",4,3 3 40 14
  text "Doubleclick to copy to clipboard",5,50 5 100 10
}
on *:dialog:sq.sfvlog:init:0:sq.sfvloginit

alias sq.sfvloginit {
  var %count = 1
  while (%count <= $ini($sq.dir $+ SQsfvmonitor.log,0)) {
    did -a sq.sfvlog 2 $ini($sq.dir $+ SQsfvmonitor.log,%count)
    inc %count 1
  }
  did -c sq.sfvlog 1
  %count = 1
  var %sect = $ini($sq.dir $+ SQsfvmonitor.log,1)
  while (%count <= $ini($sq.dir $+ SQsfvmonitor.log,1,0)) {
    var %var = $ini($sq.dir $+ SQsfvmonitor.log,1,%count)
    did -a sq.sfvlog 3 $readini($sq.dir $+ SQsfvmonitor.log,%sect,%var)
    inc %count 1
  }
  did -z sq.sfvlog 2,3
}
on *:dialog:sq.sfvlog:sclick:2:{
  did -r sq.sfvlog 3
  var %count = 1
  while (%count <= $ini($sq.dir $+ SQsfvmonitor.log,$did(2,1).sel,0)) {
    did -a sq.sfvlog 3 $readini($sq.dir $+ SQsfvmonitor.log,$ini($sq.dir $+ SQsfvmonitor.log,$did(2,1).sel),$ini($sq.dir $+ SQsfvmonitor.log,$did(2,1).sel,%count))
    inc %count 1
  }
  did -z sq.sfvlog 3
}
on *:dialog:sq.sfvlog:dclick:2:{
  $sq.reminisection($sq.dir $+ SQsfvmonitor.log,$ini($sq.dir $+ SQsfvmonitor.log,$did(2,1).sel))
  did -r sq.sfvlog 2,3
  sq.sfvloginit
}
on *:dialog:sq.sfvlog:dclick:3:{
  clipboard $did(3).seltext
}

;#########################################New on server#############################################

dialog sq.newonserver {
  size -1 -1 185 150
  option dbu
  title SQ-Script Setup ^NewOnServer
  button "OK",1,70 138 40 10, ok
  text "Enter the text you want as your ^NewOnServer variable",2,3 3 140 10
  edit "",3,3 15 180 10,limit 80
  button "Add from filename",4,5 30 60 10
  button "Add from dir-name",5,70 30 60 10
  button "Add to list",6,140 30 40 10
  list 7,3 43 180 56,sort size
  text "Doubleclick to remove entry",8,3 100 100 7
  check "Automatically remove items older than",9,5 108 100 10
  text "",10,108 110 9 10,right
  scroll "",11,116 106 10 13, range 167
  text "Hours",12,128 110 15 10
  check "Randomize",13,5 118 100 10
}
on *:dialog:sq.newonserver:init:0:{ sq.newonserverinit }
alias sq.newonserverinit {
  did -r sq.newonserver 7
  var %file = $sq.dir $+ sq.NoS.txt,%count = $lines(%file)
  while (%count > 0) {
    var %line = $read(%file,%count)
    did -i sq.newonserver 7 1 < $+ $duration($calc($ctime - $gettok(%line,1,59)),2) $+ > $gettok(%line,2-,59)
    dec %count 1
  }
  did -o sq.newonserver 10 1 $sq.get(trigger.nosdelage)
  did -c sq.newonserver 11 $calc(168- $sq.get(trigger.nosdelage))
  if ($sq.get(ftp.nosrand)) { did -c sq.newonserver 13 }
  if ($sq.get(ftp.removeoldnos)) { did -c sq.newonserver 9 }
  did -z sq.newonserver 7
}
on *:dialog:sq.newonserver:sclick:*:{
  var %file = $sq.dir $+ sq.NoS.txt
  if ($did == 4) { did -a sq.newonserver 3 $nopath($$sfile(C:,Choose a file)) }
  elseif ($did == 5) { 
    var %dir = $$sdir(C:,Choose a directory)
    did -a sq.newonserver 3 $gettok(%dir,$numtok(%dir,92),92)
  }
  elseif ($did == 6 && $did(3).text) { 
    write  %file $ctime $+ ; $+ $did(3).text
    did -r sq.newonserver 3,7
    sq.newonserverinit
  }
  elseif ($did == 9) {
    sq.set ftp.removeoldnos $did(9).state
  }
  elseif ($did == 13) {
    sq.set ftp.nosrand $did(13).state
  }
}
on *:dialog:sq.newonserver:scroll:11:{
  sq.set trigger.nosdelage $calc(168- $did(11).sel)
  did -o sq.newonserver 10 1 $sq.get(trigger.nosdelage)
}

on *:dialog:sq.newonserver:dclick:7:{
  write -dl $+ $did(7,1).sel $sq.dir $+ sq.NoS.txt 
  sq.newonserverinit
}
;############################################Sound Control############################################

alias f12 { dialog -mdo vol vol }
dialog vol {
  title VOLUME
  option dbu
  size $int($calc($dbuw * 450)) $int($calc($dbuh * 210)) 50 135
  Scroll "WAVE",2, 5 13 10 80,range 65535
  button "",1,1 1 0 0,cancel hide
  check "No Sounds",3, 5 102 40 8,push
  text "",4,0 95 20 7, center
  scroll "MIDI",5,32 13 10 80,range 65535
  text "",6,24 95 30 7,center
  text "Wave/MP3",9,0 3 30 10
  text "MIDI",10,32 3 20 10
  check "Time of silence:",11,2 112 45 7
  edit "",12,4 122 10 10,right
  text ":00 to",13,15 123 15 10
  edit "",14,30 122 10 10,right
  text ":00",15,41 123 10 7
}
on *:dialog:vol:init:0:{
  did -c vol 2 $calc(65535 - $vol(wave))
  did -o vol 4 1 $round($calc($vol(wave) / 65535 *100),2) $+ $chr(37)
  did -c vol 5 $calc(65535 - $vol(midi))
  did -o vol 6 1 $round($calc($vol(midi) / 65535 *100),2) $+ $chr(37)
  if ($sq.get(sound.silence)) { did -c vol 11 }
  if ($sq.get(sound.block)) { did -c vol 3 }
  did -o vol 12 1 $sq.get(sound.silence.begin)
  did -o vol 14 1 $sq.get(sound.silence.stop)
}
on *:dialog:vol:scroll:*:{
  if ($did == 2) { 
    vol -p $calc(65535 - $did($did).sel)
    did -o vol 4 1 $round($calc((65535 - $did(vol,2).sel) / 65535 *100),2) $+ $chr(37) 
  }
  elseif ($did == 5) {
    vol -m $calc(65535 - $did($did).sel)
    did -o vol 6 1 $round($calc((65535 - $did(vol,5).sel) / 65535 *100),2) $+ $chr(37) 
  }
}
on *:dialog:vol:sclick:*:{
  if ($did == 3) {
    if ($did($did).state) {
      splay stop
      sq.set sound.block 1
    }
    else { sq.set sound.block 0 }
  }
  if ($did == 11) { sq.set sound.silence $did($did).state }
}
on *:dialog:vol:edit:*:{
  sq.set sound.silence.begin $did(vol,12).text
  sq.set sound.silence.stop $did(vol,14).text
}
;####################################Eggdrops section################################

alias sq.sorteggs {
  if ($sq.istok(eggdrop.channel,$1)) {
    var %tempcount = 1
    while ($sq.findtok(eggdrop.channel,$1,%tempcount)) { 
      var %temptok1 = $addtok(%temptok1,$sq.findtok(eggdrop.channel,$1,%tempcount),59)
      inc %tempcount 1 
    }
    var %temptext = 1st;2nd;3rd
    var %count = 1
    while (%count <= $numtok(%temptext,59)) {
      var %tempcount = 1
      while (%tempcount <= $numtok(%temptok1,59)) { 
        if ($sq.tok(eggdrop.rating,$gettok(%temptok1,%tempcount,59)) == $gettok(%temptext,%count,59)) { 
          var %temptok = $addtok(%temptok,$gettok(%temptok1,%tempcount,59),59)
        }
        inc %tempcount 1
      }
      inc %count 1
    }
  }
  return %temptok
}
alias sq.automode {
  if ($sq.get(eggdrop.status)) { 
    var %tempeggs = $sq.sorteggs($1)
    var %count = 1
    while (%count <= $sq.num(connection.eggdrop)) {
      if ($istok(%tempeggs,$sq.tok(connection.eggdrop,%count),59)) { var %con = %count }
      inc %count 1
    }
    if (!%con) {
      var %tempcount = 1
      while (%tempcount <= $numtok(%tempeggs,59)) {
        if ($sq.tok(eggdrop.nick,$gettok(%tempeggs,%tempcount,59)) isop $1) {
          .userhost $sq.tok(eggdrop.nick,$gettok(%tempeggs,%tempcount,59))
          sq.eggconnect $gettok(%tempeggs,%tempcount,59) $sq.tok(eggdrop.method,$gettok(%tempeggs,%tempcount,59)) $sq.tok(eggdrop.nick,$gettok(%tempeggs,%tempcount,59))
          break
        }
        inc %tempcount 1
      }
      if (%tempcount > $numtok(%tempeggs,59)) { echo 4 -ta SQ-script could not find a bot to perform commands | sq.del revenge revengechan }
    }
    else { 
      if ($sq.tok(eggdrop.method,%con) == chat) { .msg = $+ $sq.tok(eggdrop.nick,%con) .op $me $sq.tok(eggdrop.channel,%con) }
      elseif ($sq.tok(eggdrop.method,%con) == telnet) { sq.writetelnet %con .op $me $sq.tok(eggdrop.channel,%con) }
    }
  }
}
alias sq.eggconnect {
  sq.app tempegg $3
  sq.app tempeggaction $1 $2
  .dns $3
}
on *:chat:*:{
  if ($sq.istok(chatdrop,$sq.findtok(eggdrop.nick,$nick))) {
    var %num = $sq.findtok(eggdrop.nick,$nick)
    if (Enter your password. isin $1-) { 
      echo =$nick ***Hidden***
      .msg =$nick $sq.decrypt(@,$sq.tok(eggdrop.pass,%num)) 
    }
    elseif ($sq.tok(eggdrop.login,%num) joined the party line isin $1-) {
      var %egg = $sq.findtok(eggdrop.nick,$nick)
      while ($sq.istok(revengechan,$sq.tok(eggdrop.channel,%egg))) {
        var %count = $sq.findtok(revengechan,$sq.tok(eggdrop.channel,%egg))
        sq.writetelnet $1 $sq.tok(revenge,%count)
        sq.deltok revenge %count
        sq.deltok revengechan %count
      }
      if (!$sq.get(eggdrop.onlycon)) { .msg =$nick .op $me $sq.tok(eggdrop.channel,%num) }
      else {
        if (!$sq.get(eggdrop.keepcon)) { .msg =$nick .quit | close -c $nick }
        else { sq.add connection.eggdrop $sq.findtok(eggdrop.nick,$nick) | echo =$nick SQ-Script: Keeping connection to bot }
        sq.rem chatdrop %num
      }
    }
    elseif (Gave op to $me isin $1-) {
      if (!$sq.get(eggdrop.keepcon)) { .msg =$nick .quit | close -c $nick }
      else { sq.add connection.eggdrop $sq.findtok(eggdrop.nick,$nick) | echo =$nick SQ-Script: Keeping connection to bot }
      sq.rem chatdrop %num
    }
  }
}
on *:close:=:{
  if ($sq.istok(connection.eggdrop,$sq.findtok(eggdrop.nick,$nick))) { 
    var %num = $sq.findtok(eggdrop.nick,$nick)
    sq.rem chat.eggdrop %num,1 
    sq.rem chatdrop %num
    sq.rem tempchat %num
    sq.rem connection.eggdrop %num
  }
}
on *:open:=:{
  if ($sq.istok(tempchat,$sq.findtok(eggdrop.nick,$nick))) {
    var %num = $sq.findtok(eggdrop.nick,$nick)
    sq.rem tempchat %num
    sq.app chatdrop %num
  }
}
;####################################SQ TELNET#######################################

alias sq.telnet {
  if ($1) { sockopen sq.telnet $+ $1 $replace($sq.tok(eggdrop.ip,$1),$chr(58),$chr(32)) | .timernotelnet 1 15 sq.closetelnet $1 | sq.app telnetbot $1 }
  else { 
    var %tempaddress = $replace($$input(Please enter an IP:Port to establish Telnet connection,1,Telnet),$chr(58),$chr(32))
    if ($longip($gettok(%tempaddress,1,32)) && $gettok(%tempaddress,2,32) isnum) && ($chr(46) isin %tempaddress) { 
      sockopen sq.telnet $+ $gettok(%tempaddress,1,32) %tempaddress 
      .timernotelnet 1 15 sq.closetelnet $gettok(%tempaddress,1,58) 
    }
    else { echo 3 -a Invalid Telnet format. Use NumericIP:Port }
  }
} 
alias sq.closetelnet {
  if ($1 isnum) { sq.sysmsg Telnet connect attempt to Eggdrop $sq.tok(eggdrop.nick,$remove($sockname,sq.telnet)) timed out after 15sec }
  else { sq.sysmsg Telnet connect attempt to $remove($sockname,sq.telnet) timed out after 15sec. }
  sockclose sq.telnet $+ $1
  sq.rem telnetbot $1
}
On *:sockclose:SQ.telnet*:{
  var %remote = $remove($sockname,sq.telnet)
  if (!$timer(notelnet $+ %remote)) { 
    if (%remote isnum) { 
      echo @Telnet- $+ $sq.tok(eggdrop.nick,%remote) Eggdrop $sq.tok(eggdrop.nick,%remote) closed telnet connection 
      sq.rem connection.eggdrop %remote
    }
    else { echo @Telnet- $+ %remote %remote closed telnet connection. }
  }
  else { 
    if (%remote isnum) { sq.sysmsg Eggdrop $sq.tok(eggdrop.nick,%remote) refused telnet connection }
    else { sq.sysmsg %remote refused telnet connection. }
    .timernotelnet $+ %remote off 
  }
}
on *:sockopen:SQ.telnet*:{
  var %remote = $remove($sockname,sq.telnet)
  if ($sockerr == 3) { sq.sysmsg Error on establishing Telnet connection. No remote on $sock($sockname).ip $+ : $+ $sock($sockname).port | sq.rem telnetbot $1 }
  elseif ($sockerr != 0) { sq.sysmsg Error on establishing Telnet connection. Check all settings and start over | sq.rem telnetbot $1 }
  elseif (%remote isnum) { window -en @Telnet- $+ $sq.tok(eggdrop.nick,%remote) | echo @Telnet- $+ $sq.tok(eggdrop.nick,%remote) Connection established, waiting for answer }
  else { window -ea @Telnet- $+ %remote | echo @Telnet- $+ %remote Connection established }
  .timernotelnet off
}
on *:close:@Telnet-*:{ 
  if ($sq.istok(eggdrop.nick,$remove($target,@Telnet-))) { var %remote = $sq.findtok(eggdrop.nick,$remove($target,@Telnet-)) }
  else { var %remote = $remove($target,@Telnet-) }
  sockclose sq.telnet $+ %remote 
  if ($sq.istok(connection.eggdrop,$sq.findtok(eggdrop.nick,%remote))) { 
    sq.rem connection.eggdrop $sq.findtok(eggdrop.nick,%remote)
  }
}
on *:sockread:sq.telnet*:{
  if ($sockerr != 0) { sq.sysmsg Error on recieving Telnet. Check all settings and start over | sq.rem telnetbot $1 }
  var %temptext = $null
  var %remote = $remove($sockname,sq.telnet)
  sockread %temptext
  %temptext = $replace(%temptext,$chr(32),$chr(3) $+ $chr(32))
  if (%remote isnum) { 
    %temptext = $sq.telnetfilter(%temptext)
    %nick = $sq.tok(eggdrop.nick,%remote)
    echo -tf @Telnet- $+ %nick < $+ %nick $+ > %temptext
    if ($sq.istok(telnetbot,%remote)) { sq.eggdroptelnet %remote %temptext }
  }
  else { echo -t @Telnet- $+ %remote %temptext }
}
alias sq.eggdroptelnet {
  if (nickname. isin $2-) {
    sq.writetelnet $1 $sq.tok(eggdrop.login,$1)
  }
  elseif (*Enter*your*password.* iswm $2-) {
    var %remote = $sq.tok(eggdrop.nick,$1)
    sockwrite -n sq.telnet $+ $1 $sq.decrypt(@,$sq.tok(eggdrop.pass,$1))
    echo -mt @Telnet- $+ %remote < $+ $me $+ > ***Hidden***
  }
  elseif (* $+ $sq.tok(eggdrop.login,$1) $+ *joined*the*party*line.* iswm $2-) {
    while ($sq.istok(revengechan,$sq.tok(eggdrop.channel,$1))) {
      var %count = $sq.findtok(revengechan,$sq.tok(eggdrop.channel,$1))
      sq.writetelnet $1 $sq.tok(revenge,%count)
      sq.deltok revenge %count
      sq.deltok revengechan %count
    }
    if (!$sq.get(eggdrop.onlycon)) { sq.writetelnet $1 .op $me $sq.tok(eggdrop.channel,$1) }
    else {
      if (!$sq.get(eggdrop.keepcon)) { sq.writetelnet $1 .quit | .timer 1 1 .close @Telnet- $+ $sq.tok(eggdrop.nick,$1) }
      else { sq.add connection.eggdrop $1 | echo @Telnet- $+ $sq.tok(eggdrop.nick,$1) SQ-Script: Keeping connection to bot }
      sq.rem telnetbot $1
    }
  }
  elseif (*Gave*op*to* $+ $me $+ *on* $+ $sq.tok(eggdrop.channel,$1) $+ * iswm $2-) {
    if (!$sq.get(eggdrop.keepcon)) { sq.writetelnet $1 .quit | .timer 1 1 .close @Telnet- $+ $sq.tok(eggdrop.nick,$1) }
    else { sq.add connection.eggdrop $1 | echo @Telnet- $+ $sq.tok(eggdrop.nick,$1) SQ-Script: Keeping connection to bot }
    sq.rem telnetbot $1
  }
}
alias sq.telnetfilter {
  var %text = $remove($1-,ÿû,ÿü)
  %text = $replace(%text,,,,)
  return %text
}
alias sq.writetelnet {
  if ($1 isnum) { var %remote = $sq.tok(eggdrop.nick,$1) }
  else { var %remote = $1 }
  if ($sock(sq.telnet $+ $1)) { sockwrite -n sq.telnet $+ $1 $2- | echo -mt @Telnet- $+ %remote < $+ $me $+ > $2- }
  elseif ($chat($sq.tok(eggdrop.nick,$1),1)) { msg = $+ $sq.tok(eggdrop.nick,$1) $2- }
}

;####################################ON CHANGE##################################

on *:deop:#:{
  if ($nick != $me) {
    if ($opnick == $me && $sq.get(eggdrop.reop) && $sq.istok(eggdrop.channel,$chan)) { 
      var %count = 1
      while ($sq.tok(eggdrop.channel,$gettok($sq.get(connection.eggdrop),%count,59)) != $chan) { 
        if (%count > $sq.num(connection.eggdrop)) { break }
        inc %count 1 
      }
      if (%count <= $sq.num(connection.eggdrop)) {
        var %eggi = $sq.tok(connection.eggdrop,%count)
        if ($sq.get(eggdrop.kickondeopme) && $sq.get(eggdrop.banondeopme)) { sq.writetelnet %eggi .kickban $chan $nick SQ-script:Bad idea deoping $me }
        elseif ($sq.get(eggdrop.kickondeopme)) { sq.writetelnet %eggi .kick $chan $nick SQ-script:Bad idea deoping $me }
        elseif ($sq.get(eggdrop.banondeopme)) { sq.writetelnet %eggi .+ban $address($nick,3) $chan SQ-script:Bad idea deoping $me }
        if ($sq.get(eggdrop.reop)) { sq.writetelnet %eggi .op $me $sq.tok(eggdrop.channel,%eggi) }
      }
      else { 
        if ($sq.get(eggdrop.kickondeopme) && $sq.get(eggdrop.banondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .kickban $chan $nick SQ-script:Bad idea deoping $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .kickban $chan $nick *,1,59),59)
        }
        elseif ($sq.get(eggdrop.kickondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .kick $chan $nick SQ-script:Bad idea deoping $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .kick $chan $nick *,1,59),59)
        }
        elseif ($sq.get(eggdrop.banondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .+ban $address($nick,3) $chan SQ-script:Bad idea deoping $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .+ban $address($nick,3) $chan *,1,59),59)
        }
        sq.automode $chan 
      }
    }
    elseif ($sq.istok(eggdrop.address,$address($opnick,1))) {
      sq.eggdrop.protect $opnick $nick $chan
    }
  }
}
on *:kick:#:{
  if ($nick != $me) {
    if ($knick == $me && $sq.get(eggdrop.reop) && $sq.istok(eggdrop.channel,$chan)) { 
      var %count = 1
      while ($sq.tok(eggdrop.channel,$gettok($sq.get(connection.eggdrop),%count,59)) != $chan) { 
        if (%count > $sq.num(connection.eggdrop)) { break }
        inc %count 1 
      }
      if (%count <= $sq.num(connection.eggdrop)) {
        var %eggi = $sq.tok(connection.eggdrop,%count)
        if ($sq.get(eggdrop.kickondeopme) && $sq.get(eggdrop.banondeopme)) { sq.writetelnet %eggi .kickban $chan $nick SQ-script:Bad idea kicking $me }
        elseif ($sq.get(eggdrop.kickondeopme)) { sq.writetelnet %eggi .kick $chan $nick SQ-script:Bad idea kicking $me }
        elseif ($sq.get(eggdrop.banondeopme)) { sq.writetelnet %eggi .+ban $address($nick,3) $chan SQ-script:Bad idea kicking $me }
      }
      else { 
        if ($sq.get(eggdrop.kickondeopme) && $sq.get(eggdrop.banondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .kickban $chan $nick SQ-script:Bad idea kicking $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .kickban $chan $nick *,1,59),59)
        }
        elseif ($sq.get(eggdrop.kickondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .kick $chan $nick SQ-script:Bad idea kicking $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .kick $chan $nick *,1,59),59)
        }
        elseif ($sq.get(eggdrop.banondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .+ban $address($nick,3) $chan SQ-script:Bad idea kicking $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .+ban $address($nick,3) $chan *,1,59),59)
        }
      }
      join $chan
    }
    if ($sq.istok(eggdrop.address,$address($knick,1))) {
      sq.eggdrop.protect $knick $nick $chan
    }
  }
}
on *:ban:#:{
  if ($nick != $me) {
    if ($me isop $chan && (($sq.get(eggdrop.formodes) && $sq.get(eggdrop.fastrevenge)) || !$sq.get(eggdrop.formodes))) {
      if ($banmask iswm $address($me,5)) {
        .mode $chan -b $banmask 
        if ($sq.get(eggdrop.kickondeopme)) { .kick $chan $nick }
        if ($sq.get(eggdrop.banondeopme)) { .mode $chan +b $address($nick,3) }
      }
      elseif ($wildtok($sq.get(eggdrop.address),$mask($banmask,1),1,59) && $wildtok($sq.get(eggdrop.nick),$gettok($mask($banmask,7),1,33),1,59)) {
        var %count = 1
        while (%count <= $sq.num(eggdrop.address)) {
          if ($banmask iswm $sq.tok(eggdrop.nick,%count) $+ $mid($sq.tok(eggdrop.address,%count),2)) { var %victim = %count }
          inc %count 1
        }
        if (%victim) {
          .mode $chan -b $banmask
          sq.eggdrop.protect $sq.tok(eggdrop.nick,%victim) $nick $chan
        }
      }
    }
    elseif ($sq.istok(eggdrop.channel,$chan) && $banmask iswm $address($me,6)) {
      var %count = 1
      while ($sq.tok(eggdrop.channel,$gettok($sq.get(connection.eggdrop),%count,59)) != $chan) { 
        if (%count > $sq.num(connection.eggdrop)) { break }
        inc %count 1 
      }
      if (%count <= $sq.num(connection.eggdrop)) {
        var %eggi = $sq.tok(connection.eggdrop,%count)
        sq.writetelnet %eggi .-ban $banmask $chan
        if ($sq.get(eggdrop.kickondeopme) && $sq.get(eggdrop.banondeopme)) { sq.writetelnet %eggi .kickban $chan $nick SQ-script:Bad idea banning $me }
        elseif ($sq.get(eggdrop.kickondeopme)) { sq.writetelnet %eggi .kick $chan $nick SQ-script:Bad idea banning $me }
        elseif ($sq.get(eggdrop.banondeopme)) { sq.writetelnet %eggi .+ban $address($nick,3) $chan SQ-script:Bad idea banning $me }
      }
      else { 
        if ($sq.get(eggdrop.kickondeopme) && $sq.get(eggdrop.banondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .kickban $chan $nick SQ-script:Bad idea bannning $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .kickban $chan $nick *,1,59),59)
        }
        elseif ($sq.get(eggdrop.kickondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .kick $chan $nick SQ-script:Bad idea banning $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .kick $chan $nick *,1,59),59)
        }
        elseif ($sq.get(eggdrop.banondeopme)) { 
          sq.set revenge $addtok($sq.get(revenge),%eggi .+ban $address($nick,3) $chan SQ-script:Bad idea banning $me,59) 
          sq.set revengechan $puttok($sq.get(revengechan),$chan,$wildtok($sq.get(revenge),%eggi .+ban $address($nick,3) $chan *,1,59),59)
        }
        join $chan
      }
    }
  }
}

;#####################################Eggdrop protect##############################

alias sq.eggdrop.protect {
  var %count = 1
  while (%count <= $sq.num(connection.eggdrop)) { 
    if ($sq.tok(eggdrop.channel,$gettok($sq.get(connection.eggdrop),%count,59)) != $3 && $sq.tok(eggdrop.nick,$gettok($sq.get(connection.eggdrop),%count,59)) isop $3 ) { break }
    inc %count 1 
  }
  if (%count <= $sq.num(connection.eggdrop)) {
    var %eggi = $sq.tok(connection.eggdrop,%count)
    if (!$sq.get(eggdrop.fastrevenge) && $sq.get(eggdrop.formodes)) {
      if ($sq.get(eggdrop.protect.kick) && $sq.get(eggdrop.protect.ban)) { sq.writetelnet %eggi .kickban $3 $2 SQ-script:Don't touch $1 }
      elseif ($sq.get(eggdrop.protect.kick)) { sq.writetelnet %eggi .kick $3 $2 SQ-script:Don't touch $1 }
      elseif ($sq.get(eggdrop.protect.ban)) { sq.writetelnet %eggi .+ban $address($2,3) $3 SQ-script:Don't touch $1 }
    }
  }
  elseif ($me isop $3) {
    if ($sq.get(eggdrop.protect.kick)) { .kick $3 $2 SQ-script:Don't touch $1 }
    if ($sq.get(eggdrop.protect.ban)) { .mode $3 +b $address($2,3) }
    if ($sq.get(eggdrop.protect) && $1 ison $3) { .mode $3 +o $1 }
  }
  elseif ($numtok($sq.sorteggs($3),59) > 1) { 
    if ($sq.get(eggdrop.protect.kick) && $sq.get(eggdrop.protect.ban)) { 
      sq.set revenge $addtok($sq.get(revenge),%eggi .kickban $3 $2 SQ-script:Don't touch $1,59) 
      sq.set revengechan $puttok($sq.get(revengechan),$3,$wildtok($sq.get(revenge),%eggi .kickban $3 $2 *,1,59),59)
    }
    elseif ($sq.get(eggdrop.protect.kick)) { 
      sq.set revenge $addtok($sq.get(revenge),%eggi .kick $3 $2 SQ-script:Don't touch $1,59) 
      sq.set revengechan $puttok($sq.get(revengechan),$3,$wildtok($sq.get(revenge),%eggi .kick $3 $2 *,1,59),59)
    }
    elseif ($sq.get(eggdrop.protect.ban)) { 
      sq.set revenge $addtok($sq.get(revenge),%eggi .+ban $address($2,3) $3 SQ-script:Don't touch $1,59) 
      sq.set revengechan $puttok($sq.get(revengechan),$3,$wildtok($sq.get(revenge),%eggi .+ban $address($2,3) $3 *,1,59),59)
    }
    sq.automode $3 
  }
}

;##############################################Winamp Wakeup##########################################

alias sq.wakeup {
  if ($sq.get(sound.winamp.weekend) && ($asctime(ddd) == sun || $asctime(ddd) == sat)) { return }
  window -aophdx +d @winamp 1 1 200 200
  drawtext -b @winamp 4 0 Arial 88 300 300 WAKE UP!
  sq.set volmp3 $vol(mp3)
  sq.set volall $vol(master)
  if (!$isfile($shortfn($sq.get(sound.winamp.play)))) { run " $+ $sq.get(sound.winamp.location) $+ " $sq.get(sound.winamp.play) }
  else { run $shortfn($sq.get(sound.winamp.play)) }
  if ($sq.get(sound.winamp.loud)) { .timersq.inc -o 1 20 sq.incvolume }
  if ($sq.get(sound.winamp.wakeup)) { .timer 1 120 .timersq.wakeup -o $sq.get(sound.winamp.hour) $+ : $+ $sq.get(sound.winamp.minutes) 1 1 sq.wakeup }
}
alias sq.incvolume {
  if ($calc($vol(mp3) +500) <= 65535) { vol -p $calc($vol(mp3) +500) | .timersq.inc -o 1 1 sq.incvolume }
  elseif ($calc($vol(master) +500) <= 65535) { vol -v $calc($vol(master) +500) | .timersq.inc -o 1 1 sq.incvolume }
  else { .timer 1 300 sq.stopwakeup }
}
menu @winamp {
  sclick:sq.stopwakeup
  rclick:sq.stopwakeup
  dclick:sq.stopwakeup
}
alias sq.stopwakeup {
  window -c @winamp
  vol -p $sq.get(volmp3)
  vol -v $sq.get(volall)
  .timersq.inc off
}

alias sq.searchfiles {
  dialog -m sq.search sq.search
}
dialog sq.search {
  title Search
  size -1 -1 100 61
  option dbu
  button "Search",1,55 50 40 10,ok
  button "Cancel",2,5 50 40 10,cancel
  edit "Enter String to search for",3,5 5 90 10
  combo 4,5 20 40 30,drop
  combo 5,55 20 40 100,drop disabled
}
on *:dialog:sq.search:init:0:{
  didtok sq.search 4 44 /msg,/ctcp
  did -c sq.search 4 1
  var %count = 1,%nicks
  while (%count <= $nick($active,0,a,r)) { %nicks = $addtok(%nicks,$nick($active,%count,a,r),44) | inc %count 1 }
  didtok sq.search 5 44 %nicks
  did -c sq.search 5 1
  if ($isfile($sq.dir $+ mask.conf)) {
    var %count = 1,%file = $sq.dir $+ mask.conf
    while (%count <= $ini(%file,search $active,0)) {
      $readini(%file,search $active,%count)
      inc %count 1
    }
  }
}
on *:dialog:sq.search:sclick:4:{
  if ($did(4).text = /msg) { did -b sq.search 5 }
  else { did -e sq.search 5 }
}
on *:dialog:sq.search:sclick:1:{
  if ($did(4).text == /msg) { .msg $active @find $did(3).text }
  else { .ctcp $did(5).text @find $did(3).text }
}

;#############################################SQ-net##############################################

on *:text:*»SQ-Script«*:#:{ 
  if (!$window(@sq-hidden)) { window -hn +L @sq-hidden }
  if (!$fline(@sq-hidden,$address($nick,1) $+ *,1)) { aline @sq-hidden $address($nick,1) $ctime }
  else { rline @sq-hidden $fline(@sq-hidden,$address($nick,1) $+ *,1) $address($nick,1) $ctime }
  sq.cleanhidden
}
alias sq.cleanhidden {
  var %n = 1
  while (%n <= $line(@sq-hidden,0)) {
    if ($calc($ctime - $gettok($line(@sq-hidden,%n),2,32)) > 7200) { dline @sq-hidden %n }
    else { inc %n }
  }
}
alias sq.net.connect {
  sq.set netnick $1
  dialog -m sq.net sq.net
}

dialog sq.net {
  Title "Connect to FTP"
  size -1 -1 140 80
  option dbu
  button "Create",1,45 69 25 10,ok
  text "",2,5 5 130 10
  combo 3,20 15 50 30,drop
  text "Your Internet IP is",4,5 35 50 10
  edit "",5,55 34 49 10
  button "Cancel",6, 75 69 25 10,cancel
  text "Desired password:",7,5 50 50 10
  edit "",8,55 49 30 10
}
on *:dialog:sq.net:init:0:{
  did -o sq.net 2 1 Create an account on $sq.get(netnick) $+ 's FTPserver for:
  didtok sq.net 3 44 download,upload
  did -c sq.net 3 1
  did -o sq.net 5 1 $iif($sq.get(currentip),$sq.get(currentip),$ip)
}
on *:dialog:sq.net:sclick:1:.ctcp $sq.get(netnick) FTP $did(5).text $did(3).text $did(8).text
;#################################################################################################
;##############################################FTP-modules########################################
;#################################################################################################

dialog sq.summary {
  button "",3,1 1 1 1,ok hide
  size -1 -1 160 65
  title "Summary"
  option dbu
  edit "",2,0 0 160 65,multi read
}
on *:dialog:sq.summary:init:0:{
  did -o sq.summary 2 1 Action: $sq.tok(ftpaction,$sq.get(summarynum))
  did -o sq.summary 2 2 Speed: $sq.tok(ftpspeed,$sq.get(summarynum)) kBytes/s
  did -o sq.summary 2 3 data uploaded: $bytes($calc($sq.tok(ftpkbup,$sq.get(summarynum)) * 1024),3).suf
  did -o sq.summary 2 4 data downloaded: $bytes($calc($sq.tok(ftpkbdown,$sq.get(summarynum)) * 1024),3).suf
  did -o sq.summary 2 5 Files uploaded: $sq.tok(ftpfilesup,$sq.get(summarynum))
  did -o sq.summary 2 6 Files downloaded: $sq.tok(ftpfilesdown,$sq.get(summarynum))
  did -o sq.summary 2 7 Connected for: $duration($calc($ctime - $sq.tok(ftptime,$sq.get(summarynum))),2)
  did -o sq.summary 2 8 Last File accessed:
  did -o sq.summary 2 9 $iif($sq.tok(ftplastaccess,$sq.get(summarynum)),$nopath($sq.tok(ftplastaccess,$sq.get(summarynum))),none)
  dialog -t sq.summary Summary for $sq.tok(ftpnick,$sq.get(summarynum))
  sq.del summarynum
  did -f sq.summary 3
}
alias SQ.summary {
  if ($dialog(sq.summary)) { dialog -x sq.summary }
  sq.set summarynum $1
  dialog -odm sq.summary sq.summary
}
alias sq.ftplogview {
  dialog -md sq.logviewer sq.logviewer
}
dialog sq.logviewer {
  title "FTP-logviewer"
  option dbu
  size -1 -1 300 300
  list 1,10 15 60 270,hsbar size auto
  list 2,75 15 210 270,hsbar extsel size auto
  menu "Action",3
  item "Remove Selected",4
  item break,7
  item "Purge list",5
  item "Remove All",6
  text "Doubleclick on item to remove",8,15 2 50 13
  button "Click to copy item into clipboard",9,100 5 160 10
}
on *:dialog:sq.logviewer:init:0:{
  sq.logviewer.writetopic
}
alias sq.logviewer.writetopic {
  var %n = 1,%file = $sq.dir $+ sqftp.log,%topic
  did -r sq.logviewer 1,2
  while (%n <= $ini(%file,0)) {
    %topic = $ini(%file,%n)
    if ($readini(%file,%topic,nick)) { did -a sq.logviewer 1 $readini(%file,%topic,nick) }
    else { did -a sq.logviewer 1 %topic }
    inc %n 1
  }
}
on *:dialog:sq.logviewer:sclick:9:{
  var %n = 1,%text
  while (%n <= $did(2,0).sel) {
    %text = %text $+ $did(2,$did(2,%n).sel).text $+ $crlf 
    inc %n 1
  }
  clipboard %text
}
on *:dialog:sq.logviewer:sclick:1:{
  var %n = 1,%file = $sq.dir $+ sqftp.log,%topic = $ini(%file,$did(1).sel)
  did -r sq.logviewer 2
  did -a sq.logviewer 2 Address = $readini(%file,%topic,address)
  did -a sq.logviewer 2 Nick = $readini(%file,%topic,nick) 
  did -a sq.logviewer 2 Channel = $readini(%file,%topic,chan)
  did -a sq.logviewer 2 Last Log = $readini(%file,%topic,lastlog)
  did -a sq.logviewer 2 Downloaded = $bytes($calc($readini(%file,%topic,totaldownkb) * 1024),3).suf
  did -a sq.logviewer 2 Uploaded = $bytes($calc($readini(%file,%topic,totalupkb) * 1024),3).suf
  did -a sq.logviewer 2 Last IP = $readini(%file,%topic,lastip)
  while ($readini(%file,%topic,upload $+ %n)) {
    did -a sq.logviewer 2 Upload $+ %n = $readini(%file,%topic,upload $+ %n)
    inc %n 1
  }
  while ($readini(%file,%topic,download $+ %n)) {
    did -a sq.logviewer 2 Download $+ %n = $readini(%file,%topic,download $+ %n)
    inc %n 1
  }
  did -z sq.logviewer 2
}
on *:dialog:sq.logviewer:menu:4:{
  if (!$did(1).sel) { return }
  var %file = $sq.dir $+ sqftp.log
  $sq.reminisection(%file,$ini(%file,$did(1).sel))
  sq.logviewer.writetopic
}
on *:dialog:sq.logviewer:dclick:1:{
  var %file = $sq.dir $+ sqftp.log
  $sq.reminisection(%file,$ini(%file,$did(1).sel))
  sq.logviewer.writetopic
}
on *:dialog:sq.logviewer:menu:5:{
  if (!$input(This will remove every entry from the list with no transfers,wy,FTPlog Purge)) { return }
  var %file =  $sq.dir $+ sqftp.log,%n = 1,%a = 0
  while (%n <= $ini(%file,0)) {
    if (!$readini(%file,$ini(%file,%n),download1) && !$readini(%file,$ini(%file,%n),upload1)) { $sq.reminisection(%file,$ini(%file,%n)) | inc %a 1 }
    else { inc %n 1 }
  }
  sq.logviewer.writetopic
  .echo -q $input(Removed %a items from list,o,FTPlog Purge)
}
on *:dialog:sq.logviewer:menu:6:{
  if (!$input(This will remove all items from list,wy,FTPlog Purge)) { return }
  write -c $sq.dir $+ sqftp.log
  sq.logviewer.writetopic
}
;#############################################################################################################
;#################################################BPFTPserver#################################################
;#############################################################################################################

#bpftp on

alias SQ.makeaccount {
  var %user = $+(",$sq.get(ftp.directory),users.ini,")
  var %group = $+(",$sq.get(ftp.directory),groups.ini,")
  if ($9 == $null) { return $false Missing Parameters }
  if (!$ini(%group,$4)) { return $false Group $5 does not exist }
  var %num = 1
  while ($ini(%user,SQ $+ %num)) { inc %num 1 }
  var %account = SQ $+ %num
  writeini -n %user %account Info_Name $1
  $sq.writeini(%user,%account,Login,%account)
  $sq.writeini(%user,%account,Pass,$2)
  $sq.writeini(%user,%account,IP0,+ $+ $3)
  $sq.writeini(%user,%account,GroupName,$4)
  $sq.writeini(%user,%account,Info_city,$5)
  $sq.writeini(%user,%account,EnableGroup,1)
  $sq.writeini(%user,%account,AllowNoop,0)
  $sq.writeini(%user,%account,EnableMaxConPerIP,1)
  $sq.writeini(%user,%account,MaxConPerIp,$iif($sq.get(ftp.uploadgroup) == $4,0,1))
  $sq.writeini(%user,%account,UseGroupHomedir,1)
  $sq.writeini(%user,%account,By-Pass_MaxUser,1)
  $sq.writeini(%user,%account,RelativePath,1)
  $sq.writeini(%user,%account,Info_Notes,0)
  $sq.writeini(%user,%account,Info_fax,$8 $+ / $+ $9)
  $sq.writeini(%user,%account,info_address,$address($1,1))
  $sq.writeini(%user,%account,info_Email,$6 $+ / $+ $7)
  $sq.writeini(%user,%account,info_PhoneHome,0)
  $sq.writeini(%user,%account,info_PhoneWork,0)
  $sq.writeini(%user,%account,EnableSiteChat,1) 
  $sq.writeini(%user,%account,filesup,0)
  $sq.writeini(%user,%account,filesdown,0)
  $sq.writeini(%user,%account,kbup,0)
  $sq.writeini(%user,%account,kbdown,0)  
  $sq.writeini(%user,%account,failedup,0)
  $sq.writeini(%user,%account,lastfile,none)
  if ($sq.get(ftp.maxservstatus)) { sq.adjustspeed }
  sq.runftp -reload
  return %num
}
alias sq.gotaccount {
  var %temp = 1,%user = $+(",$sq.get(ftp.directory),users.ini,"),%nick = $iif($1,$1,$nick)
  while (%temp <= $ini(%user,0)) {
    if ($remove($ini(%user,%temp),SQ) isnum && $readini(%user,$ini(%user,%temp),info_address) == $address(%nick,1) || $readini(%user,$ini(%user,%temp),Info_name) == %nick && $readini(%user,$ini(%user,%temp),GroupName) != $sq.get(ftp.uploadgroup)) {
      return 1 
    }
    inc %temp 1
  }
}
alias sq.delaccount {
  var %user = $+(",$sq.get(ftp.directory),users.ini,"),%num = 1
  if ($1 !isnum) {
    while ($readini(%user,SQ $+ %num,info_address) != $1) { 
      inc %num 1 
      if (%num > $ini(%user,0)) { return $false no such user } 
    }
    %num = $ini(%user,%num)
  }
  else { %num = $1 }
  if ($2) { sq.ftp.tell %num $2- }
  else { sq.sysmsg Account number %num was closed without reason. Check if this was done willingly }
  $sq.reminisection(%user,SQ $+ %num)
  if ($sq.get(ftp.maxservstatus)) { sq.adjustspeed }
  .timersq.delaccount 1 1 sq.runftp -reload
  return $true
}
alias sq.countaccounts {
  var %user = $+(",$sq.get(ftp.directory),users.ini,")
  var %temp = 1,%acc
  while (%temp <= $ini(%user,0)) {
    if ($remove($ini(%user,%temp),SQ) isnum) { inc %acc 1 }
    inc %temp 1
  }
  return %acc
}
alias sq.ftpuploaders {
  var %user = $+(",$sq.get(ftp.directory),users.ini,")
  var %temp = 1,%acc
  while (%temp <= $ini(%user,%temp)) {
    if ($remove($ini(%user,%temp),SQ) isnum && $readini(%user,$ini(%user,%temp),groupname) == $sq.get(ftp.uploadgroup)) { 
      if ($1) { %acc = %acc $+ ; $+ $ini(%user,%temp) }
      else { inc %acc 1 }
    }
    inc %temp 1
  }
  if (!$1) { %acc = $calc(%acc +0) }
  return %acc
}
alias sq.ftpdownloaders {
  var %user = $+(",$sq.get(ftp.directory),users.ini,")
  var %temp = 1,%acc
  while (%temp <= $ini(%user,0)) {
    if ($remove($ini(%user,%temp),SQ) isnum && $readini(%user,$ini(%user,%temp),groupname) != $sq.get(ftp.uploadgroup)) { 
      if ($1) { %acc = %acc $+ ; $+ $ini(%user,%temp) }
      else { inc %acc 1 }
    }
    inc %temp 1
  }
  if (!$1) { %acc = $calc(%acc +0) }
  return %acc
}
alias SQ.FTPsetup {
  var %step = $1,%user = $+(",$sq.get(ftp.directory),users.ini,"),%ftpini = $+(",$sq.get(ftp.directory),FTPsrv.ini,")
  if (!$isfile(%ftpini)) {
    sq.sysmsg Could not find FTPsrv.ini. This should not happen, let's pray everything's ok.
    Sq.sysmsg Lookup for %ftpini failed
  }
  if (!$isfile(%user)) { 
    write -c %user 
    SQ.sysmsg Could not find existing Users.ini. Creating New
    sq.sysmsg Lookup for %user failed
  }
  if ($sock(sq.ftp)) { sockclose sq.ftp }
  SQ.sysmsg Step %step $+ : Reading port setting 
  inc %step 1
  if ($readini(%ftpini,n,FTPserver,Port) isnum) {
    SQ.sysmsg      Found Port $readini(%ftpini,n,FTPserver,Port)
    sq.set ftp.port $readini(%ftpini,n,FTPserver,Port)
  }
  else { sq.set ftp.port 21 | SQ.sysmsg      Could not find port, asuming 21 }
  SQ.sysmsg Step %step $+ : Setting auto-activate server on serverstart to ON and disabling drives scan for fast startup 
  inc %step 1
  writeini -n %ftpini Ftpserver autostart 1
  writeini -n %ftpini FTPserver ScanDrivesAtStartup 0
  SQ.sysmsg Step %step $+ : Disabling multiple instances to avoid complications 
  inc %step 1
  writeini -n %ftpini ftpserver AllowMultipleInstance 0
  SQ.sysmsg Step %step $+ : Setting IP-resolve to ON else SQ-Script will not be able to resolve nicks 
  inc %step 1
  writeini -n %ftpini ftpserver IP_resolve 1
  SQ.sysmsg Step %step $+ : Setting case sensivity and encryption for Login and Password to OFF (You have been warned) 
  inc %step 1
  writeini -n %ftpini FTPserver Login_Insensitive 1
  writeini -n %ftpini FTPserver Password_Insensitive 1
  writeini -n %ftpini FTPserver Password_Encrypt 0
  SQ.sysmsg Step %step $+ : Setting Log options
  inc %step 1
  writeini -n %ftpini LogFile LogFileMethod 1
  writeini -n %ftpini LogFile TriedConnection 0
  writeini -n %ftpini LogFile Connection 1
  writeini -n %ftpini LogFile Disconnection 0
  writeini -n %ftpini LogFile MakeDir 1
  writeini -n %ftpini LogFile Upload 1
  writeini -n %ftpini LogFile UploadClose 1
  writeini -n %ftpini LogFile Download 1
  writeini -n %ftpini LogFile DownloadClose 1
  writeini -n %ftpini LogFile ChgDir 1
  writeini -n %ftpini LogFile CmdDele 1
  writeini -n %ftpini LogFile ShowServerAnswer 0
  writeini -n %ftpini LogFile ShowClientCommand 0
  writeini -n %ftpini LogFile LogPath FTP.log
  writeini -n %ftpini LogFile LogIPList0 127.0.0.1
  writeini -n %ftpini LogScreen UseCustomSyntax 0
  writeini -n %ftpini LogScreen UseStdSyntax 1
  writeini -n %ftpini LogScreen ShowServerAnswer 0
  writeini -n %ftpini LogScreen ShowClientCommand 0
  sq.sysmsg Hiding SQ-script from FTP logs
  writeini -n %ftpini LogScreen LogIPMethod 2
  writeini -n %ftpini LogScreen ApplyIPLoggingRulesTo 0
  writeini -n %ftpini LogScreen LogIPList0 127.0.0.1
  inc %step 1
  SQ.sysmsg Step %step $+ : Setting minimize to tray on startup to ON 
  inc %step 1
  writeini -n %ftpini FTPserver TrayOnStartup 1
  SQ.sysmsg Step %step $+ : Checking all other accounts and groups 
  inc %step 1
  var %counter = 1
  while (%counter <= $ini(%user,0)) {
    var %temptext = $ini(%user,%counter)
    if (%temptext != SQ-Script) { 
      if ($chr(32) isin %temptext) {
        SQ.sysmsg SQ-Script will mess-up if accountnames contain spaces, like %temptext
        SQ.sysmsg SQ-Script will replace all spaces by "-"
        write -s $+ $chr(91) $+ %temptext $+ $chr(93) %user $replace(%temptext,$chr(32),$chr(45))
        %temptext = $ini(%user,%counter)
      }
      SQ.sysmsg      Found account %temptext
      if ($readini(%user,%temptext,EnableSITECHAT) != 1) {
        writeini -n %user %temptext EnableSITECHAT 1
        SQ.sysmsg      Enabling SiteChat for account %temptext to send messages
      }
    }
    inc %counter 1
  }
  if ($sq.ftpgroups < 2 && $input(You do not have enough groups defined for BPFTP. $crlf $+ To properly use SQ-script's abilities you need at least two,4)) { } 
  sq.sysmsg Step %step $+ : Setting up log to file options on server
  inc %step 1
  writeini -n %ftpini logfile upload 1
  writeini -n %ftpini logfile uploadclose 1
  writeini -n %ftpini logfile download 1
  writeini -n %ftpini logfile downloadclose 1
  writeini -n %ftpini logfile makedir 1
  writeini -n %ftpini logfile logfilemethod 1
  writeini -n %ftpini logfile logpath FTP.log
  writeini -n %ftpini logscreen usestdsyntax 1
  writeini -n %ftpini logscreen usecustomsyntax 0
  writeini -n %ftpini ftpserver loggingtofile 1
  writeini -n %ftpini logfile ShowServerAnswer 0
  writeini -n %ftpini logfile ShowClientCommand 0
  writeini -n %ftpini logfile TriedConnection 0
  writeini -n %ftpini logfile Connection 1
  writeini -n %ftpini logfile Disconnection 0
  SQ.sysmsg      Please read in the help about this
  SQ.sysmsg Step %step $+ : Writing SQ-account into ini without rights 
  inc %step 1
  writeini -n %user SQ-script login SQ-script
  writeini -n %user SQ-script pass SQ-script
  writeini -n %user SQ-script By-Pass_MaxUser 1
  writeini -n %user SQ-script MaxConPerIp 1
  writeini -n %user SQ-script MaxUsers 1
  writeini -n %user SQ-script Timeoutenabled 0
  SQ.sysmsg Step %step $+ : Enabling SITE CHAT and SITE WHO for SQ-Script 
  inc %step 1
  writeini -n %user SQ-script EnableSITECHAT 1
  writeini -n %user SQ-script EnableSITEWHO 1
  SQ.sysmsg Step %step $+ : Setting C:\ as HomeDir as it exists on most Windows PCs. Change it, if you want to. 
  inc %step 1
  writeini -n %user SQ-script Dir0 C:\
  writeini -n %user SQ-script Attr0 -----L--
  SQ.sysmsg Step %STEP $+ : Restricting Login to SQ-Script account to localhost 
  inc %step 1
  writeini -n %user SQ-script IP0 +127.0.0.1
  SQ.sysmsg Step %Step $+ : Connecting to server
  sq.set ftp.configured G6
  inc %step 1
  if ($sq.get(ftp.startserver)) {
    sq.set ftp.login $true
    .timer 1 1 SQ.FTP.check
  }
  else {
    sq.sysmsg      You disabled the start of the server, when needed.
    sq.sysmsg      Please start the server now and connect to it via rightclick menu
  }
  SQ.sysmsg Step %step $+ : Cleaning up 
  inc %step 1
  sq.del configuringftp
  sq.set ftp.sqlogin SQ-script
  sq.set ftp.sqpass SQ-script
  SQ.sysmsg Self-configuration completed in %step steps
  echo @SQ-script! 
  SQ.sysmsg SQ-Script will try to stay always connected to your server
  SQ.sysmsg If SQ-script does not login automatically you can force it with the rightclick menu.
  SQ.sysmsg SQ-script updates the userlist every 60secs so don't worry if the users shown in mirc do not always match the ones on your server. Your can force manual update by using the rightclick menu.
}
alias sq.ftpaccounts {
  var %count = 1,%user = $+(",$sq.get(ftp.directory),Users.ini,"),%acc
  while (%count <= $ini(%user,0)) {
    %acc = $addtok(%acc,$ini(%user,%count),59)
    inc %count 1
  }
  return %acc
}
alias sq.ftpgroups {
  var %count = 1,%group = $+(",$sq.get(ftp.directory),Groups.ini,"),%acc
  while (%count <= $ini(%group,0)) {
    %acc = $addtok(%acc,$ini(%group,%count),59)
    inc %count 1
  }
  if ($chr(32) isin %acc) { sq.sysmsg 4One of your groups in BPFTPserver contains spaces, please remove it else you will get errors }
  return %acc
}
alias SQ.runFTP {
  if ($1- == - && $isdir($+(",$sq.get(ftp.directory),Administrative Tools,")) && $sq.get(ftp.sysservice)) {
    Sq.sysmsg SQ-Script starting Bulletproof FTP server system service
    run $+(",$sq.get(ftp.directory),Administrative Tools\Start BPFTPServer Service.bat,")
  }
  if ($1 != -exit) { sq.set serverqueue $addtok($sq.get(serverqueue),$1,59) }
  else { run $+(",$sq.get(ftp.directory),G6FTPsrv.exe -exit,") }
  if (!$timer(sq.serverqueue)) { sq.buffer }
}
alias SQ.buffer {
  if ($sq.get(serverread) && $isfile($sq.dir $+ ini.queue)) {
    sq.del serverread
    sq.writeini queue 
    .timersq.serverqueue 1 1 SQ.buffer
  }
  else {
    if ($gettok($sq.get(serverqueue),1,59) == -reload) { 
      .echo -q $findfile($+(",$sq.get(ftp.directory),"),Users.ini*.bak,0,1,.remove $+(",$1-,"))
      .echo -q $findfile($+(",$sq.get(ftp.directory),"),Groups.ini*.bak,0,1,.remove $+(",$1-,"))
      sq.set serverread 1 
    }
    else { sq.del serverread }
    if ($sq.get(serverqueue)) {
      if ($isfile($+(",$sq.get(ftp.directory),G6FTPsrv.exe,"))) { run $+(",$sq.get(ftp.directory),G6FTPsrv.exe,") $gettok($sq.get(serverqueue),1,59) }
      else { sq.del ftp.configured | return }
      sq.set serverqueue $deltok($sq.get(serverqueue),1,59)
      .timersq.serverqueue 1 3 SQ.buffer
    }
  }
}
alias SQ.collectinfo {
  if (SQ-script !isin $1 && 200-SQ* iswm $1) {
    var %user = $+(",$sq.get(ftp.directory),users.ini,"),%server = $+(",$sq.get(ftp.directory),FTPsrv.ini,")
    if (?M iswm $5 ) || (?.m. iswm $5) { 
      var %ip = $gettok($7,1,47)
      var %host = $gettok($7,2,47)
      var %action = $9,%speed = $replace($11,$chr(44),.)
      if (?M iswm $5) { var %time = $ctime($gettok($3,2,47) $+ / $+ $gettok($3,1,47) $+ / $+ $gettok($3,3,47) $4) }
      else { var %time = $ctime($3 $4) }
      if ($5 == PM || $5 == p.m.) { inc %time 43200 }
    }
    else { 
      var %ip = $gettok($6,1,47)
      var %host = $gettok($6,2,47)
      var %action = $8,%speed = $replace($10,$chr(44),.),%time = $ctime($replace($3,.,/) $4)
    }
    var %account = $mid($1,5)
    var %chan = $readini(%user,%account,info_city)
    var %realnick = $readini(%user,%account,Info_Name)
    var %slow = $readini(%user,%account,info_PhoneWork)
    var %netsplit = $readini(%user,%account,info_PhoneHome)
    var %minspeed = $gettok($readini(%user,%account,Info_Email),1,47),%bandwidthup = $calc($sq.get(ftpbandwidthup) +0),%bandwidthdown = $calc($sq.get(ftpbandwidthdown) +0)
    var %slowcounter = $gettok($readini(%user,%account,Info_Email),2,47),%lastsize
    var %address = $readini(%user,%account,info_address),%sect = $mask(%address,3)
    var %filesup = $readini(%user,%account,filesup),%filesdown = $readini(%user,%account,filesdown),%kbup = $readini(%user,%account,kbup),%kbdown = $readini(%user,%account,kbdown)
    var %limitfiles = $gettok($readini(%user,%account,info_fax),1,47),%limitMB = $gettok($readini(%user,%account,info_fax),2,47),%failedup = $readini(%user,%account,failedup)
    var %lastfile = $readini(%user,%account,lastfile),%totaldown = $calc($readini($sq.dir $+ SQftp.log,%sect,TotaldownKB) +0),%totalup = $calc($readini($sq.dir $+ SQftp.log,%sect,TotalupKB) +0)
    var %lastdirection = $gettok(%lastfile,1,32),%lasttime = $gettok(%lastfile,2,32),%lastsize = $gettok(%lastfile,3,32),%lastspeed = $gettok(%lastfile,4,32)
    var %lastfile = $gettok(%lastfile,5-,32),%lastaccess = %lastfile
    if (%slowcounter && %action == downloading) {
      var %temp = %slow
      if (%speed < %minspeed) { inc %slow 1 }
      elseif (%action == downloading) { %slow = 0 }
      if (%slow != %temp) { $sq.writeini(%user,%account,info_PhoneWork,%slow) }
    }
    if ($ial(%address,1).nick) { var %nick = $ial(%address,1).nick }
    elseif ($ial(*!*@ $+ %host,1).nick) { var %nick = $ial(*!*@ $+ %host,1).nick }
    elseif ($ial(*!*@ $+ %IP,1).nick) { var %nick = $ial(*!*@ $+ %IP,1).nick }
    else { var %nick = %realnick }
    var %temp = %netsplit
    if (%nick !ison %chan) { inc %netsplit 1 }
    else { %netsplit = 0 }
    if (%netsplit != %temp) { $sq.writeini(%user,%account,info_PhoneHome,%netsplit) }
    $sq.writeini(%user,%account,info_notes,0)
    if (!$ini($sq.dir $+ SQftp.log,%sect) && (%action == downloading || %action == uploading)) { 
      writeini -n $sq.dir $+ SQftp.log %sect nick %nick
      writeini -n $sq.dir $+ SQftp.log %sect address %address
      writeini -n $sq.dir $+ SQftp.log %sect chan %chan
    }
    if ($readini(%server,logscreen,usestdsyntax) && $readini(%server,ftpserver,loggingtofile)) {
      .echo -q $findfile($+(",$sq.get(ftp.directory),"),FTP*.log,0,sq.getlog $shortfn($1-))
      if ($isdir($+(",$sq.get(ftp.directory),logs,"))) { .echo -q $findfile($+(",$sq.get(ftp.directory),logs,"),FTP*.log,0,sq.getlog $shortfn($1-)) }
      var %log = $sq.get(ftp.log),%line = $sq.get(ftp.logline),%read,%count
      while (%line < $lines(%log)) {
        inc %line 1
        %read = $read(%log,w,* %account *,%line)
        if (!$readn) {
          if (!%lastfile) { 
            %lastfile = none 
            %lastsize = none
            %lastspeed = none
            %lastdirection = none
            %lastaccess = none
          }
          break 
        }
        else { %line = $readn }
        sq.readlog %read
        if ($sq.get(return)) { 
          %lastfile = $gettok($sq.get(return),2,47)
          %lastsize = $replace($gettok($gettok($sq.get(return),4,47),1,32),$chr(44),.)
          %lastspeed = $replace($gettok($gettok($sq.get(return),5,47),1,32),$chr(44),.)
          %lasttime = $sq.seconds($gettok($sq.get(return),3,47))
          %lastdirection = $gettok($sq.get(return),1,47)
          %lastaccess = %lastfile
          if (!$ini($sq.dir $+ SQftp.log,%sect)) { 
            writeini -n $sq.dir $+ SQftp.log %sect nick %nick
            writeini -n $sq.dir $+ SQftp.log %sect address %address
            writeini -n $sq.dir $+ SQftp.log %sect chan %chan
          }
          if (%lastdirection == down) { 
            inc %filesdown 1 
            inc %kbdown %lastsize
            %count = 1 
            while ($ini($sq.dir $+ SQftp.log,%sect,download $+ %count)) { inc %count 1 }
            Writeini -n $sq.dir $+ SQftp.log %sect download $+ %count %lastfile
            if (%lastspeed > $calc($gettok($SQ.get(stat.bestdownload),1,32) + 0)) { sq.set stat.bestdownload %lastspeed kBytes/s by %nick }
            inc %totaldown %lastsize
            hadd -m sq.downloads $ctime %lastsize
          }
          elseif (%lastdirection == up) { 
            inc %filesup 1 
            inc %kbup %lastsize
            %count = 1 
            while ($ini($sq.dir $+ SQftp.log,%sect,upload $+ %count)) { inc %count 1 }
            writeini -n $sq.dir $+ SQftp.log %sect upload $+ %count %lastfile
            inc %totalup %lastsize
            if (%lastspeed > $calc($gettok($SQ.get(stat.bestdupload),1,32) + 0)) { sq.set stat.bestupload %lastspeed kBytes/s by %nick }
            if (*.sfv iswm %lastfile) { 
              var %sec = $replace($nopath(%lastfile),$chr(32),_)
              writeini -n $sq.dir $+ SQsfvmonitor.log %sec nick %nick
              writeini -n $sq.dir $+ SQsfvmonitor.log %sec chan %chan
              writeini -n $sq.dir $+ SQsfvmonitor.log %sec directory $nofile(%lastfile)
              writeini -n $sq.dir $+ SQsfvmonitor.log %sec sfvfile %lastfile
              writeini -n $sq.dir $+ SQsfvmonitor.log %sec ip %ip
              writeini -n $sq.dir $+ SQsfvmonitor.log %sec address %address
              writeini -n $sq.dir $+ SQsfvmonitor.log %sec time $date $time
              sq.sysmsg 4new sfv-checker results for %nick are available.
              sq.sfvmonitor
            }
            elseif ($ini($sq.dir $+ SQsfvmonitor.log,0)) { .timersq.sfvmonitor 1 3 sq.sfvmonitor }
            hadd -m sq.uploads $ctime %lastsize
          }
          elseif (%lastdirection == failedup) { 
            inc %failedup 1
            %count = 1 
            while ($ini($sq.dir $+ SQftp.log,%sect,upload $+ %count)) { inc %count 1 }
            Writeini -n $sq.dir $+ SQftp.log %sect failedup $+ %count %lastfile
          }
        }
        elseif ($gettok($sq.get(return2),1,47) == made dir) {
          sq.sysmsg  $+ %nick $remove($sq.get(return2),/)
        }
        elseif ($gettok($sq.get(return2),1,47) == started) {
          %lastaccess = $gettok($sq.get(return2),3,47)
          %lastdirection = $gettok($sq.get(return2),2,47)
          %lastfile = %lastaccess
        }
      }
    }
    else { sq.sysmsg Please enable logging to file in the FTP server and use standart syntax | halt }
    if ($ini($sq.dir $+ SQftp.log,%sect) && (%action == downloading || %action == uploading)) {
      writeini -n $sq.dir $+ SQftp.log %sect lastlog $date $time
      writeini -n $sq.dir $+ SQftp.log %sect TotaldownKB %totaldown
      writeini -n $sq.dir $+ SQftp.log %sect TotalupKB %totalup
      writeini -n $sq.dir $+ SQftp.log %sect lastip %ip
    }
    if (%filesup !isnum) { %filesup = 0 }
    if (%filesdown !isnum) { %filesdown = 0 }
    if (%kbup !isnum) { %kbup = 0 }
    if (%kbdown !isnum) { %kbdown = 0 }
    if (%failedup !isnum) { %failedup = 0 }
    $sq.writeini(%user,%account,filesup,%filesup)
    $sq.writeini(%user,%account,filesdown,%filesdown)
    $sq.writeini(%user,%account,kbup,%kbup)
    $sq.writeini(%user,%account,kbdown,%kbdown)
    $sq.writeini(%user,%account,failedup,%failedup)
    %lastspeed = %speed
    if (%lastfile) { $sq.writeini(%user,%account,lastfile,%lastdirection $calc(%lasttime +0) $calc(%lastsize +0) %lastspeed %lastfile) }
    else { $sq.writeini(%user,%account,lastfile,none) }
    if (%lasttime > 5) { 
      if (%lastdirection == down) { inc %bandwidthdown %lastspeed }
      elseif (%lastdirection == up || %lastdirection == failedup) { inc %bandwidthup %lastspeed }
    }
    else { 
      if (%action == downloading) { inc %bandwidthdown %speed }
      if (%action == uploading) { inc %bandwidthup %speed }
    }
    sq.set ftpbandwidthup %bandwidthup
    sq.set ftpbandwidthdown %bandwidthdown
    sq.app ftpident $mid($gettok(%address,1,64),3)
    sq.app ftplastdirection %lastdirection
    sq.app ftplastaccess %lastaccess
    sq.app ftplastspeed %lastspeed
    sq.app ftplastsize %lastsize
    sq.app ftplasttime %lasttime
    sq.app ftptotalkbup %totalup
    sq.app ftptotalkbdown %totaldown
    sq.app ftpfailedup %failedup
    sq.app ftplastfile %lastfile
    sq.app ftplimitfiles %limitfiles
    sq.app ftplimitMB %limitMB
    sq.app ftpnick %nick
    sq.app ftpminspeed %minspeed
    sq.app ftpslowcounter %slowcounter    
    sq.app ftpchan %chan
    sq.app ftpslow %slow
    sq.app ftpnetsplit %netsplit
    sq.app ftpaccount %account
    sq.app ftpspeed %speed
    sq.app ftptime %time
    sq.app ftpaction %action
    sq.app ftpip %ip
    sq.app ftphost %host
    sq.app ftpkbup %kbup
    sq.app ftpkbdown %kbdown
    sq.app ftpfilesdown %filesdown
    sq.app ftpfilesup %filesup
    sq.del return return2
  }
}
alias sq.readlog {
  sq.del return return2
  if (?M !iswm $4) && (?.m. !iswm $4) {
    if ($8-9 == finished downloading) {
      sq.set return down $+ / $+ $mid($10-,2,$calc($pos($10-,' - $chr(40),1) -2)) $replace($remove($gettok($10-,$pos($10-,',0),39),$chr(40),$chr(41)),-,/)
    }
    elseif ($8-9 == finished uploading) {
      sq.set return up $+ / $+ $mid($10-,$calc($pos($10-,' in ',1) +6),$calc($pos($10-,' - $chr(40),1) -6 - $pos($10-,' in ',1))) $+ $mid($10-,2,$calc($pos($10-,' in ',1) -2)) $replace($remove($gettok($10-,$pos($10-,',0),39),$chr(40),$chr(41)),-,/)
    }
    elseif ($8-9 == aborted uploading) {
      sq.set return failedup $+ / $+ $gettok($mid($10-,1,$pos($10-,',$pos($10-,',0))),1,39) $replace($remove($gettok($10-,$pos($10-,',0),39),$chr(40),$chr(41)),-,/)
    }
    elseif ($8-9 == started downloading) {
      sq.set return2 $8 $+ / $+ $9 $+ / $+ $gettok($mid($10-,1,$pos($10-,',$pos($10-,',0))),1,39)
    }
    elseif ($8-9 == started uploading) {
      sq.set return2 $8 $+ / $+ $9 $+ / $+ $mid($12-,2,$calc($len($12-) -3)) $+ $gettok($mid($10-,1,$pos($10-,',$pos($10-,',0))),1,39)
    }
    elseif ($8-9 == made dir) {
      sq.set return2 $8-9 $+ / $+ $10-
    }
  }
  else {
    if ($9-10 == finished downloading) {
      sq.set return down $+ / $+ $mid($11-,2,$calc($pos($11-,' - $chr(40),1) -2)) $replace($remove($gettok($11-,$pos($11-,',0),39),$chr(40),$chr(41)),-,/)
    }
    elseif ($9-10 == finished uploading) {
      sq.set return up $+ / $+ $mid($11-,$calc($pos($11-,' in ',1) +6),$calc($pos($11-,' - $chr(40),1) -6 - $pos($11-,' in ',1))) $+ $mid($11-,2,$calc($pos($11-,' in ',1) -2)) $replace($remove($gettok($11-,$pos($11-,',0),39),$chr(40),$chr(41)),-,/)
    }
    elseif ($9-10 == aborted uploading) {
      sq.set return failedup $+ / $+ $gettok($mid($11-,1,$pos($11-,',$pos($11-,',0))),1,39) $replace($remove($gettok($11-,$pos($11-,',0),39),$chr(40),$chr(41)),-,/)
    }
    elseif ($9-10 == started downloading) {
      sq.set return2 $9 $+ / $+ $10 $+ / $+ $gettok($mid($11,1,$pos($11-,',$pos($11-,',0))),1,39)
    }
    elseif ($9-10 == started uploading) {
      sq.set return2 $9 $+ / $+ $10 $+ / $+ $mid($13-,2,$calc($len($13-) -3)) $+ $gettok($mid($11-,1,$pos($11-,',$pos($11-,',0))),1,39)
    }
    elseif ($9-10 == made dir) {
      sq.set return2 $8-9 $+ / $+ $11-
    }
  }
}
alias sq.getlog {
  if ($file($1-).ctime > $calc($file($sq.get(ftp.log)).ctime +0)) {
    if ($sq.get(ftp.deloldlog) && $sq.get(ftp.log)) { .remove $sq.get(ftp.log) }
    sq.set ftp.log $1-
    sq.set ftp.logline 1
  }
  elseif ($file($1-).ctime < $calc($file($sq.get(ftp.log)).ctime +0) && $sq.get(ftp.deloldlog)) { .remove $1- }
}
alias SQ.sockclose {
  sockclose SQ.ftp
  SQ.sysmsg Error: Connect-attempt timed out after 15sec
  window -g1 @SQ-script! 
}
on *:sockopen:SQ.ftp:{
  if ($sockerr) { sq.set ftp.status 0 }
  else { sq.del noserverrunning }
  if ($sockerr == 3 && !$SQ.get(noconnect)) { 
    if ($sq.get(ftp.startserver)) { 
      sq.sysmsg No Server on specified IP and Port found. SQ-script will try to start server.    
      SQ.runftp -
      .timersq.ftp.check 1 10 SQ.ftp.check
      sq.set 20 noconnect $true
    }
    elseif (!$sq.get(noserverrunning)) { 
      sq.sysmsg No Server found on specified IP and Port. Please check if server is running and try to connect again.
      .timernoconnect off
      sq.set noserverrunning 1
    }
  }
  elseif ($sockerr == 3) {
    var %ftpini = $+(",$sq.get(ftp.directory),FTPsrv.ini,"),%port = $readini(%ftpini,n,FTPserver,Port)
    if (%port != $sq.get(ftp.port)) { 
      sq.sysmsg The port setting in BPFTPserver did not match the saved value. Fixed
      sq.set ftp.port %port
      sq.sysmsg trying to reconnect with new settings
      .timersq.ftp.check 1 2 sq.ftp.check
    }
    else { sq.sysmsg Error: Connection could not be established. Check Firewall settings and retry. }
    .timernoconnect off
    sq.del noconnect
  }
  .timernoconnect off 
}
on *:sockread:SQ.ftp:{
  sockread -f %tempread
  SQ.ftpread %tempread
}
alias SQ.ftpread {
  if ($sock(SQ.ftp)) {
    if ($1 == 220) { sockwrite -n SQ.ftp USER $SQ.get(ftp.sqlogin) }
    elseif ($1 == 331) { sockwrite -n SQ.ftp PASS $SQ.get(ftp.sqpass) }
    elseif ($1 == 230) { 
      .timernoconnect off 
      SQ.sysmsg Login successful 
      sq.set ftp.status 1 
      sockwrite -n SQ.ftp PWD 
      if ($dialog(SQ)) { did -c SQ 106 | did -o SQ 106 1 ON } 
    }
    elseif ($1 == 257) { sockwrite -n SQ.ftp Type A }
    elseif ($1- == 200 Type set to A.) { sockwrite -n SQ.ftp site who }
    elseif ($1 == 530) || ($1 == 421) || ($1 == 503) {
      SQ.sysmsg An error occured ! Please check the settings in BPFTPserver. 
      SQ.sysmsg Errormsg: $2- 
      sq.set ftp.status 0
      sockclose sq.ftp  
    }
    elseif (200-* iswm $1) {
      if (200-Site == $1) { sq.set ftplogged $calc($5 - 1) }
      elseif (200-ID != $1 && 200-SQ-* !iswm $1) { SQ.collectinfo $1- }
    }
    elseif ($1- == 200 End of SITE WHO) { 
      var %user = $+(",$sq.get(ftp.directory),users.ini,"),%count = 1
      while (%count <= $ini(%user,0) && $1) {
        if ($remove($ini(%user,%count),SQ) isnum) {
          if ($ini(%user,%count,0) < 10) { $sq.reminisection(%user,$ini(%user,%count)) }
          var %var = $calc($readini(%user,$ini(%user,%count),Info_Notes) +0)
          if (%var < $sq.get(ftp.nouser)) { $sq.writeini(%user,$ini(%user,%count),Info_Notes,$calc(%var +1)) }
          else { sq.delaccount $remove($ini(%user,%count),SQ) No user timeout exceeded. Please contact the owner because this should not be visible }
        }
        inc %count 1
      }
      SQ.process 
      sq.set ftp.logline $lines($sq.get(ftp.log))
    }
    elseif (214* iswm $1 && SQ* iswm $2) { sq.sysmsg ( $+ $sq.tok(ftpnick,$findtok($sq.get(ftpaccount),$2,1,59)) $+ ) $6- }
  }
  unset %tempread
}
On *:sockclose:SQ.ftp:{
  sq.set ftp.status 0
  if ($timer(noconnect)) { sq.sysmsg Server refused connection. Check settings ! | .timernoconnect off }
  else {
    sq.sysmsg Server quitted connection without warning
    sq.sysmsg assuming server runtime error (happens sometimes). Restarting server
    sq.runftp -
    .timer 1 3 sq.ftp.check
  }
}
alias sq.ftp.check {
  sq.del ftp*
  if ($SQ.get(ftp.configured) && $sq.get(ftp.login)) {
    if (!$sock(SQ.ftp)) { 
      dline -l @SQ-script! 1-
      if ($sq.get(noserverrunning) && !$1 || !$sq.get(noserverrunning)) { 
        sq.del noserverrunning
        sq.sysmsg Establishing connection to server 
      }
      .timernoconnect 1 15 SQ.sockclose
      sockopen SQ.FTP localhost $SQ.get(ftp.port)
    }
    elseif ($sock(SQ.ftp)) { sockwrite -n SQ.ftp SITE who }
    if ($sq.get(stat.status.ftp)) {
      if ($sq.get(stat.count) >= $sq.get(stat.refresh)) { sq.ftp.stat.update | sq.set stat.count 1 }
      else { sq.inc stat.count 1 }
    }
    sq.dec ftplogged
    .echo -q $findfile($+(",$sq.get(ftp.directory),"),*.bak,0,.remove $1-)
  }
  Elseif ($sq.get(ftp.login)) {
    sq.sysmsg You did not run the FTP setup for SQ-Script yet 
    dline -l @SQ-script! 1-
  }
  else { dline -l @SQ-script! 1- }
}
alias sq.ftp.deny {
  while ($len($sq.get(ftp.denyaddress)) > 900) { sq.set ftp.denyaddress $deltok($sq.get(ftp.denyaddress),$numtok($sq.get(ftp.denynick),59),59) }
  sq.set ftp.denynick $instok($sq.get(ftp.denynick),$1,1,59)
  sq.set ftp.denyaddress $instok($sq.get(ftp.denyaddress),$address($1,3),1,59)
}
alias sq.ftp.tell {
  if ($sock(sq.ftp)) {
    if ($2 == prvcht) {
      if ($1 !isnum) { sockwrite -n sq.ftp SITE CHAT $3- (To reply use: SITE CHAT SQ-script <text>) }
      else { sockwrite -n sq.ftp SITE CHAT SQ $+ $3- (To reply use: SITE CHAT SQ-script <text>) }
    }
    else {
      if ($1 !isnum) { sockwrite -n sq.ftp SITE CHAT $1- }
      else { sockwrite -n sq.ftp SITE CHAT SQ $+ $1- }
    }
  }
}

;##############################################Stats section#################################################

alias sq.ftp.stat.update {
  sq.runftp -stat
  .timersq.readstat 1 4 sq.ftp.stat.read
}
alias sq.ftp.stat.read {
  var %temptxt = $read($+(",$sq.get(ftp.directory),stat.top,"),1)
  sq.set stat.call $gettok(%temptxt,1,59)
  sq.set stat.c24h $gettok(%temptxt,2,59)
  sq.set stat.suptimenn $gettok(%temptxt,3,59)
  sq.set stat.suptimeHH $gettok(%temptxt,4,59)
  sq.set stat.suptimedd $gettok(%temptxt,5,59)
  sq.set stat.suptimetotal $gettok(%temptxt,6,59)
  var %temptxt = $read($+(",$sq.get(ftp.directory),stat.top,"),2)
  sq.set stat.sup $bytes($calc($remove($left($gettok(%temptxt,1,59),$calc($len($gettok(%temptxt,1,59)) -2)),$chr(44),.) *1024),3).suf
  sq.set stat.sdown $bytes($calc($remove($left($gettok(%temptxt,2,59),$calc($len($gettok(%temptxt,2,59)) -2)),$chr(44),.) *1024),3).suf
  sq.set stat.sall $bytes($calc($remove($left($gettok(%temptxt,3,59),$calc($len($gettok(%temptxt,3,59)) -2)),$chr(44),.) *1024),3).suf
  var %temptxt = $read($+(",$sq.get(ftp.directory),stat.top,"),3)
  sq.set stat.upup $bytes($calc($remove($left($gettok(%temptxt,1,59),$calc($len($gettok(%temptxt,1,59)) -2)),$chr(44),.) *1024),3).suf
  sq.set stat.updown $bytes($calc($remove($left($gettok(%temptxt,2,59),$calc($len($gettok(%temptxt,2,59)) -2)),$chr(44),.) *1024),3).suf
  sq.set stat.upall $bytes($calc($remove($left($gettok(%temptxt,3,59),$calc($len($gettok(%temptxt,3,59)) -2)),$chr(44),.) *1024),3).suf
  sq.set stat.upfilesup $gettok(%temptxt,4,59)
  sq.set stat.upfilesdown $gettok(%temptxt,5,59)
  sq.set stat.upfilesall $gettok(%temptxt,6,59)
  var %temptxt = $read($+(",$sq.get(ftp.directory),stat.top,"),4)
  sq.set stat.g6version $gettok(%temptxt,1,59)
  sq.set stat.CPU $gettok(%temptxt,2,59)
  sq.set stat.Ram $bytes($calc($replace($remove($gettok(%temptxt,3,59),.),$chr(44),.) * 1024),3).suf
  sq.set stat.osver $gettok(%temptxt,4,59)
}
alias sq.writeini {
  if ($2 && !$ini($1,$2)) { return }
  if ($sq.get(serverread)) { write $sq.dir $+ ini.queue $1- }
  elseif ($1 == queue) {
    var %count = 1
    while (%count <= $lines($sq.dir $+ ini.queue)) {
      if ($ini($1,$2)) { writeini $read($sq.dir $+ ini.queue,%count) }
      inc %count 1
    }
    .remove $sq.dir $+ ini.queue
  }
  elseif ($0 >= 4) {
    writeini -n $1-
  }
  else { sq.sysmsg 4ERROR for writeini in $script in $scriptline $+ : $1- }
}
alias sq.adjustspeed {
  var %user = $+(",$sq.get(ftp.directory),users.ini,"),%count = 1
  while (%count <= $ini(%user,0)) {
    if ($istok($sq.ftpdownloaders(1),$ini(%user,%count),59)) {
      $sq.writeini(%user,$ini(%user,%count),MaxSpeedEnabled,1)
      $sq.writeini(%user,$ini(%user,%count),MaxSpeedRcv,$int($calc($sq.get(ftp.maxserv) / $sq.ftpdownloaders)))
      $sq.writeini(%user,$ini(%user,%count),MaxSpeedSnd,999999)
      if ($sq.get(ftp.maxspeed.tell)) { sq.ftp.tell $ini(%user,%count) Speedlimit is now $calc($sq.get(ftp.maxserv) / $sq.ftpdownloaders) bytes/s }
    }
    inc %count 1
  }
}
alias sq.setmaxserv {
  if ($1) { sq.adjustspeed }
  else {
    var %user = $+(",$sq.get(ftp.directory),users.ini,"),%count = 1
    while ($ini(%user,%count)) {
      if ($istok($sq.ftpdownloaders(1),$ini(%user,%count),59)) {
        $sq.writeini(%user,$ini(%user,%count),MaxSpeedEnabled,0)
      }
      inc %count 1
    }
  }
  sq.runftp -reload
}
#bpftp end

;##########################################################################################################################
;############################################## RaidenFTPd ################################################################
;##########################################################################################################################


#raidenftpd off

alias SQ.FTPsetup {
  var %step = $1,%ftpini = $shortfn($sfile($+(",$sq.get(ftp.directory),*.ftpd,"),Please select your FTP config file))
  var %user = $readini(%ftpini,ftpd,usrfile),%error = 0
  if (!$readini(%ftpini,ftpd,log)) { sq.sysmsg Please enable logging and make it cycle daily for better performance. Aborting | %error = 1 }
  if ($readini(%ftpini,ftpd,encrypt_log)) { sq.sysmsg Please do not encrypt the logfile. Aborting | %error = 1 }
  if ($readini(%ftpini,ftpd,ipchk) != 1) { sq.sysmsg Please enable IP checking before login. Aborting | %error = 1 }
  if (!$readini(%ftpini,ftpd,DNS_LOOKUP)) { sq.sysmsg Please enable IP resolving. Aborting | %error = 1 }
  if (!$read(%user,w,SQ-script:0*)) { sq.sysmsg Please create a useraccount as described in the readme. Aborting | %error = 1 }
  if (%error) { sq.del configuringftp ftp.configured | .timer 1 1 .disable #raidenftpd | halt }
  if ($readini(%ftpini,ftpd,logname) != daily) { sq.sysmsg Please make the logfile cycle daily for better performance. }
  sq.set ftp.port $iif($readini(%ftpini,ftpd,listen_port),$readini(%ftpini,ftpd,listen_port),21)
  sq.set ftp.configured Raiden
  .timer 1 1 SQ.FTP.check
  sq.del configuringftp
  sq.set stat.status.ftp 0
  sq.set ftp.killserver 0
  sq.set ftp.startserver 0
  sq.set ftp.sqlogin SQ-script
  sq.set ftp.sqpass SQ-script
  SQ.sysmsg SQ-Script will try to stay always connected to your server
  SQ.sysmsg If SQ-script does not login automatically you can force it with the rightclick menu.
  SQ.sysmsg SQ-script updates the userlist every 60secs so don't worry if the users shown in mirc do not always match the ones on your server. Your can force manual update by using the rightclick menu.
}
alias sq.ftp.check {
  sq.del ftp*
  if ($SQ.get(ftp.configured) && $sq.get(ftp.login)) {
    if (!$sock(SQ.ftp)) { 
      dline -l @SQ-script! 1-
      if ($sq.get(noserverrunning) && !$1 || !$sq.get(noserverrunning)) { 
        sq.del noserverrunning
        sq.sysmsg Establishing connection to server 
      }
      .timernoconnect 1 15 SQ.sockclose
      sockopen SQ.FTP localhost $SQ.get(ftp.port)
    }
    elseif ($sock(SQ.ftp)) { sq.del ftpdirect | sockwrite -n SQ.ftp SITE xwho }
    sq.dec ftplogged
  }
  Elseif ($sq.get(ftp.login)) {
    sq.sysmsg You did not run the FTP setup for SQ-Script yet 
    dline -l @SQ-script! 1-
  }
  else { dline -l @SQ-script! 1- }
}
alias SQ.sockclose {
  sockclose SQ.ftp
  SQ.sysmsg Error: Connect-attempt timed out after 15sec
  window -g1 @SQ-script! 
}
on *:sockopen:SQ.ftp:{
  if ($sockerr) { sq.set ftp.status 0 }
  if ($sockerr == 3 && !$SQ.get(noconnect)) { 
    sq.sysmsg No Server found on specified IP and Port. Please check if server is running and try to connect again.
  }
  elseif ($sockerr == 3) {
    sq.sysmsg Error: Connection could not be established. Check Firewall settings and retry. 
  }
  .timernoconnect off 
}
on *:sockread:SQ.ftp:{
  sockread -f %tempread
  ;sq.sysmsg - %tempread
  if ($sq.get(ftpdirect)) { SQ.sysmsg %tempread }
  else { SQ.ftpread %tempread }
}
alias SQ.ftpread {
  if ($sock(SQ.ftp)) {
    if ($1 == 220 && $2 != .) { sockwrite -n SQ.ftp USER $SQ.get(ftp.sqlogin) }
    elseif ($1 == 331) { sockwrite -n SQ.ftp PASS $SQ.get(ftp.sqpass) }
    elseif ($1 == 230) { 
      .timernoconnect off 
      SQ.sysmsg Login successful 
      sq.set ftp.status 1 
      sq.del ftpdirect
      sockwrite -n SQ.ftp Site xwho 
      if ($dialog(SQ)) { did -c SQ 106 | did -o SQ 106 1 ON } 
    }
    elseif ($1 == 530) || ($1 == 421) || ($1 == 503) {
      SQ.sysmsg An error occured ! Please check the settings in the FTPserver. 
      SQ.sysmsg Errormsg: $2- 
      sq.set ftp.status 0
      sockclose sq.ftp  
    }
    elseif (220-[ == $1) { sq.set ftplogged $calc($2 - 1) }
    elseif (220-|* iswm $1) {
      if (220-| $+ $chr(40) == $1) { 
        sq.set templogin $3 
        sq.set tempgroup $4
        sq.set tempaction $remove($5-,|)
      }
      elseif ($longip($remove($1,220-|))) { 
        sq.collectinfo $1- 
        sq.del templogin tempgroup tempaction 
      }
    }
    elseif ($1- == 220 .) { 
      var %user = $sq.dir $+ FTPusers.ini,%count = 1
      while (%count <= $ini(%user,0) && $1) {
        if ($remove($ini(%user,%count),SQ) isnum) {
          var %var = $calc($readini(%user,$ini(%user,%count),no_user) +0)
          if (%var < $sq.get(ftp.nouser)) { writeini %user $ini(%user,%count) no_user $calc(%var +1) }
          else { sq.delaccount $remove($ini(%user,%count),SQ) }
        }
        inc %count 1
      }
      SQ.process 
      sq.set ftp.logline $lines($sq.get(ftp.log))
    }
  }
  unset %tempread
}
On *:sockclose:SQ.ftp:{
  sq.set ftp.status 0
  if ($timer(noconnect)) { sq.sysmsg Server refused connection. Check settings ! | .timernoconnect off }
  sq.sysmsg Connection to Server lost
}
alias SQ.collectinfo {
  if ($remove($1,220-|) != 127.0.0.1 && SQ* iswm $sq.get(templogin)) {
    var %user = $sq.dir $+ ftpusers.ini
    var %ip = $remove($1,220-|)
    var %host = $2
    if ($gettok($sq.get(tempaction),1,32) == RETR) { var %action = Downloading }
    elseif ($gettok($sq.get(tempaction),1,32) == APP) { var %action = Uploading }
    elseif ($gettok($sq.get(tempaction),1,32) == STOR) { var %action = Uploading }
    else { var %action = idle }
    if (%action != idle) { var %speed = $calc($remove($gettok($sq.get(tempaction),$numtok($sq.get(tempaction),32),32),k/s) * 1024) }
    else { var %speed = 0 }
    var %account = $sq.get(templogin)
    var %time = $readini(%user,%account,time)
    var %chan = $readini(%user,%account,channel)
    var %realnick = $readini(%user,%account,realnick)
    var %slow = $readini(%user,%account,slow)
    var %netsplit = $readini(%user,%account,netsplit)
    var %minspeed = $readini(%user,%account,minspeed),%bandwidthup = $calc($sq.get(ftpbandwidthup) +0),%bandwidthdown = $calc($sq.get(ftpbandwidthdown) +0)
    var %slowcounter = $readini(%user,%account,slowcounter),%lastsize
    var %address = $readini(%user,%account,address),%sect = $mask(%address,3)
    var %filesup = $readini(%user,%account,filesup),%filesdown = $readini(%user,%account,filesdown),%kbup = $readini(%user,%account,kbup),%kbdown = $readini(%user,%account,kbdown)
    var %limitfiles = $readini(%user,%account,limitfiles),%limitMB = $readini(%user,%account,limitMB),%failedup = $readini(%user,%account,failedup)
    var %lastfile = $readini(%user,%account,lastfile),%totaldown = $calc($readini($sq.dir $+ SQftp.log,%sect,TotaldownKB) +0),%totalup = $calc($readini($sq.dir $+ SQftp.log,%sect,TotalupKB) +0)
    var %lastdirection = $gettok(%lastfile,1,32),%lasttime = $gettok(%lastfile,2,32),%lastsize = $gettok(%lastfile,3,32),%lastspeed = $gettok(%lastfile,4,32)
    var %lastfile = $gettok(%lastfile,5-,32),%lastaccess = %lastfile
    if (%slowcounter && %action == downloading) {
      var %temp = %slow
      if (%speed < %minspeed) { inc %slow 1 }
      elseif (%action == downloading) { %slow = 0 }
      if (%slow != %temp) { writeini %user %account slow %slow }
    }
    if ($ial(%address,1).nick) { var %nick = $ial(%address,1).nick }
    elseif ($ial(*!*@ $+ %host,1).nick) { var %nick = $ial(*!*@ $+ %host,1).nick }
    elseif ($ial(*!*@ $+ %IP,1).nick) { var %nick = $ial(*!*@ $+ %IP,1).nick }
    else { var %nick = %realnick }
    var %temp = %netsplit
    if (%nick !ison %chan) { inc %netsplit 1 }
    else { %netsplit = 0 }
    if (%netsplit != %temp) { writeini %user %account netsplit %netsplit }
    writeini %user %account no_user 0
    if (!$ini($sq.dir $+ SQftp.log,%sect) && (%action == downloading || %action == uploading)) { 
      writeini -n $sq.dir $+ SQftp.log %sect nick %nick
      writeini -n $sq.dir $+ SQftp.log %sect address %address
      writeini -n $sq.dir $+ SQftp.log %sect chan %chan
    }
    $findfile($+(",$sq.get(ftp.directory),log,"),*.log,0,sq.getlog $shortfn($1-))
    var %log = $sq.get(ftp.log),%line = $sq.get(ftp.logline),%read,%count
    while (%line < $lines(%log)) {
      inc %line 1
      %read = $read(%log,s,%ip,%line)
      if (!$readn) {
        if (!%lastfile) { 
          %lastfile = none 
          %lastsize = none
          %lastspeed = none
          %lastdirection = none
          %lastaccess = none
        }
        break 
      }
      else { %line = $readn }
      sq.readlog %read
      if ($sq.get(return)) { 
        %lastfile = $gettok($sq.get(return),2,47)
        %lastsize = $replace($gettok($gettok($sq.get(return),4,47),1,32),$chr(44),.)
        %lastspeed = $replace($gettok($gettok($sq.get(return),5,47),1,32),$chr(44),.)
        %lasttime = $sq.seconds($gettok($sq.get(return),3,47))
        %lastdirection = $gettok($sq.get(return),1,47)
        if (!$ini($sq.dir $+ SQftp.log,%sect)) { 
          writeini -n $sq.dir $+ SQftp.log %sect nick %nick
          writeini -n $sq.dir $+ SQftp.log %sect address %address
          writeini -n $sq.dir $+ SQftp.log %sect chan %chan
        }
        if (%lastdirection == down) { 
          inc %filesdown 1 
          inc %kbdown %lastsize
          %count = 1 
          while ($ini($sq.dir $+ SQftp.log,%sect,download $+ %count)) { inc %count 1 }
          Writeini -n $sq.dir $+ SQftp.log %sect download $+ %count %lastfile
          if (%lastspeed > $calc($gettok($SQ.get(stat.bestdownload),1,32) + 0)) { sq.set stat.bestdownload %lastspeed kBytes/s by %nick }
          inc %totaldown %lastsize
          hadd -m sq.downloads $ctime %lastsize
        }
        elseif (%lastdirection == up) { 
          inc %filesup 1 
          inc %kbup %lastsize
          %count = 1 
          while ($ini($sq.dir $+ SQftp.log,%sect,upload $+ %count)) { inc %count 1 }
          writeini -n $sq.dir $+ SQftp.log %sect upload $+ %count %lastfile
          inc %totalup %lastsize
          if (%lastspeed > $calc($gettok($SQ.get(stat.bestdupload),1,32) + 0)) { sq.set stat.bestupload %lastspeed kBytes/s by %nick }
          if (*.sfv iswm %lastfile) { 
            writeini -n $sq.dir $+ SQsfvmonitor.log $nopath(%lastfile) nick %nick
            writeini -n $sq.dir $+ SQsfvmonitor.log $nopath(%lastfile) chan %chan
            writeini -n $sq.dir $+ SQsfvmonitor.log $nopath(%lastfile) directory $nofile(%lastfile)
            writeini -n $sq.dir $+ SQsfvmonitor.log $nopath(%lastfile) sfvfile %lastfile
            writeini -n $sq.dir $+ SQsfvmonitor.log $nopath(%lastfile) ip %ip
            writeini -n $sq.dir $+ SQsfvmonitor.log $nopath(%lastfile) address %address
            writeini -n $sq.dir $+ SQsfvmonitor.log $nopath(%lastfile) time $date $time
            sq.sysmsg 4new sfv-checker results for %nick are available.
            sq.sfvmonitor
          }
          hadd -m sq.uploads $ctime %lastsize
        }
      }
      elseif ($gettok($sq.get(return2),1,47) == made dir) {
        sq.sysmsg  $+ %nick $remove($sq.get(return2),/)
      }
    }
    if ($ini($sq.dir $+ SQftp.log,%sect) && (%action == downloading || %action == uploading)) {
      writeini -n $sq.dir $+ SQftp.log %sect lastlog $date $time
      writeini -n $sq.dir $+ SQftp.log %sect TotaldownKB %totaldown
      writeini -n $sq.dir $+ SQftp.log %sect TotalupKB %totalup
      writeini -n $sq.dir $+ SQftp.log %sect lastip %ip
    }
    if (%filesup !isnum) { %filesup = 0 }
    if (%filesdown !isnum) { %filesdown = 0 }
    if (%kbup !isnum) { %kbup = 0 }
    if (%kbdown !isnum) { %kbdown = 0 }
    if (%failedup !isnum) { %failedup = 0 }
    writeini %user %account filesup %filesup
    writeini %user %account filesdown %filesdown
    writeini %user %account kbup %kbup
    writeini %user %account kbdown %kbdown  
    writeini %user %account failedup %failedup
    if (%action != idle) {
      %speed = $remove($gettok($remove($sq.get(tempaction),|),$numtok($remove($sq.get(tempaction),|),32),32),k/s)
      %lastfile = $gettok($remove($sq.get(tempaction),|),2- $+ $calc($numtok($remove($sq.get(tempaction),|),32) -1),32)
      %lastsize = 0
      %lastdirection = $iif(%action == Downloading,Down,Up)
      %lastaccess = %lastfile
    }
    %lastspeed = %speed
    if (%lastfile) { writeini %user %account lastfile %lastdirection $calc(%lasttime +0) $calc(%lastsize +0) %lastspeed %lastfile }
    else { writeini %user %account lastfile none }
    if (%lasttime > 5) { 
      if (%lastdirection == down) { inc %bandwidthdown %lastspeed }
      elseif (%lastdirection == up || %lastdirection == failedup) { inc %bandwidthup %lastspeed }
    }
    else { 
      if (%action == downloading) { inc %bandwidthdown %speed }
      if (%action == uploading) { inc %bandwidthup %speed }
    }
    sq.set ftpbandwidthup %bandwidthup
    sq.set ftpbandwidthdown %bandwidthdown
    sq.app ftpident $mid($gettok(%address,1,64),3)
    sq.app ftplastdirection %lastdirection
    sq.app ftplastaccess %lastaccess
    sq.app ftplastspeed %lastspeed
    sq.app ftplastsize %lastsize
    sq.app ftplasttime %lasttime
    sq.app ftptotalkbup %totalup
    sq.app ftptotalkbdown %totaldown
    sq.app ftpfailedup %failedup
    sq.app ftplastfile %lastfile
    sq.app ftplimitfiles %limitfiles
    sq.app ftplimitMB %limitMB
    sq.app ftpnick %nick
    sq.app ftpminspeed %minspeed
    sq.app ftpslowcounter %slowcounter    
    sq.app ftpchan %chan
    sq.app ftpslow %slow
    sq.app ftpnetsplit %netsplit
    sq.app ftpaccount %account
    sq.app ftpspeed %speed
    sq.app ftptime %time
    sq.app ftpaction %action
    sq.app ftpip %ip
    sq.app ftphost %host
    sq.app ftpkbup %kbup
    sq.app ftpkbdown %kbdown
    sq.app ftpfilesdown %filesdown
    sq.app ftpfilesup %filesup
    sq.del return
  }
}
alias sq.readlog {
  sq.del return return2
  var %time = $calc($gettok($gettok($5-,2,34),1,32) /1024 / $gettok($gettok($5-,2,34),1,32))
  if ($4 == r) {
    sq.set return down $+ / $+ $replace($gettok($5-,1,34),/,\) $+ / $+ $asctime($calc($timezone + %time),HH:nn:ss) $+ / $+ $calc($gettok($gettok($5-,2,34),1,32) /1024) KB $+ / $+ $gettok($gettok($5-,2,34),2,32) KBytes/s
  }
  elseif ($4 == w) {
    sq.set return up $+ / $+ $replace($gettok($5-,1,34),/,\) $+ / $+ $asctime($calc($timezone + %time),HH:nn:ss) $+ / $+ $calc($gettok($gettok($5-,2,34),1,32) /1024) KB $+ / $+ $gettok($gettok($5-,2,34),2,32) KBytes/s
  }
  elseif ($4 == m) {
    sq.set return2 Made Dir / $+ $replace($gettok($5-,1,34),/,\)
  }
}
alias sq.getlog {
  echo 5 -st $1-
  if ($file($1-).ctime > $calc($file($sq.get(ftp.log)).ctime +0)) {
    if ($sq.get(ftp.deloldlog) && $sq.get(ftp.log)) { .remove $sq.get(ftp.log) }
    sq.set ftp.log $1-
    sq.set ftp.logline 1
  }
  elseif ($file($1-).ctime < $calc($file($sq.get(ftp.log)).ctime +0) && $sq.get(ftp.deloldlog)) { .remove $1- }
}
alias SQ.makeaccount {
  var %user = $sq.dir $+ FTPusers.ini
  if ($9 == $null) { return $false Missing Parameters }
  var %num = 1
  while ($ini(%user,SQ $+ %num)) { inc %num 1 }
  var %account = SQ $+ %num
  sockwrite -n sq.ftp site adduser %account $2 $4 $3
  .timer 1 2 sockwrite -n sq.ftp site chratio %account 0
  writeini -n %user %account realnick $1
  writeini -n %user %account Login %account
  writeini -n %user %account Pass $2
  writeini -n %user %account IP0 + $+ $3
  writeini -n %user %account GroupName $4
  writeini -n %user %account channel $5
  writeini -n %user %account no_user 0
  writeini -n %user %account limitfiles $8
  writeini -n %user %account limitMB $9
  writeini -n %user %account address $address($1,1)
  writeini -n %user %account slowcounter $7
  writeini -n %user %account minspeed $6
  writeini -n %user %account netsplit 0
  writeini -n %user %account slowcounter 0
  writeini -n %user %account filesup 0
  writeini -n %user %account filesdown 0
  writeini -n %user %account kbup 0
  writeini -n %user %account kbdown 0  
  writeini -n %user %account failedup 0
  writeini -n %user %account lastfile none
  writeini -n %user %account time $ctime
  return %num
}
alias sq.gotaccount {
  var %temp = 1,%user = $sq.dir $+ FTPusers.ini
  while (%temp <= $ini(%user,0)) {
    if ($remove($ini(%user,%temp),SQ) isnum && $readini(%user,$ini(%user,%temp),address) == $address($nick,1) || $readini(%user,$ini(%user,%temp),realnick) == $nick && $readini(%user,$ini(%user,%temp),GroupName) != $sq.get(ftp.uploadgroup)) {
      return 1 
    }
    inc %temp 1
  }
}
alias sq.delaccount {
  var %user = $sq.dir $+ FTPusers.ini,%num = 1
  if ($1 !isnum) {
    while ($readini(%user,SQ $+ %num,address) != $1) { 
      inc %num 1 
      if (%num > $ini(%user,0)) { return $false no such user } 
    }
    %num = $ini(%user,%num)
  }
  else { %num = $1 }
  $sq.reminisection(%user,SQ $+ %num)
  sockwrite -n sq.ftp site kick SQ $+ %num
  .timer 1 2 sockwrite -n sq.ftp site deluser SQ $+ %num
  return $true
}
alias sq.countaccounts {
  var %user = $sq.dir $+ FTPusers.ini
  var %temp = 1,%acc
  while (%temp <= $ini(%user,0)) {
    if ($remove($ini(%user,%temp),SQ) isnum) { inc %acc 1 }
    inc %temp 1
  }
  return %acc
}
alias sq.ftpuploaders {
  var %user = $sq.dir $+ FTPusers.ini
  var %temp = 1,%acc
  while (%temp <= $ini(%user,%temp)) {
    if ($remove($ini(%user,%temp),SQ) isnum && $readini(%user,$ini(%user,%temp),groupname) == $sq.get(ftp.uploadgroup)) { 
      if ($1) { %acc = %acc $+ ; $+ $ini(%user,%temp) }
      else { inc %acc 1 }
    }
    inc %temp 1
  }
  if (!$1) { %acc = $calc(%acc +0) }
  return %acc
}
alias sq.ftpdownloaders {
  var %user = $sq.dir $+ FTPusers.ini
  var %temp = 1,%acc
  while (%temp <= $ini(%user,0)) {
    if ($remove($ini(%user,%temp),SQ) isnum && $readini(%user,$ini(%user,%temp),groupname) != $sq.get(ftp.uploadgroup)) { 
      if ($1) { %acc = %acc $+ ; $+ $ini(%user,%temp) }
      else { inc %acc 1 }
    }
    inc %temp 1
  }
  if (!$1) { %acc = $calc(%acc +0) }
  return %acc
}
alias sq.ftpaccounts {
  var %count = 1,%user = $sq.dir $+ FTPUsers.ini,%acc
  while (%count <= $ini(%user,0)) {
    %acc = $addtok(%acc,$ini(%user,%count),59)
    inc %count 1
  }
  return %acc
}
alias sq.ftpgroups { return IRCdownload;IRCupload }


#raidenftpd end