Conductrics-Agent

 view release on metacpan or  search on metacpan

lib/Conductrics/Agent.pm  view on Meta::CPAN

package Conductrics::Agent;

use strict;
use warnings;
use namespace::autoclean;
use Moose;
use MooseX::Types::Moose qw( Str );
use MooseX::Types::URI qw(Uri);
use URI;
use URI::QueryParam;
use JSON::MaybeXS;
use Time::HiRes;
use LWP::UserAgent;
use Data::Dumper;

our $VERSION = '0.004';
$VERSION = eval $VERSION;

sub build_uri { 
    my($self)=@_;
    return URI->new($self->baseUrl); 
}

has 'apiKey' => (is=>'ro', isa=>Str, required=>1);
has 'ownerCode' => (is=>'ro', isa=>Str, required=>1);
has 'baseUrl' => (is=>'ro', isa=>Str, required=>1);
has 'baseUri' => (is=>'ro', isa=>Uri, lazy=>1, builder=>'build_uri');
has 'sessionId' => (is=>'rw', isa=>Str);
has 'name' => (is=>'rw', isa=>Str, required=>1);

my $ua = LWP::UserAgent->new();
$ua->agent('Perl Conductrics::Agent');
$ua->timeout(2);
$ua->env_proxy;

sub _request {
    my ($self, $uri, @params) = @_;
    my ($seconds, $microseconds) = Time::HiRes::gettimeofday;
    my %parameters = (nocache=>"$seconds$microseconds", apikey=>$self->apiKey, session=>$self->sessionId, @params);
    for my $k (keys %parameters) {
	$uri->query_param_append($k, $parameters{$k});
    }

    my $response = $ua->get($uri);
    if ($response->is_success) {
	if ($response->code != 200) {
	    warn "Content: ", $response->decoded_content;  # or whatever
	    warn "Code: ", $response->code;
	    warn "Err:", $response->message;
	    warn "Something get wrong on response";
	    warn Dumper($response);
	}

	JSON::MaybeXS::decode_json($response->decoded_content);
    } else {
	warn "Content: ", $response->decoded_content;  # or whatever
	warn "Code: ", $response->code;
	warn "Err:", $response->message;
	die $response->status_line;
    }
}

sub decide {
    my ($self, $session, @choices) = @_;
    my $uri = $self->baseUri->clone;
    $self->sessionId($session);
    my ($answer, $kind);
    if ('ARRAY' eq ref $choices[0]) {
	# Multi decisions request simple  ([ qw/ red black green / ], [ qw/ verdana arial /] )
	$uri->path_segments($self->ownerCode, $self->name, "decisions", map { join(',', @{$_}) } @choices );
    } elsif ('HASH' eq ref $choices[0]) {
	# Multi decision request with names ( {colour=>[qw/red black green/] }, { font=>[qw/ verdana arial /] })
	$uri->path_segments($self->ownerCode, $self->name, "decisions", map { my ($k) = keys %{$_}; "$k:" . join (",", map {$_} @{$_->{$k}} ) } @choices );
    } else {
	# single decision
	$kind = 'single';
	$uri->path_segments($self->ownerCode, $self->name, "decision", join(',', @choices));
    }
    # handle multidecision answer
    eval {
	$answer = $self->_request(
	    $uri,
	    );
    };
    if ($@) {
	die('Not able to get decision');
    }
    return $answer->{decision} if ( 'single' eq $kind );
    return $answer;
}


sub get_decisions {
    my ($self, $session, $point) = @_;
    my $uri = $self->baseUri->clone;
    $self->sessionId($session);
    $uri->path_segments($self->ownerCode, $self->name, "decisions" );
    # handle multidecision answer
    my $answer;
    eval {
	$answer = $self->_request(
	    $uri,
	    point=>$point,
	    );
    };
    if ($@) {
	die('Not able to get decision');
    }
    return $answer;
}



sub reward {
    my ($self, $session, $goalCode, $value) = @_;
    $value = 1 unless (defined $value);



( run in 2.008 seconds using v1.01-cache-2.11-cpan-600a1bdf6e4 )