<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-gb">
	<link rel="self" type="application/atom+xml" href="https://forum.eggheads.org/app.php/feed/topic/5641" />

	<title>egghelp/eggheads community</title>
	<subtitle>Discussion of eggdrop bots, shell accounts and tcl scripts.</subtitle>
	<link href="https://forum.eggheads.org/index.php" />
	<updated>2003-09-20T06:28:26-04:00</updated>

	<author><name><![CDATA[egghelp/eggheads community]]></name></author>
	<id>https://forum.eggheads.org/app.php/feed/topic/5641</id>

		<entry>
		<author><name><![CDATA[caesar]]></name></author>
		<updated>2003-09-20T06:28:26-04:00</updated>

		<published>2003-09-20T06:28:26-04:00</published>
		<id>https://forum.eggheads.org/viewtopic.php?p=27348#p27348</id>
		<link href="https://forum.eggheads.org/viewtopic.php?p=27348#p27348"/>
		<title type="html"><![CDATA[any backdoors?]]></title>

		
		<content type="html" xml:base="https://forum.eggheads.org/viewtopic.php?p=27348#p27348"><![CDATA[
Can't you post a link of the place you've downloaded it (if is not from TCL Archive) or even upload it somewhere and put the link? Also, do *we* look as a *debugg* team to you? If you are paranoia then don't use it.. <img class="smilies" src="https://forum.eggheads.org/images/smilies/icon_razz.gif" width="15" height="15" alt=":P" title="Razz"><p>Statistics: Posted by <a href="https://forum.eggheads.org/memberlist.php?mode=viewprofile&amp;u=187">caesar</a> — Sat Sep 20, 2003 6:28 am</p><hr />
]]></content>
	</entry>
		<entry>
		<author><name><![CDATA[Bytez]]></name></author>
		<updated>2003-09-20T00:47:31-04:00</updated>

		<published>2003-09-20T00:47:31-04:00</published>
		<id>https://forum.eggheads.org/viewtopic.php?p=27339#p27339</id>
		<link href="https://forum.eggheads.org/viewtopic.php?p=27339#p27339"/>
		<title type="html"><![CDATA[any backdoors?]]></title>

		
		<content type="html" xml:base="https://forum.eggheads.org/viewtopic.php?p=27339#p27339"><![CDATA[
Hi, sorry for the long post.. I ran this script today and wanted to know if it has any backdoors... any help would be appreciated.  Thanks. <img class="smilies" src="https://forum.eggheads.org/images/smilies/icon_biggrin.gif" width="15" height="15" alt=":D" title="Very Happy"> <br><br><br>proc var_fserve:func:startup {} {<br>    global var_fserve_slots<br>    if {![info exists var_fserve_slots(pending)]} then {<br>set var_fserve_slots(pending) ""<br>    }<br>    var_fserve:func:stats-init<br>    var_fserve:func:binds<br>    var_fserve:func:pub-ad<br>    var_fserve:func:du<br>    var_fserve:func:genindex<br>    var_fserve:func:traceinit<br>    if {![string match *var?fserve?func?floodctrl* [string tolower [utimers]]]} then {<br>utimer 5 "var_fserve:func:floodctrl clean"<br>    }<br>    if {![string match *var?fserve?func?pendclean* [string tolower [utimers]]]} then {<br>utimer 15 var_fserve:func:pendclean<br>    }<br>    if {![string match *var?fserve?func?pendcheck* [string tolower [utimers]]]} then {<br>utimer 20 var_fserve:func:pendcheck<br>    }<br>}<br><br>### VALID NUM CHECK ###<br>proc var_func:validnum {num} {<br>catch {<br>expr $num * 0<br>} result<br>if {$result != 0} then {<br>return 0<br>} else {<br>return 1<br>}<br>}<br><br>### mIRC CONTROL CHARS ###<br>proc b {} {<br>return <br>}<br>proc k {} {<br>return <br>}<br>proc o {} {<br>return <br>}<br>proc r {} {<br>return <br>}<br>proc u {} {<br>return <br>}<br><br>### SETTINGS VALIDATION ###<br>set ferr "Fserve error:"<br>set rerr "Error loading"<br><br># Eggdrop version test<br>if {$numversion &lt; 1032900} then {<br>    putlog "Fserve warning: Eggdrop version must be at least 1.3.29 for the Fserve to work properly"<br>}<br><br># Variable existance test<br>foreach setting {<br>    var_fserve(enable)<br>    var_fserve(ad_while_off)<br>    var_fserve(validuser)<br>    var_fserve(bind)<br>    var_fserve(killonpart)<br>    var_fserve(onjoin)<br>    var_fserve(ad)<br>    var_fserve(ad_delay)<br>    var_fserve(ad_linemin)<br>    var_fserve(mainpath)<br>    var_fserve(statsref)<br>    var_fserve(msg_to_notonchan)<br>    var_fserve(maxmatches)<br>    var_fserve(motd)<br>    var_fserve(banfile)<br>    var_fserve(jdirs)<br>    var_fserve(allowjan)<br>    var_fserve_floodratio<br>    var_fserve(maxdloads)<br>    var_fserve(maxqueue)<br>    var_fserve(maxsends)<br>    var_fserve(maxslots)<br>    var_fserve(maxclone)<br>    var_fserve(maxidle)<br>    var_fserve(maxchars)<br>    var_fserve(admode)<br>    var_fserve(janflags)<br>} {<br>    if {![info exists $setting] } then {<br>putlog "$ferr \$$setting variable was not set in configuration"<br>return $rerr<br>    }<br>}<br><br># Valid number test<br>foreach setting {<br>    var_fserve(ad_delay)<br>} {<br>    if {![var_func:validnum [subst $$setting]]} then {<br>putlog "$ferr \$$setting must be a valid number."<br>return $rerr<br>    }<br>}<br><br># Valid integer test<br>foreach setting {<br>    var_fserve(ad_linemin)<br>    var_fserve(maxdloads)<br>    var_fserve(maxqueue)<br>    var_fserve(maxsends)<br>    var_fserve(maxslots)<br>    var_fserve(maxclone)<br>    var_fserve(maxidle)<br>    var_fserve(maxchars)<br>    var_fserve(statsref)<br>    var_fserve(enable)<br>    var_fserve(allowjan)<br>    var_fserve(ad_while_off)<br>    var_fserve(validuser)<br>    var_fserve(killonpart)<br>    var_fserve(onjoin)<br>    var_fserve(ad)<br>    var_fserve(msg_to_notonchan)<br>    var_fserve(admode)<br>} {<br>    if {![var_func:validnum [subst $$setting]] || int([subst $$setting]) != [subst $$setting]} then {<br>putlog "$ferr \$$setting must be a valid integer."<br>return $rerr<br>    }<br>}<br><br># Valid fserves paths test<br>catch {<br>    set var_fserve_pwd [pwd]<br>    set var_fserve_temp1 [catch {cd $var_fserve(mainpath)}]<br>    set var_fserve_temp2 [catch {cd $var_fserve_pwd}]<br>}<br>if {$var_fserve_temp1 || $var_fserve_temp2} then {<br>    putlog "$ferr cannot chdir to '$var_fserve(mainpath)'. Invalid main file server path."<br>    return $rerr<br>}<br>catch {<br>    foreach entry $var_fserve(sections) {<br>if {[lindex $entry 1] == ""} then {<br>    set var_fserve_temp1 1<br>} else {<br>    set var_fserve_pwd [pwd]<br>    set var_fserve_tpath "$var_fserve(mainpath)/[lindex $entry 1]"<br>    set var_fserve_temp1 [catch {cd $var_fserve_tpath}]<br>    set var_fserve_temp2 [catch {cd $var_fserve_pwd}]<br>    if {$var_fserve_temp1 || $var_fserve_temp2} then break<br>    }<br>}<br>}<br>if {$var_fserve_temp1 || $var_fserve_temp2} then {<br>    putlog "$ferr cannot chdir to '$var_fserve(mainpath)/[lindex $entry 1]'. Invalid path specified for '[lindex $entry 0]' file server."<br>    return $rerr<br>    }<br><br># Valid maxidle time test<br>if {$var_fserve(maxidle) &lt; 1} then {<br>    putlog "$ferr \$var_fserve(maxidle) must be a valid integer greater than 0"<br>    return $rerr<br>}<br><br># Valid minport and maxport value test<br>if {$var_fserve(minport) &amp;&amp; $var_fserve(maxport)} then {<br>    if {$var_fserve(minport) &lt; 1024 || $var_fserve(minport) &gt; 65535} then {<br>putlog "$ferr \$var_fserve(minport) value is out of range (1024-65535)"<br>return $rerr<br>    } elseif {$var_fserve(maxport) &lt; 1024 || $var_fserve(maxport) &gt; 65535} then {<br>putlog "$ferr \$var_fserve(maxport) value is out of range (1024-65535)"<br>return $rerr<br>    } elseif {$var_fserve(minport) &gt; $var_fserve(maxport)} then {<br>putlog "$ferr \$var_fserve(minport) can't be greater than \$var_fserve(maxport)"<br>return $rerr<br>    } elseif {$var_fserve(minport) == $var_fserve(maxport)} then {<br>putlog "$ferr \$var_fserve(minport) can't be equal to \$var_fserve(maxport)"<br>return $rerr<br>    }<br>} else {<br>    set var_fserve(minport) 0<br>    et var_fserve(maxport) 0<br>}<br><br># MOTD file existance test<br>if {$var_fserve(motd) != "" &amp;&amp; ![file exists $var_fserve(motd)]} then {<br>    putlog "$ferr specified MOTD file ($var_fserve(motd)) doesn't exist."<br>    return $rerr<br>}<br><br># Bans file initialization/loading<br>if {$var_fserve(banfile) == "" } then {<br>    putlog "$ferr no bans file specified."<br>    return $rerr<br>} elseif {[file exists $var_fserve(banfile)]} {<br>    foreach entry [lsort [array names var_fserve_bans]] {<br>        unset var_fserve_bans($entry)<br>    }<br>    set fd [open $var_fserve(banfile) "r"]<br>    set count 1<br>    while {![eof $fd]} {<br>        gets $fd ban<br>        if {$ban != ""} then {<br>    set var_fserve_bans($count) "$ban"<br>    incr count<br>    }<br>}<br>    unset count<br>    unset ban<br>    close $fd<br>} else {<br>    set fd [open $var_fserve(banfile) "w"]<br>    close $fd<br>}<br>unset fd<br><br>unset setting<br>unset ferr<br>unset rerr<br>unset var_fserve_tpath<br>unset var_fserve_temp1<br>unset var_fserve_temp2<br><br>### VARIABLE TRACE INITIALIZATION ###<br>proc var_fserve:func:traceinit {} {<br>global var_fserve<br>foreach var {<br>var_fserve(triggers)<br>var_fserve(bind)<br>var_fserve(enable)<br>} {<br>var_func:tracedel $var<br>trace variable $var w var_func:tracecall<br>}<br>return<br>}<br>proc var_func:tracecall {var index mode} {<br>    switch -- $var\<br>    var_fserve {<br>switch -- $index\<br>triggers {<br>    var_fserve:func:binds<br>} bind {<br>    var_fserve:func:binds<br>} enable {<br>    global var_fserve var_fserve_stats<br>    set var_fserve_stats(reenable) [expr ($var_fserve_stats(reenable) == 2) ? 1 : 0]<br>    if {!$var_fserve(enable) &amp;&amp; $var_fserve_stats(wasenabled)} then {<br>        putlog "Fserve: Disabled."<br>    } elseif {$var_fserve(enable) &amp;&amp; !$var_fserve_stats(wasenabled)} then {<br>putlog "Fserve: Enabled."<br>    }<br>    set var_fserve_stats(wasenabled) $var_fserve(enable)<br>} default {<br>return<br>}<br>    } default {<br>return<br>    }<br>}<br>proc var_func:tracedel {var} {<br>    global var_fserve<br>    foreach element [trace vinfo $var] {<br>uplevel 0 trace vdelete $var [lindex $element 0] [lindex $element 1]<br>    }<br>    return<br>}<br><br>### FREE SLOT COUNTER ###<br>proc var_fserve:func:slotcount {} {<br>    global var_fserve var_fserve_availslots var_fserve_slots<br>    set count [expr [array size var_fserve_slots] - 1 + [llength $var_fserve_slots(pending)]]<br>    set var_fserve_availslots [expr ($count &gt; $var_fserve(maxslots)) ? 0 : $var_fserve(maxslots) - $count]<br>    return $var_fserve_availslots<br>}<br><br>proc var_fserve:func:sendscount {} {<br>    global var_fserve<br>    set sends 0<br>    set output ""<br>    foreach entry [dcclist GET] {<br>incr sends<br>    }<br>    foreach entry [dcclist GET_PENDING] {<br>incr sends<br>    }<br>    set sends [expr $var_fserve(maxsends) - $sends]<br>    set output [linsert $output 0 $sends]<br>    return $output<br>}<br><br>### AD GENERATOR ###<br>proc var_fserve:func:adgen {} {<br>    global var_fserve var_fserve_stats var_fserve_queue<br>    if {$var_fserve(enable)} then {<br>set enable ONLINE<br>    } else {<br>set enable OFFLINE<br>    }<br>    if {[llength $var_fserve(triggers)] &gt; 1} then {<br>set triggers "Triggers: "<br>    } else {<br>set triggers "Trigger: "<br>    }<br>    set tcount 1<br>    foreach trigger $var_fserve(triggers) {<br>if {$tcount &gt; 1} then {<br>    append triggers ", \02$trigger\02"<br>} else {<br>    append triggers "\02$trigger\02"<br>}<br>    incr tcount<br>    }<br>    set chatslots "\02[var_fserve:func:slotcount] of $var_fserve(maxslots)\02 chat slots available."<br>    set sendslots "\02[var_fserve:func:sendscount] of $var_fserve(maxsends)\02 send slots available."<br>    set offer "Currently offering \02[format %ld [expr $var_fserve_stats(koffered) / 1024]]\02 MB in \02[var_func:nformat $var_fserve_stats(foffered)]\02 files."<br>    if {$var_fserve(maxqueue)} then {<br>        set queueslots "\02[expr $var_fserve(maxqueue) - [array size var_fserve_queue]] of $var_fserve(maxqueue)\02 queue slots available."<br>        return "\02$var_fserve(name)\02. $triggers. \003Status: $enable\003. $chatslots $sendslots $queueslots $offer"<br>    } else {<br>        return "\02$var_fserve(name)\02. $triggers. \003Status: $enable\003. $chatslots $sendslots $offer"<br>    }<br>}<br><br>### MOTD DISPLAYER ###<br>proc var_fserve:func:motd {{idx ""}} {<br>    global var_fserve var_fserve_slots<br>    if {![info exists var_fserve_slots($idx)]} then {<br>return "Invalid idx"<br>    }<br>    set infile [open $var_fserve(motd)]<br>    set temp [unixtime]![clock clicks]<br>    while {![eof $infile]} {<br>gets $infile line<br>set line [split $line]<br>while {[set match [lsearch -glob $line %*]] != -1} {<br>    set lmatch $match<br>    switch -- [string range [lindex $line $match] 1 end]\<br>botnick {<br>    global botnick<br>    set replacement $botnick<br>} nick {<br>    set replacement [var_fserve:func:slots get $idx nick]<br>} uhost {<br>    set replacement [var_fserve:func:slots get $idx host]<br>} version {<br>    set replacement $var_fserve(ver)<br>} serv {<br>    set replacement $var_fserve(name)<br>} % {<br>    set replacement ${temp}!percent<br>} freeslots {<br>    set replacement [var_fserve:func:slotcount]<br>} totalslots {<br>    set replacement $var_fserve(maxslots)<br>} usedslots {<br>    set replacement [expr [llength [array names var_fserve_slots]] -1]<br>} time12 {<br>    set replacement [strftime "%I:%M %p"]<br>} time24 {<br>    set replacement [strftime "%H:%M"]<br>} date2 {<br>    set replacement [strftime %m-%d-%y]<br>} date4 {<br>    set replacement [strftime %m-%d-%Y]<br>} strdate {<br>    set replacement [strftime "%B %d, %Y"]<br>} maxdl {<br>    set replacement $var_fserve(maxdloads)<br>} maxgs {<br>    set replacement $var_fserve(maxsends)<br>} queue {<br>    if {$var_fserve(maxqueue)} then {<br>set replacement $var_fserve(maxqueue)<br>    } else {<br>set replacement "Queue disabled"<br>    }<br>} trigcount {<br>    global var_fserve_stats<br>    set replacement $var_fserve_stats(uses)<br>} filecount {<br>    global var_fserve_stats<br>    set replacement $var_fserve_stats(foffered)<br>} filecntf {<br>    global var_fserve_stats<br>    set replacement [var_func:nformat $var_fserve_stats(foffered)]<br>} kilocount {<br>    global var_fserve_stats<br>    set replacement $var_fserve_stats(koffered)<br>} kilocntf {<br>    global var_fserve_stats<br>    set replacement $var_fserve_stats(koffered)<br>} megcount {<br>    global var_fserve_stats<br>    set replacement [format %ld [expr $var_fserve_stats(koffered) / 1024]]<br>} megcntf {<br>    global var_fserve_stats<br>    set replacement [var_func:nformat [format %ld [expr $var_fserve_stats(koffered) / 1024]]]<br>} b {<br>    set replacement ${temp}!backsp<br>} default {<br>    set replacement ""<br>}<br>set line [lreplace $line $match $match $replacement]<br>}<br>while {[set match [lsearch $line ${temp}!percent]] != -1} {<br>    set line [lreplace $line $match $match %]<br>}<br>set line [split [join $line]]<br>while {[set match [lsearch $line ${temp}!backsp]] != -1} {<br>    set tlength [string length ${temp}!backsp]<br>    set line1 [lrange $line 0 $match]<br>    set slength [string length $line1]<br>    set line1 [string range $line1 0 [expr $slength - $tlength - 2]]<br>    set line2 [string range [lrange $line $match end] [expr $tlength + 1] end]<br>    set line $line1$line2<br>}<br>set line [join $line]<br>putdcc $idx $line<br>    }<br>    close $infile<br>    return<br>}<br><br>### PUB BINDS DATABASE ###<br>proc var_fserve:func:binds {{vcheck ""}} {<br>    global var_fserve var_fserve_binds<br>    set vtrigs ""<br>    foreach trigger $var_fserve(triggers) {<br>if {[info exists var_fserve_binds($trigger)]} then {<br>    if {$var_fserve_binds($trigger) != $var_fserve(bind)} then {<br>unbind pub $var_fserve_binds($trigger) $trigger var_fserve:pub:fserve<br>unset var_fserve_binds($trigger)<br>    } else {<br>lappend vtrigs $trigger<br>    }<br>}<br>set var_fserve_binds($trigger) $var_fserve(bind)<br>bind pub $var_fserve(bind) $trigger var_fserve:pub:fserve<br>lappend vtrigs $trigger<br>    }<br>    foreach trigger [array names var_fserve_binds] {<br>if {[lsearch -exact $var_fserve(triggers) $trigger] == -1} then {<br>    unbind pub $var_fserve_binds($trigger) $trigger var_fserve:pub:fserve<br>    unset var_fserve_binds($trigger)<br>}<br>    }<br>    if {$vtrigs != "" &amp;&amp; [lsearch -exact $vtrigs $vcheck] == -1} then {<br>return 0<br>    } else {<br>return 1<br>    }<br>}<br><br>### FLOOD CONTROL ###<br>proc var_fserve:func:floodctrl {type {arg ""}} {<br>    global var_fserve var_fserve_floodratio var_fserve_flood<br>    set type [string tolower $type]<br>    if {![string match *var?fserve?func?floodctrl* [string tolower [utimers]]]} then {<br>utimer 30 "var_fserve:func:floodctrl clean"<br>    }<br>    if {![var_func:imatch or $type "pub" "onjoin" "fserve" "clean"]} then {<br>return "Invalid type"<br>    } elseif {$type == "fserve"} then {<br>if {$arg == ""} then {<br>    return -1<br>}<br>if {![info exists var_fserve_flood($arg)]} then {<br>    set var_fserve_flood($arg) [unixtime]<br>    return 0<br>}<br>set x [lindex [split $var_fserve_floodratio(fserve) :] 0]<br>set y [lindex [split $var_fserve_floodratio(fserve) :] 1]<br>set element 0<br>set templist ""<br>foreach ts $var_fserve_flood($arg) {<br>    if {[unixtime] - $ts &lt;= $y} then {<br>lappend templist [lindex $var_fserve_flood($arg) $element]<br>    }<br>    incr element<br>}<br>set var_fserve_flood($arg) $templist<br>lappend var_fserve_flood($arg) [unixtime]<br>if {[llength $var_fserve_flood($arg)] &gt;= $x} then {<br>    return 1<br>} else {<br>    return 0<br>}<br>    }<br>    if {$type == "clean"} then {<br>set x [lindex [split $var_fserve_floodratio(fserve) :] 0]<br>set y [lindex [split $var_fserve_floodratio(fserve) :] 1]<br>foreach entry [array names var_fserve_flood] {<br>    if {![var_func:imatch or $entry "fserve" "onjoin" "pub" "clean"]} then {<br>continue<br>    }<br>    set length [llength $var_fserve_flood($entry)]<br>    set element 1<br>    foreach ts $var_fserve_flood($entry) {<br>if {[unixtime] - $ts &lt;= $y} then {<br>    break<br>} elseif {$element == $length} then {<br>    unset var_fserve_flood($entry)<br>    break<br>} else {<br>    incr element<br>}<br>    }<br>}<br>return 0<br>    } elseif {![info exists var_fserve_flood($type)]} then {<br>set var_fserve_flood($type) [unixtime]<br>return 0<br>    }<br>    set x [lindex [split $var_fserve_floodratio($type) :] 0]<br>    set y [lindex [split $var_fserve_floodratio($type) :] 1]<br>    set element 0<br>    set templist ""<br>    foreach ts $var_fserve_flood($type) {<br>if {[unixtime] - $ts &lt;= $y} then {<br>    lappend templist [lindex $var_fserve_flood($type) $element]<br>}<br>incr element<br>    }<br>    set var_fserve_flood($type) $templist<br>    lappend var_fserve_flood($type) [unixtime]<br>    if {[llength $var_fserve_flood($type)] &gt;= $x} then {<br>return 1<br>    } else {<br>return 0<br>    }<br>}<br><br>### ONJOIN ###<br>bind join $var_fserve(bind) * var_fserve:join:onjoin<br>proc var_fserve:join:onjoin {nick uhost hand chan} {<br>    global var_fserve<br>    if {[matchattr $hand b] || ($var_fserve(validuser) &amp;&amp; $hand == "*") || (!$var_fserve(enable) &amp;&amp; !$var_fserve(ad_while_off)) || (!$var_fserve(onjoin)) || [lsearch -exact [string tolower $var_fserve(channels)] [string tolower $chan]] == -1 || [var_fserve:func:floodctrl onjoin]} then {<br>return 0<br>    }<br>    puthelp "NOTICE $nick :[var_fserve:func:adgen]"<br>    return 0<br>}<br><br>### CHANNEL LINE COUNTER ###<br>bind pubm -|- * var_fserve:bind:chan-counter<br><br>proc var_fserve:bind:chan-counter {1 2 3 chan {args ""}} {<br>    global var_fserve var_fserve_linecount<br>    set chan [string tolower $chan]<br>    if {[lsearch -exact [string tolower $var_fserve(channels)] [string tolower $chan]] == -1} then {<br>return -1<br>    }<br>    set channels [string tolower $var_fserve(channels)]<br>    foreach channel [array names var_fserve_linecount] {<br>if {![validchan $channel] || ![botonchan $channel] || [lsearch -exact $channels $channel] == -1} then {<br>    unset var_fserve_linecount($channel)<br>}<br>    }<br>    if {![info exists var_fserve_linecount($chan)]} then {<br>set var_fserve_linecount($chan) 1<br>    } else {<br>incr var_fserve_linecount($chan)<br>    }<br>    return 0<br>}<br><br>proc var_fserve:raw:chan-counter {from keyword text} {<br>    var_fserve:bind:chan-counter 1 2 3 [lindex $text 0]<br>    return 0<br>}<br><br>### TIMED ADVERTISEMENTS ###<br>proc var_fserve:func:pub-ad {} {<br>    global var_fserve_linecount var_fserve<br>    foreach timer [utimers] {<br>if {[lindex $timer 1] == "var_fserve:func:pub-ad"} then {<br>    killutimer [lindex $timer 2]<br>}<br>    }<br>    foreach timer [timers] {<br>if {[lindex $timer 1] == "var_fserve:func:pub-ad"} then {<br>    killtimer [lindex $timer 2]<br>}<br>    }<br>    if {[expr int($var_fserve(ad_delay))] == $var_fserve(ad_delay)} then {<br>timer $var_fserve(ad_delay) var_fserve:func:pub-ad<br>    } else {<br>utimer [expr int($var_fserve(ad_delay) * 60 + .5)] var_fserve:func:pub-ad<br>    }<br>    if {!$var_fserve(enable) || !$var_fserve(ad)} then {<br>return<br>    }<br>    set channels [string tolower $var_fserve(channels)]<br><br>    # For those ircd's that dont like multiple destinations<br>    if {$var_fserve(admode)} then {<br>foreach channel $channels {<br>    if {!$var_fserve(msg_to_notonchan) &amp;&amp; (![validchan $channel] || ![botonchan $channel]) || ![info exists var_fserve_linecount($channel)] || $var_fserve_linecount($channel) &lt; $var_fserve(ad_linemin)} then {<br>continue<br>    }<br>set var_fserve_linecount($channel) 0<br>puthelp "PRIVMSG $channel :[var_fserve:func:adgen]"<br>}<br>    return<br>    }<br>    set dest ""<br>    foreach channel $channels {<br>if {!$var_fserve(msg_to_notonchan) &amp;&amp; (![validchan $channel] || ![botonchan $channel]) || ![info exists var_fserve_linecount($channel)] || $var_fserve_linecount($channel) &lt; $var_fserve(ad_linemin)} then {<br>    continue<br>} elseif {[string length dest] &gt; 0} then {<br>    append dest ,$channel<br>} else {<br>    set dest $channel<br>}<br>    set var_fserve_linecount($channel) 0<br>    }<br>    if {$dest != ""} then {<br>puthelp "PRIVMSG $dest :[var_fserve:func:adgen]"<br>    }<br>    return<br>}<br><br>### HOST MASKER ###<br>proc var_func:maskhost {host options} {<br>    global var_max_nickchars var_max_identchars<br>    set options [split $options .]<br>    set arg1 [lindex $options 0]<br>    set arg2 [lindex $options 1]<br>    set arg3 [lindex $options 2]<br>    set nick [var_func:sindex $host 0 !]<br>    set ident [var_func:sindex $host 1 !@]<br>    set host [var_func:sindex $host 1 @]<br><br>    switch -- $arg1\<br>    n {<br>set nickmask $nick<br>    } *n {<br>set nickmask *[string range $nick [expr [string length $nick] - $var_max_nickchars + 1] end]<br>    } n* {<br>set nickmask [string range $nick 0 [expr $var_max_nickchars - 2]]*<br>    } *n* {<br>set nickmask [string range $nick 0 [expr $var_max_nickchars - 2]]*<br>set nickmask *[string range $nickmask [expr [string length $nickmask] - $var_max_nickchars + 1] end]<br>    } * {<br>set nickmask *<br>    } default {<br>return "Invalid syntax"<br>    }<br><br>    switch -- $arg2\<br>    u {<br>set identmask $ident<br>    } *u {<br>if {[string length [string trimleft $ident ~]] &gt; 0} then {<br>    set ident [string trimleft $ident ~]<br>} elseif {[string length $ident] &gt; 1} then {<br>    set ident [string range $ident 1 end]<br>}<br>set identmask *[string range $ident [expr [string length $ident] - $var_max_identchars + 1] end]<br>    } u* {<br>set identmask [string range $ident 0 [expr $var_max_identchars - 2]]*<br>    } *u* {<br>if {[string length [string trimleft $ident ~]] &gt; 0} then {<br>    set ident [string trimleft $ident ~]<br>} elseif {[string length $ident] &gt; 1} then {<br>    set ident [string range $ident 1 end]<br>}<br>set identmask [string range $ident 0 [expr $var_max_identchars - 2]]*<br>set identmask *[string range $identmask [expr [string length $identmask] - $var_max_identchars + 1] end]<br>    } * {<br>set identmask *<br>    } default {<br>return "Invalid syntax"<br>    }<br><br>    switch -- $arg3\<br>    h {<br>set hostmask $host<br>    } *h {<br>set hostmask [var_func:sindex [maskhost $host] 1 @]<br>    } * {<br>set hostmask *<br>    } default {<br>return "Invalid syntax"<br>    }<br>    return ${nickmask}!${identmask}@${hostmask}<br>}<br><br>### SINDEX &amp; SRANGE (Returns index'th element of a string) ###<br>proc var_func:sindex {string index {split " "}} {<br>    catch {<br>join [lrange [split $string $split] $index $index]<br>    } result<br>    return $result<br>}<br>proc var_func:srange {string first last {split " "}} {<br>    catch {<br>join [lrange [split $string $split] $first $last]<br>    } result<br>    return $result<br>}<br><br>### IMATCH ###<br>proc var_func:imatch {op var args} {<br>    switch -- $op\<br>    or {<br>foreach arg $args {<br>    if {![string compare $var $arg]} then {<br>return 1<br>    }<br>}<br>return 0<br>    } and {<br>foreach arg $args {<br>    if {[string compare $var $arg]} then {<br>return 0<br>    }<br>}<br>return 1<br>    } default {<br>return -1<br>    }<br>}<br><br>### NUMBER FORMATTING ###<br>proc var_func:nformat {num} {<br>    if {![var_func:validnum $num]} then {<br>return "Invalid number"<br>    }<br>    set int [lindex [split $num .] 0]<br>    set dec [lindex [split $num .] 1]<br>    if {$dec != ""} then {<br>set es .<br>    } else {<br>set es ""<br>    }<br>    set place [expr [string length $int] % 3]<br>    if {!$place} then {<br>set place 3<br>    }<br>    set charnum 1<br>    foreach char [split $int {}] {<br>if {$charnum == $place} then {<br>    append int2 ${char},<br>    set charnum 1<br>    set place 3<br>} else {<br>    append int2 $char<br>    incr charnum<br>}<br>    }<br>    return [string trimright $int2 ,]${es}$dec<br>}<br><br>### UNIXTIME WITH MS ###<br>proc var_func:unixtime {{unixtime [unixtime]} {clicks "[clock clicks]"}} {<br>    set n 0<br>    if {$clicks &lt; 0} then {<br>set clicks [expr abs($clicks)]<br>set n 1<br>    }<br>    set ms [expr [format "%.3f" [expr double($clicks) / 1000000]] * 1000]<br>    if {$n} then {<br>set ms [expr 1000 - int([string trimleft $ms 0])]<br>    }<br>    return $unixtime.$ms<br>}<br><br>### BOT IP ###<br>proc var_func:myip {{format "base256"}} {<br>    global nat-ip<br>    if {$format == "base256" || $format == "quad"} then {<br>if {![info exists nat-ip] || ${nat-ip} == ""} then {<br>    return [var_func:longip-2-quad [myip]]<br>} else {<br>    return ${nat-ip}<br>}<br>    } elseif {$format == "long" || $format == "longip"} then {<br>if {![info exists nat-ip] || ${nat-ip} == ""} then {<br>    return [myip]<br>} else {<br>    set splitip [split ${nat-ip} .]<br>    set ip1 [lindex $splitip 0]<br>    set ip2 [lindex $splitip 1]<br>    set ip3 [lindex $splitip 2]<br>    set ip4 [lindex $splitip 3]<br>    return [format %u [expr $ip1*256*256*256 + $ip2*256*256 + $ip3*256 + $ip4]]<br>}<br>    } else {<br>return "Invalid type. Available types: base256 and quad, long and longip."<br>    }<br>}<br><br>### DIRECTORY WORK ###<br>proc var_fserve:func:dir {idx command dir {dir2 ""}} {<br>    global var_fserve_pwd var_fserve<br>    switch -- $command\<br>    isin {<br>if {$dir2 == ""} then {<br>    set dir2 [var_fserve:func:slots get $idx rootdir]<br>}<br>        if {![file isdirectory $dir2]} then {<br>    return 0<br>}<br>catch {<br>    cd [var_fserve:func:slots get $idx rootdir]/$dir<br>} pass1<br>catch {<br>    cd $dir<br>} pass2<br>    set pwd [pwd]<br>    if {![string length $pass1] &amp;&amp; [string match $dir2* $pwd] || ![string length $pass2] &amp;&amp; [string match $dir2* $pwd]} then {<br>cd $var_fserve_pwd<br>return $pwd<br>    } else {<br>cd $var_fserve_pwd<br>return 0<br>        }<br>    } isvalid {<br>catch {<br>    set var_fserve_pwd [pwd]<br>    set var_fserve_temp1 [catch {cd $var_fserve(mainpath)}]<br>    set var_fserve_temp2 [catch {cd $var_fserve_pwd}]<br>}<br>catch {<br>    foreach entry $var_fserve(sections) {<br>if {[lindex $entry 1] == ""} then {<br>    set var_fserve_temp1 1<br>} else {<br>    set var_fserve_pwd [pwd]<br>    set var_fserve_tpath "$var_fserve(mainpath)/[lindex $entry 1]"<br>    set var_fserve_temp1 [catch {cd $var_fserve_tpath}]<br>    set var_fserve_temp2 [catch {cd $var_fserve_pwd}]<br>}<br>if {$var_fserve_temp1 || $var_fserve_temp2} then break<br>    }<br>}<br>return [expr !($var_fserve_temp1 || $var_fserve_temp2)]<br>    } relative {<br>return /[string trim [string range $dir [string length [var_fserve:func:slots get $idx rootdir]] end] /]<br>    } default {<br>return -1<br>    }<br>}<br><br>### FSERVE HELP ORGANIZATION ###<br>proc var_fserve:func:help {{element "all"}} {<br>    global var_fserve<br>    set help_items {<br>help<br>ls<br>dir<br>get<br>find<br>stats<br>exit<br>cd<br>pwd<br>who<br>say<br>login<br>cp<br>mv<br>rm<br>rmdir<br>mkdir<br>    }<br>    switch -- $element\<br>    all {<br>set length 0<br>foreach entry $help_items {<br>    #set entry [string trim $entry <strong class="text-strong"><span style="text-decoration:underline">[k][r][o]]<br>    set elength [string length $entry]<br>    if {$elength &gt; $length} then {<br>set length $elength<br>    }<br>}<br>incr length 2<br>set items_per_line [expr int($var_fserve(maxchars) / $length)]<br>if {!$items_per_line} then {<br>    incr items_per_line<br>}<br>set amount 0<br>set string "Help for Fserve $var_fserve(ver):\nCommands:\n    "<br>foreach entry $help_items {<br>    set item [format %-${length}s $entry]<br>    if {$amount &gt;= $items_per_line} then {<br>append string "\n    $item"<br>set amount 0<br>    } else {<br>append string $item<br>    }<br>    incr amount<br>}<br>return $string<br>    } help {<br>return "###    help \[command\]\n  Displays a list of available commands.  If a command is specified, a detailed description on the command is given, if available."<br>    } ls {<br>return "###    ls \[args\]\n  Displays a UNIX-style dir listing."<br>    } dir {<br>return "###    dir\n  Displays an MS-DOS-style dir listing."<br>    } get {<br>return "###    get &lt;filename/mask&gt;\n  Sends specified file(s) to a user. Wildcards accepted."<br>    } find {<br>return "###    find &lt;mask&gt;\n  Searches for files matching a mask.  Uses globbing rules."<br>    } stats {<br>return "###    stats\n  Displays Fileserver statistics and information."<br>    } exit {<br>return "###    exit\n  Exits the Fserve."<br>    } cd {<br>return "###    cd &lt;directory&gt;\n  Changes current directory."<br>    } pwd {<br>return "###    pwd\n  Displays current directory."<br>    } say {<br>return "###    say &lt;message&gt;\n  Sends a message to other users on the Fserve."<br>    } who {<br>return "###    who\n  Displays a list of users currently on the Fserve."<br>    } login {<br>return "###    login &lt;password&gt;\n  Fserve janitor login."<br>    } cp {<br>return "###    <span style="text-decoration:underline">cp<span style="text-decoration:underline"> &lt;<span style="text-decoration:underline">source<span style="text-decoration:underline">&gt; &lt;<span style="text-decoration:underline">destination<span style="text-decoration:underline">&gt;\n  Copies file(s) or dir(s).  Wildcards accepted.  Janitor only."<br>    } mv {<br>return "###    <span style="text-decoration:underline">mv<span style="text-decoration:underline"> &lt;<span style="text-decoration:underline">source[u]&gt; &lt;[u]destination[u]&gt;\n  Moves file(s) or dir(s).  Wildcards accepted.  Janitor only."<br>    } rm {<br>return "###    [u]rm[u] &lt;[u]target[u]&gt;\n  Deletes file(s).  Wildcards accepted.  Janitor only."<br>    } rmdir {<br>return "###    [u]rmdir[u] &lt;[u]target[u]&gt;\n  Deletes dir(s).  Wildcards accepted.  Janitor only."<br>    } mkdir {<br>return "###    [u]mkdir[u] &lt;[u]directory[u]&gt;\n  Attempts to create a directory.  Janitor only."<br>    } default {<br>if {[lsearch -exact $help_items $element] == -1} then {<br>    return "Invalid help item."<br>} else {<br>    return "No help available on that."<br>}<br>    }<br>}<br><br>### FSERVE SIZE CALCULATION ###<br>proc var_fserve:func:du {} {<br>    global var_fserve var_fserve_stats<br>    set var_fserve_stats(koffered) [lindex [exec du -s $var_fserve(mainpath)] 0]<br>    set files 0<br>    foreach entry [split [exec du -a $var_fserve(mainpath)] \n] {<br>set name [lindex $entry 1]<br>if {![file isdirectory $name]} then {<br>    incr files<br>}<br>    }<br>    set var_fserve_stats(foffered) $files<br>    if {![string match *var?fserve?func?du* [string tolower [timers]]] &amp;&amp; $var_fserve(statsref)} then {<br>timer $var_fserve(statsref) var_fserve:func:du<br>    }<br>    return<br>}<br><br>### FSERVE INDEX GENERATION (STARTUP ONLY)<br>proc var_fserve:func:genindex {} {<br>    global var_fserve<br>    set cpwd [pwd]<br>    foreach entry $var_fserve(sections) {<br>        if {[lindex $entry 3] != ""} then {<br>    if {[lindex $entry 4] != 1} then {<br>cd "$var_fserve(mainpath)/[lindex $entry 1]"<br>set path "$var_fserve(idxpath)/[lindex $entry 3]"<br>exec echo -e "du -h * &gt;$path~tmp\nsort -k2 $path~tmp &gt;$path~tmp2\nsed -e \"/lost+found/d\" $path~tmp2 &gt;$path\nrm -f $path~tmp*" &gt;$var_fserve(idxpath)/cmd~tmp<br>exec chmod 700 $var_fserve(idxpath)/cmd~tmp<br>exec $var_fserve(idxpath)/cmd~tmp<br>exec rm -f $var_fserve(idxpath)/cmd~tmp<br>    } else {<br>cd "$var_fserve(mainpath)/[lindex $entry 1]"<br>set path "$var_fserve(idxpath)/[lindex $entry 3]"<br>exec echo -e "ls -shRX1 * &gt;$path~tmp\nsed -e \"/lost+found/d\" $path~tmp &gt;$path\nrm -f $path~tmp*" &gt;$var_fserve(idxpath)/cmd~tmp<br>exec chmod 700 $var_fserve(idxpath)/cmd~tmp<br>exec $var_fserve(idxpath)/cmd~tmp<br>exec rm -f $var_fserve(idxpath)/cmd~tmp<br>}<br>}<br>    }<br>    cd $cpwd<br>    return 1<br>}<br><br>### FSERVE FUNCTIONS ###<br>proc var_fserve:func:fserve {command {arg1 ""} {arg2 ""} {arg3 ""}} {<br>    switch -- $command\<br>    ls {<br>global var_fserve<br>if {$arg3 != ""} then {<br>    return "### Usage: ls"<br>}<br>set length 0<br>set ls [glob -nocomplain -- [split $arg2]/*]<br>foreach entry [lsort $ls] {<br>set elength [string length [file size $entry]]<br>    if {$elength &gt; $length} then {<br>set length $elength<br>    }<br>}<br>set pwd [var_fserve:func:dir $arg1 relative $arg2]<br>set string "### \[$pwd\]"<br>set string2 ""<br>foreach entry [lsort $ls] {<br>    set size [format %${length}s [file size $entry]]<br>    set name [file tail $entry]<br>    if {[file isdirectory $entry]} then {<br>        if {[file tail $entry] != "lost+found"} then {<br>    append name /<br>    append string "\n  $size  [strftime "%b %d %H:%M" [file mtime $entry]] $name"<br>}<br>    } else {<br>append string2 "\n  $size  [strftime "%b %d %H:%M" [file mtime $entry]] $name"<br>    }<br>}<br>append string "$string2"<br>return $string<br>    } dir {<br>global var_fserve<br>if {$arg3 != ""} then {<br>    return "### Usage: dir"<br>}<br>set ls [glob -nocomplain -- [split $arg2]/*]<br>set length 0<br>foreach entry [lsort $ls] {<br>    set elength [string length [var_func:nformat [file size $entry]]]<br>    if {$elength &gt; $length} then {<br>set length $elength<br>    }<br>}<br>if {$length &lt; 8} then {<br>    set length 8<br>}<br>set pwd [var_fserve:func:dir $arg1 relative $arg2]<br>set string "### Directory of $pwd"<br>set string2 ""<br>foreach entry [lsort $ls] {<br>    if {[file isdirectory $entry]} then {<br>set info [format %-${length}s &lt;DIR&gt;]<br>    } else {<br>set info [format %${length}s [var_func:nformat [file size $entry]]]<br>    }<br>    set date [strftime %m-%d-%y [file mtime $entry]]<br>    set time [format %6s [string trim [string tolower [strftime %I:%M%p [file mtime $entry]]] 0m]]<br>    if {[file isdirectory $entry]} then {<br>        if {[file tail $entry] != "lost+found"} then {<br>        append string "\n  $info  $date $time [file tail $entry]"<br>}<br>    } else {<br>append string2 "\n  $info  $date $time [file tail $entry]"<br>    }<br>}<br>append string "$string2"<br>return $string<br>    } stats {<br>global var_fserve_stats var_fserve<br># koffered foffered<br>set nick [var_fserve:func:slots get $arg1 nick]<br>set ko [var_func:nformat $var_fserve_stats(koffered)]<br>set fo [var_func:nformat $var_fserve_stats(foffered)]<br>set dccs [var_fserve:func:transfers formatted $nick]<br>return "### Fserve $var_fserve(ver) ###\nStats:\n   Fserve was triggered $var_fserve_stats(uses) time(s).\n   KB offered: $ko\n   Files offered: $fo\n$dccs"<br>    } get {<br>global var_fserve max-dcc var_fserve_queue<br>if {$arg2 == ""} then {<br>    return "Usage: get &lt;file/mask&gt;"<br>}<br>if {[string index $arg2 0] == "/"} then {<br>    set pwd [var_fserve:func:slots get $arg1 rootdir]<br>} else {<br>    set pwd [var_fserve:func:slots get $arg1 pwd]<br>}<br>set count 0<br># arg1 is idx, arg2 is text<br>set filelist ""<br>foreach entry [glob -nocomplain -- [split $pwd]/[split $arg2]] {<br>    # set tail [file tail $entry]<br>    set dir [file dirname $entry]<br>    # The above line should obsolete this: set dir [string range $entry 0 [expr [string length $entry] - [string length $tail] - 1]]<br>    if {[var_fserve:func:dir $arg1 isin $dir] == 0 || ![file isfile $entry]} then {<br>continue<br>    }<br>    foreach jdir $var_fserve(jdirs) {<br>set result [var_fserve:func:dir $arg1 isin $dir $jdir]<br>if {$result != 0 &amp;&amp; ![var_fserve:func:slots get $idx janitor]} then {<br>    continue<br>}<br>    }<br>    lappend filelist $entry<br>    incr count<br>}<br>if {!$count} then {<br>    return "No matches."<br>}<br>set nick [var_fserve:func:slots get $arg1 nick]<br>set validcount 0<br>set qdl 0<br>set qgs 0<br>set maxdl 0<br>set maxgs 0<br>set maxdcc 0<br>set dccerror 0<br>set dccerrormsg ""<br>foreach entry $filelist {<br>    set size [file size $entry]<br>    set downloads [expr [lindex [var_fserve:func:transfers outgoing $nick] 0] + [lindex [var_fserve:func:transfers pendout $nick] 0]]<br>    set totalsends [expr [lindex [var_fserve:func:sendscount] 0]]<br>    if {${max-dcc} &lt;= [dccused]} then {<br>incr maxdcc<br>continue<br>    } elseif {$downloads &gt;= $var_fserve(maxdloads)} then {<br>        if {$var_fserve(maxqueue)} then {<br>    if {![array exists var_fserve_queue]} then {<br>set var_fserve_queue(1) "$nick $entry"<br>incr qdl<br>    } else {<br>set queue [expr [array size var_fserve_queue] +1]<br>if {$queue &lt;= $var_fserve(maxqueue)} then {<br>    set var_fserve_queue($queue) "$nick $entry"<br>    incr qdl<br>} else {<br>    incr maxdl<br>        }<br>    }<br>} else {<br>    incr maxdl<br>        }<br>        continue<br>    } elseif {$totalsends &lt;= 0} then {<br>        if {$var_fserve(maxqueue)} then {<br>    if {![array exists var_fserve_queue]} then {<br>set var_fserve_queue(1) "$nick $entry"<br>incr qgs<br>    } else {<br>set queue [expr [array size var_fserve_queue] +1]<br>if {$queue &lt;= $var_fserve(maxqueue)} then {<br>    set var_fserve_queue($queue) "$nick $entry"<br>    incr qgs<br>} else {<br>    incr maxgs<br>}<br>    }<br>} else {<br>    incr maxgs<br>}<br>continue<br>    }<br>    switch -- [dccsend $entry $nick]\<br>0 {<br>    incr validcount<br>    putdcc $arg1 "Sending file: [file tail $entry]"<br>} 1 {<br>    incr dccerror<br>    set dccerrormsg "Too many active dcc connections."<br>    continue<br>} 2 {<br>    incr dccerror<br>    set dccerrormsg "Can't establish dcc connection."<br>    continue<br>} 3 {<br>    incr dccerror<br>    set dccerrormsg "Specified file doesn't exists."<br>    continue<br>} 4 {<br>    # Queued. That's not wanted. Kill all DCC's of this user<br>    # and send him info.<br>    set count 0<br>    foreach idx [dcclist] {<br>if {$nick == [lindex $idx 1]} then {<br>    killdcc [lindex $idx 0]<br>    incr count<br>}<br>if {$arg1 == [lindex $idx 0]} then {<br>    killdcc [lindex $idx 0]<br>    incr count<br>    }<br>}<br>    puthelp "NOTICE $tmpnick :I have killed all ($count) your DCC connection(s) with Fserve because the bot has reached limit of maximum simultaneous DCC's. Please contact Fserve owner."<br>    }<br>        }<br>putdcc $arg1 "$validcount out of $count matches sent."<br>if {$maxdcc} then {<br>    putdcc $arg1 "Bot has reached maximum number od dcc slots. $maxdcc matches denied."<br>}<br>if {$maxdl || $qdl} then {<br>    if {!$qdl} then {<br>        putdcc $arg1 "You have too many active downloads. $maxdl matches denied."<br>    } elseif {$maxdl} then {<br>        putdcc $arg1 "You have too many active downloads. $qdl matches queued, $maxdl matches not queued because queue is full."<br>    } else {<br>        putdcc $arg1 "You have too many active downloads. $qdl matches queued."<br>    }<br>}<br>if {$maxgs || $qgs} then {<br>    if {!$qgs} then {<br>        putdcc $arg1 "All download slots are in use. $maxgs matches denied."<br>    } elseif {$maxgs} then {<br>        putdcc $arg1 "All download slots are in use. $qgs matches queued, $maxgs matches not queued because queue is full."<br>    } else {<br>        putdcc $arg1 "All download slots are in use. $qgs matches queued."<br>    }<br>}<br>if {$dccerror} then {<br>    putdcc $arg1 "$dccerrormsg $dccerror matches denied."<br>}<br>return<br>    } say {<br>if {[string trim $arg1] == ""} then {<br>    return "Usage: say &lt;message&gt;"<br>}<br>set nick [var_fserve:func:slots get $arg2 nick]<br>var_fserve:func:uinfo say $arg2 "&lt;$nick&gt; $arg1"<br>return "Said: $arg1"<br>    } who {<br>global var_fserve_slots<br>foreach idx [var_fserve:func:uinfo who] {<br>    append nicklist "[var_fserve:func:slots get $idx nick], "<br>}<br>set nicklist [string trimright [join [lsort $nicklist]] ", "]<br>        return "Users online: $nicklist"<br>    } cp {<br>set pwd1 [var_fserve:func:slots get $arg1 pwd]<br>if {[string index $arg2 0] == "/"} then {<br>    set pwd1 [var_fserve:func:slots get $arg1 rootdir]<br>}<br>set pwd2 [var_fserve:func:slots get $arg1 pwd]<br>if {[string index $arg3 0] == "/"} then {<br>    set pwd2 [var_fserve:func:slots get $arg1 rootdir]<br>}<br>set scount 0<br>set dcount 0<br>set copycount 0<br>set srclist ""<br>set destlist ""<br>foreach entry [glob -nocomplain -- [split $pwd1]/[split $arg2]] {<br>    set dir [file dirname $entry]<br>    if {[file isfile $entry] &amp;&amp; [var_fserve:func:dir $arg1 isin $dir] == 0 || [file isdirectory $entry] &amp;&amp; [var_fserve:func:dir $arg1 isin $entry] == 0} then {<br>        continue<br>    }<br>    lappend srclist $entry<br>    incr scount<br>}<br>foreach entry [glob -nocomplain -- [split $pwd2]/[split $arg3]] {<br>    set dir [file dirname $entry]<br>    if {[file isfile $entry] &amp;&amp; [var_fserve:func:dir $arg1 isin $dir] == 0 || [file isdirectory $entry] &amp;&amp; [var_fserve:func:dir $arg1 isin $entry] == 0} then {<br>        continue<br>    }<br>    lappend destlist $entry<br>    incr dcount<br>}<br>if {$destlist == ""} then {<br>    lappend destlist $pwd2/$arg3<br>}<br>foreach dest $destlist {<br>    foreach src $srclist {<br>        if {$src != $dest} then {<br>    catch {<br>        file copy -force -- $src $dest<br>    } result<br>    if {$result == ""} then {<br>incr copycount<br>    }<br>}<br>    }<br>        }<br>return "### Copied $copycount object(s) out of $scount total matching object(s) to $dcount matching destination(s)."<br>    } mv {<br>set pwd1 [var_fserve:func:slots get $arg1 pwd]<br>if {[string index $arg2 0] == "/"} then {<br>    set pwd1 [var_fserve:func:slots get $arg1 rootdir]<br>}<br>set pwd2 [var_fserve:func:slots get $arg1 pwd]<br>if {[string index $arg3 0] == "/"} then {<br>    set pwd2 [var_fserve:func:slots get $arg1 rootdir]<br>}<br>set scount 0<br>set dcount 0<br>set movecount 0<br>set srclist ""<br>set destlist ""<br>foreach entry [glob -nocomplain -- [split $pwd1]/[split $arg2]] {<br>    set dir [file dirname $entry]<br>    if {[file isfile $entry] &amp;&amp; [var_fserve:func:dir $arg1 isin $dir] == 0 || [file isdirectory $entry] &amp;&amp; [var_fserve:func:dir $arg1 isin $entry] == 0} then {<br>continue<br>    }<br>lappend srclist $entry<br>incr scount<br>}<br>foreach entry [glob -nocomplain -- [split $pwd2]/[split $arg3]] {<br>    set dir [file dirname $entry]<br>    if {[file isfile $entry] &amp;&amp; [var_fserve:func:dir $arg1 isin $dir] == 0 || [file isdirectory $entry] &amp;&amp; [var_fserve:func:dir $arg1 isin $entry] == 0} then {<br>continue<br>    }<br>lappend destlist $entry<br>incr dcount<br>}<br>if {$destlist == ""} then {<br>lappend destlist $pwd2/$arg3<br>}<br>foreach dest $destlist {<br>    foreach src $srclist {<br>if {$src != $dest} then {<br>catch {<br>    file rename -force -- $src $dest<br>} result<br>if {$result == ""} then {<br>incr movecount<br>}<br>}<br>    }<br>}<br>return "### Moved $movecount object(s) out of $scount total matching object(s) to $dcount matching destination(s)."<br>    } rm {<br>set pwd [var_fserve:func:slots get $arg1 pwd]<br>if {[string index $arg2 0] == "/"} then {<br>    set pwd [var_fserve:func:slots get $arg1 rootdir]<br>}<br>set count 0<br>foreach entry [glob -nocomplain -- [split $pwd]/[split $arg2]] {<br>    set dir [file dirname $entry]<br>    #set tail [file tail $entry]<br>    #set dir [string range $entry 0 [expr [string length $entry] - [string length $tail] - 1]]<br>    if {[var_fserve:func:dir $arg1 isin $dir] == 0 || ![file isfile $entry]} then {<br>continue<br>    }<br>    file delete -- $entry<br>    incr count<br>}<br>return "### Deleted $count file(s)"<br>    } rmdir {<br>set pwd [var_fserve:func:slots get $arg1 pwd]<br>if {[string index $arg2 0] == "/"} then {<br>    set pwd [var_fserve:func:slots get $arg1 rootdir]<br>}<br>set count 0<br>foreach entry [glob -nocomplain -- [split $pwd]/[split $arg2]] {<br>    #set dir [file dirname $entry]<br>    #set tail [file tail $entry]<br>    #set dir [string range $entry 0 [expr [string length $entry] - [string length $tail] - 1]]<br>    if {[var_fserve:func:dir $arg1 isin $entry] == 0 || [var_fserve:func:dir $arg1 isin $entry] == [var_fserve:func:slots get $arg1 rootdir] || ![file isdirectory $entry]} then {<br>continue<br>    }<br>    file delete -force -- $entry<br>    putdcc $arg1 "Deleted dir: [var_fserve:func:dir $arg1 relative $entry]"<br>    incr count<br>}<br>return "### Deleted $count dir(s)"<br>    } mkdir {<br>set pwd [var_fserve:func:slots get $arg1 pwd]<br>if {[string index $arg2 0] == "/"} then {<br>    set pwd [var_fserve:func:slots get $arg1 rootdir]<br>}<br>set count 0<br>set dirs [file dirname $arg2]<br>set dest [file tail $arg2]<br>set result [glob -nocomplain -- [split $pwd]/[split $dirs]]<br>if {[llength $result] &lt;= 1} then {<br>    putdcc $arg1 "### Single dir mode."<br>    if {$result == ""} then {<br>catch {<br>    set exists [file exists [var_fserve:func:slots get $arg1 rootdir]/$arg2]<br>    file mkdir [var_fserve:func:slots get $arg1 rootdir]/$arg2<br>    set dest [var_fserve:func:slots get $arg1 rootdir]<br>} result<br>} else {<br>    catch {<br>set exists [file exists $result/$dest]<br>file mkdir $result/$dest<br>set dest $result<br>    } result<br>}<br>if {[string match error* $result] || $exists} then {<br>    return "Destination already exists."<br>} elseif {[var_fserve:func:dir $arg1 isin $dest] == 0} then {<br>    file delete -force -- $dest/$arg2<br>    return "Invalid path."<br>}<br>return "### Created dir: [var_fserve:func:dir $arg1 relative [file dirname $dest]/$arg2]"<br>    } else {<br>putdcc $arg1 "### Multidir mode."<br>foreach entry $result {<br>    set dir [file dirname $entry]<br>    if {[var_fserve:func:dir $arg1 isin $dir] == 0 || [file exists $entry/$dest]} then {<br>continue<br>    }<br>    file mkdir $entry/$dest<br>putdcc $arg1 "Created [var_fserve:func:dir $arg1 relative $entry/$dest]"<br>incr count<br>}<br>return "### Created $count dir(s)"<br>    }<br>    } default {<br>return "Invalid command."<br>    }<br>}<br><br>### FSERVE SLOTS MANAGEMENT ###<br>proc var_fserve:func:slots {command idx {element ""} {data ""}} {<br>    global var_fserve_slots<br>    set command [string tolower $command]<br>    if {![var_func:validnum $idx] &amp;&amp; ![var_func:imatch or $command "isonfserve" "addpend" "delpend" "ispend"]} then {<br>return -1<br>    }<br>    switch -- $command\<br>    set {<br>if {$data == "" || $element == "" || [llength $data] &gt; 6 || (![info exists var_fserve_slots($idx)] &amp;&amp; $element != "all" &amp;&amp; $command != "isonfserve") || ($command != "isonfserve" &amp;&amp; ![var_func:imatch or $element "all" "nick" "mask" "pwd" "idle" "janitor"])} then {<br>    return -1<br>} elseif {$element == "all"} then {<br>    if {[llength $data] != 6 || ![var_func:validnum [lindex $data 3]] || ![var_func:validnum [lindex $data 4]]} then {<br>return -1<br>    }<br>set var_fserve_slots($idx) $data<br>return 1<br>}<br># Check for ([llength $data] &gt; 1) was removed<br>switch -- $element\<br>    nick {<br>set index 0<br>    } host {<br>set index 1<br>    } pwd {<br>set index 2<br>    } idle {<br>set index 3<br>if {![var_func:validnum $data]} then {<br>    return -1<br> }<br>    } janitor {<br>set index 4<br>if {$data != 0 &amp;&amp; $data != 1} then {<br>    return -1<br>}<br>    }<br>        set var_fserve_slots($idx) [lreplace $var_fserve_slots($idx) $index $index $data]<br>        return 1<br>    } get {<br>    if {![info exists var_fserve_slots($idx)]} then {<br>    return 0<br>} elseif {![var_func:imatch or $element "all" "nick" "host" "pwd" "idle" "janitor" "rootdir"]} then {<br>    return -1<br>} elseif {$element == "all"} then {<br>    return $var_fserve_slots($idx)<br>}<br>switch -- $element\<br>    nick {<br>    set index 0<br>    } host {<br>set index 1<br>    } pwd {<br>set index 2<br>    } idle {<br>set index 3<br>    } janitor {<br>set index 4<br>    } rootdir {<br>set index 5<br>    }<br>return [lindex $var_fserve_slots($idx) $index]<br>    } isonfserve {<br>if {![info exists var_fserve_slots]} then {<br>    return 0<br>} elseif {$element == "masked"} then {<br>    set idx [var_func:maskhost n!$idx *.*u.*h]<br>}<br>set idx [string tolower $idx]<br>set count 0<br>foreach entry [array names var_fserve_slots] {<br>    if {[string match [string tolower $idx] [var_func:sindex [string tolower [lindex $var_fserve_slots($entry) 1]] 1 @]]} then {<br>incr count<br>    }<br>}<br>return $count<br>    } addpend {<br>if {$idx == ""} then {<br>    return -1<br>} elseif {![info exists var_fserve_slots(pending)]} then {<br>    set var_fserve_slots(pending) ""<br>}<br>lappend var_fserve_slots(pending) "[unixtime] $idx"<br>    } delpend {<br>if {$idx == ""} then {<br>    return -1<br>} elseif {![info exists var_fserve_slots(pending)]} then {<br>    return<br>}<br>set success 0<br>set templist ""<br>foreach entry [string tolower $var_fserve_slots(pending)] {<br>    if {[string tolower [lindex $entry 1]] == [string tolower $idx] &amp;&amp; !$success} then {<br>set success 1<br>    } else {<br>lappend templist $entry<br>    }<br>}<br>set var_fserve_slots(pending) $templist<br>return<br>    } ispend {<br>if {![info exists var_fserve_slots(pending)]} then {<br>    return 0<br>}<br>set count 0<br>foreach entry [string tolower $var_fserve_slots(pending)] {<br>    if {[string tolower [lindex $entry 1]] == [string tolower $idx]} then {<br>incr count<br>    }<br>}<br>return $count<br>    } default {<br>return -1<br>    }<br>}<br><br>proc var_fserve:func:pendclean {} {<br>    global var_fserve_slots<br>    if {![info exists var_fserve_slots(pending)]} then {<br>return<br>    }<br>    foreach entry $var_fserve_slots(pending) {<br>if {[unixtime] - [lindex $entry 0] &gt;= 30} then {<br>    var_fserve:func:slots delpend [lindex $entry 1]<br>}<br>    }<br>    if {![string match *var?fserve?func?pendclean* [string tolower [utimers]]]} then {<br>utimer 30 var_fserve:func:pendclean<br>    }<br>}<br><br>### STATS INIT ###<br>proc var_fserve:func:stats-init {} {<br>    global var_fserve var_fserve_stats<br>    if {![info exists var_fserve_stats]} then {<br>set var_fserve_stats(uses) 0<br>set var_fserve_stats(koffered) 0<br>set var_fserve_stats(foffered) 0<br>set var_fserve_stats(ksnagged) 0<br>set var_fserve_stats(krecieved) 0<br>set var_fserve_stats(reenable) 0<br>set var_fserve_stats(wasenabled) $var_fserve(enable)<br>set var_fserve_stats(lock) 0<br>    }<br>    return<br>}<br><br>### DCC COMMANDS ###<br># !list<br>bind pub $var_fserve(bind) !list var_fserve:pub:list<br>proc var_fserve:pub:list {nick uhost hand chan text} {<br>    puthelp "NOTICE $nick :[var_fserve:func:adgen]"<br>    return 1<br>}<br><br>bind dcc j|- fhelp var_dcc:fhelp<br>bind dcc j|- fstat var_dcc:fstat<br>bind dcc j|- fwho var_dcc:fwho<br>bind dcc j|- fcount var_dcc:fcount<br>bind dcc j|- findex var_dcc:findex<br>bind dcc j|- fad var_dcc:fad<br>bind dcc j|- fban var_dcc:fban<br>bind dcc j|- funban var_dcc:funban<br>bind dcc j|- fbans var_dcc:fbans<br>bind dcc j|- fon var_dcc:fon<br>bind dcc j|- foff var_dcc:foff<br>proc var_dcc:fhelp {hand idex text} {<br>    putdcc $idex "Available Fserve commands:"<br>    putdcc $idex "fstat  - shows current transfer statistics"<br>    putdcc $idex "fwho   - shows who is currently connected via chat"<br>    putdcc $idex "fcount - count how many files/megabytes fserve is offering"<br>    putdcc $idex "findex - create index files for all fserve sections"<br>    putdcc $idex "fad    - shows current ad message"<br>    putdcc $idex "fban   - add fserve ban"<br>    putdcc $idex "funban - remove specified fserve ban"<br>    putdcc $idex "fbans  - show all fserve bans"<br>    putdcc $idex "fon    - enable fserve"<br>    putdcc $idex "foff   - disable fserve"<br>    putdcc $idex "fhelp  - shows this help"<br>}<br>proc var_dcc:findex {hand idex text} {<br>    global var_fserve<br>    set cpwd [pwd]<br>    putdcc $idex "$text"<br>    foreach entry $var_fserve(sections) {<br>        if {[lindex $entry 3] != ""} then {<br>    if {[lindex $entry 4] != 1} then {<br>cd "$var_fserve(mainpath)/[lindex $entry 1]"<br>set path "$var_fserve(idxpath)/[lindex $entry 3]"<br>exec echo -e "du -h * &gt;$path~tmp\nsort -k2 $path~tmp &gt;$path~tmp2\nsed -e \"/lost+found/d\" $path~tmp2 &gt;$path\nrm -f $path~tmp*" &gt;$var_fserve(idxpath)/cmd~tmp<br>exec chmod 700 $var_fserve(idxpath)/cmd~tmp<br>exec $var_fserve(idxpath)/cmd~tmp<br>exec rm -f $var_fserve(idxpath)/cmd~tmp<br>putdcc $idex "Index file '[lindex $entry 3]' for fserve '[lindex $entry 0]' created."<br>    } else {<br>cd "$var_fserve(mainpath)/[lindex $entry 1]"<br>set path "$var_fserve(idxpath)/[lindex $entry 3]"<br>exec echo -e "ls -shRX1 * &gt;$path~tmp\nsed -e \"/lost+found/d\" $path~tmp &gt;$path\nrm -f $path~tmp*" &gt;$var_fserve(idxpath)/cmd~tmp<br>exec chmod 700 $var_fserve(idxpath)/cmd~tmp<br>exec $var_fserve(idxpath)/cmd~tmp<br>exec rm -f $var_fserve(idxpath)/cmd~tmp<br>putdcc $idex "Index file '[lindex $entry 3]' for fserve '[lindex $entry 0]' created."<br>}<br>}<br>    }<br>    cd $cpwd<br>}<br>proc var_dcc:fcount {hand idex text} {<br>    var_fserve:func:du<br>    putdcc $idex "Stats refreshed."<br>}<br>proc var_dcc:fad {hand idex text} {<br>    putdcc $idex [var_fserve:func:adgen]<br>}<br>proc var_dcc:fstat {hand idex text} {<br>    global var_fserve_queue<br>    putdcc $idex [var_fserve:func:transfers formatted $text]<br>    if {[array size var_fserve_queue]} then {<br>putdcc $idex "### Queue:"<br>foreach entry [lsort [array names var_fserve_queue]] {<br>    putdcc $idex "-&gt; Filename: [file tail [lindex $var_fserve_queue($entry) 1]] to [lindex $var_fserve_queue($entry) 0]."<br>    putdcc $idex "  [file size [lindex $var_fserve_queue($entry) 1]] bytes."<br>}<br>    } else {<br>putdcc $idex "### Queue is empty."<br>    }<br>}<br>proc var_dcc:fwho {hand idex text} {<br>    global var_fserve_slots<br>    set nicklist ""<br>    foreach idx [var_fserve:func:uinfo who] {<br>append nicklist "[var_fserve:func:slots get $idx nick], "<br>    }<br>    set nicklist [string trimright [join [lsort $nicklist]] ", "]<br>    putdcc $idex "### Users connected to fserve:"<br>    putdcc $idex "$nicklist"<br>}<br>proc var_dcc:fban {hand idex text} {<br>    global var_fserve var_fserve_bans<br>    if {$text == ""} then {<br>        putdcc $idex "Usage: fban &lt;hostmask&gt; \[reason\]"<br>        return 0<br>    } else {<br>        set var_fserve_bans([expr [array size var_fserve_bans] + 1]) "[lindex $text 0] [lrange $text 1 end]"<br>        set fd [open $var_fserve(banfile) "w"]<br>        foreach entry [lsort [array names var_fserve_bans]] {<br>        puts $fd "[lindex $var_fserve_bans($entry) 0] [lrange $var_fserve_bans($entry) 1 end]"<br>    }<br>close $fd<br>if {[lindex $var_fserve_bans($entry) 1] != ""} then {<br>    putdcc $idex "Added ban for [lindex $text 0] with reason \"[lrange $text 1 end]\"."<br>} else {<br>    putdcc $idex "Added ban for [lindex $text 0] with no reason."<br>}<br>    }<br>}<br>proc var_dcc:funban {hand idex text} {<br>    global var_fserve var_fserve_bans<br>    if {$text == ""} then {<br>        putdcc $idex "Usage: funban &lt;ban number&gt;"<br>        return 0<br>    } else {<br>        if {![array size var_fserve_bans]} then {<br>    putdcc $idex "No bans."<br>    return 0<br>}<br>set ban ""<br>foreach entry [lsort [array names var_fserve_bans]] {<br>    if {$entry == [lindex $text 0]} then {<br>set ban [lindex $var_fserve_bans($entry) 0]<br>    }<br>    if {$entry &gt; [lindex $text 0]} then {<br>set var_fserve_bans([expr $entry - 1]) $var_fserve_bans($entry)<br>    }<br>}<br>if {[array size var_fserve_bans] &gt; 0 &amp;&amp; $ban != ""} then {<br>    unset var_fserve_bans([array size var_fserve_bans])<br>}<br>set fd [open $var_fserve(banfile) "w"]<br>foreach entry [lsort [array names var_fserve_bans]] {<br>        puts $fd "[lindex $var_fserve_bans($entry) 0] [lrange $var_fserve_bans($entry) 1 end]"<br>}<br>close $fd<br>if {$ban != ""} then {<br>    putdcc $idex "Removed ban for $ban."<br>} else {<br>    putdcc $idex "No such ban."<br>}<br>    }<br>}<br>proc var_dcc:fbans {hand idex text} {<br>    global var_fserve var_fserve_bans<br>    if {[array size var_fserve_bans]} then {<br>putdcc $idex "Current bans:"<br>foreach entry [lsort [array names var_fserve_bans]] {<br>    if {[lindex $var_fserve_bans($entry) 1] != ""} then {<br>        putdcc $idex "$entry. [lindex $var_fserve_bans($entry) 0] ([lrange $var_fserve_bans($entry) 1 end])"<br>    } else {<br>        putdcc $idex "$entry. [lindex $var_fserve_bans($entry) 0]"<br>    }<br>        }<br>    } else {<br>        putdcc $idex "No bans."<br>    }<br>}<br>proc var_dcc:fon {hand idex text} {<br>    global var_fserve<br>    if {$var_fserve(enable)} then {<br>putdcc $idex "Fserve already enabled."<br>    } else {<br>set var_fserve(enable) 1<br>    }<br>}<br>proc var_dcc:foff {hand idex text} {<br>    global var_fserve<br>    if {$var_fserve(enable)} then {<br>set var_fserve(enable) 0<br>    } else {<br>putdcc $idex "Fserve already disabled."<br>    }<br>}<br><br>### DCC TRANSFERS ###<br>proc var_fserve:func:transfers {type {nick ""}} {<br>    switch -- $type\<br>    outgoing {<br>set gets 0<br>set output ""<br>foreach entry [dcclist GET] {<br>    if {$nick != "" &amp;&amp; [string tolower [lindex $entry 1]] != [string tolower $nick]} then {<br>continue<br>    }<br>    set olist ""<br>    set file [lrange [lindex $entry 4] 2 end]<br>    set whom [lindex $entry 1]<br>    set sent [string trim [lindex [split [lindex [lindex $entry 4] 1] /] 0] ()]<br>    set total [lindex [split [lindex [lindex $entry 4] 1] /] 1]<br>    lappend olist $whom $file $sent $total<br>    lappend output $olist<br>    incr gets<br>}<br>set output [linsert $output 0 $gets]<br>return $output<br>    } pendout {<br>set gets 0<br>set output ""<br>foreach entry [dcclist GET_PENDING] {<br>    if {$nick != "" &amp;&amp; [string tolower [lindex $entry 1]] != [string tolower $nick]} then {<br>continue<br>    }<br>    set olist ""<br>    set file [lrange [lindex $entry 4] 2 end]<br>    set whom [lindex $entry 1]<br>    set sent [string trim [lindex [split [lindex [lindex $entry 4] 1] /] 0] ()]<br>    set total [lindex [split [lindex [lindex $entry 4] 1] /] 1]<br>    lappend olist $whom $file $sent $total<br>    lappend output $olist<br>    incr gets<br>}<br>set output [linsert $output 0 $gets]<br>return $output<br>    } formatted {<br>set outgoing [var_fserve:func:transfers outgoing $nick]<br>set outcount [lindex $outgoing 0]<br>set outgoing [lreplace $outgoing 0 0]<br>set output ""<br>if {!$outcount &amp;&amp; $nick == ""} then {<br>    append output "\n### No outgoing transfers."<br>} elseif {!$outcount &amp;&amp; $nick != ""} then {<br>    append output "\n### No outgoing transfers for $nick."<br>} else {<br>    if {$nick == ""} then {<br>append output "\n### Outgoing transfers:"<br>    } else {<br>append output "\n### Outgoing transfers for $nick:"<br>    }<br>    foreach entry $outgoing {<br>set whom [lindex $entry 0]<br>set filename [file tail [lindex $entry 1]]<br>set sent [lindex $entry 2]<br>set total [lindex $entry 3]<br>set percentage [expr int([format %.3f [expr double($sent) / 1024]] * 100 / [format %.3f [expr double($total) / 1024]])]<br>append output "\n-&gt; $filename to $whom.\n  [var_func:nformat $sent] out of [var_func:nformat $total] bytes ($percentage%)."<br>    }<br>}<br>if {$outcount} then {<br>    append output "\n### $outcount DCC send(s)."<br>}<br>return $output<br>    } default {<br>return -1<br>    }<br>}<br><br>### PUB FSERVE ###<br>proc var_fserve:pub:fserve {nick uhost hand chan text} {<br>    global var_fserve max-dcc var_fserve_queue var_fserve_stats var_fserve_bans<br>    # Took out: ![var_fserve:func:binds $lastbind]<br>    # Tracing the settings should make this redundant<br>    if {[matchattr $hand b] || ($var_fserve(validuser) &amp;&amp; $hand == "*") || [var_fserve:func:floodctrl pub]} then {<br>return 0<br>    }<br>    if {!$var_fserve(enable)} then {<br>        puthelp "NOTICE $nick :Fserve is currently OFFLINE"<br>        return 0<br>    }<br>    foreach entry [lsort [array names var_fserve_bans]] {<br>        if {[string match "[lindex $var_fserve_bans($entry) 0]" "$nick!$uhost"]} then {<br>    puthelp "NOTICE $nick :Banned: [lrange $var_fserve_bans($entry) 1 end]"<br>    return 0<br>}<br>    }<br>    if {[lindex $text 0] == ""} then {<br>puthelp "NOTICE $nick :Welcome to \02$var_fserve(name)\02 $nick."<br>puthelp "NOTICE $nick :Usage:"<br>puthelp "NOTICE $nick :!trigger name       - access specified fserve section"<br>puthelp "NOTICE $nick :!trigger name index - get index file for specified fserve section"<br>puthelp "NOTICE $nick :!trigger info       - show current info about chat/send/queue slots"<br>set string "Available triggers:"<br>foreach entry $var_fserve(triggers) {<br>    append string " \02$entry\02"<br>}<br>puthelp "NOTICE $nick :$string"<br>puthelp "NOTICE $nick :Available fserve sections:"<br>foreach entry $var_fserve(sections) {<br>    if {[lindex $entry 2] == ""} then {<br>puthelp "NOTICE $nick :   \02[lindex $entry 0]\02"<br>    } else {<br>puthelp "NOTICE $nick :   \02[lindex $entry 0]\02 ([lindex $entry 2])"<br>    }<br>}<br>puthelp "NOTICE $nick :$string"<br>return 0<br>    } elseif {[lindex $text 0] == "info"} then {<br>set string "\02[var_fserve:func:slotcount] of $var_fserve(maxslots)\02 chat slots available."<br>append string " \02[var_fserve:func:sendscount] of $var_fserve(maxsends)\02 send slots available."<br>if {$var_fserve(maxqueue)} then {<br>    append string " \02[expr $var_fserve(maxqueue) - [array size var_fserve_queue]] of $var_fserve(maxqueue)\02 queue slots available."<br>}<br>append string " Currently offering \02[format %ld [expr $var_fserve_stats(koffered) / 1024]]\02 MB in \02[var_func:nformat $var_fserve_stats(foffered)]\02 files."<br>puthelp "NOTICE $nick :$string"<br>set sends 0<br>foreach entry [dcclist] {<br>    if {[lindex $entry 3] == "GET"} then {<br>if {!$sends} then {<br>    puthelp "NOTICE $nick :Active sends:"<br>}<br>set sent [string trim [lindex [split [lindex [lindex $entry 4] 1] /] 0] ()]<br>set total [lindex [split [lindex [lindex $entry 4] 1] /] 1]<br>set percentage [expr int([format %.3f [expr double($sent) / 1024]] * 100 / [format %.3f [expr double($total) / 1024]])]<br>incr sends<br>puthelp "NOTICE $nick :$sends. [var_func:nformat $sent] of [var_func:nformat $total] bytes completed ($percentage%)."<br>    }<br>    if {[lindex $entry 3] == "GET_PENDING"} then {<br>if {!$sends} then {<br>    puthelp "NOTICE $nick :Active sends:"<br>}<br>incr sends<br>puthelp "NOTICE $nick :$sends. Awaiting acknowledgement from user."<br>    }<br>}<br>if {!$sends} then {<br>    puthelp "NOTICE $nick :No active sends."<br>}<br>if {$var_fserve(maxqueue)} then {<br>    if {[array size var_fserve_queue]} then {<br>puthelp "NOTICE $nick :Queue slots:"<br>foreach entry [lsort [array names var_fserve_queue]] {<br>    puthelp "NOTICE $nick :$entry. [var_func:nformat [file size [lindex $var_fserve_queue($entry) 1]]] bytes"<br>}<br>    } else {<br>    puthelp "NOTICE $nick :Queue is empty."<br>    }<br>}<br>return 0<br>    } elseif {[lindex $text 1] == "index"} then {<br>set path ""<br>foreach entry $var_fserve(sections) {<br>    if {[lindex $entry 0] == [lindex $text 0]} then {<br>if {[lindex $entry 3] == ""} then {<br>    puthelp "NOTICE $nick :No index file for this section of file server."<br>    return 0<br>}<br>    set path "$var_fserve(idxpath)/[lindex $entry 3]"<br>puthelp "NOTICE $nick :Sending index file [lindex $entry 3]."<br>    }<br>}<br>if {$path != ""} then {<br>    dccsend $path $nick<br>    return 0<br>} else {<br>    set count 0<br>}<br>    } else {<br>set count 0<br>foreach entry $var_fserve(sections) {<br>    if {[lindex $entry 0] == [lindex $text 0]} then {<br>set temp_path "$var_fserve(mainpath)/[lindex $entry 1]"<br>incr count<br>    }<br>}<br>    }<br>    if {!$count} then {<br>puthelp "NOTICE $nick :\02[lindex $text 0]\02 - no such Fserve."<br>return 0<br>    }<br>    if {$temp_path == ""} then {<br>puthelp "NOTICE $nick :Unable to access '[lindex $text 0]'. Please contact Fserve owner."<br>return 0<br>    }<br>    if {[dccused] &gt;= ${max-dcc}} then {<br>puthelp "NOTICE $nick :Sorry, maximum amount of dcc slots are in use."<br>return 0<br>    } elseif {[var_fserve:func:slotcount] &lt; 1} then {<br>puthelp "NOTICE $nick :Sorry, all $var_fserve(maxslots) slots are full."<br>return 0<br>    } elseif {([var_fserve:func:slots isonfserve [var_func:sindex $uhost 1 @]] + [var_fserve:func:slots ispend $uhost]) &gt;= $var_fserve(maxclone)} then {<br>puthelp "NOTICE $nick :Maximum amount of connections from the same address has been reached."<br>return 0<br>    }<br>    var_fserve:fserv:init $nick $uhost $temp_path<br>    return 1<br>}<br><br>### FSERVE INIT ###<br>proc var_fserve:fserv:init {nick uhost temp_path} {<br>    global var_fserve<br>    putserv "NOTICE $nick :Initiating DCC chat..."<br>    var_fserve:func:slots addpend $uhost<br>    if {$var_fserve(minport) &amp;&amp; $var_fserve(minport)} then {<br>set port [listen [expr $var_fserve(minport) + [rand [expr $var_fserve(maxport) - $var_fserve(minport)]]] script null]<br>    } else {<br>set port [listen 0 script null]<br>    }<br>    listen $port off<br>    listen $port script "var_fserve:listen:init [split $nick] [split $uhost] [split $temp_path] $port"<br>    utimer 30 "catch {listen $port off}"<br>    putserv "PRIVMSG $nick :\001DCC CHAT chat [var_func:myip long] $port\001"<br>    return 0<br>}<br><br>proc var_fserve:listen:init {nick uhost temp_path port idx} {<br>    global var_fserve var_fserve_stats<br>    listen $port off<br>    var_fserve:func:slots delpend $uhost<br>    set hostmask [var_func:maskhost $nick!$uhost *.*u.*h]<br>    var_fserve:func:slots set $idx all "$nick $uhost $temp_path [unixtime] 0 $temp_path"<br>    incr var_fserve_stats(uses)<br>    var_fserve:func:idleman $idx clean<br>    if {$var_fserve(maxidle) &lt; 31} then {<br>utimer $var_fserve(maxidle) "var_fserve:func:idleman $idx kill"<br>    } else {<br>utimer [expr $var_fserve(maxidle) - 30] "var_fserve:func:idleman $idx warn"<br>    }<br>    var_fserve:func:motd $idx<br>    var_fserve:func:uinfo say $idx "*** $nick has connected to the Fserve."<br>    control $idx "var_fserve:control:fserve [split $nick] [split $uhost]"<br>    return 0<br>}<br><br>proc var_fserve:control:fserve {nick uhost idx text} {<br>    global var_fserve_slots var_fserve var_fserve_stats<br>    var_fserve:func:idleman $idx clean<br>    if {[var_fserve:func:floodctrl fserve $idx] &amp;&amp; ![var_fserve:func:slots get $idx janitor]} then {<br>var_fserve:func:ukill $idx 0 0 "Flood."<br>return 1<br>    }<br>    var_fserve:func:slots set $idx idle [unixtime]<br>    if {$var_fserve(maxidle) &lt; 31} then {<br>utimer $var_fserve(maxidle) "var_fserve:func:idleman $idx kill"<br>    } else {<br>utimer [expr $var_fserve(maxidle) - ([var_fserve:func:slots get $idx janitor] ? 0 : 30)] "var_fserve:func:idleman $idx warn"<br>    }<br>    if {$var_fserve_stats(lock) &amp;&amp; $text != ""} then {<br>putdcc $idx "Fserve is currently locked."<br>return 0<br>    } elseif {$text == ""} then {<br>var_fserve:func:ukill $idx 0 1<br>return 1<br>    }<br>    set string $text<br>    set text [string trimleft $text]<br>    set command [string tolower [var_func:sindex $text 0]]<br>    set text [var_func:srange $text 1 end]<br>    if {$command == "" &amp;&amp; $string != ""} then {<br>set command .<br>    }<br>    switch -- $command\<br>    "" {<br># Bah. This seems like an eggdrop bug or something. At this point, all our idx's are considered invalid for some reason.<br>var_fserve:func:ukill $idx 0 1<br>return 1<br>    } help {<br>if {[llength $text] &gt; 1 || $text == ""} then {<br>    putdcc $idx [var_fserve:func:help all]<br>} else {<br>    putdcc $idx [var_fserve:func:help $text]<br>}<br>return 0<br>    } ls {<br>set pwd [var_fserve:func:slots get $idx pwd]<br>putdcc $idx [var_fserve:func:fserve ls $idx $pwd]<br>return 0<br>    } dir {<br>set pwd [var_fserve:func:slots get $idx pwd]<br>putdcc $idx [var_fserve:func:fserve dir $idx $pwd]<br>return 0<br>    } find {<br>if {$text == ""} then {<br>    putdcc $idx "Usage: find &lt;mask&gt;"<br>    return 0<br>}<br>set pwd [var_fserve:func:slots get $idx pwd]<br>set result [var_func:ffind $idx $pwd $text [var_fserve:func:slots get $idx janitor]]<br>putdcc $idx "Matches for $text:"<br>set coun</span></span></span></span></span></span></span></span></span></span></strong><p>Statistics: Posted by <a href="https://forum.eggheads.org/memberlist.php?mode=viewprofile&amp;u=3647">Bytez</a> — Sat Sep 20, 2003 12:47 am</p><hr />
]]></content>
	</entry>
	</feed>
