egghelp.org community Forum Index
[ egghelp.org home | forum home ]
egghelp.org community
Discussion of eggdrop bots, shell accounts and tcl scripts.
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

help in clone scan tcl

 
Post new topic   Reply to topic    egghelp.org community Forum Index -> Script Requests
View previous topic :: View next topic  
Author Message
Arnold_X-P
Op


Joined: 30 Oct 2006
Posts: 168
Location: DALnet - Trinidad - Beni - Bolivia

PostPosted: Thu Jan 25, 2018 3:38 pm    Post subject: help in clone scan tcl Reply with quote

I found a tcl that gives in percentage a list of real users
and which are clones, the tcl works well when the channel has only 40 users online;

Code:
[15:09] <@sedition> .clones
[15:09] <@Kantuta> Starting clonescan for #Beni...
[15:09] <@Kantuta> (scz-181-114-110-00033.wimaxtigo.bo) Nicklist: Mster, sedition - Clones: 1
[15:09] <@Kantuta> Clones: 1 (25.0%) Realusers: 3 (75.0%) - Took: 0.894ms.


but note that the tcl has a failure
when the channel has more than 50 users including clones and real
then give this ruling

Code:
[15:12] <@sedition> .clones
[15:12] <Kantuta> Starting clonescan for #ReQuesT...


and at partyline I get the error:

Code:
Tcl error [::clonescan::commands]: can't read "clonescan::clones(#ReQuesT:2604)": no such element in array


the detail seems to be when the channel has more than 50 users
is where the error causes and the tcl does not work well

Code:
namespace eval clonescan {
   
    variable copyright "[lindex [split [info script] /] end] - v1.0.0.0 - r0t3n"
   
    variable clones
   
    array set clones {}
   
    variable trigger "."
   
    bind pub m|o "${trigger}clone" [namespace current]::commands
    bind pub m|o "${trigger}clones" [namespace current]::commands
   
}

proc clonescan::commands {nickname hostname handle channel text} {
    putquick "PRIVMSG $channel :Starting clonescan for $channel..."
    set start [clock clicks]
    foreach user [chanlist $channel] {
       if {[clonescan::checknick $user]} { continue }
    foreach user1 [chanlist $channel] {
       if {[clonescan::checknick $user1]} { continue }
        set host [lindex [split [getchanhost $user $channel] @] 1]
        set host1 [lindex [split [getchanhost $user1 $channel] @] 1]
        if {![string equal -nocase $user1 $user]} {
            if {[string equal -nocase $host $host1]} {
                if {[info exists clonescan::clones($channel:$host)]} {
                    set list $clonescan::clones($channel:$host)
                    set add ""
                    if {[lsearch -exact "$list" $user] == "-1"} {
                        if {$add == ""} {
                            set add "$user"
                        } else {
                            set add "$add $user"
                        }
                    }
                    if {([lsearch -exact "$list" $user1] == "-1") && ([lsearch -exact "$add" $user1] == "-1")} {
                        if {$add == ""} {
                            set add "$user1"
                        } else {
                            set add "$add $user1"
                        }
                    }
                    if {$add != ""} {
                        set clonescan::clones($channel:$host) "$list $add"
                    }
                } else {
                    set clonescan::clones($channel:$host) "$user $user1"
                }
            }
        }
        }
    }
    set end [clock clicks]
    set count "0"
    foreach clone [array names clonescan::clones $channel:*] {
        if {$clone == ""} { return }
        set host [lindex [split $clone :] 1]
        set nicklist [join "[lsort -unique $clonescan::clones($channel:$host)]" ", "]
        set i [expr {[clonescan::string2llength $nicklist] - 1}]
        putserv "PRIVMSG $channel :\($host\) Nicklist: $nicklist - Clones: $i"
        incr count $i
    }
    foreach variable [array names clonescan::clones $channel:*] {
        unset clonescan::clones($variable)
    }
    putserv "PRIVMSG $channel :Clones: $count ([set p [format %.1f [expr ($count.0 * 100.0) / [set c [llength [chanlist $channel]]].0]]]%) Realusers: [expr ($c - $count)] ([expr (100.0 - $p)]%) - Took: [expr ($end-$start)/1000.0]ms."
}

