#!/usr/bin/perl use strict; #use warnings; use vars qw($VERSION %IRSSI); use Irssi qw(signal_add_last command_bind); use List::Util qw(first); use XML::Simple; use Data::Dumper; use LWP::Simple; $VERSION = '1.0'; %IRSSI = ( authors => 'John Anderson', contact => 'sontek@gmail.com', name => 'Twitter', description => 'Allows you to update twitter from irssi', license => 'X11/MIT', url => 'http://blog.sontek.net' ); # configuration my $username = "user"; my $password = "password!"; my $xml = new XML::Simple (KeyAttr=>[]); sub get_complete_list { # Twitter API URL's my $followers_url="http://$username:$password\@twitter.com/statuses/followers.xml"; my $friends_url="http://$username:$password\@twitter.com/statuses/friends.xml"; # Download and parse the XML files into arrays my %friends=parse_xml($friends_url); my %followers=parse_xml($followers_url); my %complete_list = %friends; # Clean out dupes for my $key ( keys %followers) { if(!$complete_list{$key}) { $complete_list{$key} = 1; } } return keys %complete_list; } sub parse_xml { # Grabs all users from the xml file and returns an array my ($url) = @_; my $page=1; my %list = (); do { my $current_url = $url . "?page=$page"; my $content = get($current_url); my $data = $xml->XMLin($content); foreach my $e (@{$data->{user}}) { $list{$e->{screen_name}} = 1; } my $size = @{$data->{user}}; my $more_pages = (($size * $page) / 100); if($more_pages < 1) { $page=-1; } else { $page++; } } while($page != -1); return %list; } # Pull the list when irssi first loads my @friends = get_complete_list(); sub sig_complete { my ($complist, $window, $word, $linestart, $want_space) = @_; # matches the irssi text with our user list # todo: append @ in front of the name my $prefix = substr($word, 0, 1); my $match = $word; if($prefix eq "@") { $match = substr($word, 1); } my @matches = grep /^$match/i, @friends; if($prefix eq "@") { @matches = map { "\@$_" } @matches; } push @$complist, @matches; return; } # Usage: /twitter args sub cmd_twitter { # data - contains the parameters for /twitter # server - the active server in window # witem - the active window item (eg. channel, query) # or undef if the window is empty my ($data, $server, $witem) = @_; if ($data) { my ($command, $message) = split(/ /, $data, 2); if($command eq "u") { my $update_url = "http://$username:$password\@twitter.com/statuses/update.xml"; if($message) { my $ua = new LWP::UserAgent; my $response = $ua->post($update_url, { status=>$message }); my $content = $response->content; } else { Irssi:print("You must provide a message to update with"); } #TODO: Check response, report error to user if there was one. } elsif ($command eq "d") { my $direct_url = "http://$username:$password\@twitter.com/direct_messages/new.xml"; my ($user, $text) = split(/ /, $message, 2); if($user && $text) { my $ua = new LWP::UserAgent; my $response = $ua->post($direct_url, { user=>$user, text=>$text }); my $content = $response->content; } else { Irssi:print("You need to provide the user to message and text to send"); } #TODO: Check response, report error to user if there was one. } else { print "in command else"; } } else { Irssi::print("You need to include a command"); } } command_bind('twitter', 'cmd_twitter'); signal_add_last 'complete word' => \&sig_complete;