use File::Temp;
use LWP::Simple;
use Data::Dumper;
+use Encode;
$Data::Dumper::Indent = 1;
use vars qw($VERSION %IRSSI);
-$VERSION = "2.2.4beta";
-my ($REV) = '$Rev: 647 $' =~ /(\d+)/;
+$VERSION = "2.2.5beta";
+my ($REV) = '$Rev: 687 $' =~ /(\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-06-04 16:02:51 -0700 (Thu, 04 Jun 2009) $',
+ changed => '$Date: 2009-08-07 01:24:53 -0700 (Fri, 07 Aug 2009) $',
);
my $window;
unless (
$twits{$username}->update(
{
- status => $data,
+ status => $data,
+
# in_reply_to_status_id => $id_map{ lc $nick }[$id]
}
)
$twit = "Net::$service"->new(
username => $user,
password => $pass,
- source => "twirssi"
+ source => "twirssi",
+ ssl => Irssi::settings_get_bool("twirssi_avoid_ssl") ? 0 : 1,
);
unless ( $twit->verify_credentials() ) {
¬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;
¬ice("Downloading twirssi from $URL");
LWP::Simple::getstore( $URL, "$loc.upgrade" );
+ unless ( -s "$loc.upgrade" ) {
+ ¬ice("Failed to save $loc.upgrade."
+ . " Check that /set twirssi_location is set to the correct location."
+ );
+ return;
+ }
+
unless ( $data or Irssi::settings_get_bool("twirssi_upgrade_beta") ) {
unless ( open( NEW, "$loc.upgrade" ) ) {
- ¬ice(
-"Failed to read $loc.upgrade. Check that /set twirssi_location is set to the correct location."
+ ¬ice("Failed to read $loc.upgrade."
+ . " Check that /set twirssi_location is set to the correct location."
);
return;
}
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;
print $fh "-- $new_poll";
}
close $fh;
+ rename $filename, "$filename.done";
exit;
} else {
&ccrap("Failed to fork for updating: $!");
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;
+ print scalar localtime, " - Polling for replies since ",
+ $id_map{__last_id}{$username}{reply}
+ if &debug;
$new_poll_id = 0;
eval {
if ( $id_map{__last_id}{$username}{reply} )
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
# pretend
if ( open FILE, $filename ) {
+ binmode FILE, ":utf8";
my @lines;
my %new_cache;
while (<FILE>) {
}
if (/^-- (\d+)$/) {
- ($new_last_poll) = ($1);
- last;
+ $new_last_poll = $1;
+ if ( $new_last_poll >= $last_poll ) {
+ last;
+ } else {
+ print "Impossible! ",
+ "new_last_poll=$new_last_poll < last_poll=$last_poll!"
+ if &debug;
+ undef $new_last_poll;
+ next;
+ }
}
my ( $f, $t ) = split ' ', $_;
$nicks{$f} = $friends{$f} = $t;
$window->printformat(
$line->[0],
"twirssi_" . $line->[1],
- @$line[ 2 .. $#$line ]
+ @$line[ 2 .. $#$line - 1 ],
+ &hilight( $line->[-1] )
);
}
}
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::settings_add_bool( "twirssi", "twirssi_hilights", 1 );
Irssi::settings_add_bool( "twirssi", "twirssi_always_shorten", 0 );
Irssi::settings_add_bool( "twirssi", "tweet_window_input", 0 );
+Irssi::settings_add_bool( "twirssi", "twirssi_avoid_ssl", 0 );
$last_poll = time - &get_poll_time;
$window = Irssi::window_find_name( Irssi::settings_get_str('twitter_window') );
}
);
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",