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 <arrayname>
# 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.
