are you refering to the listen xxxx all conf line? try .status allTosser^^ wrote:How can i find out what port a user is connected to/from. Not the server port 6667 etc, the port their ip/hostname is. Like 8080 etc.
Code: Select all
##########################
### ProxyScan.tcl ###
### Version 1.0 ###
### By ^DooM^ ###
### Based on PortCheck ###
### by Wcc ###
##########################
##################################################################################################
## This script checks the status of a port on a host. Returns either Accepted, Refused, Failed, ##
## or Timeout as a user connects. Bot has to be an oper and recieve connection notices. ##
##################################################################################################
##########################################################
## PUB ## !scan <host/ip> <port> (Can be changed) ##
######### Checks weather or not the specified port is ##
######### open on the specified host or ip. ##
##########################################################
##########################################################
## Just load the script, set the variables, and rehash. ##
##########################################################
########################################################
# Set flag required for checking the status of a port. #
########################################################
set portcheck_setting(flag) "o|o"
###############################################################
# Set the pub command for checking the status of a port here. #
###############################################################
set portcheck_setting(cmd_pub) "!scan"
#########################################################################
# Set the open ports to scan for when a user joins a monitored channel. #
#########################################################################
set portcheck_setting(ports) "1080 8080 8088 3128"
#######################
# Enable use of bold? #
#######################
set portcheck_setting(bold) 1
##############################
# Channel to output data too #
##############################
set gCommandChan "#server"
#################################################
# Add how the opered bot will catch connections #
#################################################
set gCatchNotice "Client connecting"
####################
# Code begins here #
####################
set portcheck_setting(autoban_svr) 1
set portcheck_setting(read) 1
set portcheck_setting(Proxycheck:) 1
if {![string match 1.6.* $version]} {
putlog "\002PORTCHECK:\002 \002CRITICAL ERROR\002 PortCheck.tcl requires eggdrop 1.6.x to run."
die "\002PORTCHECK:\002 \002CRITICAL ERROR\002 PortCheck.tcl requires eggdrop 1.6.x to run."
}
bind pub $portcheck_setting(flag) $portcheck_setting(cmd_pub) portcheck_scan_pub
bind raw - NOTICE portcheck_onconnect_scan
setudef flag portcheck
proc portcheck_dopre {} {
global portcheck_setting
if {!$portcheck_setting(Proxycheck:)} {
return ""
} elseif {!$portcheck_setting(bold)} {
return "ProxyScan: "
} else {
return "^C9\002ProxyScan:\002^O "
}
}
proc portcheck_onconnect_scan {from keyword arg} {
global gCommandChan gCatchNotice portcheck_setting botnick
if {([string match "*$gCatchNotice*" $arg])} {
set args $arg
set nick [lindex $args 9]
set uhost [lindex $args 10]
set host [lindex [split $uhost @] 1]
set host "[string trimright $host ")"]"
if {$host == "data.searchirc.org" || $host == "python.netsplit.de"} { return }
putquick "PRIVMSG $gCommandChan :^C9\002ProxyCheck:\002^O $nick connected: Scanning $host"
foreach p $portcheck_setting(ports) {
if {![catch {set sock [socket -async $host $p]} error]} {
set timerid [utimer 15 [list portcheck_timeout_join $sock]]
fileevent $sock writable [list portcheck_connected_join $nick $gCommandChan $sock $host $p $timerid]
}
}
}
}
proc portcheck_scan_pub {nick uhost hand chan text} {
global portcheck_setting
set host [lindex $text 0]
set port [lindex $text 1]
if {$port == ""} {
putquick "NOTICE $nick :Usage: $portcheck_setting(cmd_pub) <host> <port>"
} else {
if {[catch {set sock [socket -async $host $port]} error]} {
putquick "PRIVMSG $chan :^C9\002ProxyCheck:\002^O Connection to $host \($port\) was refused."
} else {
set timerid [utimer 15 [list portcheck_timeout_pub $chan $sock $host $port]]
fileevent $sock writable [list portcheck_connected_pub $chan $sock $host $port $timerid]
}
}
}
proc portcheck_connected {idx sock host port timerid} {
killutimer $timerid
if {[set error [fconfigure $sock -error]] != ""} {
close $sock
putdcc $idx "[portcheck_dopre]Connection to $host \($port\) failed. \([string totitle $error]\)"
} else {
fileevent $sock writable {}
fileevent $sock readable [list portcheck_read $idx $sock $host $port]
putdcc $idx "[portcheck_dopre]Connection to $host \($port\) accepted."
}
}
proc portcheck_timeout {idx sock host port} {
close $sock
putdcc $idx "[portcheck_dopre]Connection to $host \($port\) timed out."
}
proc portcheck_read {idx sock host port} {
global portcheck_setting
if {$portcheck_setting(read)} {
if {[gets $sock read] == -1} {
putdcc $idx "[portcheck_dopre]EOF On Connection To $host \($port\). Socket Closed."
close $sock
} else {
putdcc $idx "[portcheck_dopre]$host \($port\) > $read"
}
} else {
close $sock
}
}
proc portcheck_connected_pub {chan sock host port timerid} {
killutimer $timerid
if {[set error [fconfigure $sock -error]] != ""} {
close $sock
putquick "PRIVMSG $chan :^C9\002ProxyCheck:\002^O Connection to $host \($port\) failed. \([string totitle $error]\)"
} else {
fileevent $sock writable {}
fileevent $sock readable [list portcheck_read_pub $chan $sock $host $port]
putquick "PRIVMSG $chan :^C4\002ProxyCheck:\002^O Connection to $host \($port\) accepted."
}
}
proc portcheck_timeout_pub {chan sock host port} {
close $sock
putquick "PRIVMSG $chan :^C7\002ProxyCheck:\002^O Connection to $host \($port\) timed out."
}
proc portcheck_connected_join {nick chan sock host port timerid} {
global portcheck_setting botnick
killutimer $timerid
if {[set error [fconfigure $sock -error]] != ""} {
close $sock
} else {
fileevent $sock writable {}
fileevent $sock readable [list portcheck_read_join $sock]
if {$portcheck_setting(onotice)} {
foreach i [chanlist $chan] {
if {([isop $i $chan]) && ($i != $botnick)} {
putserv "NOTICE $i :Port $port was found open on $nick's host. \($host\)"
}
}
}
if {$portcheck_setting(autoban_svr)} {
putserv "KLINE $nick :Found Open Proxy. Please secure your machine."
putserv "PRIVMSG $gCommandChan :^C4\002ProxyCheck:\002^O Found Open Port ^C4$port^O on $nick's machine. Adding Kline!"
}
}
}
proc portcheck_timeout_join {sock} {
close $sock
}
proc portcheck_read_join {sock} {
close $sock
}
proc portcheck_read_pub {sock} {
global portcheck_setting
if {!$portcheck_setting(read)} {
close $sock
} elseif {[gets $sock read] == -1} {
putquick "PRIVMSG $chan :^C9\002ProxyCheck:\002^O EOF On Connection To $host \($port\). Socket Closed."
close $sock
}
}
putlog "\002ProxyScan:\002 V1.0 by WCC Modified by ^DooM^."
Code: Select all
namespace eval proxy {
variable version "0.75"
variable author "Tosser^^ \(#eggtcl\)"
variable trigger "/$"
# The sources we dns to find out if a user is a proxy
variable source { "cbl.abuseat.org" "opm.blitzed.org" "dnsbl.ahbl.org" "list.dsbl.org" "sbl.csma.biz" "dnsbl.njabl.org" }
setudef flag antiproxy
setudef str antijoins
setudef str antidetected
setudef str antikicked
# /* Settings! */
variable flood "4:15" ;# 4 proxies that join in 8 seconds and the channel gets closed
variable close "30" ;# This is in seconds! It will keep the channel closed for 30 seconds
variable modes "mir" ;# the modes it will set when the channel gets flooded.
# /* End of settings */
# /* Don't edit anything below these lines. If you break it, don't expect me to fix it for you. */
bind JOIN -|- * [namespace current]::checkuser
bind PUB -|- ${trigger}proxy [namespace current]::toggle
variable proxy
array set proxy ""
}
proc proxy::toggle {nickname hostname handle channel arguments} {
set command [lindex [split $arguments] 0]
switch -exact -- [string tolower $command] {
enable {
if {![channel get $channel antiproxy]} {
channel set $channel +antiproxy
putquick "NOTICE $nickname :Done. Anti-Proxy was enabled."
} else {
putquick "NOTICE $nickname :Error: Anti-Proxy is already enabled."
}
}
disable {
if {[channel get $channel antiproxy]} {
channel set $channel -antiproxy
putquick "NOTICE $nickname :Done. Anti-Proxy was disabled."
} else {
putquick "NOTICE $nickname :Error: Anti-Proxy is already disabled."
}
}
stats {
if {([channel get $channel antijoins] != "") || ([channel get $channel antidetected] != "") || ([channel get $channel antikicked] != "")} {
putquick "NOTICE $nickname :Stats for $channel: [statistics $channel]"
} else {
putquick "NOTICE $nickname :No statistics available for $channel."
}
}
default {
if {[channel get $channel antiproxy]} {
putquick "NOTICE $nickname :Anti-Proxy is currently enabled for $channel. Statistic: [statistics $channel]"
} else {
putquick "NOTICE $nickname :Anti-Proxy is currently disabled for $channel."
}
}
}
}
proc proxy::checkuser {nickname hostname handle channel} {
checkstats $channel
if {[channel get $channel antiproxy] && [botisop $channel] && ![string match *users.quakenet.org* $hostname] && ![matchattr $handle m|m $channel] && ![isbotnick $nickname]} {
channel set $channel antijoins "[expr [channel get $channel antijoins] + 1]"
regexp {.*\@(.*)} $hostname -> hostname
if [regexp {[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$} $hostname] {
[namespace current]::check $hostname $hostname 1 $nickname $hostname $channel
} else {
dnslookup $hostname [namespace current]::check $nickname $hostname $channel
}
}
}
proc proxy::check {ip hostname status nickname originalhost channel } {
variable source
if {$status} {
regexp {([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})} $ip -> part1 part2 part3 part4
set newip "$part4.$part3.$part2.$part1"
foreach proxylist $source {
dnslookup "$newip.$proxylist" [namespace current]::check2 $nickname $ip $originalhost $hostname $channel $proxylist
}
} else {
putlog "AntiProxy: Couldn't dns resolve $originalhost."
}
}
proc proxy::check2 {ip hostname status nickname oip realhost originalhost channel rbl } {
variable proxy
variable bantime
variable close
if {[info exists proxy($channel,$nickname)]} { return 0 }
set closemode [modes $channel]
if {$status} {
set proxy($channel,$nickname) 1
utimer 10 [list unset [namespace current]::proxy($channel,$nickname)]
channel set $channel antidetected "[expr [channel get $channel antidetected] + 1]"
if {[floodjoin $channel]} {
putquick "MODE $channel +b$closemode $realhost" -next
set ::close($channel) 1
utimer $close [list [namespace current]::open "$channel" "$closemode"]
}
pushmode $channel +b $realhost
if [regexp {[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$} $originalhost] {
putquick "KICK $channel $nickname :\<$oip\> is in the DNSBL \[Open Proxy\] \(ID: [expr [channel get $channel antikicked] + 1]\)"
} else {
putquick "KICK $channel $nickname :\<$oip\> \[$originalhost\] is in the DNSBL \[Open Proxy\] \(ID: [expr [channel get $channel antikicked] + 1]\)"
}
channel set $channel antikicked "[expr [channel get $channel antikicked] + 1]"
utimer 3 [list flushmode $channel]
}
}
proc proxy::open {channel modes} {
if {[info exists ::close($channel)]} {
putserv "MODE $channel -$modes"
unset ::close($channel)
} else {
return 0
}
}
proc proxy::modes {channel} {
variable modes
set end ""
set chanmode [lindex [getchanmode $channel] 0]
foreach mode [split $modes ""] {
if {![string match *$mode* $chanmode]} {
append end $mode
}
}
return "[join $end]"
}
proc proxy::unsetflood {channel} {
if {[info exists ::flood($channel)]} {
unset ::flood($channel)
}
}
proc proxy::statistics {channel} {
set joins [channel get $channel antijoins]
set detected [channel get $channel antidetected]
set kicked [channel get $channel antikicked]
if {$joins == "" || $joins == "0"} {
return "Statistic Unavailable"
} elseif {$detected == "" || $detected == "0"} {
return "Statistic Unavailable"
} elseif {$kicked == "" || $kicked == "0"} {
return "Statistic Unavailable"
} else {
return "Scanned: $joins, Detected: $detected, Kicked: $kicked \[[format %.2f [expr ($kicked * 100.0) / $joins]]%\]"
}
}
proc proxy::checkstats {channel} {
# /* This is set to 1 to prevent the bot from crashing. (for some people this appears to be a problem) */
if {[channel get $channel antijoins] == ""} { channel set $channel antijoins "1" }
if {[channel get $channel antidetected] == ""} { channel set $channel antidetected "1" }
if {[channel get $channel antikicked] == ""} { channel set $channel antikicked "1" }
}
proc proxy::floodjoin {channel} {
variable flood
set split [split $flood :]
set user [lindex $split 0]
set seconds [lindex $split 1]
if {![info exists ::flood($channel)]} {
set ::flood($channel) 1
} else {
incr ::flood($channel)
}
if {$::flood($channel) >= $user} {
set ::flood($channel) 0
return 1
} else {
utimer $seconds [list [namespace current]::unsetflood $channel]
}
return 0
}
proc proxy::credits {} {
variable file [lindex [split [info script] "/"] end];
variable version;
variable owner "metroid (#development)";
variable modified [clock format [file mtime [info script]] -format "%Y/%m/%d %H:%M:%S"];
set channels 0; set total 0; set end ""
foreach chan [channels] {;
checkstats $chan
incr total
if {[channel get $chan antiproxy]} { incr channels ; lappend end $chan }
};
putlog "$file v$version by $owner - Last modified: $modified"
putlog "$file active on $channels/$total ([format %.2f [expr ($channels.0 * 100.0) / $total.0]]%) channels: [join $end ", "]"
putlog "$file was successfully loaded!"
}
proxy::credits
Code: Select all
# __ __ __ ___ __
# _\ \\ \__ /\ \ /\_ \ /\ \__
# /\__ _ _\ \_\ \ __ __ __ __\//\ \ ___ _____ ___ ___ __ ___\ \ ,_\
# \/__\ \\ \__ /'_` \ /'__`\/\ \/\ \ /'__`\\ \ \ / __`\/\ '__`\ /' __` __`\ /'__`\/' _ `\ \ \/
# /\_ _ _\/\ \_\ \/\ __/\ \ \_/ |/\ __/ \_\ \_/\ \_\ \ \ \_\ \/\ \/\ \/\ \/\ __//\ \/\ \ \ \_
# \/_/\_\\_\/\ \___,_\ \____\\ \___/ \ \____\/\____\ \____/\ \ ,__/\ \_\ \_\ \_\ \____\ \_\ \_\ \__\
# \/_//_/ \/__,_ /\/____/ \/__/ \/____/\/____/\/___/ \ \ \/ \/_/\/_/\/_/\/____/\/_/\/_/\/__/
# \ \_\
# \/_/
#
# /\ \ /\ \__ __
# _____ _ __ ___ \_\ \ __ __ ___\ \ ,_\/\_\ ___ ___ ____
# /\ '__`\/\`'__\/ __`\ /'_` \/\ \/\ \ /'___\ \ \/\/\ \ / __`\ /' _ `\ /',__\
# \ \ \_\ \ \ \//\ \_\ \/\ \_\ \ \ \_\ \/\ \__/\ \ \_\ \ \/\ \_\ \/\ \/\ \/\__, `\
# \ \ ,__/\ \_\\ \____/\ \___,_\ \____/\ \____\\ \__\\ \_\ \____/\ \_\ \_\/\____/
# \ \ \/ \/_/ \/___/ \/__,_ /\/___/ \/____/ \/__/ \/_/\/___/ \/_/\/_/\/___/
# \ \_\
# \/_/
#
# Anti proxy scan script.
# /* This is an anti proxy script written for eggdrop. It's been tested on eggdrop1.6.17 with TCL version 8.4
# * Unlike other anti proxy scripts i've seen around.
# * This script works just as well on a windrop as it does on a windrop
# * I've been testing it with a few proxies myself and it clears about 5 proxies in a few seconds without a problem
# * If it detects a floodjoin happening it will set the modes you choose
# * (Default mir = moderated, invite only, registered only) These modes are for Quakenet though.
# * The script will first check what modes you already have set so it won't be unsetting a mode you already had before the floodjoin
# */
# /* Author info
# * I made this script because i was sick of all the proxies that were joining my channel and spamming it
# * It's based off the proxycheck.tcl made by James. I rewrote the entire script but kept the basics in.
# * This script is generally alot faster than that script. But it's still in beta form!
# * I release this script to http://development.woosah.org
# * and no other websites are allowed to release this without my explicit authorisation.
# * If you have an eggdrop website with scripts and you'd like to put this script on your webpage,
# * Send me an email at metroid at gmail.com replacing at with @
# */
# /* Installing the anti-proxy script
# * First, put the script into your /scripts folder.
# * Then at the end of your eggdrop.conf, Put:
# * source scripts/anti-proxy.tcl
# * Or if you are using the #development configuration file, you won't have to do anything.
# * Just rehash the bot after you've done this and it should work.
# * Read the next part about using it.
# */
# /* Using the anti-proxy script
# * The script itself pretty much does everything automaticly once it's activated.
# * You can activate it by typing: <trigger>proxy enable
# * You can deactivate it by typing: <trigger>proxy disable
# * If you want some statistics about how many people it has scanned, detected or kicked,
# * you can use <trigger>proxy stats
# * Just typing <trigger>proxy will tell you if the check is enabled or disabled, and possibly statistics about it.
# */
namespace eval proxy {
variable version "0.75"
variable author "metroid - #development on irc.quakenet.org"
variable trigger "$"
# The sources we dns to find out if a user is a proxy
variable source { "cbl.abuseat.org" "opm.blitzed.org" "dnsbl.ahbl.org" "list.dsbl.org" "sbl.csma.biz" "dnsbl.njabl.org" }
setudef flag antiproxy
setudef str antijoins
setudef str antidetected
setudef str antikicked
# /* Settings! */
variable flood "4:15" ;# 4 proxies that join in 8 seconds and the channel gets closed
variable close "30" ;# This is in seconds! It will keep the channel closed for 30 seconds
variable modes "mir" ;# the modes it will set when the channel gets flooded.
# /* End of settings */
# /* Don't edit anything below these lines. If you break it, don't expect me to fix it for you. */
bind JOIN -|- * [namespace current]::checkuser
bind PUB m|n ${trigger}proxy [namespace current]::toggle
variable proxy
array set proxy ""
}
proc proxy::toggle {nickname hostname handle channel arguments} {
set command [lindex [split $arguments] 0]
switch -exact -- [string tolower $command] {
enable {
if {![channel get $channel antiproxy]} {
channel set $channel +antiproxy
putquick "NOTICE $nickname :Done. Anti-Proxy was enabled."
} else {
putquick "NOTICE $nickname :Error: Anti-Proxy is already enabled."
}
}
disable {
if {[channel get $channel antiproxy]} {
channel set $channel -antiproxy
putquick "NOTICE $nickname :Done. Anti-Proxy was disabled."
} else {
putquick "NOTICE $nickname :Error: Anti-Proxy is already disabled."
}
}
stats {
if {([channel get $channel antijoins] != "") || ([channel get $channel antidetected] != "") || ([channel get $channel antikicked] != "")} {
putquick "NOTICE $nickname :Stats for $channel: [statistics $channel]"
} else {
putquick "NOTICE $nickname :No statistics available for $channel."
}
}
default {
if {[channel get $channel antiproxy]} {
putquick "NOTICE $nickname :Anti-Proxy is currently enabled for $channel. Statistic: [statistics $channel]"
} else {
putquick "NOTICE $nickname :Anti-Proxy is currently disabled for $channel."
}
}
}
}
proc proxy::checkuser {nickname hostname handle channel} {
checkstats $channel
if {[channel get $channel antiproxy] && [botisop $channel] && ![string match *users.quakenet.org* $hostname] && ![matchattr $handle m|m $channel] && ![isbotnick $nickname]} {
channel set $channel antijoins "[expr [channel get $channel antijoins] + 1]"
regexp {.*\@(.*)} $hostname -> hostname
if [regexp {[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$} $hostname] {
[namespace current]::check $hostname $hostname 1 $nickname $hostname $channel
} else {
dnslookup $hostname [namespace current]::check $nickname $hostname $channel
}
}
}
proc proxy::check {ip hostname status nickname originalhost channel } {
variable source
if {$status} {
regexp {([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})} $ip -> part1 part2 part3 part4
set newip "$part4.$part3.$part2.$part1"
foreach proxylist $source {
dnslookup "$newip.$proxylist" [namespace current]::check2 $nickname $ip $originalhost $hostname $channel $proxylist
}
} else {
putlog "AntiProxy: Couldn't dns resolve $originalhost."
}
}
proc proxy::check2 {ip hostname status nickname oip realhost originalhost channel rbl } {
variable proxy
variable bantime
variable close
if {[info exists proxy($channel,$nickname)]} { return 0 }
set closemode [modes $channel]
if {$status} {
set proxy($channel,$nickname) 1
utimer 10 [list unset [namespace current]::proxy($channel,$nickname)]
channel set $channel antidetected "[expr [channel get $channel antidetected] + 1]"
if {[floodjoin $channel]} {
putquick "MODE $channel +b$closemode $realhost" -next
set ::close($channel) 1
utimer $close [list [namespace current]::open "$channel" "$closemode"]
}
pushmode $channel +b $realhost
if [regexp {[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$} $originalhost] {
putquick "KICK $channel $nickname :\<$oip\> is in the DNSBL \[Open Proxy\] \(ID: [expr [channel get $channel antikicked] + 1]\)"
} else {
putquick "KICK $channel $nickname :\<$oip\> \[$originalhost\] is in the DNSBL \[Open Proxy\] \(ID: [expr [channel get $channel antikicked] + 1]\)"
}
channel set $channel antikicked "[expr [channel get $channel antikicked] + 1]"
utimer 3 [list flushmode $channel]
}
}
proc proxy::open {channel modes} {
if {[info exists ::close($channel)]} {
putserv "MODE $channel -$modes"
unset ::close($channel)
} else {
return 0
}
}
proc proxy::modes {channel} {
variable modes
set end ""
set chanmode [lindex [getchanmode $channel] 0]
foreach mode [split $modes ""] {
if {![string match *$mode* $chanmode]} {
append end $mode
}
}
return "[join $end]"
}
proc proxy::unsetflood {channel} {
if {[info exists ::flood($channel)]} {
unset ::flood($channel)
}
}
proc proxy::statistics {channel} {
set joins [channel get $channel antijoins]
set detected [channel get $channel antidetected]
set kicked [channel get $channel antikicked]
if {$joins == "" || $joins == "0"} {
return "Statistic Unavailable"
} elseif {$detected == "" || $detected == "0"} {
return "Statistic Unavailable"
} elseif {$kicked == "" || $kicked == "0"} {
return "Statistic Unavailable"
} else {
return "Scanned: $joins, Detected: $detected, Kicked: $kicked \[[format %.2f [expr ($kicked * 100.0) / $joins]]%\]"
}
}
proc proxy::checkstats {channel} {
# /* This is set to 1 to prevent the bot from crashing. (for some people this appears to be a problem) */
if {[channel get $channel antijoins] == ""} { channel set $channel antijoins "1" }
if {[channel get $channel antidetected] == ""} { channel set $channel antidetected "1" }
if {[channel get $channel antikicked] == ""} { channel set $channel antikicked "1" }
}
proc proxy::floodjoin {channel} {
variable flood
set split [split $flood :]
set user [lindex $split 0]
set seconds [lindex $split 1]
if {![info exists ::flood($channel)]} {
set ::flood($channel) 1
} else {
incr ::flood($channel)
}
if {$::flood($channel) >= $user} {
set ::flood($channel) 0
return 1
} else {
utimer $seconds [list [namespace current]::unsetflood $channel]
}
return 0
}
proc proxy::credits {} {
variable file [lindex [split [info script] "/"] end];
variable version;
variable owner "metroid (#development)";
variable modified [clock format [file mtime [info script]] -format "%Y/%m/%d %H:%M:%S"];
set channels 0; set total 0; set end ""
foreach chan [channels] {;
checkstats $chan
incr total
if {[channel get $chan antiproxy]} { incr channels ; lappend end $chan }
};
putlog "$file v$version by $owner - Last modified: $modified"
putlog "$file active on $channels/$total ([format %.2f [expr ($channels.0 * 100.0) / $total.0]]%) channels: [join $end ", "]"
putlog "$file was successfully loaded!"
}
proxy::credits
# // Copyright: This script was made by metroid (#development). This means, YOU DIDNT MAKE IT! I DID! :p
# // Don't break my copyright because it's lame and i'll sue you ass if you do. Have fun!