package Hubot::Adapter::Campfire; { $Hubot::Adapter::Campfire::VERSION = '0.1.6'; } use Moose; use namespace::autoclean; extends 'Hubot::Adapter'; use AnyEvent; use AnyEvent::HTTP; use AnyEvent::Campfire::Client; use JSON::XS; use Encode 'encode_utf8'; use HTTP::Request; use LWP::UserAgent; use Try::Tiny; use Hubot::Message; has 'robot' => ( is => 'ro', isa => 'Hubot::Robot', ); has 'cv' => ( is => 'ro', lazy_build => 1, ); has 'bot' => ( is => 'rw', ); has 'httpClient' => ( is => 'ro', default => sub { LWP::UserAgent->new }, ); sub _build_cv { AnyEvent->condvar } sub send { my ( $self, $user, @strings ) = @_; $self->bot->speak( $user->{room}, encode_utf8($_) ) for @strings; } sub reply { my ( $self, $user, @strings ) = @_; @strings = map { $user->{name} . ": $_" } @strings; $self->send( $user, @strings ); } sub run { my $self = shift; my %options = ( token => $ENV{HUBOT_CAMPFIRE_TOKEN}, rooms => $ENV{HUBOT_CAMPFIRE_ROOMS}, account => $ENV{HUBOT_CAMPFIRE_ACCOUNT}, ); $self->cv->begin; my $bot = AnyEvent::Campfire::Client->new(%options); $bot->on( 'join', sub { my ( $e, $data ) = @_; $self->receive( new Hubot::EnterMessage ); } ); $bot->on( 'message', sub { my ( $e, $data ) = @_; my $user = $self->userForId( $data->{user_id}, { room => $data->{room_id}, } ); if ( $user->{name} eq $user->{id} ) { my $req = HTTP::Request->new( GET => sprintf( "https://%s.campfirenow.com/users/%s", $options{account}, $user->{id} ), ); $req->header( 'Accept', 'application/json' ); $req->header( 'Authorization', $bot->authorization ); my $res = $self->httpClient->request($req); # non-async return unless $res->is_success; my $userData; try { $userData = decode_json( $res->content ); } catch { $bot->emit( 'error', $_ ); }; $user->{name} = $userData->{user}{name}; } ## TODO: support EnterMessage, LeaveMessage $self->receive( new Hubot::TextMessage( user => $user, text => $data->{body}, ) ); } ); $bot->on( 'error', sub { my ( $e, $error ) = @_; print STDERR "$error\n"; } ); $bot->on( 'leave', sub { $self->cv->send; # TODO: support multiple rooms `leave` } ); $self->bot($bot); $self->emit('connected'); $self->cv->recv; } sub close { my $self = shift; $self->bot->exit; } __PACKAGE__->meta->make_immutable; 1; =pod =encoding utf-8 =head1 NAME Hubot::Adapter::Campfire - Campfire adapter for L =head1 SYNOPSIS $ export HUBOT_CAMPFIRE_TOKEN='xxxx' $ export HUBOT_CAMPFIRE_ROOMS='1234' $ export HUBOT_CAMPFIRE_ACCOUNT='aanoaa' $ hubot -a campfire =head1 DESCRIPTION Campfire is the web based chat application built by L<37 Signals|http://37signals.com/>. The Campfire adapter is one of the original adapters in Hubot. =head1 CONFIGURATION =over =item HUBOT_CAMPFIRE_TOKEN This can be found by logging in with your hubot's account click the My Info link and make a note of the API token. =item HUBOT_CAMPFIRE_ROOMS If you join the rooms you want your hubot to join will see notice a numerical ID for the room in the URL. Make a note of each ID for the rooms you want your hubot to join. =item HUBOT_CAMPFIRE_ACCOUNT This is simply the first part of the domain you visit for your Campfire account. For example if your Campfire was at C your subdomain is hubot. Make a note of the subdomain. =back =head1 SEE ALSO =over =item L =item L =back =head1 AUTHOR Hyungsuk Hong =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2012 by Hyungsuk Hong. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut