| 1 |
#!/usr/bin/perl |
|---|
| 2 |
use warnings; |
|---|
| 3 |
binmode STDOUT, ":utf8"; |
|---|
| 4 |
use HTTP::Date qw( |
|---|
| 5 |
time2str |
|---|
| 6 |
); |
|---|
| 7 |
use Irssi qw( |
|---|
| 8 |
window_find_name command_bind |
|---|
| 9 |
settings_get_bool settings_add_bool |
|---|
| 10 |
settings_get_str settings_add_str |
|---|
| 11 |
timeout_add signal_add_first |
|---|
| 12 |
signal_add signal_stop |
|---|
| 13 |
windows_refnum_last |
|---|
| 14 |
signal_add_last |
|---|
| 15 |
active_win |
|---|
| 16 |
); |
|---|
| 17 |
use Net::Twitter; |
|---|
| 18 |
use HTML::Entities qw( decode_entities ); |
|---|
| 19 |
# setup global varibles |
|---|
| 20 |
our ( $twit, $refresh, $username, $password, $maintimetag, $setuptimetag, |
|---|
| 21 |
$time, $twitterwin, $main_name, $main_window, $direct_window, @friends ); |
|---|
| 22 |
|
|---|
| 23 |
$main_window = "twitter-main"; |
|---|
| 24 |
$direct_window = "twitter-direct"; |
|---|
| 25 |
|
|---|
| 26 |
### window manager |
|---|
| 27 |
sub get_twitter_window { |
|---|
| 28 |
$twitterwin = window_find_name($main_window); |
|---|
| 29 |
if (! $twitterwin) { |
|---|
| 30 |
$twitterwin = Irssi::Windowitem::window_create($main_window,1); |
|---|
| 31 |
} |
|---|
| 32 |
} |
|---|
| 33 |
|
|---|
| 34 |
### wrap in setup sub? |
|---|
| 35 |
sub setup { |
|---|
| 36 |
my ($data, $server, $witem) = @_; |
|---|
| 37 |
$refresh=75; #75 second refresh |
|---|
| 38 |
|
|---|
| 39 |
# setup the twitter object |
|---|
| 40 |
$username = settings_get_str('twit_user') or print "Twitter username not set, please set the username using the command /twit_user USERNAME"; |
|---|
| 41 |
$password = settings_get_str('twit_pass') or print "Twitter password not set, please set the password using the command /twit_pass PASSWORD"; |
|---|
| 42 |
$twit = Net::Twitter->new(username=>$username, password=>$password, source=>'irssi') or show_error($!); |
|---|
| 43 |
|
|---|
| 44 |
# get the main twitter window |
|---|
| 45 |
get_twitter_window(); |
|---|
| 46 |
$twitterwin->set_name($main_window); |
|---|
| 47 |
|
|---|
| 48 |
# check return code |
|---|
| 49 |
if ( ! $twit->verify_credentials() ) { |
|---|
| 50 |
show_error('auth failed',1); |
|---|
| 51 |
} |
|---|
| 52 |
my @followers = $twit->followers(); |
|---|
| 53 |
for $i ( 0 .. $#followers ) { |
|---|
| 54 |
for $j ( 0 .. $#{$followers[$i]} ) { |
|---|
| 55 |
push(@friends, $followers[$i][$j]->{'screen_name'}); |
|---|
| 56 |
} |
|---|
| 57 |
} |
|---|
| 58 |
|
|---|
| 59 |
main($data,$server,$witem); |
|---|
| 60 |
|
|---|
| 61 |
# usage: timeout_add(msecs, func, data) |
|---|
| 62 |
$maintimetag = timeout_add($refresh*1000, \&main, undef); |
|---|
| 63 |
} |
|---|
| 64 |
### end wrap? |
|---|
| 65 |
|
|---|
| 66 |
## get message |
|---|
| 67 |
sub event_send_message { |
|---|
| 68 |
my ($line, $server, $witem) = @_; |
|---|
| 69 |
if (active_win()->{'name'} eq $main_window) { |
|---|
| 70 |
my $retval = $twit->update($line); |
|---|
| 71 |
my $message = "<$username> $line"; |
|---|
| 72 |
$twitterwin->print($message, MSGLEVEL_PUBLIC); |
|---|
| 73 |
} |
|---|
| 74 |
} |
|---|
| 75 |
|
|---|
| 76 |
sub show_error { |
|---|
| 77 |
# usage: show_error('errormsg',deadlybool); |
|---|
| 78 |
my ($message,$deadly) = @_; |
|---|
| 79 |
warn "$message\n"; |
|---|
| 80 |
if ($twit->http_code()) { |
|---|
| 81 |
warn $twit->http_code(); |
|---|
| 82 |
warn " - "; |
|---|
| 83 |
warn $twit->http_message(); |
|---|
| 84 |
warn "\n"; |
|---|
| 85 |
} |
|---|
| 86 |
# if it's a severe error pass a 1 as the second arg and this script will exit. |
|---|
| 87 |
die "Severe error, exiting.\n" if $deadly; |
|---|
| 88 |
} |
|---|
| 89 |
|
|---|
| 90 |
sub main { |
|---|
| 91 |
my ($data, $server, $witem) = @_; |
|---|
| 92 |
|
|---|
| 93 |
# get the replies or return the code |
|---|
| 94 |
my $replies = $twit->following_timeline( { since=> $time }); |
|---|
| 95 |
my $ret_code = $twit->http_code(); |
|---|
| 96 |
if ( $ret_code == 200 ) { |
|---|
| 97 |
my @reply_list = @$replies; |
|---|
| 98 |
my $size = @reply_list; |
|---|
| 99 |
if ( $size > 0 ) { |
|---|
| 100 |
get_twitter_window(); |
|---|
| 101 |
} |
|---|
| 102 |
foreach my $foo ( reverse @reply_list ) { |
|---|
| 103 |
my $screen_name = $foo->{'user'}{'screen_name'}; |
|---|
| 104 |
my $text = $foo->{'text'}; |
|---|
| 105 |
$text =~ s/\n/\n /; |
|---|
| 106 |
#print "<$screen_name> $text"; |
|---|
| 107 |
my $cleantext = decode_entities($text); |
|---|
| 108 |
my $message = "<$screen_name> $cleantext"; |
|---|
| 109 |
$twitterwin->print($message, MSGLEVEL_PUBLIC); |
|---|
| 110 |
} |
|---|
| 111 |
$time = time2str(time); |
|---|
| 112 |
} elsif ( $ret_code != 304 ) { |
|---|
| 113 |
show_error( 'fetch of timeline failed' ); |
|---|
| 114 |
} |
|---|
| 115 |
} |
|---|
| 116 |
|
|---|
| 117 |
sub set_user { |
|---|
| 118 |
my ($data, $server, $witem) = @_; |
|---|
| 119 |
my $tmp = $data; |
|---|
| 120 |
settings_add_str('twit','twit_user', $tmp); |
|---|
| 121 |
} |
|---|
| 122 |
|
|---|
| 123 |
sub set_pass { |
|---|
| 124 |
my ($data, $server, $witem) = @_; |
|---|
| 125 |
my $tmp = $data; |
|---|
| 126 |
settings_add_str('twit','twit_pass', $tmp); |
|---|
| 127 |
setup($data,$server,$witem); |
|---|
| 128 |
} |
|---|
| 129 |
sub complete_names { |
|---|
| 130 |
my ($complist, $window, $word, $linestart, $want_space) = @_; |
|---|
| 131 |
if ($window->{'name'} eq $main_window) { |
|---|
| 132 |
# matches the irssi text with our user list |
|---|
| 133 |
# todo: append @ in front of the name |
|---|
| 134 |
my $prefix = substr($word, 0, 1); |
|---|
| 135 |
my $match = $word; |
|---|
| 136 |
|
|---|
| 137 |
if($prefix eq "@") { |
|---|
| 138 |
$match = substr($word, 1); |
|---|
| 139 |
} |
|---|
| 140 |
my @matches = grep /^$match/i, @friends; |
|---|
| 141 |
|
|---|
| 142 |
if($prefix eq "@") { |
|---|
| 143 |
@matches = map { "\@$_" } @matches; |
|---|
| 144 |
} |
|---|
| 145 |
push @$complist, @matches; |
|---|
| 146 |
return; |
|---|
| 147 |
} |
|---|
| 148 |
} |
|---|
| 149 |
|
|---|
| 150 |
command_bind twit_replies => \&print_replies; |
|---|
| 151 |
command_bind twit_user => \&set_user; |
|---|
| 152 |
command_bind twit_pass => \&set_pass; |
|---|
| 153 |
signal_add_first 'send text' => \&event_send_message; |
|---|
| 154 |
signal_add_last 'complete word' => \&complete_names; |
|---|