if (word(2 $loadinfo()) != [pf]) { load -pf $word(1 $loadinfo()); return; }; # NETSPLIT 7 - This script does it's best to suppress the excessive # joins and signoffs due ONLY to netsplits. It should pass regular # signoffs. Need at least ircII2.2pre6 # Version II handles multiple channels. (mycroft) # Version III ignores bogus signoff messages # Version IV handles multiple splits. # Version V handles multiple splits and ignores bogus signoff messages. also # adds timestamps to split/join messages # Version VI For ircII2.2pre8 and beyond. Uses encode() and decode() # Version VII Fixed a problem with encode() and decode() and case # sensitive channel names, + adding lformat() # # This one by Daemon # CONVERTED for ircII2.2pre8 # Version V by poxaV (cgw@unt.edu), from Daemon's code # modified last 7-03-93 #shows the current time in HH:MM:SS format ^alias currtime @ function_return = strftime(%T); # This function tests for bogus splits. ^alias isbogus { ^if ([$3]) { @ function_return = 1; }; ^if (rmatch(.$1. $isbogus.pats *..*)) { @ function_return = 1; }; ^if (rmatch(.$2. $isbogus.pats *..*)) { @ function_return = 1; }; }; # Add patterns.. like /boguspat *bonk* *thud* *haha* # that will NOT be treated as server names.. ^alias boguspat { ^assign isbogus.pats $isbogus.pats $*;echo $* added; } ; # Next two are pretty obvious ^alias boguslist { echo Pats: $isbogus.pats; }; ^alias bogusclear { ^assign -isbogus.pats;echo Bogus list clean; }; # If first word in Signoff contains a period then assume servername # and thus a a split. Stash in assoc array. ^ON ^CHANNEL_SIGNOFF "% % %.% %.%" { if (isbogus($1-)) { xecho -b Signoff: $1 \($2-\); } { ^netbroke $encode($tolower($0)) $encode($1) $encode($2).$encode($3) $2 $3; }; }; # Stuff array. Tell us what server broke and set split flag. ^alias netbroke { @ signcross[$2][$0][$1] = 1; @ signoffs[$0][$1] = [$2]; @ splittime[$2] = time(); ^if ( !isbroke[$2] ) { xecho -b -level OPNOTES Netsplit at $currtime() \($3-\); @ isbroke[$2] = 1; @ splitname[$2] = [$3-]; }; }; # When a person joins a channel.. Check them against the array. # If they are in array, then remove silently. Otherwards echo normally ^ON ^JOIN * { ^netjoined $encode($tolower($1)) $encode($0) $1 $0 $USERHOST(); }; # Unset the split flag ^alias netjoined { if ( signoffs[$0][$1] ) { ^if ( isbroke[$signoffs[$0][$1]] ) { xecho -b -level OPNOTES Netjoined at $currtime() \($splitname[$signoffs[$0][$1]]\); }; ^assign -isbroke[$signoffs[$0][$1]]; ^assign -signcross[$signoffs[$0][$1]][$0][$1]; ^assign -signoffs[$0][$1]; } else { xecho -b $3 \($4-\) has joined channel $2; }; }; # Clear the array every 10 minutes to prevent excess garbage ^on #^timer 70 * { netclean; }; ^alias netclean { foreach splittime ii { foreach splittime.$(ii) jj { if ( time() - splittime.$(ii).$(jj) > 300 ) { foreach signcross.$(ii).$(jj) xx { foreach signcross.$(ii).$(jj).$(xx) yy { @ signcross.$(ii).$(jj).$(xx).$(yy) = signoffs.$(xx).$(yy) = [] }; }; @ xx = yy = isbroke.$(ii).$(jj) = splitname.$(ii).$(jj) = splittime.$(ii).$(jj) = []; }; }; }; }; ^alias netpurge { purge isbroke; purge splitname; purge splittime; purge signcross; purge signoffs; }; # If you want to suppress mode changes by servers.. (usually after a split) # then uncomment next line # ^on ^mode "%.%" # # If you want to look an array.. Type /show # Lists keys and contents ^alias showsplit { if ( [$($0)] ) { echo $0 $($0); }; foreach $0 ii { showsplit $0.$ii; }; ^assign -ii; }; ^alias purge { foreach $0 ii { purge $0.$ii; }; ^assign -ii; ^assign -$0; }; ^alias wholeft { foreach signoffs ii { foreach signoffs.$ii jj { echo $lformat(15 $decode($ii)) $lformat(10 $decode($jj)) $splitname[$signoffs[$ii][$jj]]; }; }; ^assign -ii; ^assign -jj; }; # format and lformat differ from $[-num]var and $[num]var in that # They don't chop off the string if it is too long. alias lformat (len, stuff) { if (@stuff < len) { return $([$len]stuff); } else { return $stuff; }; }; # Many people contributed to this script.