Просмотр исходного кода

New "mIRC6hack" format to work around braindead mIRC6 logging

Christoph Berg 22 лет назад
Родитель
Сommit
1c2db47faf
3 измененных файлов с 140 добавлено и 2 удалено
  1. 1 0
      docs/Changelog
  2. 16 2
      docs/FORMATS
  3. 123 0
      modules/Pisg/Parser/Format/mIRC6hack.pm

+ 1 - 0
docs/Changelog

@@ -4,6 +4,7 @@ pisg (0.61) - ??
    * Fix & conversion.
    * Fix & conversion.
    * More nick sanitizing.
    * More nick sanitizing.
    * Remove whitespace around user pictures, border="0", title.
    * Remove whitespace around user pictures, border="0", title.
+   * New "mIRC6hack" format to work around braindead mIRC6 logging.
    * docs/:
    * docs/:
      + Nicer Makefile.
      + Nicer Makefile.
      + Write a single HTML file.
      + Write a single HTML file.

+ 16 - 2
docs/FORMATS

@@ -15,12 +15,26 @@ link to the logfile)
   - Version 6.x of mIRC
   - Version 6.x of mIRC
 
 
   - Same as mIRC except it uses a retarded logging format that makes modes
   - Same as mIRC except it uses a retarded logging format that makes modes
-    indeciperable from actions
+    indeciperable from actions (which is a nightmare to parse)
 
 
-  - Don't use it if you can avoid it, it dosnt do very well at understanding modes
+  - DON'T USE IT if you can avoid it, it doesn't do very well at understanding
+    modes (see the "mIRC6hack" format)
 
 
   - In order to use this, format must be set to 'mIRC6'.
   - In order to use this, format must be set to 'mIRC6'.
 
 
+* mIRC6hack:
+  - Version 6.x of mIRC using a logging script to produce a saner output
+
+  - Same as mIRC6 except it uses '**' for actions
+
+  - In order to use this, format must be set to 'mIRC6hack', and the following
+    be added to the remote script section: (thanks to virtuall)
+
+    on ^1:ACTION:*:*: {
+      haltdef
+      echo $chan ** $nick $1-
+    }
+
 * mIRC:
 * mIRC:
   - A client for Windows (www.mirc.com)
   - A client for Windows (www.mirc.com)
   
   

+ 123 - 0
modules/Pisg/Parser/Format/mIRC6hack.pm

@@ -0,0 +1,123 @@
+package Pisg::Parser::Format::mIRC6hack;
+
+# Documentation for the Pisg::Parser::Format modules is found in Template.pm
+
+use strict;
+$^W = 1;
+
+sub new
+{
+    my ($type, %args) = @_;
+    my $self = {
+        cfg => $args{cfg},
+        normalline => '^\[(\d+):\d+:?\d*\] <([^>]+)> (.*)',
+        actionline  => '^\[(\d+):\d+:?\d*\] \*\* (\S+) (.+)',
+        thirdline  => '^\[(\d+):(\d+):?\d*\] \* (.+)'
+    };
+
+    bless($self, $type);
+    return $self;
+}
+
+sub normalline
+{
+    my ($self, $line, $lines) = @_;
+    my %hash;
+
+    if ($line =~ /$self->{normalline}/o) {
+
+        $hash{hour}   = $1;
+        $hash{saying} = $3;
+        ($hash{nick}  = $2) =~ s/^[@%\+]//o; # Remove prefix
+
+        return \%hash;
+    } else {
+        return;
+    }
+}
+
+sub actionline
+{
+    my ($self, $line, $lines) = @_;
+    my %hash;
+
+    if ($line =~ /$self->{actionline}/o) {
+
+        $hash{hour}   = $1;
+        $hash{saying} = $3;
+        ($hash{nick}  = $2) =~ s/^[@%\+]//o; # Remove prefix
+
+        return \%hash;
+    } else {
+        return;
+    }
+}
+
+sub thirdline
+{
+    my ($self, $line, $lines, $action) = @_;
+    my %hash;
+
+    if ($line =~ /$self->{thirdline}/o) {
+
+        my @line = split(/\s/, $3);
+
+        $hash{hour} = $1;
+        $hash{min}  = $2;
+        $hash{saying} = $3;
+        ($hash{nick} = $line[0]) =~ s/^[@%\+]//o; # Remove prefix
+
+        if ($#line >= 4 && ($line[1].$line[2]) eq 'waskicked' && ($line[$#line] =~ /\)$/)) {
+                $hash{kicker} = $line[4];
+
+        } elsif ($#line >= 4 && ($line[1].$line[2]) eq 'werekicked' && ($line[$#line] =~ /\)$/)) {
+                $hash{kicker} = $line[4];
+                $hash{nick} = $self->{cfg}{maintainer};
+
+        } elsif ($#line >= 4 && ($line[1] eq 'changes') && ($line[$#line] =~ /\'$/)) {
+                $hash{newtopic} = join(' ', @line[4..$#line]);
+                $hash{newtopic} =~ s/^'//;
+                $hash{newtopic} =~ s/'$//;
+
+        } elsif ($#line >= 3 && ($line[1].$line[2]) eq 'setsmode:') {
+            $hash{newmode} = $line[3];
+
+        } elsif ($#line == 4 && ($line[2].$line[3]) eq 'hasjoined') {
+            $hash{newjoin} = $line[0];
+
+        } elsif ($#line == 5 && ($line[2].$line[3]) eq 'nowknown') {
+            $hash{newnick} = $line[5];
+
+        } elsif ($action) {
+            if (
+                ($hash{saying} =~ /^Set by \S+ on \S+ \S+ \d+ \d+:\d+:\d+/) ||
+                ($hash{saying} =~ /^Now talking in #\S+/) ||  
+                ($hash{saying} =~ /^Topic is \'.*\'/) ||  
+                ($hash{saying} =~ /^Disconnected/) ||  
+                ($hash{saying} =~ /^\S+ has quit IRC \(.+\)/) ||  
+                ($hash{saying} =~ /^\S+ has left \#\S+/) ||  
+                ($hash{saying} =~ /^\S+\s\S+ has left \#\S+/) ||
+                ($hash{saying} =~ /^\S+\s\S+ Quit \S+/) ||
+                ($hash{saying} eq "You're not channel operator") ||
+                ($hash{nick} eq 'Attempting' && $hash{saying} =~ /^to rejoin channel/) ||  
+                ($hash{nick} eq 'Rejoined' && $hash{saying} =~ /^channel/) ||  
+                ($hash{saying} =~ /^Retrieving #\S+ info\.\.\./)
+              ) {
+                return 0;
+            } else {
+                $hash{saying} =~ s/^\Q$hash{nick}\E //;
+                return \%hash;
+            }
+
+        } else {
+            return;
+        }
+
+        return \%hash
+            unless ($action);
+
+    }
+    return;
+}
+
+1;