package Plagger::Plugin::Notify::Campfire;
use strict;
use base qw( Plagger::Plugin );
use Time::HiRes;
our $VERSION = 0.01;
sub plugin_id {
my $self = shift;
$self->class_id . '-' . $self->conf->{email};
}
sub register {
my ( $self, $context ) = @_;
$context->register_hook(
$self,
'publish.init' => \&initialize,
'publish.entry' => \&publish_entry,
);
}
sub initialize {
my ( $self, $context ) = @_;
$self->{campfire} =
Plagger::Plugin::Notify::Campfire::Mechanize->new($self);
unless ( $self->{campfire}->login ) {
$context->log( error => "Login to Campfire failed." );
return;
}
$context->log( info => 'Login to Campfire succeeded.' );
}
sub publish_entry {
my ( $self, $context, $args ) = @_;
$self->{campfire}->speak( $args->{entry}->title );
$self->{campfire}->speak( $args->{entry}->link );
$context->log( info => 'Speak: ' . $args->{entry}->title );
Time::HiRes::sleep( $self->conf->{speak_interval} || 2 );
}
package Plagger::Plugin::Notify::Campfire::Mechanize;
use strict;
use Plagger::Mechanize;
use HTTP::Request::Common;
use Encode;
sub new {
my $class = shift;
my $plugin = shift;
my $mech = Plagger::Mechanize->new(cookie_jar => $plugin->cookie_jar);
$mech->agent_alias("Windows IE 6");
bless {
mecha => $mech,
nickname => $plugin->conf->{nickname},
email => $plugin->conf->{email},
password => $plugin->conf->{password},
room_url => $plugin->conf->{room_url},
guest_url => $plugin->conf->{guest_url},
}, $class;
}
sub login {
my $self = shift;
my $start_url = $self->{guest_url} || $self->{room_url};
my $res = $self->{mecha}->get($start_url);
return 0 unless $self->{mecha}->success;
# still login
return 1 if ( $self->{mecha}->content =~ /chat-wrapper/);
if ( $self->{guest_url} ) {
$self->{mecha}->submit_form(
fields => {
name => $self->{nickname},
remember => 1,
},
);
}
else {
$self->{mecha}->submit_form(
fields => {
email_address => $self->{email},
password => $self->{password},
remember => 1,
},
);
}
$self->{mecha}->submit;
return 0 unless $self->{mecha}->success;
return 0 if $self->{mecha}->content =~ /Oops/;
unless ( $self->{room_url} ) {
$self->{room_url} = $self->{guest_url};
my ( $room_no, ) = $self->{mecha}->content =~ /participant_list-(\d+)/;
$self->{room_url} =~ s!/\w+$!/room/$room_no!;
}
}
sub speak {
my ( $self, $message ) = @_;
$self->{mecha}->request(
POST $self->{room_url} . "/speak",
[ message => encode( 'utf-8', $message ) ]
);
return 0 unless $self->{mecha}->success;
}
1;
__END__
=head1 NAME
Plagger::Plugin::Notify::Campfire - Notification bot for Campfire
=head1 SYNOPSIS
To use bot as a guest (recommended),
- module: Notify::Campfire
config:
guest_url: http://exmaple.campfirenow.com/room/NNNN
nickname: nickname
speak_interval: 3
Or, to use bot using existent login credentials,
- module: Notify::Campfire
config:
room_url: http://exmaple.campfirenow.com/NNNN
email: example@example.com
password: xxxxxx
speak_interval: 2
=head1 DESCRIPTION
This plugin notifies feed updates to 37 Signals' Campfire
L chat room.
Note that you don't have to supply emali and password if you set
global cookie_jar in your configuration file and the cookie_jar
contains a valid login session there, such as:
global:
user_agent:
cookies: /path/to/cookies.txt
See L for details.
=head1 AUTHOR
Takeshi Nagayama
=head1 SEE ALSO
L, L, L
=cut