X-Git-Url: https://git.sommitrealweird.co.uk/twirssi-net-twitter-lite.git/blobdiff_plain/2492f53ab359ac856c8df4ff64305c4214cde461..66c32ba6d43d0dfc1d826d05ec550d0645fd24d7:/twirssi.pl diff --git a/twirssi.pl b/twirssi.pl index e6142cd..0dd07ca 100644 --- a/twirssi.pl +++ b/twirssi.pl @@ -10,8 +10,8 @@ $Data::Dumper::Indent = 1; use vars qw($VERSION %IRSSI); -$VERSION = "2.2.1beta"; -my ($REV) = '$Rev: 599 $' =~ /(\d+)/; +$VERSION = "2.2.2"; +my ($REV) = '$Rev: 615 $' =~ /(\d+)/; %IRSSI = ( authors => 'Dan Boger', contact => 'zigdon@gmail.com', @@ -20,7 +20,7 @@ my ($REV) = '$Rev: 599 $' =~ /(\d+)/; . 'Can optionally set your bitlbee /away message to same', license => 'GNU GPL v2', url => 'http://twirssi.com', - changed => '$Date: 2009-04-07 07:49:19 -0700 (Tue, 07 Apr 2009) $', + changed => '$Date: 2009-04-20 20:26:08 -0700 (Mon, 20 Apr 2009) $', ); my $window; @@ -133,7 +133,7 @@ sub cmd_retweet_as { $data =~ s/^\s+|\s+$//; my ( $username, $id, $data ) = split ' ', $data, 3; - unless ( $username ) { + unless ($username) { ¬ice("Usage: /retweet_as [comment]"); return; } @@ -552,12 +552,12 @@ sub cmd_add_search { return; } - if ( exists $id_map{__searches}{$user}{$data} ) { + if ( exists $id_map{__searches}{"$user\@$defservice"}{$data} ) { ¬ice("Already had a subscription for '$data'"); return; } - $id_map{__searches}{$user}{$data} = 1; + $id_map{__searches}{"$user\@$defservice"}{$data} = 1; ¬ice("Added subscription for '$data'"); } @@ -577,12 +577,12 @@ sub cmd_del_search { return; } - unless ( exists $id_map{__searches}{$user}{$data} ) { + unless ( exists $id_map{__searches}{"$user\@$defservice"}{$data} ) { ¬ice("No subscription found for '$data'"); return; } - delete $id_map{__searches}{$user}{$data}; + delete $id_map{__searches}{"$user\@$defservice"}{$data}; ¬ice("Removed subscription for '$data'"); } @@ -765,8 +765,9 @@ sub get_updates { my $new_poll = time; my $error = 0; + my %context_cache; foreach ( keys %twits ) { - $error += &do_updates( $fh, $_, $twits{$_} ); + $error++ unless &do_updates( $fh, $_, $twits{$_}, \%context_cache ); } my ( $added, $removed ) = &load_friends($fh); @@ -784,9 +785,9 @@ sub get_updates { if ($error) { print $fh "type:debug Update encountered errors. Aborted\n"; - print $fh $last_poll; + print $fh "-- $last_poll"; } else { - print $fh $new_poll; + print $fh "-- $new_poll"; } close $fh; exit; @@ -795,36 +796,46 @@ sub get_updates { } sub do_updates { - my ( $fh, $username, $obj ) = @_; + my ( $fh, $username, $obj, $cache ) = @_; my $rate_limit = $obj->rate_limit_status(); if ( $rate_limit and $rate_limit->{remaining_hits} < 1 ) { ¬ice("Rate limit exceeded for $username"); - return 1; + return undef; } print scalar localtime, " - Polling for updates for $username" if &debug; my $tweets; - eval { $tweets = $obj->friends_timeline(); }; + my $new_poll_id = 0; + eval { + if ( $id_map{__last_id}{$username}{timeline} ) + { + $tweets = $obj->friends_timeline( { count => 100 } ); + } else { + $tweets = $obj->friends_timeline(); + } + }; if ($@) { - print $fh - "type:debug Error during friends_timeline call: $@. Aborted.\n"; - return 1; + print $fh "type:debug Error during friends_timeline call: Aborted.\n"; + print $fh "type:debug : $_\n" foreach split /\n/, Dumper($@); + return undef; } unless ( ref $tweets ) { if ( $obj->can("get_error") ) { - my $error; + my $error = "Unknown error"; eval { $error = JSON::Any->jsonToObj( $obj->get_error() ) }; - if ($@) { $error = $obj->get_error() } - print $fh "type:debug API Error during friends_timeline call: ", - "$error Aborted.\n"; + unless ($@) { $error = $obj->get_error() } + print $fh + "type:debug API Error during friends_timeline call: Aborted\n"; + print $fh "type:debug : $_\n" foreach split /\n/, Dumper($error); + } else { print $fh "type:debug API Error during friends_timeline call. Aborted.\n"; } - return 1; + return undef; } foreach my $t ( reverse @$tweets ) { @@ -838,9 +849,14 @@ sub do_updates { { $nicks{ $t->{in_reply_to_screen_name} } = time; my $context; - eval { - $context = $obj->show_status( $t->{in_reply_to_status_id} ); - }; + unless ( $cache->{ $t->{in_reply_to_status_id} } ) { + eval { + $cache->{ $t->{in_reply_to_status_id} } = + $obj->show_status( $t->{in_reply_to_status_id} ); + }; + + } + $context = $cache->{ $t->{in_reply_to_status_id} }; if ($context) { my $ctext = decode_entities( $context->{text} ); @@ -854,12 +870,6 @@ sub do_updates { $context->{id}, $username, $context->{user}{screen_name}, $ctext; $reply = "reply"; - } elsif ($@) { - print $fh "type:debug request to get context failed: $@"; - } else { - print $fh -"type:debug Failed to get context from $t->{in_reply_to_screen_name}\n" - if &debug; } } next @@ -871,17 +881,27 @@ sub do_updates { } printf $fh "id:%d 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:%d account:%s type:last_id timeline\n", + $new_poll_id, $username; print scalar localtime, " - Polling for replies" if &debug; + $new_poll_id = 0; eval { - $tweets = $obj->replies( { since => HTTP::Date::time2str($last_poll) } ) - || []; + if ( $id_map{__last_id}{$username}{reply} ) + { + $tweets = $obj->replies( + { since_id => $id_map{__last_id}{$username}{reply} } ) + || []; + } else { + $tweets = $obj->replies() || []; + } }; if ($@) { print $fh "type:debug Error during replies call. Aborted.\n"; - return 1; + return undef; } foreach my $t ( reverse @$tweets ) { @@ -896,18 +916,26 @@ sub do_updates { } printf $fh "id:%d 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:%d account:%s type:last_id reply\n", $new_poll_id, $username; print scalar localtime, " - Polling for DMs" if &debug; + $new_poll_id = 0; eval { - $tweets = - $obj->direct_messages( { since => HTTP::Date::time2str($last_poll) } ) - || []; + if ( $id_map{__last_id}{$username}{dm} ) + { + $tweets = $obj->direct_messages( + { since_id => $id_map{__last_id}{$username}{dm} } ) + || []; + } else { + $tweets = $obj->direct_messages() || []; + } }; if ($@) { print $fh "type:debug Error during direct_messages call. Aborted.\n"; - return 1; + return undef; } foreach my $t ( reverse @$tweets ) { @@ -915,7 +943,9 @@ sub do_updates { $text = &hilight($text); printf $fh "id:%d account:%s nick:%s type:dm %s\n", $t->{id}, $username, $t->{sender_screen_name}, $text; + $new_poll_id = $t->{id} if $new_poll_id < $t->{id}; } + printf $fh "id:%d account:%s type:last_id dm\n", $new_poll_id, $username; print scalar localtime, " - Polling for subscriptions" if &debug; if ( $obj->can('search') and $id_map{__searches}{$username} ) { @@ -935,14 +965,13 @@ sub do_updates { if ($@) { print $fh "type:debug Error during search($topic) call. Aborted.\n"; - return 1; + return undef; } unless ( $search->{max_id} ) { - print $fh -"type:debug Invalid search results when searching for $topic.", - " Aborted.\n"; - return 1; + print $fh "type:debug Invalid search results when searching", + " for $topic. Aborted.\n"; + return undef; } $id_map{__searches}{$username}{$topic} = $search->{max_id}; @@ -954,13 +983,16 @@ sub do_updates { $text = &hilight($text); printf $fh "id:%d account:%s nick:%s type:search topic:%s %s\n", $t->{id}, $username, $t->{from_user}, $topic, $text; + $new_poll_id = $t->{id} + if not $new_poll_id + or $t->{id} < $new_poll_id; } } } print scalar localtime, " - Done" if &debug; - return 0; + return 1; } sub monitor_child { @@ -970,7 +1002,7 @@ sub monitor_child { print scalar localtime, " - checking child log at $filename ($attempt)" if &debug; - my $new_last_poll; + my ($new_last_poll); # first time we run we don't want to print out *everything*, so we just # pretend @@ -985,13 +1017,14 @@ sub monitor_child { last if /^__friends__/; my $hilight = 0; my %meta; + foreach my $key (qw/id account nick type topic/) { if (s/^$key:(\S+)\s*//) { $meta{$key} = $1; } } - if ( not $meta{type} or $meta{type} ne 'searchid' ) { + if ( not $meta{type} or $meta{type} !~ /searchid|last_id/ ) { if ( exists $meta{id} and exists $new_cache{ $meta{id} } ) { next; } @@ -1004,17 +1037,17 @@ sub monitor_child { } my $account = ""; - if ( lc $meta{account} ne lc "$user\@$defservice" ) { - $meta{account} =~ s/\@(\w+)$//; - my $service = $1; - if ( - lc $service eq - lc Irssi::settings_get_str("twirssi_default_service") ) - { - $account = "$meta{account}: "; - } else { - $account = "$meta{account}\@$service: "; - } + $meta{account} =~ s/\@(\w+)$//; + $meta{service} = $1; + if ( + lc $meta{service} eq + lc Irssi::settings_get_str("twirssi_default_service") ) + { + $account = "$meta{account}: " + if lc "$meta{account}\@$meta{service}" ne lc + "$user\@$defservice"; + } else { + $account = "$meta{account}\@$meta{service}: "; } my $marker = ""; @@ -1080,6 +1113,11 @@ sub monitor_child { } elsif (&debug) { print "Search '$meta{topic}' returned invalid id $meta{id}"; } + } elsif ( $meta{type} eq 'last_id' ) { + $id_map{__last_id}{"$meta{account}\@$meta{service}"}{$_} = + $meta{id} + if $id_map{__last_id}{"$meta{account}\@$meta{service}"}{$_} < + $meta{id}; } elsif ( $meta{type} eq 'error' ) { push @lines, [ MSGLEVEL_MSGS, $_ ]; } elsif ( $meta{type} eq 'debug' ) { @@ -1091,8 +1129,8 @@ sub monitor_child { %friends = (); while () { - if (/^\d+$/) { - $new_last_poll = $_; + if (/^-- (\d+)$/) { + ($new_last_poll) = ($1); last; } my ( $f, $t ) = split ' ', $_; @@ -1100,7 +1138,8 @@ sub monitor_child { } if ($new_last_poll) { - print "new last_poll = $new_last_poll" if &debug; + print "new last_poll = $new_last_poll" if &debug; + print "new last_poll_id = ", Dumper( $id_map{__last_id} ) if &debug; if ($suppress) { print "First call, not printing updates" if &debug; } else { @@ -1271,6 +1310,13 @@ sub sig_complete { keys %{ $id_map{__indexes} }; } + if ( $linestart =~ /^\/twitter_unfriend\s*$/ ) + { # /twitter_unfriend gets a nick + $word =~ s/^@//; + push @$complist, grep /^\Q$word/i, + sort { $nicks{$b} <=> $nicks{$a} } keys %nicks; + } + # /tweet, /tweet_as, /dm, /dm_as - complete @nicks (and nicks as the first # arg to dm) if ( $linestart =~ /^\/(?:tweet|dm)/ ) {