Make sure we don't leave pids in the pidwait_*() list once we're done with our forked...
[twirssi-net-twitter-lite.git] / twirssi.pl
index a52823fbfc00a468d24a122625214a47f436e211..eb878bf205db717e4a49b7abeec4bbb4c712e11e 100644 (file)
@@ -11,7 +11,7 @@ $Data::Dumper::Indent = 1;
 
 use vars qw($VERSION %IRSSI);
 
-$VERSION = "2.2.5beta";
+$VERSION = "2.2.6beta";
 my ($REV) = '$Rev: 687 $' =~ /(\d+)/;
 %IRSSI = (
     authors     => 'Dan Boger',
@@ -38,6 +38,7 @@ my %tweet_cache;
 my %id_map;
 my $failwhale  = 0;
 my $first_call = 1;
+my $child_pid;
 
 my %irssi_to_mirc_colors = (
     '%k' => '01',
@@ -499,6 +500,17 @@ sub cmd_login {
         ssl      => Irssi::settings_get_bool("twirssi_avoid_ssl") ? 0 : 1,
     );
 
+    unless ($twit) {
+        &notice("Failed to create Net::$service object!  Aborting.");
+        return;
+    }
+
+    if ( my $timeout = Irssi::settings_get_int("twitter_timeout")
+        and $twit->can('ua') )
+    {
+        $twit->ua->timeout($timeout);
+    }
+
     unless ( $twit->verify_credentials() ) {
         &notice("Login as $user\@$service failed");
         $twit = undef;
@@ -765,13 +777,13 @@ sub get_updates {
 
     my ( $fh, $filename ) = File::Temp::tempfile();
     binmode( $fh, ":utf8" );
-    my $pid = fork();
+    $child_pid = fork();
 
-    if ($pid) {    # parent
+    if ($child_pid) {    # parent
         Irssi::timeout_add_once( 5000, 'monitor_child',
             [ "$filename.done", 0 ] );
-        Irssi::pidwait_add($pid);
-    } elsif ( defined $pid ) {    # child
+        Irssi::pidwait_add($child_pid);
+    } elsif ( defined $child_pid ) {    # child
         close STDIN;
         close STDOUT;
         close STDERR;
@@ -1211,6 +1223,9 @@ sub monitor_child {
                 delete $tweet_cache{$_};
             }
             $last_poll = $new_last_poll;
+            
+            # make sure the pid is removed from the waitpid list
+            Irssi::pidwait_remove($child_pid);
 
             # save id_map hash
             if ( keys %id_map
@@ -1511,6 +1526,7 @@ Irssi::settings_add_str( "twirssi", "twirssi_replies_store",
     ".irssi/scripts/twirssi.json" );
 
 Irssi::settings_add_int( "twirssi", "twitter_friends_poll", 600 );
+Irssi::settings_add_int( "twirssi", "twitter_timeout",      30 );
 
 Irssi::settings_add_bool( "twirssi", "twirssi_upgrade_beta",      0 );
 Irssi::settings_add_bool( "twirssi", "tweet_to_away",             0 );
@@ -1582,11 +1598,22 @@ if ($window) {
     Irssi::command_bind(
         "twirssi_version",
         sub {
-            &notice("Twirssi v$VERSION (r$REV); "
-                  . "Net::Twitter v$Net::Twitter::VERSION. "
+            &notice(
+                "Twirssi v$VERSION (r$REV); "
+                  . (
+                    $Net::Twitter::VERSION
+                    ? "Net::Twitter v$Net::Twitter::VERSION. "
+                    : ""
+                  )
+                  . (
+                    $Net::Identica::VERSION
+                    ? "Net::Identica v$Net::Identica::VERSION. "
+                    : ""
+                  )
                   . "JSON in use: "
                   . JSON::Any::handler()
-                  . ".  See details at http://twirssi.com/" );
+                  . ".  See details at http://twirssi.com/"
+            );
         }
     );
     Irssi::command_bind(
@@ -1613,6 +1640,22 @@ if ($window) {
             sub { &notice("Device updated to $_[0]"); }
         )
     );
+    Irssi::command_bind(
+        "twitter_block",
+        &gen_cmd(
+            "/twitter_block <username>",
+            "create_block",
+            sub { &notice("Blocked $_[0]"); }
+        )
+    );
+    Irssi::command_bind(
+        "twitter_unblock",
+        &gen_cmd(
+            "/twitter_unblock <username>",
+            "destroy_block",
+            sub { &notice("Unblock $_[0]"); }
+        )
+    );
     Irssi::signal_add_last( 'complete word' => \&sig_complete );
 
     &notice("  %Y<%C(%B^%C)%N                   TWIRSSI v%R$VERSION%N (r$REV)");