aboutsummaryrefslogtreecommitdiffstats
path: root/.irssi/scripts/bitlbee_timestamp.pl
diff options
context:
space:
mode:
Diffstat (limited to '.irssi/scripts/bitlbee_timestamp.pl')
-rw-r--r--.irssi/scripts/bitlbee_timestamp.pl105
1 files changed, 105 insertions, 0 deletions
diff --git a/.irssi/scripts/bitlbee_timestamp.pl b/.irssi/scripts/bitlbee_timestamp.pl
new file mode 100644
index 0000000..7957d57
--- /dev/null
+++ b/.irssi/scripts/bitlbee_timestamp.pl
@@ -0,0 +1,105 @@
+use strict;
+use Data::Dumper;
+use vars qw($VERSION %IRSSI);
+use DateTime;
+
+$VERSION = '0.5';
+%IRSSI = (
+ authors => 'Tijmen "timing" Ruizendaal',
+ contact => 'tijmen.ruizendaal@gmail.com',
+ name => 'bitlbee_timestamp',
+ description => 'Replace Irssi\'s timestamps with those sent by BitlBee',
+ license => 'GPLv2',
+ url => 'http://the-timing.nl/stuff/irssi-bitlbee',
+ changed => '2010-05-01',
+);
+
+my $tf = Irssi::settings_get_str('timestamp_format');
+
+my $bitlbee_server; # server object
+my @control_channels; # mostly: &bitlbee, &facebook etc.
+init();
+
+sub init { # if script is loaded after connect
+ my @servers = Irssi::servers();
+ foreach my $server(@servers) {
+ if( $server->isupport('NETWORK') eq 'BitlBee' ){
+ $bitlbee_server = $server;
+ my @channels = $server->channels();
+ foreach my $channel(@channels) {
+ if( $channel->{mode} =~ /C/ ){
+ push @control_channels, $channel->{name} unless (grep $_ eq $channel->{name}, @control_channels);
+ }
+ }
+ }
+ }
+}
+# if connect after script is loaded
+Irssi::signal_add_last('event 005' => sub {
+ my( $server ) = @_;
+ if( $server->isupport('NETWORK') eq 'BitlBee' ){
+ $bitlbee_server = $server;
+ }
+});
+# if new control channel is synced after script is loaded
+Irssi::signal_add_last('channel sync' => sub {
+ my( $channel ) = @_;
+ if( $channel->{mode} =~ /C/ && $channel->{server}->{tag} eq $bitlbee_server->{tag} ){
+ push @control_channels, $channel->{name} unless (grep $_ eq $channel->{name}, @control_channels);
+ }
+});
+
+my $prev_date = '';
+
+sub privmsg {
+ my ($server, $data, $nick, $address) = @_;
+
+ # What we need to match: ^B[^B^B^B2010-03-21 16:33:41^B]^B
+
+ if( $server->{tag} eq $bitlbee_server->{tag} ){
+
+ my ($target, $text) = split(/ :/, $data, 2);
+
+ #if( $text =~ /^B[^B^B^B[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}^B]^B/ ){
+
+ if( $text =~ /\x02\[\x02\x02\x02.*\x02\]\x02/ ){
+ my $window;
+ my $timestamp = $text;
+ my $time;
+ my $date;
+ $timestamp =~ s/.*\x02\[\x02\x02\x02(.*?)\x02\]\x02.*/$1/g;
+ $text =~ s/\x02\[\x02\x02\x02(.*?)\x02\]\x02 //g;
+
+ ($date, $time) = split(/ /, $timestamp);
+ if( !$time ){ # the timestamp doesn't have a date
+ $time = $date;
+ # use today as date
+ $date = DateTime->now->ymd;
+ }
+
+ if( $date ne $prev_date ){
+ if( $target =~ /#|&/ ){ # find channel window based on target
+ $window = Irssi::window_find_item($target);
+ } else { # find query window based on nick
+ $window = Irssi::window_find_item($nick);
+ }
+ if( $window != undef ){
+ my($year, $month, $day) = split(/-/, $date);
+ my $dt = DateTime->new(year => $year, month => $month, day => $day);
+ my $formatted_date = $day.' '.$dt->month_abbr.' '.$year;
+
+ $window->print('Day changed to '.$formatted_date, MSGLEVEL_NEVER);
+ }
+ }
+ $prev_date = $date;
+
+ Irssi::settings_set_str('timestamp_format', $time);
+ Irssi::signal_continue($server, $target . ' :' . $text, $nick, $address);
+ my $escaped = $tf;
+ $escaped =~ s/%/%%/g;
+ Irssi::settings_set_str('timestamp_format', $tf);
+ }
+ }
+}
+
+Irssi::signal_add('event privmsg', 'privmsg');