Jump to content
chain

Clone scanner and kicker

Recommended Posts

  • Administrators
Tye (tye at mirc . net) DALnet #mIRC / Undernet #mirc.net, #hawkee.com
; 
; This collection of snippets does a few things:
;  - Displays all clones in a channel
;  - Displays a user's clones when they join a channel
;  - Kick/Ban clones when they join a channel (enabled per channel)
;  - Kick/Ban clones in a channel
;
; These scripts are public domain. You can do whatever you want with them.
;
; If you need help with with these snippets please ask your question on the www.hawkee.com
; forums.

; To install simply paste the code in your remotes
; The snippets can be used/configured from the channel/nicklist popups
; The 'clone threshold' setting is how many _clones_ are allowed in the channel (not how many users from the same host). A threshold of 0 means no clones are allowed (only 1 user per host)

; /showclones #channel [-k]
; Will display all clones in #channel
; If you give the -k parameter all clones above the channel's threshold will be kicked/banned
alias showclones {
  if ($hget(clones)) hfree clones
  hmake clones 10
  var %x = $nick($1,0)
  while (%x) {
    var %addr = $address($nick($1,%x),2)
    ; Get user's clones
    var %g = $clones(%addr,$1)
    var %n = $gettok(%g,2-,32), %g = $gettok(%g,1,32)
    if (%n) && (!$hget(clones,%addr)) {
      ; If we haven't already shown clones from this host then do that now
      echo $colour(info) $1 *** %g clones from %addr $+ : %n
      ; If there are more clones than the threshold, and the user is not protected, start kicking
      if ($2 = -k) && (%g > $thresh($1)) && (!$is_clone_prot($address($nick($1,%x),5))) {
        mode $chan +b %addr
        .timer 1 600 mode $chan -b %addr
        var %xx = $ialchan(%addr,$1,0)
        while (%xx) {
          if ($ialchan(%addr,$1,%xx).nick isreg $1) { kick $chan $ifmatch Clones from %addr }
          dec %xx
        }
      }
      hinc clones %addr
    }
    dec %x
  }
  hfree clones
}

; $clones(*!*@site,#channel)
; Returns the number of clones matching *!*@site and their nicknames in this format:
;    N nicknames
; where N is the number of clones and nicknames is a space delimited list of the users.
alias clones {
  var %x = $ialchan($1,$2,0)
  if (%x = 1) { return 1 }
  if (%x > 80) { return %x Too many to list }
  var %r
  while (%x) {
    %r = %r $ialchan($1,$2,%x).nick
    dec %x
  }
  return $ialchan($1,$2,0) %r
}

; The options below the seperator are per channel settings.
menu channel {
  Clone Utilities
  .Show clones in $chan:showclones #
  .Kick/Ban current clones:if ($input(Are you sure you want to kick/ban all clones in $chan $+ ?,y)) { showclones # -k }
  .$iif($($+(%,clones.join),2),$style(1)) Show clones on join:if ($($+(%,clones.join),2)) { set $+(%,clones.join) 0 } | else { set $+(%,clones.join) 1 }
  .-
  .$iif($($+(%,clones.kick.,$chan),2),$style(1)) Kick/Ban clones on join:if ($($+(%,clones.kick.,$chan),2)) { set $+(%,clones.kick.,$chan) 0 } | else { set $+(%,clones.kick.,$chan) 1 }
  .Clone threshold - $thresh($chan).1:set $+(%,clones.th.,$chan) $input(Enter how many clones a site is allowed in the channel [0 means only 1 user/host $+ $chr(44) 1 means 2 users/host]:,e)
}
menu nicklist {
  $iif(!$is_clone_prot($address($$1,5)),Clone Utilities)
  .Protect User
  ..$submenu($getmasks($1))
  $iif($is_clone_prot($address($$1,5)),Clone Utilities)
  .Unprotect $is_clone_prot($address($$1,5)).addr:ruser $is_clone_prot($address($$1,5)).addr
}
alias -l getmasks {
  if ($1 > 19) { return }
  return $1 $address($snick($active,1),$1) $+ :auser cloneprotect $address($snick($active,1),$1)
}
; $is_clone_prot(nick!user@host)
; Returns $true of user is protected from clone kick
alias is_clone_prot {
  var %x = $ulist(*,cloneprotect,0)
  while (%x) {
    var %a = $ulist(*,cloneprotect,%x)
    if (%a iswm $1) { return $iif($prop = addr,%a,$true) }
    dec %x
  }
  return $false
}
ON *:JOIN:#: {
  ; Show users clones
  var %n = $clones($wildsite,$chan)
  if ($($+(%,clones.join),2)) {
    if ($gettok(%n,2-,32)) {
      echo -tc info2 $chan * $gettok(%n,1,32) clones from $wildsite $+ : $gettok(%n,2-,32)
    }
  }
  ; If you are opped, there are more clones from the host than the threshold allows, kicking clones has been enabled for this channel and the user is not protected, kick/ban the clones
  if ($me isop $chan) && ($gettok(%n,1,32) > $thresh($chan)) && ($($+(%,clones.kick.,$chan),2)) && (!$is_clone_prot($fulladdress)) {
    ; Ban the host if we haven't already
    if (!$($+(%,clonekicking,$cid,$chan,$wildsite),2)) {
      mode $chan +b $wildsite
      .timer 1 600 mode $chan -b $wildsite
      set -u10 $+(%,clonekicking,$cid,$chan,$wildsite) 1
    }
    var %x = $ialchan($wildsite,$chan,0)
    while (%x) {
      ; Kick this user is we haven't already
      if ($ialchan($wildsite,$chan,%x).nick isreg $chan) && (!$($+(%,clonekicking,$cid,$chan,$ifmatch),2)) {
        var %nick = $ialchan($wildsite,$chan,%x).nick
        kick $chan %nick Clones from $wildsite
        set -u10 $+(%,clonekicking,$cid,$chan,%nick) 1
      }
      dec %x
    }
  }
}
; Returns the clone threshold for a channel
; $thresh(#channel).N
; If you give the N parameter that value will be subtratced from the threshold.
; The threshold returns the maximum number of users a host can have in #channel,
; not the number of clones a host can have. Use $thresh(#channel).1 to get the
; number of clones a host can have.
alias -l thresh {
  if ($($+(%,clones.th.,$1),2) != $null) { return $calc($ifmatch + 1 - $prop) }
  return $calc(1 - $prop)
}

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...


×
×
  • Create New...