renames, add irssi scripts
[shutils.git] / dotfiles / irssi / scripts / topic-diff.pl
diff --git a/dotfiles/irssi/scripts/topic-diff.pl b/dotfiles/irssi/scripts/topic-diff.pl
new file mode 100644 (file)
index 0000000..6082c81
--- /dev/null
@@ -0,0 +1,86 @@
+use strict;
+use vars qw($VERSION %IRSSI);
+
+use Irssi;
+
+$VERSION = '1.00';
+%IRSSI = (
+    authors     => 'Pascal Hakim',
+    contact     => 'pasc@redellipse.net',
+    name        => 'topic-diff',
+    description => 'This script shows you changes in the topic. ',
+    license     => 'GPL'
+);
+
+my %topics;
+
+sub new_channel {
+    my ($channel) = @_;
+    $topics{$channel->{server}->{tag}."_".$channel->{name}} = $channel->{topic};
+}
+
+sub new_topic {
+    my ($server, $channel, $topic, $user, $real) = @_;
+    my $i;
+    my $diff;
+    my $i = 0;
+    my $j = 0;
+    my $k = 0;
+    
+#    $server->print ($channel, $server->{tag});
+
+    if ($topics{$server->{tag}."_".$channel}) {
+       $topics{$server->{tag}."_".$channel} =~ s/^ +| +$//g;
+       $topic =~ s/^ +| +$//g;
+       my @original = split /\s*\|\s*|\s+-\s+/, $topics{$server->{tag}."_".$channel};
+       my @modified = split /\s*\|\s*|\s+-\s+/, $topic;
+       
+       
+      outer: while( $i <= $#original) {
+         if ($j <= $#modified && $original[$i] eq $modified[$j]) {
+             $modified[$j] = '';
+             $i += 1;
+             $j += 1;
+             next;
+             
+         }  else {
+             # First two don't match, check the rest of the list
+             for ($k = $j ; $k <= $#modified; $k++) {
+                 if ($modified[$k] eq $original[$i])
+                 {       
+                     $modified[$k] = '';
+                     $i += 1;
+                     next outer;
+                 }
+             }
+             $diff = ($diff ? $diff." | " : "").$original[$i];
+             $i += 1;
+         }
+      }
+       
+       
+       if ($diff ne '') { $server->print ($channel, "Topic: -: ".$diff);}
+       
+       $diff = join " | ", (grep {$_ ne ''} @modified);
+
+       if ($diff ne '') { $server->print ($channel, "Topic: +: ".$diff);}
+       
+    }
+    $topics{$server->{tag}."_".$channel} = $topic;
+
+}
+
+
+# Start by reading all the channels currently opened, and recording their topic
+
+my @channels = Irssi::channels () ;
+
+foreach my $channel (@channels) {
+       $topics{$channel->{server}->{tag}."_".$channel->{name}} = $channel->{topic};
+}
+
+# Topic has changed
+Irssi::signal_add 'message topic' => \& new_topic;
+
+# We've joined a new channel
+Irssi::signal_add 'channel joined' => \& new_channel;