OpenInteract2::Observer::UsePerlPost - Observer to post the contents of an object to a use.perl.org journal


OpenInteract2-Observer-UsePerlPost documentation Contained in the OpenInteract2-Observer-UsePerlPost distribution.

Index


Code Index:

NAME

Top

OpenInteract2::Observer::UsePerlPost - Observer to post the contents of an object to a use.perl.org journal

SYNOPSIS

Top

 # In your action.ini we need data to configure the journal post; this
 # can also be set programmatically if for instance you need to use
 # this for multiple users on your system

 [someaction]

 # ... normal action parameters ...

 # observer parameters
 # field with subject of post
 use_perl_subject  = title

 # field with content of post
 use_perl_content  = news_item

 # your use.perl userid
 use_perl_user_id  = 55

 # your password
 use_perl_password = foobar

 # In conf/observer.ini:

 # declare the observer
 [observer]
 useperl = OpenInteract2::Observer::UsePerlPost

 # hook it into the 'news' action so that 'post add' events fired will
 # add an entry into the journal

 [map]
 useperl = news

DESCRIPTION

Top

This class is an OpenInteract2::Action observer that takes the object just added and fires off a posting to a use.perl.org journal with the contents. Thus keeping you in touch with your Perl peeps while still using your favorite application server to hold all your data.

What is an observer? See Class::Observer for general information and OpenInteract2::Observer for specifics related to OpenInteract.

Configuration

use_perl_skip (optional)

If this parameter set in the action or in the OpenInteract2::Request to 'yes' or 'true', this observer won't kick off the journal addition. This allows you to stick a checkbox on the form that adds your object to skip the use.perl part if you want. (For instance, folks there might not dig your weekly cat photo post...)

use_perl_subject (required)

Field/method to pull the subject of the use.perl post from.

use_perl_content (required)

Field/method to pull the content of the use.perl post from.

use_perl_footer (optional)

Text to use as the footer of the message posted. Any instance of '$LINK' will be replaced by my best guess for the URL to display this object, and '$ID' will be replaced by the object ID.

use_perl_user_id (required)

ID of the user to use for authentication.

use_perl_password (required)

Password for the given user ID.

use_perl_proxy (optional)

Specify the 'Proxy' used in the Net::Blogger call to create a connection to the use.perl server. By default this is set to 'http://use.perl.org/journal.pl' and you should not need to change it.

use_perl_uri (optional)

Specify the 'Uri' used in the Net::Blogger call to create a connection to the use.perl server. By default this is set to 'http://use.perl.org/Slash/Journal/SOAP' and should not need to change it.

If you need to change either 'use_perl_proxy' or 'use_perl_uri' please contact the author since it probably means the API has changed and the default behavior of this module should be updated.

Modifying your content

We modify the content extracted from your object in the following ways:

SEE ALSO

Top

Net::Blogger

OpenInteract2::Observer

OpenInteract2::Action

Class::Observable

COPYRIGHT

Top

AUTHORS

Top

Chris Winters <chris@cwinters.com>


OpenInteract2-Observer-UsePerlPost documentation Contained in the OpenInteract2-Observer-UsePerlPost distribution.

package OpenInteract2::Observer::UsePerlPost;

# $Id: UsePerlPost.pm,v 1.9 2005/01/17 00:06:59 cwinters Exp $

use strict;
use Log::Log4perl            qw( get_logger );
use Net::Blogger;
use OpenInteract2::Constants qw( :log );
use OpenInteract2::Context   qw( CTX DEPLOY_URL );

$OpenInteract2::Observer::UsePerlPost::VERSION  = '0.05';

my $DEFAULT_PROXY = 'http://use.perl.org/journal.pl';
my $DEFAULT_URI   = 'http://use.perl.org/Slash/Journal/SOAP';

my @REQUIRED_FIELDS = qw(
    use_perl_subject use_perl_content
    use_perl_user_id use_perl_password
);

my ( $log );

