Merge branch 'master' of git://github.com/zigdon/twirssi master
authorBrett Parker <iDunno@sommitrealweird.co.uk>
Fri, 14 May 2010 15:16:55 +0000 (16:16 +0100)
committerBrett Parker <iDunno@sommitrealweird.co.uk>
Fri, 14 May 2010 15:16:55 +0000 (16:16 +0100)
Conflicts:
twirssi.pl

1  2 
twirssi.pl

diff --combined twirssi.pl
@@@ -8,12 -8,12 +8,12 @@@ use LWP::Simple
  use Data::Dumper;
  use Encode;
  use POSIX qw/:sys_wait_h/;
 -use Net::Twitter qw/3.05/;
 +use Net::Twitter::Lite
  $Data::Dumper::Indent = 1;
  
  use vars qw($VERSION %IRSSI);
  
- $VERSION = "2.4.1beta";
+ $VERSION = "2.4.2";
  %IRSSI   = (
      authors     => 'Dan Boger',
      contact     => 'zigdon@gmail.com',
@@@ -131,11 -131,6 +131,6 @@@ sub cmd_retweet 
  sub cmd_retweet_as {
      my ( $data, $server, $win ) = @_;
  
-     unless ( Irssi::settings_get_bool("twirssi_track_replies") ) {
-         &notice("twirssi_track_replies is required in order to reteet.");
-         return;
-     }
      return unless &logged_in($twit);
  
      $data =~ s/^\s+|\s+$//;
@@@ -296,13 -291,6 +291,6 @@@ sub cmd_reply 
  sub cmd_reply_as {
      my ( $data, $server, $win ) = @_;
  
-     unless ( Irssi::settings_get_bool("twirssi_track_replies") ) {
-         &notice("twirssi_track_replies is required in order to reply to "
-               . "specific tweets.  Either enable it, or just use /tweet "
-               . "\@username <text>." );
-         return;
-     }
      return unless &logged_in($twit);
  
      $data =~ s/^\s+|\s+$//;
@@@ -509,11 -497,76 +497,10 @@@ sub cmd_login 
      }
      $defservice = $service = ucfirst lc $service;
  
 -    if ( $service eq 'Twitter'
 -        and Irssi::settings_get_bool("twirssi_use_oauth") )
 -    {
 -        print "Attempting OAuth for $user\@$service" if &debug;
 -        eval {
 -            if ( $service eq 'Identica' )
 -            {
 -                $twit = Net::Twitter->new(
 -                    identica => 1,
 -                    traits   => [ 'API::REST', 'API::Search' ],
 -                    source   => "twirssi",
 -                    ssl      => !Irssi::settings_get_bool("twirssi_avoid_ssl"),
 -                );
 -            } else {
 -                $twit = Net::Twitter->new(
 -                    traits => [ 'API::REST', 'OAuth', 'API::Search' ],
 -                    consumer_key => 'BZVAvBma4GxdiRwXIvbnw',
 -                    consumer_secret =>
 -                      '0T5kahwLyb34vciGZsgkA9lsjtGCQ05vxVE2APXM',
 -                    source => "twirssi",
 -                    ssl    => !Irssi::settings_get_bool("twirssi_avoid_ssl"),
 -                );
 -            }
 -        };
 -
 -        if ($twit) {
 -            if ( open( OAUTH, Irssi::settings_get_str("twirssi_oauth_store") ) )
 -            {
 -                while (<OAUTH>) {
 -                    chomp;
 -                    next unless m/$user\@$service (\S+) (\S+)/i;
 -                    print "Trying cached oauth creds for $user\@$service"
 -                      if &debug;
 -                    $twit->access_token($1);
 -                    $twit->access_token_secret($2);
 -                    last;
 -                }
 -                close OAUTH;
 -            }
 -
 -            unless ( $twit->authorized ) {
 -                my $url;
 -                eval { $url = $twit->get_authorization_url; };
 -
 -                if ($@) {
 -                    &notice("ERROR: Failed to get OAuth authorization_url. "
 -                          . "Try again later." );
 -                    return;
 -                }
 -                &notice(
 -                    "Twirssi not autorized to access $service for $user.",
 -                    "Please authorize at the following url, then enter the pin",
 -                    "supplied with /twirssi_oauth $user\@$service <pin>",
 -                    $url
 -                );
 -
 -                $oauth{pending}{"$user\@$service"} = $twit;
 -                return;
 -            }
 -        }
 -    } else {
 -        $twit = Net::Twitter->new(
 -            $service eq 'Identica' ? ( identica => 1 ) : (),
 -            username => $user,
 -            password => $pass,
 -            source   => "twirssi",
 -            ssl      => Irssi::settings_get_bool("twirssi_avoid_ssl") ? 0 : 1,
 -        );
 -    }
 -
 +    $twit = Net::Twitter::Lite->new(
 +        username => $user,
 +        password => $pass,
 +    );
      unless ($twit) {
          &notice("Failed to create object!  Aborting.");
          return;
@@@ -626,7 -679,7 +613,7 @@@ sub verify_twitter_object 
      $poll = Irssi::timeout_add( &get_poll_time * 1000, \&get_updates, "" );
      &notice("Logged in as $user\@$service, loading friends list...");
      &load_friends();
-     &notice( "loaded friends: ". scalar keys %friends );
+     &notice( "loaded friends: " . scalar keys %friends );
      if ( Irssi::settings_get_bool("twirssi_first_run") ) {
          Irssi::settings_set_bool( "twirssi_first_run", 0 );
      }
@@@ -927,7 -980,7 +914,7 @@@ sub get_updates 
      return unless &logged_in($twit);
  
      my ( $fh, $filename ) = File::Temp::tempfile();
-     binmode( $fh, ":utf8" );
+     binmode( $fh, ":" . &get_charset );
      $child_pid = fork();
  
      if ($child_pid) {    # parent
@@@ -1041,9 -1094,31 +1028,31 @@@ sub do_updates 
          return undef;
      }
  
+     my @ignore_tags =
+       Irssi::settings_get_str("twirssi_ignored_tags")
+       ? split /\s*,\s*/, Irssi::settings_get_str("twirssi_ignored_tags")
+       : ();
+     my @strip_tags =
+       Irssi::settings_get_str("twirssi_stripped_tags")
+       ? split /\s*,\s*/, Irssi::settings_get_str("twirssi_stripped_tags")
+       : ();
      foreach my $t ( reverse @$tweets ) {
          my $text = &get_text( $t, $obj );
          my $reply = "tweet";
+         my $match = 0;
+         foreach my $tag (@ignore_tags) {
+             next unless $text =~ /\b\Q$tag\E\b/i;
+             $match = 1;
+             $text = "(ignored: $tag) $text" if &debug;
+             last;
+         }
+         next if not &debug and $match;
+         foreach my $tag (@strip_tags) {
+             $text =~ s/\b\Q$tag\E\b//gi;
+         }
          if (    Irssi::settings_get_bool("show_reply_context")
              and $t->{in_reply_to_screen_name} ne $username
              and $t->{in_reply_to_screen_name}
              }
  
              $id_map{__searches}{$username}{$topic} = $search->{max_id};
+             $topic =~ s/ /%20/g;
              printf $fh "id:%s account:%s type:searchid topic:%s\n",
                $search->{max_id}, $username, $topic;
  
@@@ -1266,7 -1342,7 +1276,7 @@@ sub monitor_child 
      # pretend
  
      if ( open FILE, $filename ) {
-         binmode FILE, ":utf8";
+         binmode FILE, ":" . &get_charset;
          my @lines;
          my %new_cache;
          while (<FILE>) {
              my %meta;
  
              foreach my $key (qw/id account nick type topic/) {
-                 if (s/^$key:(\S+)\s*//) {
+                 if (s/^$key:((?:\S|\\ )+)\s*//) {
                      $meta{$key} = $1;
+                     $meta{$key} =~ s/%20/ /g;
                  }
              }
  
              }
  
              my $marker = "";
-             if (    $meta{type} ne 'dm'
-                 and Irssi::settings_get_bool("twirssi_track_replies")
-                 and $meta{nick}
-                 and $meta{id} )
-             {
+             if ( $meta{type} ne 'dm' and $meta{nick} and $meta{id} ) {
                  $marker = ( $id_map{__indexes}{ $meta{nick} } + 1 ) % 100;
                  $id_map{ lc $meta{nick} }[$marker]           = $meta{id};
                  $id_map{__indexes}{ $meta{nick} }            = $marker;
              Irssi::pidwait_remove($child_pid);
  
              # and that we don't leave any zombies behind, somehow
-             wait();
+             waitpid( -1, WNOHANG );
  
              # save id_map hash
              if ( keys %id_map
      } else {
          print "Giving up on polling $filename" if &debug;
          Irssi::pidwait_remove($child_pid);
-         wait();
+         waitpid( -1, WNOHANG );
          unlink $filename unless &debug;
  
          return unless Irssi::settings_get_bool("twirssi_notify_timeouts");
                  q{      \\          a    |},
                  q{       ',.__.   ,__.-'/},
                  q{         '--/_.'----'`}
-               );
+             );
              $failwhale = 1;
          }
  
@@@ -1650,6 -1723,12 +1657,12 @@@ sub get_poll_time 
      return 60;
  }
  
+ sub get_charset {
+     my $charset = Irssi::settings_get_str("twirssi_charset");
+     return "utf8" if $charset =~ /^\s*$/;
+     return $charset;
+ }
  sub hilight {
      my $text = shift;
  
@@@ -1690,7 -1769,7 +1703,7 @@@ sub shorten 
                      "Set short_url_args to username,API_key or change your",
                      "short_url_provider."
                  );
-                 return decode "utf8", $data;
+                 return decode &get_charset, $data;
              }
          }
  
          }
      }
  
-     return decode "utf8", $data;
+     return decode &get_charset, $data;
  }
  
  sub normalize_username {
@@@ -1744,7 -1823,7 +1757,7 @@@ sub get_text 
          if ( exists $tweet->{retweeted_status} ) {
              $text = "RT \@$tweet->{retweeted_status}{user}{screen_name}: "
                . "$tweet->{retweeted_status}{text}";
 -        } elsif ( $object->isa('Net::Twitter') ) {
 +        } elsif ( $object->isa('Net::Twitter::Lite') ) {
              $text .= " -- http://twitter.com/$tweet->{user}{screen_name}"
                . "/status/$tweet->{id}";
          }
@@@ -1768,6 -1847,7 +1781,7 @@@ Irssi::theme_register
  );
  
  Irssi::settings_add_int( "twirssi", "twitter_poll_interval", 300 );
+ Irssi::settings_add_str( "twirssi", "twirssi_charset",         "utf8" );
  Irssi::settings_add_str( "twirssi", "twitter_window",          "twitter" );
  Irssi::settings_add_str( "twirssi", "bitlbee_server",          "bitlbee" );
  Irssi::settings_add_str( "twirssi", "short_url_provider",      "TinyURL" );
@@@ -1777,6 -1857,8 +1791,8 @@@ Irssi::settings_add_str( "twirssi", "tw
  Irssi::settings_add_str( "twirssi", "twirssi_default_service", "Twitter" );
  Irssi::settings_add_str( "twirssi", "twirssi_nick_color",      "%B" );
  Irssi::settings_add_str( "twirssi", "twirssi_topic_color",     "%r" );
+ Irssi::settings_add_str( "twirssi", "twirssi_ignored_tags",    "" );
+ Irssi::settings_add_str( "twirssi", "twirssi_stripped_tags",   "" );
  Irssi::settings_add_str( "twirssi", "twirssi_retweet_format",
      'RT $n: "$t" ${-- $c$}' );
  Irssi::settings_add_str( "twirssi", "twirssi_location",
@@@ -1795,7 -1877,6 +1811,6 @@@ Irssi::settings_add_bool( "twirssi", "s
  Irssi::settings_add_bool( "twirssi", "show_own_tweets",           1 );
  Irssi::settings_add_bool( "twirssi", "twirssi_debug",             0 );
  Irssi::settings_add_bool( "twirssi", "twirssi_first_run",         1 );
- Irssi::settings_add_bool( "twirssi", "twirssi_track_replies",     1 );
  Irssi::settings_add_bool( "twirssi", "twirssi_replies_autonick",  1 );
  Irssi::settings_add_bool( "twirssi", "twirssi_use_reply_aliases", 0 );
  Irssi::settings_add_bool( "twirssi", "twirssi_notify_timeouts",   1 );
@@@ -1867,8 -1948,8 +1882,8 @@@ if ($window) 
              &notice(
                  "Twirssi v$VERSION; "
                    . (
 -                    $Net::Twitter::VERSION
 -                    ? "Net::Twitter v$Net::Twitter::VERSION. "
 +                    $Net::Twitter::Lite::VERSION
 +                    ? "Net::Twitter v$Net::Twitter::Lite::VERSION. "
                      : ""
                    )
                    . (
      );
      Irssi::signal_add_last( 'complete word' => \&sig_complete );
  
-     &notice("  %Y<%C(%B^%C)%N                   TWIRSSI v%R$VERSION%N",
-             "   %C(_(\\%N           http://twirssi.com/ for full docs",
-             "    %Y||%C `%N Log in with /twitter_login, send updates with /tweet");
+     &notice(
+         "  %Y<%C(%B^%C)%N                   TWIRSSI v%R$VERSION%N",
+         "   %C(_(\\%N           http://twirssi.com/ for full docs",
+         "    %Y||%C `%N Log in with /twitter_login, send updates with /tweet"
+     );
  
      my $file = Irssi::settings_get_str("twirssi_replies_store");
      if ( $file and -r $file ) {