NickTRacker
Submited by: Andy Abnormal 2025-07-03 02:36:00 Thanks to: WhiteRabbit Likes: 0 ;# Homepage:
;# http://hawkee.com/snippet/1368/
on *:start: {
nicktracker
delnumnick
}
alias delnumnick {
var %thelounge = $hfind(TABLE,thelounge*, 0, w).data
var %kiwi = $hfind(TABLE,kiwi*, 0, w).data
while (%thelounge) {
hdel $hfind(TABLE,thelounge*, %thelounge, w).data
dec %thelounge
}
goto goon
:goon
while (%kiwi) {
if ($hget((TABLE,kiwi*, 0, w).data)(TABLE,kiwi*, %kiwi, w))
hdel $hfind(TABLE,kiwi*, %kiwi, w).data
dec %kiwi
}
echo $color(other text) -s $+($chr(3),$color(info).dd) Nicks: thelounge Nicknamen wurden entfernt!
echo $color(other text) -s $+($chr(3),$color(info).dd) Nicks: Kiwi Nicknamen wurden entfernt!
}
; Funktion um zu prüfen, ob es sich um einen Nickban handelt
alias isNickBan {
if (!$1) return $false
var %banmask = $1
; Prüfen ob es ein reiner Nickban ist (nur Nickname ohne ! oder @)
if (!$regex(%banmask,/[!@]/)) return $true
; Prüfen ob es ein Nickban in der Form nick!*@* ist
if ($regex(%banmask,/^([^!]+)!\*@\*$/)) return $true
return $false
}
on ^*:join:#: {
if (!$hget(join)) nicktracker
hinc join $address($nick,2) $+ $chan $+ .num
; Bann-Check und erweiterte Join-Nachricht
var %baninfo = $getBanInfo($address($nick,2))
var %bantext
if (%baninfo) {
var %bancount = $gettok(%baninfo,1,32)
var %lastban = $gettok(%baninfo,2,32)
var %isNickBan = $gettok(%baninfo,3,32)
var %bandiff = $calc($ctime - %lastban)
; Nur Warnung anzeigen wenn es kein Nickban war
if (!%isNickBan) {
if (%bandiff < 43200) {
; Weniger als 12 Stunden - Rote Warnung
%bantext = $+($chr(3),4) ⚠️ WARNUNG: Letzter Bann vor $duration(%bandiff) $+ ! Bann-Count: %bancount
}
else {
; Mehr als 12 Stunden - Normale Info
%bantext = $+($chr(3),$color(info).dd) Letzter Bann vor $duration(%bandiff) $+ , Count: %bancount
}
}
}
if ($hget(join,$address($nick,2) $+ $chan $+ .last)) {
if (%bantext) {
echo $color(join) -t # ➬➩➫ $nick ( $+ $address $+ ) join # $+($chr(3),$color(ctcp).dd) joins: $+ ( $+ $hget(join,$address($nick,2) $+ $chan $+ .num) $+ ) Last: $hget(join,$address($nick,2) $+ $chan) $duration($calc($ctime - $hget(join,$address($nick,2) $+ $chan $+ .last))) %bantext
}
else {
echo $color(join) -t # ➬➩➫ $nick ( $+ $address $+ ) join # $+($chr(3),$color(ctcp).dd) joins: $+ ( $+ $hget(join,$address($nick,2) $+ $chan $+ .num) $+ ) Last: $hget(join,$address($nick,2) $+ $chan) $duration($calc($ctime - $hget(join,$address($nick,2) $+ $chan $+ .last)))
}
}
else {
if (%bantext) {
echo $color(join) -t # ➬➩➫ $nick ( $+ $address $+ ) join $chan $+($chr(3),$color(ctcp).dd) First join %bantext
}
else {
echo $color(join) -t # ➬➩➫ $nick ( $+ $address $+ ) join $chan $+($chr(3),$color(ctcp).dd) First join
}
}
hadd join $address($nick,2) $+ $chan $nick
hadd join $address($nick,2) $+ $chan $+ .last $ctime
var %a = 1,%n = 0,%b = 1, %clones
while $hget(join,$address($nick,2) $+ .nicknum. $+ %a) {
if ($v1 == $nick) %n = 1
inc %a
}
if (%n == 0) hadd join $address($nick,2) $+ .nicknum. $+ %a $nick
; Clone-Erkennung beim Join
while $nick(#,%b) {
if ($nick(#,%b) != $nick) && ($address($nick(#,%b),2) == $address($nick,2)) {
%clones = %clones $nick(#,%b)
}
inc %b
}
; Clone-Warnung nur beim Join ausgeben
if (%clones) {
echo $color(info) -t $chan 👥 $nick ist ein Clone von: %clones
}
haltdef
}
on *:nick: {
if (!$hget(join)) nicktracker
var %a = 1,%n = 0
while $hget(join,$address($newnick,2) $+ .nicknum. $+ %a) {
if ($v1 == $newnick) %n = 1
inc %a
}
if (%n == 0) hadd join $address($newnick,2) $+ .nicknum. $+ %a $newnick
}
; Automatische Ban-Erkennung
on *:ban:#: {
if (!$hget(join)) nicktracker
; Ban-Counter für die Hostmask erhöhen
hinc join $banmask $+ .bancount
; Letzte Ban-Zeit speichern
hadd join $banmask $+ .lastban $ctime
; Prüfen und speichern ob es ein Nickban ist
hadd join $banmask $+ .isnickban $isNickBan($banmask)
}
; Erkennung von manuellen /mode +b Befehlen
raw 367:*: {
; Beim Abrufen der Banliste (z.B. /mode #channel +b)
; Format: :server 367 nick #channel banmask banner time
if (!$hget(join)) nicktracker
var %chan = $3
var %banmask = $4
var %banner = $5
var %bantime = $6
; Nur verarbeiten wenn wir eine gültige Zeit haben und es noch nicht erfasst wurde
if (%bantime && !$hget(join,%banmask $+ .importtime)) {
hinc join %banmask $+ .bancount
hadd join %banmask $+ .lastban %bantime
hadd join %banmask $+ .importtime $ctime
hadd join %banmask $+ .isnickban $isNickBan(%banmask)
}
}
; Input-Handler für eigene Ban-Befehle
on *:input:#: {
if (!$hget(join)) nicktracker
; Erkennung von /ban Befehlen
if ($regex($1-,/^\/ban\s+(.+)/i)) {
var %target = $regml(1)
var %hostmask = $iif($address(%target,2),$address(%target,2),%target)
; Ban-Counter erhöhen
hinc join %hostmask $+ .bancount
hadd join %hostmask $+ .lastban $ctime
hadd join %hostmask $+ .isnickban $isNickBan(%hostmask)
}
; Erkennung von /mode +b Befehlen
if ($regex($1-,/^\/mode\s+[#&]\S+\s+\+.*b.*\s+(.+)/i)) {
var %banmask = $regml(1)
; Ban-Counter erhöhen
hinc join %banmask $+ .bancount
hadd join %banmask $+ .lastban $ctime
hadd join %banmask $+ .isnickban $isNickBan(%banmask)
}
}
; Bann-Statistik Funktionen
alias addBan {
if (!$1) {
echo $color(other text) -ag [BANN-TRACKER] Verwendung: /addBan <host>
return
}
if (!$hget(join)) nicktracker
; Bann-Counter erhöhen
hinc join $1 $+ .bancount
; Letzte Bann-Zeit speichern
hadd join $1 $+ .lastban $ctime
; Prüfen ob es ein Nickban ist
hadd join $1 $+ .isnickban $isNickBan($1)
var %bancount = $hget(join,$1 $+ .bancount)
echo $color(highlight) -ag [BANN-TRACKER] $+($chr(3),$color(other text).dd) Host $+($chr(3),$color(nick).dd) $1 $+($chr(3),$color(other text).dd) wurde gebannt! $+($chr(3),$color(info).dd) (Bann #%bancount)
}
alias getBanInfo {
if (!$1) return
if (!$hget(join)) return
var %bancount = $hget(join,$1 $+ .bancount)
var %lastban = $hget(join,$1 $+ .lastban)
var %isNickBan = $hget(join,$1 $+ .isnickban)
if (%bancount && %lastban) {
return %bancount %lastban %isNickBan
}
return $null
}
alias showBanStats {
if (!$1) {
echo $color(other text) -ag [BANN-STATS] Verwendung: /showBanStats <host>
return
}
if (!$hget(join)) nicktracker
var %bancount = $hget(join,$1 $+ .bancount)
var %lastban = $hget(join,$1 $+ .lastban)
var %isNickBan = $hget(join,$1 $+ .isnickban)
if (%bancount) {
if (%lastban) {
var %timediff = $calc($ctime - %lastban)
var %bantype = $iif(%isNickBan,Nickban,Hostban)
echo $color(nick) -ag [BANN-STATS] $+($chr(3),$color(other text).dd) Host: $+($chr(3),$color(nick).dd) $1 $+($chr(3),$color(other text).dd) - Banns: $+($chr(3),$color(info).dd) %bancount $+($chr(3),$color(other text).dd) - Letzter Bann: $+($chr(3),$color(info).dd) $duration(%timediff) $+ her $+($chr(3),$color(other text).dd) (Typ: %bantype $+ )
}
else {
echo $color(nick) -ag [BANN-STATS] $+($chr(3),$color(other text).dd) Host: $+($chr(3),$color(nick).dd) $1 $+($chr(3),$color(other text).dd) - Banns: $+($chr(3),$color(info).dd) %bancount $+($chr(3),$color(other text).dd) - Keine Zeitinfo verfügbar
}
}
else {
echo $color(other text) -ag [BANN-STATS] $+($chr(3),$color(nick).dd) $1 $+($chr(3),$color(other text).dd) wurde noch nie gebannt.
}
}
; Clone-Scanner für Channel
alias scanClones {
if (!$1) {
echo $color(other text) -ag [CLONE-SCANNER] Verwendung: /scanClones #channel
return
}
if (!$me ison $1) {
echo $color(other text) -ag [CLONE-SCANNER] Du bist nicht in $1
return
}
var %i = 1, %cloneGroups, %foundClones = 0
; Alle Nicks im Channel durchgehen
while $nick($1,%i) {
var %currentNick = $nick($1,%i)
var %currentHost = $address(%currentNick,2)
var %cloneList, %j = 1
; Nach anderen Nicks mit gleicher Hostmask suchen
while $nick($1,%j) {
if ($address($nick($1,%j),2) == %currentHost) {
%cloneList = %cloneList $nick($1,%j)
}
inc %j
}
; Wenn mehr als 1 Nick mit gleicher Hostmask
if ($numtok(%cloneList,32) > 1) {
; Prüfen ob wir diese Clone-Gruppe schon hatten
if (!$istok(%cloneGroups,%currentHost,32)) {
%cloneGroups = %cloneGroups %currentHost
inc %foundClones
; Ältesten Clone finden (wer am längsten im Channel ist)
var %oldestNick, %oldestTime = $ctime, %k = 1
while $gettok(%cloneList,%k,32) {
var %checkNick = $gettok(%cloneList,%k,32)
var %nickTime = $nick($1,%checkNick).idle
if (%nickTime < %oldestTime) {
%oldestTime = %nickTime
%oldestNick = %checkNick
}
inc %k
}
; Clone-Info ausgeben
echo $color(info) -ag [CLONE-SCANNER] $+($chr(3),$color(other text).dd) $chan
echo $color(info) -ag Clones gefunden: $+($chr(3),$color(text).dd) %cloneList
echo $color(info) -ag Host: $+($chr(3),$color(other text).dd) %currentHost $+($chr(3),$color(info).dd) Ältester Clone: $+($chr(3),$color(nick).dd) %oldestNick $+($chr(3),7) $+($chr(3),$color(other text).dd) (im Channel seit: $duration($nick($1,%oldestNick).idle) $+ )
echo -ag $str(-,50)
}
}
inc %i
}
if (%foundClones == 0) {
echo $color(info) -ag [CLONE-SCANNER] Keine Clones in $1 gefunden.
}
else {
echo $color(mode) -ag [CLONE-SCANNER] Insgesamt %foundClones Clone-Gruppen in $1 gefunden!
}
}
; Schneller Clone-Check für aktuellen Channel
alias clones {
scanClones $active
}
menu channel {
-
Clone-Scanner
.Clones scannen:/scanClones #
.Schnell-Scan:/clones
}
menu nicklist,query {
-
Verfolgen
.$1 Tracken:/prevnicks $1
}
alias prevnicks {
if (!$hget(join)) $nick!user nicktracker
var %a = 1,%s
while $hget(join,$address($1,2) $+ .nicknum. $+ %a) {
%s = %s $v1
inc %a
}
echo $color(nick) -ag [NICKTRACKER] $+($chr(3),$color(other text).dd) $1 auch bekannt als: $+($chr(3),$color(nick).dd) %s $+($chr(3),$color(other text).dd) ( $+ $address($1,2) $+ )
}
alias nicktracker {
if (!$hget(join)) hmake join 1000
hload join join.hsh
.timer 0 600 hsave join join.hsh
}