]> git.sommitrealweird.co.uk Git - twirssi-net-twitter-lite.git/blobdiff - twirssi.pl
Work around a bug in irssi on gentoo, leading to random zombies lurching about
[twirssi-net-twitter-lite.git] / twirssi.pl
index b7c1eade0953840969e8f2d8b1042742f2025687..267db1114d01e79c6f437a22e70544f9eb1d7552 100644 (file)
@@ -7,11 +7,12 @@ use File::Temp;
 use LWP::Simple;
 use Data::Dumper;
 use Encode;
 use LWP::Simple;
 use Data::Dumper;
 use Encode;
+use POSIX qw/:sys_wait_h/;
 $Data::Dumper::Indent = 1;
 
 use vars qw($VERSION %IRSSI);
 
 $Data::Dumper::Indent = 1;
 
 use vars qw($VERSION %IRSSI);
 
-$VERSION = "2.3.3";
+$VERSION = "2.3.4beta";
 %IRSSI   = (
     authors     => 'Dan Boger',
     contact     => 'zigdon@gmail.com',
 %IRSSI   = (
     authors     => 'Dan Boger',
     contact     => 'zigdon@gmail.com',
@@ -178,24 +179,23 @@ sub cmd_retweet_as {
     my $modified = $data;
     $data = &shorten($text);
 
     my $modified = $data;
     $data = &shorten($text);
 
-    return if &too_long($data);
+    return if $modified and &too_long($data);
 
     my $success = 1;
     eval {
 
     my $success = 1;
     eval {
-        if ($modified) {
+        if ($modified)
+        {
             $success = $twits{$username}->update(
                 {
                     status => $data,
 
                     # in_reply_to_status_id => $id_map{ lc $nick }[$id]
                 }
             $success = $twits{$username}->update(
                 {
                     status => $data,
 
                     # in_reply_to_status_id => $id_map{ lc $nick }[$id]
                 }
-            )
+            );
         } else {
         } else {
-            $success = $twits{$username}->retweet(
-                {
-                    id => $id_map{ lc $nick }[$id]
-                }
-            )
+            $success =
+              $twits{$username}->retweet( { id => $id_map{ lc $nick }[$id] } );
+            $success = $success->{id} if ref $success;
         }
         &notice("Update failed") unless $success;
     };
         }
         &notice("Update failed") unless $success;
     };
@@ -969,8 +969,7 @@ sub do_updates {
     }
 
     foreach my $t ( reverse @$tweets ) {
     }
 
     foreach my $t ( reverse @$tweets ) {
-        my $text = decode_entities( $t->{text} );
-        $text =~ s/[\n\r]/ /g;
+        my $text = &get_text( $t, $obj );
         my $reply = "tweet";
         if (    Irssi::settings_get_bool("show_reply_context")
             and $t->{in_reply_to_screen_name} ne $username
         my $reply = "tweet";
         if (    Irssi::settings_get_bool("show_reply_context")
             and $t->{in_reply_to_screen_name} ne $username
@@ -989,13 +988,7 @@ sub do_updates {
             $context = $cache->{ $t->{in_reply_to_status_id} };
 
             if ($context) {
             $context = $cache->{ $t->{in_reply_to_status_id} };
 
             if ($context) {
-                my $ctext = decode_entities( $context->{text} );
-                $ctext =~ s/[\n\r]/ /g;
-                if ( $context->{truncated} and ref($obj) ne 'Net::Identica' ) {
-                    $ctext .=
-                        " -- http://twitter.com/$context->{user}{screen_name}"
-                      . "/status/$context->{id}";
-                }
+                my $ctext = &get_text( $context, $obj );
                 printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
                   $context->{id}, $username,
                   $context->{user}{screen_name}, $ctext;
                 printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
                   $context->{id}, $username,
                   $context->{user}{screen_name}, $ctext;
@@ -1005,10 +998,6 @@ sub do_updates {
         next
           if $t->{user}{screen_name} eq $username
               and not Irssi::settings_get_bool("show_own_tweets");
         next
           if $t->{user}{screen_name} eq $username
               and not Irssi::settings_get_bool("show_own_tweets");
-        if ( $t->{truncated} and ref($obj) ne 'Net::Identica' ) {
-            $text .= " -- http://twitter.com/$t->{user}{screen_name}"
-              . "/status/$t->{id}";
-        }
         printf $fh "id:%s account:%s nick:%s type:%s %s\n",
           $t->{id}, $username, $t->{user}{screen_name}, $reply, $text;
         $new_poll_id = $t->{id} if $new_poll_id < $t->{id};
         printf $fh "id:%s account:%s nick:%s type:%s %s\n",
           $t->{id}, $username, $t->{user}{screen_name}, $reply, $text;
         $new_poll_id = $t->{id} if $new_poll_id < $t->{id};
@@ -1040,12 +1029,7 @@ sub do_updates {
         next
           if exists $friends{ $t->{user}{screen_name} };
 
         next
           if exists $friends{ $t->{user}{screen_name} };
 
-        my $text = decode_entities( $t->{text} );
-        $text =~ s/[\n\r]/ /g;
-        if ( $t->{truncated} ) {
-            $text .= " -- http://twitter.com/$t->{user}{screen_name}"
-              . "/status/$t->{id}";
-        }
+        my $text = &get_text( $t, $obj );
         printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
           $t->{id}, $username, $t->{user}{screen_name}, $text;
         $new_poll_id = $t->{id} if $new_poll_id < $t->{id};
         printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
           $t->{id}, $username, $t->{user}{screen_name}, $text;
         $new_poll_id = $t->{id} if $new_poll_id < $t->{id};
@@ -1111,8 +1095,7 @@ sub do_updates {
               $search->{max_id}, $username, $topic;
 
             foreach my $t ( reverse @{ $search->{results} } ) {
               $search->{max_id}, $username, $topic;
 
             foreach my $t ( reverse @{ $search->{results} } ) {
-                my $text = decode_entities( $t->{text} );
-                $text =~ s/[\n\r]/ /g;
+                my $text = &get_text( $t, $obj );
                 printf $fh "id:%s account:%s nick:%s type:search topic:%s %s\n",
                   $t->{id}, $username, $t->{from_user}, $topic, $text;
                 $new_poll_id = $t->{id}
                 printf $fh "id:%s account:%s nick:%s type:search topic:%s %s\n",
                   $t->{id}, $username, $t->{from_user}, $topic, $text;
                 $new_poll_id = $t->{id}
@@ -1158,8 +1141,7 @@ sub get_timeline {
     }
 
     foreach my $t ( reverse @$tweets ) {
     }
 
     foreach my $t ( reverse @$tweets ) {
-        my $text = decode_entities( $t->{text} );
-        $text =~ s/[\n\r]/ /g;
+        my $text = &get_text( $t, $obj );
         my $reply = "tweet";
         if (    Irssi::settings_get_bool("show_reply_context")
             and $t->{in_reply_to_screen_name} ne $username
         my $reply = "tweet";
         if (    Irssi::settings_get_bool("show_reply_context")
             and $t->{in_reply_to_screen_name} ne $username
@@ -1178,23 +1160,13 @@ sub get_timeline {
             $context = $cache->{ $t->{in_reply_to_status_id} };
 
             if ($context) {
             $context = $cache->{ $t->{in_reply_to_status_id} };
 
             if ($context) {
-                my $ctext = decode_entities( $context->{text} );
-                $ctext =~ s/[\n\r]/ /g;
-                if ( $context->{truncated} and ref($obj) ne 'Net::Identica' ) {
-                    $ctext .=
-                        " -- http://twitter.com/$context->{user}{screen_name}"
-                      . "/status/$context->{id}";
-                }
+                my $ctext = &get_text( $context, $obj );
                 printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
                   $context->{id}, $username,
                   $context->{user}{screen_name}, $ctext;
                 $reply = "reply";
             }
         }
                 printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
                   $context->{id}, $username,
                   $context->{user}{screen_name}, $ctext;
                 $reply = "reply";
             }
         }
-        if ( $t->{truncated} and ref($obj) ne 'Net::Identica' ) {
-            $text .= " -- http://twitter.com/$t->{user}{screen_name}"
-              . "/status/$t->{id}";
-        }
         printf $fh "id:%s account:%s nick:%s type:%s %s\n",
           $t->{id}, $username, $t->{user}{screen_name}, $reply, $text;
         $last_id = $t->{id} if $last_id < $t->{id};
         printf $fh "id:%s account:%s nick:%s type:%s %s\n",
           $t->{id}, $username, $t->{user}{screen_name}, $reply, $text;
         $last_id = $t->{id} if $last_id < $t->{id};
@@ -1214,6 +1186,9 @@ sub monitor_child {
       if &debug;
     my ($new_last_poll);
 
       if &debug;
     my ($new_last_poll);
 
+    # reap any random leftover processes - work around a bug in irssi on gentoo
+    waitpid(-1, WNOHANG);
+
     # first time we run we don't want to print out *everything*, so we just
     # pretend
 
     # first time we run we don't want to print out *everything*, so we just
     # pretend
 
@@ -1687,6 +1662,25 @@ sub normalize_username {
     return "$username\@$service";
 }
 
     return "$username\@$service";
 }
 
+sub get_text {
+    my $tweet  = shift;
+    my $object = shift;
+    my $text   = decode_entities( $tweet->{text} );
+    if ( $tweet->{truncated} ) {
+        if ( exists $tweet->{retweeted_status} ) {
+            $text = "RT \@$tweet->{retweeted_status}{user}{screen_name}: "
+              . "$tweet->{retweeted_status}{text}";
+        } elsif ( $object->isa('Net::Twitter') ) {
+            $text .= " -- http://twitter.com/$tweet->{user}{screen_name}"
+              . "/status/$tweet->{id}";
+        }
+    }
+
+    $text =~ s/[\n\r]/ /g;
+
+    return $text;
+}
+
 Irssi::signal_add( "send text", "event_send_text" );
 
 Irssi::theme_register(
 Irssi::signal_add( "send text", "event_send_text" );
 
 Irssi::theme_register(