proc clonescan::checknick {nickname} {
    global botnick
    if {[string equal -nocase $botnick $nickname] || $nickname == "Q" || $nickname == "S"} {
        return 1
    } else {
        return 0
    }
}

proc clonescan::string2llength {str} {
    set i "0"
    foreach x $str {
        incr i 1
    }
    return "$i"
}

putlog "$clonescan::copyright - loaded!"

_________________
Very Happy thanks to that they help, that others learn Very Happy
Back to top
View user's profile Send private message Send e-mail Visit poster's website MSN Messenger
caesar
Ass Kicker


Joined: 14 Oct 2001
Posts: 3506
Location: Top Secret

PostPosted: Mon Jan 29, 2018 5:43 am    Post subject: Reply with quote

Code:

namespace eval clonescan {
   variable trigger "."
   
   bind pub m|o "${trigger}clone" [namespace current]::commands
   bind pub m|o "${trigger}clones" [namespace current]::commands
   
   proc checknick {nick} {
      set skip [list "S" "Q"]
      set test [expr {[lsearch -nocase $skip $nick] > -1 ? "1" : "0"}]
   }

   proc commands {nick uhost hand chan text} {
      putquick "PRIVMSG $chan :Starting clonescan for $chan..."
      set start [clock clicks]
      set chanlist [chanlist $chan]
      foreach user $chanlist {
         if {[checknick $user]} continue
         lappend userList $user
      }
      set len [llength $userList]
      while {$len > 0} {
         set u1 [lindex [split $userList] 0]
         set h1 [lindex [split [getchanhost $u1 $chan] @] 1]
         set userList [lreplace $userList 0 0]
         foreach u2 $userList {
            set h2 [lindex [split [getchanhost $u2 $chan] @] 1]
            if {[string equal -nocase $h1 $h2]} {   
               if {[expr [lsearch -nocase [array names clones] $h1]] > -1} {
                  lappend clones($h1) $u2
               } else {
                  lappend clones($h1) [list $u1 $u2]
               }
            }
         }
         incr len -1
      }
      set end [clock clicks]
      set count 0
      foreach host [array names clones] {
         set nickList [join [join $clones($host)] ", "]
         set len [llength $nickList]
         puthelp "PRIVMSG $chan :\($host\) Nick list: $nickList - Clones: $len"
         incr $count $len
      }
      set p(c) [expr {$len > 0 ? [format %.1f [expr ($count.0 * 100.0) / $len.0]] : "0.0"}]
      set p(u) [expr (100.0 - $p(c))]
      puthelp "PRIVMSG $chan :Clones: $count ($p(c)%) Real users: [expr ($len - $count)] ($p(u)%) - Took: [expr ($end-$start)/1000.0]ms."
   }
}

Haven't tested it so let me know if get any errors.

Edit: Typo and bug fixes.
_________________
You may say anything about me, but at least don't misspell my name. xD


Last edited by caesar on Tue Feb 06, 2018 2:38 am; edited 1 time in total
Back to top
View user's profile Send private message
Arnold_X-P
Op


Joined: 30 Oct 2006
Posts: 168
Location: DALnet - Trinidad - Beni - Bolivia

PostPosted: Tue Jan 30, 2018 7:48 pm    Post subject: Reply with quote

it gives a mistake in partyline
Code:

[18:47:11] Tcl error [::clonescan::commands]: can't read "u1": no such variable

_________________
Very Happy thanks to that they help, that others learn Very Happy
Back to top
View user's profile Send private message Send e-mail Visit poster's website MSN Messenger
SpiKe^^
Owner


Joined: 12 May 2006
Posts: 572
Location: Tennessee, USA

PostPosted: Tue Jan 30, 2018 7:58 pm    Post subject: Reply with quote

Try replace
Code:
if {[checknick $u1]} continue


With
Code:
if {[checknick $user]} continue

_________________
SpiKe^^

Get BogusTrivia 2.06.4.7 at www.mytclscripts.com
Back to top
View user's profile Send private message Visit poster's website
Arnold_X-P
Op


Joined: 30 Oct 2006
Posts: 168
Location: DALnet - Trinidad - Beni - Bolivia

