Perl and Pidgin’s API
I’m trying to write a plugin for the Pidgin IM client in Perl that would take your latest post to identi.cafrom an RSS feed and set it as your Pidgin status message. However the Perl API for Pidgin is poorly documented and I’m having trouble. I based a lot of it on the pidgintwitter-plugin.
I’m not sure what’s going on exactly though I suspect I’m not passing the URL correctly to the the parsing subroutine.
Any help would be appreciated.
use Purple;
use XML::RSS;
use LWP::Simple;
%PLUGIN_INFO = (
perl_api_version => 2,
name => "Identica Status",
version => "0.0.1",
summary => "Use an identi.ca feed as your Pidgin status.",
description => "Use an identi.ca feed as your Pidgin status. Based on the pidgintwitter-status plugin (http://code.google.com/p/pidgin-twitterstatus/).",
author => "Mattack
"http://identica.ca",
load => "plugin_load",
unload => "plugin_unload",
prefs_info => "prefs_info_cb",
);
sub fetch_url_cb {
my $response = shift; # This section correctly
# parse the RSS feed # parses the URL and pulls
my $rss = new XML::RSS; # the latest post if $response
my $feed = get($response); # is a correct URL. If you pull
Purple::Debug::info("Identica Status Feed", "Fetching $responsen"); # it out and put it in a
$rss->parse($feed); # seperate script, add something
my $item = shift (@{$rss->{'items'}}); # like print $status_message;
my $status_message = "$item->{'title'}n"; # to the end... I'm not sure I'm
# we don't want @replies # passing the URL to the subroutine
while ( $status_message =~ /^@/) { # correctly though...
$item = shift (@{$rss->{'items'}}); # Pidgin's Perl API is poorly
$status_message = "$item->{'title'}n"; # documented.
}
Purple::Debug::info("Identica Status Feed", "Status Message is ". $status_message ."n");
# set identi.ca status to pidgin status
my $saved_status = Purple::SavedStatus::get_current();
my $statusType = $saved_status->get_type();
my $prev_status = $saved_status->get_message();
Purple::Debug::info("Identica Status Feed","Your status type is ". $statusType . "n");
$saved_status->set_message($status_message);
$saved_status->set_type($statusType);
$saved_status->activate();
}
## if(!($keepOnAway && $statusType == 6))
## {
## if(($prev_status ne $status_message) && (length($status_message) > 1) && (index($status_message, '@') != 0))
## {
## Purple::Debug::info("Identica Status Feed", "Updating status message with ".$status_message." From ".$identicaurl."n");
# $saved_status->set_message($status_message);
# $saved_status->set_type($statusType);
# $saved_status->activate();
## }else{
## Purple::Debug::info("Identica Status Feed","Not updating status because it has not changed, was too short, or started with an @n");
## }
## }else{
## Purple::Debug::info("Identica Status Feed","Not updating status because you are away and like your messagen");
## }
## print $status;
#}
sub timeout_cb {
Purple::Debug::info("Identica Status Feed", "Starting the sequence. Pidgin's timer expired.n");
my $plugin = shift;
my $identicausername = Purple::Prefs::get_string("/plugins/core/gtk-mattack-identicastatus/identicausername");
my $identicaurl = "http://identi.ca/api/statuses/user_timeline/".$identicausername.".rss";
#if the timeout cannot be parsed, 0 will result
my $timeout = 0+Purple::Prefs::get_string("/plugins/core/gtk-mattack-identicastatus/timeout");
my $keepOnAway = Purple::Prefs::get_bool("/plugins/core/gtk-mattack-identicastatus/onaway");
my $status_message = "";
if($identicausername eq ""){
Purple::Debug::info("Identica Status Feed","Blank usernamen");
die "blank username";
}
my $agent = "pidgin-identicastatusfeed/1.0";
#give some timeout if not otherwise specified
if($timeout eq 0)
{
Purple::Debug::info("identica Status Feed", "Could not parse timeout field. Using 120 seconds default.n");
$timeout = 120
}
Purple::Debug::info("identica Status Feed", "Fetching URL.n");
Purple::Util::fetch_url($plugin, $identicaurl, TRUE, $agent,TRUE, "fetch_url_cb");
# Reschedule timeout
Purple::Debug::info("identica Status Feed", "Rescheduling timer.n");
Purple::timeout_add($plugin, $timeout, &timeout_cb, $plugin);
Purple::Debug::info("identica Status Feed", "New timer set for " . $timeout . " seconds.n");
return 0;
}
sub plugin_init {
return %PLUGIN_INFO;
}
sub plugin_load {
my $plugin = shift;
Purple::Debug::info("Identica Status Feed", "plugin_load() - Identi.ca Status Loaded.n");
# Here we are adding a set of preferences
# The second argument is the default value for the preference.
Purple::Prefs::add_none("/plugins/core/gtk-mattack-identicastatus");
Purple::Prefs::add_string("/plugins/core/gtk-mattack-identicastatus/identicausername", "");
Purple::Prefs::add_bool("/plugins/core/gtk-mattack-ideinticastatus/onidleonly", "");
Purple::Prefs::add_bool("/plugins/core/gtk-mattack-identicastatus/onaway","");
Purple::Prefs::add_string("/plugins/core/gtk-mattack-identicastatus/timeout", "120");
# Schedule a timeout for 1 second from now
Purple::timeout_add($plugin, 10, &timeout_cb, $plugin);
}
sub plugin_unload {
my $plugin = shift;
Purple::Debug::info("Identica Status Feed", "plugin_unload() - Identi.ca Status Unloaded.n");
}
sub prefs_info_cb {
# The first step is to initialize the Purple::Pref::Frame that will be returned
$frame = Purple::PluginPref::Frame->new();
# Create a new boolean option with a label "Boolean Label" and then add
# it to the frame
$ppref = Purple::PluginPref->new_with_label("Identi.ca Account Information");
$frame->add($ppref);
# Create a text box. The default value will be "Foobar" as set by
# plugin_load
$ppref = Purple::PluginPref->new_with_name_and_label(
"/plugins/core/gtk-mattack-identicastatus/identicausername", "Identi.ca User Name");
$ppref->set_type(2);
$ppref->set_max_length(120);
$frame->add($ppref);
#Adding the timeout box
$tpref = Purple::PluginPref->new_with_name_and_label("/plugins/core/gtk-mattack-identicastatus/timeout", "Timeout Period");
#TODO: look to see if this type can be automatically set to be an integer so we don't need to parse it later
$tpref->set_type(2);
$tpref->set_max_length(3);
$frame->add($tpref);
#Update on Away
$ppref = Purple::PluginPref->new_with_name_and_label(
"/plugins/core/gtk-mattack-identicastatus/onaway", "Preserve Pidgin status when extended away");
$ppref -> set_type(3);
$frame->add($ppref);
return $frame;
}
∞ July 19, 2008 at 10:55am

