use File::Temp;
use LWP::Simple;
use Data::Dumper;
+use Encode;
$Data::Dumper::Indent = 1;
use vars qw($VERSION %IRSSI);
-$VERSION = "2.2.3beta";
-my ($REV) = '$Rev: 616 $' =~ /(\d+)/;
+$VERSION = "2.2.5beta";
+my ($REV) = '$Rev: 675 $' =~ /(\d+)/;
%IRSSI = (
authors => 'Dan Boger',
contact => 'zigdon@gmail.com',
. 'Can optionally set your bitlbee /away message to same',
license => 'GNU GPL v2',
url => 'http://twirssi.com',
- changed => '$Date: 2009-04-21 12:20:40 -0700 (Tue, 21 Apr 2009) $',
+ changed => '$Date: 2009-07-22 10:06:58 -0700 (Wed, 22 Jul 2009) $',
);
my $window;
my $defservice;
my $poll;
my $last_poll;
-my $last_friends_poll = time;
+my $last_friends_poll = 0;
my %nicks;
my %friends;
my %tweet_cache;
my %id_map;
-my $failwhale = 0;
+my $failwhale = 0;
+my $first_call = 1;
+
my %irssi_to_mirc_colors = (
'%k' => '01',
'%r' => '05',
$twits{$username}->update(
{
status => $data,
- in_reply_to_status_id => $id_map{ lc $nick }[$id]
+ # in_reply_to_status_id => $id_map{ lc $nick }[$id]
}
)
)
¬ice("Welcome to twirssi!"
. " Perhaps you should add \@twirssi to your friends list,"
. " so you can be notified when a new version is release?"
- . " Just type /twitter_friend twirssi." );
+ . " Just type /twitter_follow twirssi." );
}
}
%nicks = %friends;
my $pid = fork();
if ($pid) { # parent
- Irssi::timeout_add_once( 5000, 'monitor_child', [ $filename, 0 ] );
+ Irssi::timeout_add_once( 5000, 'monitor_child', [ "$filename.done", 0 ] );
Irssi::pidwait_add($pid);
} elsif ( defined $pid ) { # child
close STDIN;
$error++ unless &do_updates( $fh, $_, $twits{$_}, \%context_cache );
}
+ print $fh "__friends__\n";
if (
time - $last_friends_poll >
Irssi::settings_get_int('twitter_friends_poll') )
{
+ print $fh "__updated ", time, "\n";
my ( $added, $removed ) = &load_friends($fh);
if ( $added + $removed ) {
print $fh "type:debug %R***%n Friends list updated: ",
sprintf( "%d removed", $removed ) ),
"\n";
}
-
- $last_friends_poll = time;
}
- print $fh "__friends__\n";
foreach ( sort keys %friends ) {
print $fh "$_ $friends{$_}\n";
}
print $fh "-- $new_poll";
}
close $fh;
+ rename $filename, "$filename.done";
exit;
+ } else {
+ &ccrap("Failed to fork for updating: $!");
}
print scalar localtime, " - get_updates ends" if &debug;
}
foreach my $t ( reverse @$tweets ) {
my $text = decode_entities( $t->{text} );
- $text = &hilight($text);
+ $text =~ s/[\n\r]/ /g;
my $reply = "tweet";
if ( Irssi::settings_get_bool("show_reply_context")
and $t->{in_reply_to_screen_name} ne $username
if ($context) {
my $ctext = decode_entities( $context->{text} );
- $ctext = &hilight($ctext);
+ $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}";
}
- printf $fh "id:%d account:%s nick:%s type:tweet %s\n",
+ printf $fh "id:%u account:%s nick:%s type:tweet %s\n",
$context->{id}, $username,
$context->{user}{screen_name}, $ctext;
$reply = "reply";
$text .= " -- http://twitter.com/$t->{user}{screen_name}"
. "/status/$t->{id}";
}
- printf $fh "id:%d account:%s nick:%s type:%s %s\n",
+ printf $fh "id:%u 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",
+ printf $fh "id:%u account:%s type:last_id timeline\n",
$new_poll_id, $username;
print scalar localtime, " - Polling for replies" if &debug;
if exists $friends{ $t->{user}{screen_name} };
my $text = decode_entities( $t->{text} );
- $text = &hilight($text);
+ $text =~ s/[\n\r]/ /g;
if ( $t->{truncated} ) {
$text .= " -- http://twitter.com/$t->{user}{screen_name}"
. "/status/$t->{id}";
}
- printf $fh "id:%d account:%s nick:%s type:tweet %s\n",
+ printf $fh "id:%u 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;
+ printf $fh "id:%u account:%s type:last_id reply\n", $new_poll_id, $username;
print scalar localtime, " - Polling for DMs" if &debug;
$new_poll_id = 0;
foreach my $t ( reverse @$tweets ) {
my $text = decode_entities( $t->{text} );
- $text = &hilight($text);
- printf $fh "id:%d account:%s nick:%s type:dm %s\n",
+ $text =~ s/[\n\r]/ /g;
+ printf $fh "id:%u 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;
+ printf $fh "id:%u 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} ) {
}
$id_map{__searches}{$username}{$topic} = $search->{max_id};
- printf $fh "id:%d account:%s type:searchid topic:%s\n",
+ printf $fh "id:%u account:%s type:searchid topic:%s\n",
$search->{max_id}, $username, $topic;
foreach my $t ( reverse @{ $search->{results} } ) {
my $text = decode_entities( $t->{text} );
- $text = &hilight($text);
- printf $fh "id:%d account:%s nick:%s type:search topic:%s %s\n",
+ $text =~ s/[\n\r]/ /g;
+ printf $fh "id:%u 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
# first time we run we don't want to print out *everything*, so we just
# pretend
- my $suppress = 0;
- $suppress = 1 unless keys %tweet_cache;
if ( open FILE, $filename ) {
my @lines;
my %new_cache;
while (<FILE>) {
- chomp;
last if /^__friends__/;
+ unless (/\n$/) { # skip partial lines
+ # print "Skipping partial line: $_" if &debug;
+ next;
+ }
+ chomp;
my $hilight = 0;
my %meta;
my $hilight_color =
$irssi_to_mirc_colors{ Irssi::settings_get_str("hilight_color") };
- my $nick =
- '@' . substr( $meta{account}, 0, index( $meta{account}, "@" ) );
+ my $nick = "\@$meta{account}";
if ( $_ =~ /\Q$nick\E(?:\W|$)/i
and Irssi::settings_get_bool("twirssi_hilights") )
{
} elsif ( $meta{type} eq 'searchid' ) {
print "Search '$meta{topic}' returned id $meta{id}" if &debug;
if (
+ not
exists $id_map{__searches}{ $meta{account} }{ $meta{topic} }
- and $meta{id} >=
+ or $meta{id} >=
$id_map{__searches}{ $meta{account} }{ $meta{topic} } )
{
$id_map{__searches}{ $meta{account} }{ $meta{topic} } =
%friends = ();
while (<FILE>) {
+ if (/^__updated (\d+)$/) {
+ $last_friends_poll = $1;
+ print "Friend list updated" if &debug;
+ next;
+ }
+
if (/^-- (\d+)$/) {
($new_last_poll) = ($1);
last;
if ($new_last_poll) {
print "new last_poll = $new_last_poll" if &debug;
print "new last_poll_id = ", Dumper( $id_map{__last_id} ) if &debug;
- if ($suppress) {
+ if ($first_call) {
print "First call, not printing updates" if &debug;
} else {
foreach my $line (@lines) {
$window->printformat(
$line->[0],
"twirssi_" . $line->[1],
- @$line[ 2 .. $#$line ]
+ @$line[ 2 .. $#$line-1 ],
+ &hilight($line->[-1])
);
}
}
&ccrap("Failed to write replies to $file: $!");
}
}
- $failwhale = 0;
+ $failwhale = 0;
+ $first_call = 0;
return;
}
}
}
$failwhale = 1;
}
- &ccrap("Haven't been able to get updated tweets since $since");
+
+ if ( time - $last_poll < 600 ) {
+ &ccrap("Haven't been able to get updated tweets since $since");
+ }
}
}
if ( Irssi::settings_get_str("twirssi_topic_color") ) {
my $c = Irssi::settings_get_str("twirssi_topic_color");
$c = $irssi_to_mirc_colors{$c};
- $text =~ s/(^|\W)\#([-\w]+)/$1\cC$c\#$2\cO/g if $c;
+ $text =~ s/(^|\W)(\#|\!)([-\w]+)/$1\cC$c$2$3\cO/g if $c;
}
$text =~ s/[\n\r]/ /g;
}
}
- return $data;
+ return decode "utf8", $data;
}
sub normalize_username {
Irssi::command_bind( "twitter_list_subscriptions", "cmd_list_search" );
Irssi::command_bind( "twirssi_upgrade", "cmd_upgrade" );
Irssi::command_bind( "twitter_updates", "get_updates" );
+ Irssi::command_bind( "bitlbee_away", "update_away" );
if ( Irssi::settings_get_bool("twirssi_use_reply_aliases") ) {
Irssi::command_bind( "reply", "cmd_reply" );
Irssi::command_bind( "reply_as", "cmd_reply_as" );
}
);
Irssi::command_bind(
- "twitter_friend",
+ "twitter_follow",
&gen_cmd(
- "/twitter_friend <username>",
+ "/twitter_follow <username>",
"create_friend",
sub { ¬ice("Following $_[0]"); $nicks{ $_[0] } = time; }
)
);
Irssi::command_bind(
- "twitter_unfriend",
+ "twitter_unfollow",
&gen_cmd(
"/twitter_unfriend <username>",
"destroy_friend",