PostPosted: Tue Jan 30, 2018 8:05 pm    Post subject: Reply with quote

new error
Code:
<JulieTh> [20:05:26] Tcl error [::clonescan::commands]: expected boolean value but got ""

_________________
Very Happy thanks to that they help, that others learn Very Happy
Back to top
View user's profile Send private message Send e-mail Visit poster's website MSN Messenger
Arnold_X-P
Op


Joined: 30 Oct 2006
Posts: 168
Location: DALnet - Trinidad - Beni - Bolivia

PostPosted: Mon Feb 05, 2018 9:43 pm    Post subject: Reply with quote

try to use other variants but for the time being the error persists.

Wink
_________________
Very Happy thanks to that they help, that others learn Very Happy
Back to top
View user's profile Send private message Send e-mail Visit poster's website MSN Messenger
caesar
Ass Kicker


Joined: 14 Oct 2001
Posts: 3506
Location: Top Secret

PostPosted: Tue Feb 06, 2018 2:10 am    Post subject: Reply with quote

Ah. A little fix for that:
Code:

   proc checknick {nick} {
      set skip [list "S" "Q"]
      if {[isbotnick $nick] || [expr [lsearch -nocase $skip $nick]] > -1} return 0
      return 1
   }

with:
Code:

proc checknick {nick} {
   set skip [list "S" "Q"]
   set test [expr {[lsearch -nocase $skip $nick] > -1 ? "1" : "0"}]
}

If the amount of clones is 0 then:
Code:

set p(c) [format %.1f [expr ($count.0 * 100.0) / $len.0]]

will give an error so to fix that as well replace this line with:
Code:

set p(c) [expr {$len > 0 ? [format %.1f [expr ($count.0 * 100.0) / $len.0]] : "0.0"}]


If there's another user on the same host as the bot then the user and that user will show up as clones.
Quote:

<cez> .clones
<@bot> Starting clonescan for #channel...
<@bot> (x.x.x.x) Nick list: bot, cez - Clones: 2
<@bot> Clones: 0 (0.0%) Real users: 2 (100.0%) - Took: 0.088ms.


If you want to "fix" this as well then under:
Code:

set len [llength $userList]

we add:
Code:

set bh [lindex [split $::botname @] 1]

and under:
Code:

set h2 [lindex [split [getchanhost $u2 $chan] @] 1]

we add:
Code:

if {[string equal -nocase $bh $h2]} continue

and then the result will be:
Quote:

<cez> .clones
<@bot> Starting clonescan for #channel...
<@bot> Clones: 0 (0.0%) Realusers: 0 (100.0%) - Took: 0.086ms.

_________________
You may say anything about me, but at least don't misspell my name. xD
Back to top
View user's profile Send private message
Arnold_X-P
Op


Joined: 30 Oct 2006
Posts: 168
Location: DALnet - Trinidad - Beni - Bolivia

PostPosted: Tue Feb 06, 2018 11:12 am    Post subject: Reply with quote

now it works without giving failures.
Code:

namespace eval clonescan {
   variable trigger "."
   
