perltidy


use strict;
use Irssi;
use Irssi::Irc;
use Net::Twitter;
use HTTP::Date;
use HTML::Entities;
use vars qw($VERSION %IRSSI);

$VERSION = "0.3";
%IRSSI   = (
    authors     => 'Dan Boger',
    contact     => 'zigdon@gmail.com',
    name        => 'twirssi',
    description => 'Send twitter updates using /tweet.  '
      . 'Can optionally set your bitlbee /away message to same',
    license => 'GNU GPL v2',
    url     => 'http://irc.peeron.com/~zigdon/twirssi/',
    changed => 'Mon Dec  1 15:36:01 PST 2008',
);

my $window;
my $twit;
my $user;
my $poll;
my $last_poll = time;

sub cmd_tweet {
    my ( $data, $server, $win ) = @_;

    unless ($twit) {
        $window->print("%R***%n Not logged in!  Use /twitter_login username pass!");
        return;
    }

    $data =~ s/^\s+|\s+$//;
    unless ($data) {
        $window->print("%R***%n Usage: /tweet <update>");
        return;
    }

    $twit->update($data);
    if (Irssi::settings_get_bool("tweet_to_away") and $data !~ /\@\w/) {
       my $server = Irssi::server_find_tag(Irssi::settings_get_str("bitlbee_server"));
       if ($server) {
         $server->send_raw("away :$data");
       } else {
        $window->print("%R***%n Can't find bitlbee server." .
                        "Update bitlbee_server or disalbe tweet_to_away");
       }
    }

    if ( $data =~ s/^[dD] // ) {
        $window->print( "%R***%n DM sent", MSGLEVEL_MSGS );
    }
    else {
        $window->print( "%R***%n Update sent", MSGLEVEL_MSGS );
    }
}

sub cmd_login {
    my ( $data, $server, $win ) = @_;
    my $pass;
    ( $user, $pass ) = split ' ', $data, 2;

    $twit = Net::Twitter->new( username => $user, password => $pass, source => "twirssi" );
    if ($twit) {
        &get_updates;
        Irssi::timeout_remove($poll) if $poll;
        $poll = Irssi::timeout_add( 300 * 1000, \&get_updates, "" );
        $window->print("%R***%n Logged in as $user", MSGLEVEL_MSGS);
    }
    else {
        $window->print("%R***%n Login failed.", MSGLEVEL_MSGS);
    }
}

sub get_updates {
    $window =
      Irssi::window_find_name( Irssi::settings_get_str('twitter_window') );
    unless ($window) {
        Irssi::active_win()
          ->print( "Can't find a window named '"
              . Irssi::settings_get_str('twitter_window')
              . "'.  Create it or change the value of twitter_window" );
    }
    unless ($twit) {
        $window->print("%R***%n Not logged in!  Use /twitter_login username pass!");
        return;
    }

    my $tweets =
      $twit->friends_timeline( { since => HTTP::Date::time2str($last_poll) } );
    foreach my $t (reverse @$tweets) {
        my $text = decode_entities( $t->{text} );
        $text =~ s/%/%%/g;
        $text =~ s/\@(\w+)/%B\@$1%n/g;
        $window->print(
            sprintf( "[%%B\@%s%%n] %s", $t->{user}{screen_name}, $text ),
            MSGLEVEL_MSGS );
    }
    $tweets =
      $twit->direct_messages( { since => HTTP::Date::time2str($last_poll) } );
    foreach my $t (reverse @$tweets) {
        my $text = decode_entities( $t->{text} );
        $text =~ s/%/%%/g;
        $text =~ s/\@(\w+)/%B\@$1%n/g;
        $window->print(
            sprintf(
                "[%%B\@%s%%n (%%WDM%%n)] %s",
                $t->{sender_screen_name}, $text
            ),
            MSGLEVEL_MSGS
        );
    }

    $last_poll = time;
}

Irssi::settings_add_str( "twirssi", "twitter_window", "twitter" );
Irssi::settings_add_str( "twirssi", "bitlbee_server", "bitlbee" );
Irssi::settings_add_bool( "twirssi", "tweet_to_away", 0 );
$window = Irssi::window_find_name( Irssi::settings_get_str('twitter_window') );
if ($window) {
    Irssi::command_bind( "tweet",           "cmd_tweet" );
    Irssi::command_bind( "twitter_login",   "cmd_login" );
    Irssi::command_bind( "twitter_updates", "get_updates" );
    $window->print(
"%R***%n Twirssi v$VERSION loaded.  Log in with /twitter_login, send updates with /tweet",
        MSGLEVEL_MSGS
    );
}
else {
    Irssi::active_win()
      ->print( "Create a window named "
          . Irssi::settings_get_str('twitter_window')
          . " or change the value of twitter_window" );
}