From 6121f1191934c2bd95656fdb67e173f480f034d8 Mon Sep 17 00:00:00 2001 From: faemir Date: Sat, 21 Feb 2009 18:50:48 -0700 Subject: [PATCH] added preliminary support for identi.ca --- twirssi.pl | 204 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 183 insertions(+), 21 deletions(-) diff --git a/twirssi.pl b/twirssi.pl index 093a1b8..7f2f496 100644 --- a/twirssi.pl +++ b/twirssi.pl @@ -7,6 +7,7 @@ use File::Temp; use LWP::Simple; use Data::Dumper; use Net::Identica; +use Net::Twitter; $Data::Dumper::Indent = 1; use vars qw($VERSION %IRSSI); @@ -17,7 +18,7 @@ my ($REV) = '$Rev: 483 $' =~ /(\d+)/; authors => 'Dan Boger', contact => 'zigdon@gmail.com', name => 'twirssi', - description => 'Send twitter updates using /tweet. ' + description => 'Send twitter/identica updates using /tweet or /dent. ' . 'Can optionally set your bitlbee /away message to same', license => 'GNU GPL v2', url => 'http://twirssi.com', @@ -324,7 +325,7 @@ sub cmd_switch { } } -sub cmd_logout { +sub cmd_logout_twitter { my ( $data, $server, $win ) = @_; $data =~ s/^\s+|\s+$//g; @@ -343,13 +344,32 @@ sub cmd_logout { } } -sub cmd_login { +sub cmd_logout_identica { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//g; + $data = $user unless $data; + return unless &valid_username($data); + + ¬ice("Logging out $data..."); + $twits{$data}->end_session(); + delete $twits{$data}; + undef $twit; + if ( keys %twits ) { + &cmd_switch( ( keys %twits )[0], $server, $win ); + } else { + Irssi::timeout_remove($poll) if $poll; + undef $poll; + } +} + +sub cmd_login_twitter { my ( $data, $server, $win ) = @_; my $pass; if ($data) { ( $user, $pass ) = split ' ', $data, 2; - } elsif ( my $autouser = Irssi::settings_get_str("twitter_usernames") - and my $autopass = Irssi::settings_get_str("twitter_passwords") ) + } elsif ( my $autouser = Irssi::settings_get_str("twitter_usernames_twitter") + and my $autopass = Irssi::settings_get_str("twitter_passwords_twitter") ) { my @user = split /\s*,\s*/, $autouser; my @pass = split /\s*,\s*/, $autopass; @@ -361,13 +381,91 @@ sub cmd_login { while ( @user and @pass ) { $u = shift @user; $p = shift @pass; - &cmd_login("$u $p"); + &cmd_login_twitter("$u $p"); } return; } } else { ¬ice("/twitter_login requires either a username and password " - . "or twitter_usernames and twitter_passwords to be set." ); + . "or twitter_usernames_twitter and twitter_passwords_twitter to be set." ); + return; + } + + %friends = %nicks = (); + + $twit = Net::Twitter->new( + username => $user, + password => $pass, + source => "twirssi" + ); + + unless ( $twit->verify_credentials() ) { + ¬ice("Login as $user failed"); + $twit = undef; + if ( keys %twits ) { + &cmd_switch( ( keys %twits )[0], $server, $win ); + } + return; + } + + if ($twit) { + my $rate_limit = $twit->rate_limit_status(); + if ( $rate_limit and $rate_limit->{remaining_hits} < 1 ) { + ¬ice( + "Rate limit exceeded, try again after $rate_limit->{reset_time}" + ); + $twit = undef; + return; + } + + $twits{$user} = $twit; + Irssi::timeout_remove($poll) if $poll; + $poll = Irssi::timeout_add( &get_poll_time * 1000, \&get_updates, "" ); + ¬ice("Logged in as $user, loading friends list..."); + &load_friends(); + ¬ice( "loaded friends: ", scalar keys %friends ); + if ( Irssi::settings_get_bool("twirssi_first_run") ) { + Irssi::settings_set_bool( "twirssi_first_run", 0 ); + unless ( exists $friends{twirssi} ) { + ¬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." ); + } + } + %nicks = %friends; + $nicks{$user} = 0; + &get_updates; + } else { + ¬ice("Login failed"); + } +} + +sub cmd_login_identica { + my ( $data, $server, $win ) = @_; + my $pass; + if ($data) { + ( $user, $pass ) = split ' ', $data, 2; + } elsif ( my $autouser = Irssi::settings_get_str("twitter_usernames_identica") + and my $autopass = Irssi::settings_get_str("twitter_passwords_identica") ) + { + my @user = split /\s*,\s*/, $autouser; + my @pass = split /\s*,\s*/, $autopass; + if ( @user != @pass ) { + ¬ice("Number of usernames doesn't match " + . "the number of passwords - auto-login failed" ); + } else { + my ( $u, $p ); + while ( @user and @pass ) { + $u = shift @user; + $p = shift @pass; + &cmd_login_identica("$u $p"); + } + return; + } + } else { + ¬ice("/identica_login requires either a username and password " + . "or twitter_usernames_identica and twitter_passwords_identica to be set." ); return; } @@ -421,11 +519,11 @@ sub cmd_login { } } -sub cmd_add_search { +sub cmd_add_search_twitter { my ( $data, $server, $win ) = @_; unless ( $twit and $twit->can('search') ) { - ¬ice("ERROR: Your version of Net::Identica ($Net::Identica::VERSION) " + ¬ice("ERROR: Your version of Net::Twitter ($Net::Twitter::VERSION) " . "doesn't support searches." ); return; } @@ -447,7 +545,7 @@ sub cmd_add_search { ¬ice("Added subscription for '$data'"); } -sub cmd_del_search { +sub cmd_add_search_identica { my ( $data, $server, $win ) = @_; unless ( $twit and $twit->can('search') ) { @@ -455,6 +553,32 @@ sub cmd_del_search { . "doesn't support searches." ); return; } + + $data =~ s/^\s+|\s+$//; + $data = lc $data; + + unless ($data) { + ¬ice("Usage: /twitter_subscribe "); + return; + } + + if ( exists $id_map{__searches}{$user}{$data} ) { + ¬ice("Already had a subscription for '$data'"); + return; + } + + $id_map{__searches}{$user}{$data} = 1; + ¬ice("Added subscription for '$data'"); +} + +sub cmd_del_search_twitter { + my ( $data, $server, $win ) = @_; + + unless ( $twit and $twit->can('search') ) { + ¬ice("ERROR: Your version of Net::Twitter ($Net::Twitter::VERSION) " + . "doesn't support searches." ); + return; + } $data =~ s/^\s+|\s+$//; $data = lc $data; @@ -472,6 +596,31 @@ sub cmd_del_search { ¬ice("Removed subscription for '$data'"); } +sub cmd_del_search_identica { + my ( $data, $server, $win ) = @_; + + unless ( $twit and $twit->can('search') ) { + ¬ice("ERROR: Your version of Net::Identica ($Net::Identica::VERSION) " + . "doesn't support searches." ); + return; + } + $data =~ s/^\s+|\s+$//; + $data = lc $data; + + unless ($data) { + ¬ice("Usage: /identica_unsubscribe "); + return; + } + + unless ( exists $id_map{__searches}{$user}{$data} ) { + ¬ice("No subscription found for '$data'"); + return; + } + + delete $id_map{__searches}{$user}{$data}; + ¬ice("Removed subscription for '$data'"); +} + sub cmd_list_search { my ( $data, $server, $win ) = @_; @@ -1178,14 +1327,22 @@ if ($window) { Irssi::command_bind( "dm", "cmd_direct" ); Irssi::command_bind( "dm_as", "cmd_direct_as" ); Irssi::command_bind( "tweet", "cmd_tweet" ); + Irssi::command_bind( "dent", "cmd_tweet" ); Irssi::command_bind( "tweet_as", "cmd_tweet_as" ); + Irssi::command_bind( "dent_as", "cmd_tweet_as" ); Irssi::command_bind( "twitter_reply", "cmd_reply" ); + Irssi::command_bind( "identica_reply", "cmd_reply" ); Irssi::command_bind( "twitter_reply_as", "cmd_reply_as" ); - Irssi::command_bind( "twitter_login", "cmd_login" ); - Irssi::command_bind( "twitter_logout", "cmd_logout" ); + Irssi::command_bind( "identica_reply_as", "cmd_reply_as" ); + Irssi::command_bind( "twitter_login", "cmd_login_twitter" ); + Irssi::command_bind( "twitter_logout", "cmd_logout_twitter" ); + Irssi::command_bind( "identica_login", "cmd_login_identica" ); + Irssi::command_bind( "identica_logout", "cmd_logout_identica" ); Irssi::command_bind( "twitter_switch", "cmd_switch" ); - Irssi::command_bind( "twitter_subscribe", "cmd_add_search" ); - Irssi::command_bind( "twitter_unsubscribe", "cmd_del_search" ); + Irssi::command_bind( "twitter_subscribe", "cmd_add_search_twitter" ); + Irssi::command_bind( "identica_subscribe", "cmd_add_search_identica" ); + Irssi::command_bind( "twitter_unsubscribe", "cmd_del_search_twitter" ); + Irssi::command_bind( "identica_unsubscribe", "cmd_del_search_identica" ); Irssi::command_bind( "twitter_list_subscriptions", "cmd_list_search" ); Irssi::command_bind( "twirssi_upgrade", "cmd_upgrade" ); if ( Irssi::settings_get_bool("twirssi_use_reply_aliases") ) { @@ -1208,6 +1365,7 @@ if ($window) { sub { ¬ice("Twirssi v$VERSION (r$REV); " . "Net::Identica v$Net::Identica::VERSION. " + . "Net::Twitter v$Net::Twitter::VERSION." . "JSON in use: " . JSON::Any::handler() . ". See details at http://twirssi.com/" ); @@ -1235,7 +1393,7 @@ if ($window) { ¬ice(" %Y<%C(%B^%C)%N TWIRSSI v%R$VERSION%N (r$REV)"); ¬ice(" %C(_(\\%N http://twirssi.com/ for full docs"); ¬ice( - " %Y||%C `%N Log in with /twitter_login, send updates with /tweet"); + " %Y||%C `%N Log in with /twitter_login or /identica_login, send updates with /tweet or /dent"); my $file = Irssi::settings_get_str("twirssi_replies_store"); if ( $file and -r $file ) { @@ -1265,10 +1423,16 @@ if ($window) { } } - if ( my $autouser = Irssi::settings_get_str("twitter_usernames") - and my $autopass = Irssi::settings_get_str("twitter_passwords") ) + if ( my $autouser = Irssi::settings_get_str("twitter_usernames_twitter") + and my $autopass = Irssi::settings_get_str("twitter_passwords_twitter") ) + { + &cmd_login_twitter(); + } + + if ( my $autouser = Irssi::settings_get_str("twitter_usernames_identica") + and my $autopass = Irssi::settings_get_str("twitter_passwords_identica") ) { - &cmd_login(); + &cmd_login_identica(); } } else { @@ -1276,6 +1440,4 @@ if ($window) { ->print( "Create a window named " . Irssi::settings_get_str('twitter_window') . " or change the value of twitter_window. Then, reload twirssi." ); -} - -# vim: set sts=4 expandtab: +} \ No newline at end of file -- 2.30.2