   bind pub m|o "${trigger}clone" [namespace current]::commands
   bind pub m|o "${trigger}clones" [namespace current]::commands
   
proc checknick {nick} {
   set skip [list "S" "Q"]
   set test [expr {[lsearch -nocase $skip $nick] > -1 ? "1" : "0"}]


 proc commands {nick uhost hand chan text} {
  putquick "PRIVMSG $chan :Starting clonescan for $chan..."
  set start [clock clicks]
     set chanlist [chanlist $chan]
  foreach user $chanlist {
    if {[checknick $user]} continue
 lappend userList $user
    }
  set len [llength $userList]
  set bh [lindex [split $::botname @] 1]
   while {$len > 0} {
     set u1 [lindex [split $userList] 0]
     set h1 [lindex [split [getchanhost $u1 $chan] @] 1]
     set userList [lreplace $userList 0 0]
 foreach u2 $userList {
     set h2 [lindex [split [getchanhost $u2 $chan] @] 1]
    if {[string equal -nocase $bh $h2]} continue
 if {[string equal -nocase $h1 $h2]} {   
 if {[expr [lsearch -nocase [array names clones] $h1]] > -1} {
     lappend clones($h1) $u2
} else {
     lappend clones($h1) [list $u1 $u2]
        }
      }
    }
  incr len -1
 }
  set end [clock clicks]
  set count 0
 foreach host [array names clones] {
  set nickList [join [join $clones($host)] ", "]
  set len [llength $nickList]
    puthelp "PRIVMSG $chan :\($host\) Nick list: $nickList - Clones: $len"
    incr $count $len
 }
 set p(c) [expr {$len > 0 ? [format %.1f [expr ($count.0 * 100.0) / $len.0]] : "0.0"}]
  set p(u) [expr (100.0 - $p(c))]    
 puthelp "PRIVMSG $chan :Clones: $count ($p(c)%) Real users: [expr ($len - $count)] ($p(u)%) - Took: [expr ($end-$start)/1000.0]ms."
  }
}


caesar the corrected tcl only shows all zero until the second calculation puts it to zero and I do not think it's real..
something is wrong because it should not give zero if there are real users connected.

Code:
[11:09] <@sedition> .clone
[11:09] <@JulieTh> Starting clonescan for #tcls...
[11:09] <@JulieTh> Clones: 0 (0.0%) Real users: 0 (100.0%) - Took: 0.0ms.


the right thing would be like that:
Code:
[11:10] <@sedition> .clone
[11:10] <@JulieTh> Starting clonescan for #tcls...
[11:10] <@JulieTh> Clones: 0 (0.0%) Real users: 3 (100.0%) - Took: 3.0ms.

_________________
Very Happy thanks to that they help, that others learn Very Happy
Back to top
View user's profile Send private message Send e-mail Visit poster's website MSN Messenger
Arnold_X-P
Op


Joined: 30 Oct 2006
Posts: 168
Location: DALnet - Trinidad - Beni - Bolivia

PostPosted: Thu Nov 15, 2018 9:47 pm    Post subject: Reply with quote

it does not work it still has failures..
Shocked
_________________
Very Happy thanks to that they help, that others learn Very Happy
Back to top
View user's profile Send private message Send e-mail Visit poster's website MSN Messenger
caesar
Ass Kicker


Joined: 14 Oct 2001
Posts: 3506
Location: Top Secret

PostPosted: Yesterday at 2:54 am    Post subject: Reply with quote

Don't know why I complicated things so much when things can be a lot simpler.
Code:

namespace eval clonescan {
   variable trigger "."
   
   bind pub m|o "${trigger}clone" [namespace current]::clonescan
   bind pub m|o "${trigger}clones" [namespace current]::clonescan
   
   proc checknick {nick} {
      set skip [list "S" "Q"]
      set test [expr {[lsearch -nocase $skip $nick] > -1 ? "1" : "0"}]
   }

   proc clonescan {nick uhost hand chan text} {
      putquick "PRIVMSG $chan :Starting clonescan for $chan..."
      set start [clock clicks]
      foreach user [chanlist $chan] {
         if {[checknick $user] || [isbotnick $user]} continue
         set host [lindex [split [getchanhost $user $chan] @] 1]
         lappend clones($host) $user
      }
      set count 0
      foreach host [array names clones] {
         set len [llength $clones($host)]
         if {$len > 1} {
            set nickList [join [join $clones($host)] ", "]
            puthelp "PRIVMSG $chan :\($host\) Nick list: $nickList | Clones: $len"
            incr count $len
         }
      }
      set p(c) [expr {$len > 0 ? [format %.1f [expr ($count.0 * 100.0) / $len.0]] : "0.0"}]
      set p(u) [expr (100.0 - $p(c))]
      set end [clock clicks]
      puthelp "PRIVMSG $chan :Clones: $count ($p(c)%) | Real users: [expr ($len - $count)] ($p(u)%) | Took: [expr ($end-$start)/1000.0]ms."
   }
}

_________________
You may say anything about me, but at least don't misspell my name. xD
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    egghelp.org community Forum Index -> Script Requests All times are GMT - 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Forum hosting provided by Reverse.net

Powered by phpBB © 2001, 2005 phpBB Group
subGreen style by ktauber