sub update {
    my ( $class, $action, $type, $object ) = @_;
    return unless ( $type eq 'post add' );

    my $request = CTX->request;

    my $do_skip = $action->param( 'use_perl_skip' );
    unless ( $do_skip ) {
        if ( $request ) {
            $do_skip = $request->param( 'use_perl_skip' );
        }
    }
    return if ( $do_skip eq 'yes' );

    $log ||= get_logger( LOG_APP );

    my $subject_field = $action->param( 'use_perl_subject' );
    my $content_field = $action->param( 'use_perl_content' );
    my $user_id       = $action->param( 'use_perl_user_id' );
    my $password      = $action->param( 'use_perl_password' );

    my $action_name = $action->name;
    my $error_preamble = "Cannot post use.perl journal from action '$action_name'!";
    unless ( $subject_field and $content_field and $user_id and $password ) {
        $log->error(
            "$error_preamble You must define the following parameters in ",
            "your action: ", join( ', ', @REQUIRED_FIELDS ), ". You can ",
            "do so in the configuration file or in the action code itself."
        );
        return;
    }

    my $subject = $object->$subject_field();
    my $content = $object->$content_field();
    unless ( $subject and $content ) {
        $log->error(
            "$error_preamble No subject found from method '$subject_field' ",
            "or no content found from method '$content_field'; not creating ",
            "journal entry."
        );
        return;
    }

    if ( my $footer = $action->param( 'use_perl_footer' ) ) {
        $content .= "\n\n" . $class->_generate_footer( $object, $footer );
    }

    my $blogger = Net::Blogger->new(
        engine => 'slash',
        debug  => $log->is_debug,
    );

    my $use_perl_proxy = $action->param( 'use_perl_proxy' )
                         || $DEFAULT_PROXY;
    my $use_perl_uri   = $action->param( 'use_perl_uri' )
                         || $DEFAULT_URI;

    # Before we send the content we want to get rid of any HTML that
    # use.perl might not like. (This could be better done...)

    # First create 'ecode' sections...

    $content =~ s|<pre[^>]+>|<ecode>|g;
    $content =~ s|</pre>|</ecode>|g;

    # ...then remove all img tags and replace them with links to the
    # image and a note about what you're seeing

    my @image_tags = $content =~ /(<img[^>]+>)/gsm;
    foreach my $img_tag ( @image_tags ) {
        my ( $src ) = $img_tag =~ /src="([^"]+)"/sm;
        my ( $alt ) = $img_tag =~ /alt="([^"]+)"/sm;
        unless ( $alt ) {
            my $base_src = '';
            if ( $alt =~ m|/| ) {
                ( $base_src ) = $src =~ m|.*/(.*)$|;
            }
            else {
                $base_src = $src;
            }
            $alt = $base_src;
        }
        $content =~ s|$img_tag|(view image: <a href="$src">$alt</a>)|sm;
    }

    my $debug_only = $action->param( 'use_perl_debug' );
    if ( $debug_only =~ /^(yes|true)/i ) {
        $log->warn( "Not sending data to use.perl server since ",
                    "'use_perl_debug' is set." );
        $log->warn( "Proxy: $use_perl_proxy" );
        $log->warn( "Uri: $use_perl_uri" );
        $log->warn( "Username: $user_id" );
        my $masked = join( '', map { 'X' } ( 1 .. length $password ) );
        $log->warn( "Password: $masked (masked)" );
        $log->warn( "Subject:\n$subject" );
        $log->warn( "Body:\n$content" );
    }
    else {
        $blogger->Proxy( $use_perl_proxy );
        $blogger->Uri( $use_perl_uri );
        $blogger->Username( $user_id );
        $blogger->Password( $password );
        my $post_id = $blogger->slash()->add_entry(
            subject => $subject,
            body    => $content,
        );
        $log->is_info &&
            $log->info( "Result from adding entry '$subject': $post_id" );
    }
}

sub _generate_footer {
    my ( $class, $object, $footer ) = @_;
    if ( $footer =~ /\$LINK/ || $footer =~ /\$ID/ ) {
        my ( $object_info, $object_url, $object_id );
        eval {
            $object_info = $object->object_description;
            $object_url  = $object_info->{url};
            $object_id   = $object_info->{object_id};
        };

        # last-ditch to define the ID
        eval {
            $object_id ||= $object->id
        };

        if ( $object_url ) {
            my $request = CTX->request;
            my $host    = ( $request )
                            ? $request->server_name
                            : CTX->server_config->{server_host};
            if ( $host ) {
                my $server_url = "http://$host" . DEPLOY_URL;
                $footer =~ s/\$LINK/$server_url$object_url/g;
            }
            else {
                $log->warn( "Cannot generate footer: no server host found. ",
                            "Please define server configuration key ",
                            "'Global.server_host' so I know what hostname to use." );
                return '';
            }
        }
        if ( $object_id ) {
            $footer =~ s/\$ID/$object_id/g;
        }
    }
    $log->is_info && $log->info( "Adding footer: $footer" );
    return $footer;
}

1;

__END__