diff options
Diffstat (limited to 'ksirc/filters.pl')
-rw-r--r-- | ksirc/filters.pl | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/ksirc/filters.pl b/ksirc/filters.pl new file mode 100644 index 00000000..f7359714 --- /dev/null +++ b/ksirc/filters.pl @@ -0,0 +1,171 @@ +# +# Structure format is: +# $var[filter_number]{field} +# +# Defined fields: (* is required) +# SEARCH(*): search filter +# FROM(*): intput to subtitution regex +# TO(*): resultant to substitution regex +# DESC: description of filter rule +# + +$#KSIRC_FILTER = 0; + +print "*** Loading filter parser...\n"; + +$ksirc_dump = 0; + +sub hook_ksircfilter { + my($i) = 0; + for(; $i <= $#KSIRC_FILTER; $i++){ + eval{ + if($_[0] =~ m/$KSIRC_FILTER[$i]{'SEARCH'}/){ + $_[0] =~ s/$KSIRC_FILTER[$i]{'FROM'}/$KSIRC_FILTER[$i]{'TO'}/eeg; + } + }; + if ( $@ ){ + (my $error = $@ ) =~ s/before HERE.*//; + my $desc = $KSIRC_FILTER[$i]{'DESC'}; + splice(@KSIRC_FILTER, $i--, 1); + &tell("*\cbE\cb* Filter $desc disabled due to error: $error"); + } + } +} + +print "*** Filter Parser Loaded\n"; + +addhook("print", "ksircfilter"); + +sub cmd_ksircprintrule { + my($i) = 0; + for(; $i <= $#KSIRC_FILTER; $i++){ + print STDOUT "*** Rule $i " . $KSIRC_FILTER[$i]{DESC} . ": if ". $KSIRC_FILTER[$i]{SEARCH} . " then ". $KSIRC_FILTER[$i]{FROM} . " -> " . $KSIRC_FILTER[$i]{TO} . "\n"; + } +} + +addcmd("ksircprintrule"); +&docommand("^alias prule ksircprintrule"); + +# +# Addrule command takes 4 or arguments seperated by " key==value !!! key2==value2 ||| etc" +# 1. Name of rule +# 2. Pattern to search for +# 3. Substitution to take +# 4. Sub to make + +sub cmd_ksircappendrule { + my($rule, %PARSED); + foreach $rule (split(/ !!! /, $args)){ + my($key,$value) = split(/==/, $rule); + $PARSED{$key} = $value; + } + if($PARSED{'DESC'} && $PARSED{'SEARCH'} && $PARSED{'FROM'} && $PARSED{'TO'}){ + my($i) = $#KSIRC_FILTER + 1; + my($key, $value); + while(($key, $value) = each %PARSED){ + $KSIRC_FILTER[$i]{$key} = $value; + } +# &tell("*** Added rule: " . $KSIRC_FILTER[$i]{'DESC'} . "\n"); + } + else{ + print "*E* Parse Error in Rule, format is: name !!! search !!! from !!! to\n"; + } +} + +addcmd("ksircappendrule"); +&docommand("^alias arule ksircappendrule"); + +sub cmd_ksircclearrule { + @KSIRC_FILTER = (); +# &tell("*** ALL FILTER RULES ERASED - DEFAULTS ADDED\n"); +} + +&addcmd("ksircclearrule"); +&docommand("^alias crule ksircclearrule"); +&docommand("^crule"); + +sub cmd_ksircdelrule { + if($args =~ /^\d+$/){ + splice(@KSIRC_FILTER, $args, 1); + print STDOUT "*** Deleted rule: $args\n"; + } + else { + print STDOUT "*E* Syntax is ksircdelrule <rule number>\n"; + } +} + +&addcmd("ksircdelrule"); +&docommand("^alias drule ksircdelrule"); + +sub hook_pong_lag { + if($_[0] =~ /.*:LAG ([0-9.]+)/){ + my($_l) = $1; + my($_t) = kgettimeofday(); + $_t -= $_l; + #print "*** Diff: $_t\n"; + print "~!lag~*L* " . $_t . "\n"; + } +} + +&addhook("pong", "pong_lag"); + +sub cmd_lag { + my($_t) = kgettimeofday(); + # &docommand("^ctcp $nick LAG $_t"); + &docommand("^quote PING :LAG $_t"); + my $c; + foreach $c (@channels){ + if($WHO_IGNORE{uc("$c")} != 1){ + &docommand("^extnames $c"); + } + } +} + + +eval { +require 'sys/syscall.ph'; +}; + +if(! defined(&SYS_gettimeofday)){ + if(open(SYSCALL, "/usr/include/sys/syscall.h")){ + my(@line) = grep(/define\s+SYS_gettimeofday/, <SYSCALL>); + close SYSCALL; + print "*E* Strange syscall.h, SYS_gettimeofday defined more than once!\n" if $#line > 1; + my($line) = "@line"; + if($line =~ /SYS_gettimeofday\s+(\d+)/){ + eval "sub SYS_gettimeofday () {$1;}"; + print "*** Set time of day to: $1\n"; + } + } + + if(! defined(&SYS_gettimeofday)){ + eval 'sub SYS_gettimeofday () {78;}'; + print "*E* Unable to find SYS_gettimeofday, using LINUX default!\n"; + } +} + + +sub kgettimeofday { + local($failed) = 0; + local($TIMEVAL_T) = "LL"; + local($start) = pack($TIMEVAL_T, ()); + eval{ + (syscall( &SYS_gettimeofday, $start, 0) != -1) or $failed = 1; + }; + if(!$failed){ + my(@start) = unpack($TIMEVAL_T, $start); + $start[1] /= 1000000; + return $start[0] + $start[1]; + } + else { + return time(); + } +} + +&addcmd("lag"); + +sub hook_ksirc_notify_connected { + &print('~!all~`#ssfe#R reconnected'); +} + +&addhook("376", "ksirc_notify_connected"); # join on the "end of MOTD" |