root/trunk/twitter.pl

Revision 30, 4.2 kB (checked in by dcarter, 2 years ago)

changed source, we should be cool now

  • Property svn:executable set to *
Line 
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;
Note: See TracBrowser for help on using the browser.