API-BigBlueButton

 view release on metacpan or  search on metacpan

cpanfile  view on Meta::CPAN

requires 'perl', '5.008008';
requires 'Carp', '0';
requires 'LWP::UserAgent', '>= 6.05';
requires 'base', '0';
requires 'constant', '0';
requires 'Digest::SHA1', '0';
requires 'XML::Fast', '0';

on 'test' => sub {
    requires 'Test::More', '0.98';
    requires 'Test::Spec', '0';
    requires 'FindBin', '0';
};

lib/API/BigBlueButton.pm  view on Meta::CPAN


timeout

    Connection timeout. Optional parameter.

use_https

    Use/not use https. Optional parameter.
=cut

sub new {
    my $class = shift;

    $class = ref $class || $class;

    my $self = {
        timeout => 30,
        secret  => '',
        server  => '',
        use_https => 0,
        (@_),
    };

    for my $need_param ( REQUIRE_PARAMS ) {
        confess "Parameter $need_param required!" unless $self->{ $need_param };
    }

    return bless $self, $class;
}

sub abstract_request {
    my ( $self, $data ) = @_;

    my $request = delete $data->{request};
    my $checksum = delete $data->{checksum};
    confess "Parameter request required!" unless $request;

    my $url = $self->{use_https} ? 'https://' : 'http://';
    $url .= $self->{server} . '/bigbluebutton/api/' . $request . '?';

    if ( scalar keys %{ $data } > 0 ) {
        $url .= $self->generate_url_query( $data );
        $url .= '&';
    }
    $url .= 'checksum=' . $checksum;

    return $self->request( $url );
}

sub request {
    my ( $self, $url ) = @_;

    my $ua = LWP::UserAgent->new;

    $ua->ssl_opts(verify_hostname => 0) if $self->{use_https};
    $ua->timeout( $self->{ timeout } );

    my $res = $ua->get( $url );

    return API::BigBlueButton::Response->new( $res );

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN

=head1 METHODS

=over

=item B<get_version($self)>

Getting the current version of the BigBlueButton

=cut

sub get_version {
    my ( $self ) = @_;

    my $url = $self->{use_https} ? 'https://' : 'http://';
    $url .= $self->{server} . '/bigbluebutton/api';

    return $self->request( $url );
}

=item B<create($self,%params)>

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN

    This parameter is optional.

clientURL

    This parameter is optional.

SEE MORE L<https://code.google.com/p/bigbluebutton/wiki/API#create>

=cut

sub create {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'create', \%params );
    return $self->abstract_request( $data );
}

=item B<join($self,%params)>

Joins a user to the meeting specified in the meetingID parameter.

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN

    This parameter is optional.

clientURL

    This parameter is optional.

SEE MORE L<https://code.google.com/p/bigbluebutton/wiki/API#join>

=cut

sub join {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'join', \%params );
    return $self->abstract_request( $data );
}

=item B<ismeetingrunning($self,%params)>

This call enables you to simply check on whether or not a meeting is running by
looking it up with your meeting ID.

%params:

meetingID

    This parameter is mandatory.
    The meeting ID that identifies the meeting you are attempting to check on.

=cut

sub ismeetingrunning {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'isMeetingRunning', \%params );
    return $self->abstract_request( $data );
}

=item B<end($self,%params)>

Use this to forcibly end a meeting and kick all participants out of the meeting.

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN

    This parameter is mandatory.
    The meeting ID that identifies the meeting you are attempting to end.

password

    This parameter is mandatory.
    The moderator password for this meeting. You can not end a meeting using the attendee password.

=cut

sub end {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'end', \%params );
    return $self->abstract_request( $data );
}

=item B<getmeetinginfo($self,%params)>

This call will return all of a meeting's information,
including the list of attendees as well as start and end times.

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN

    The meeting ID that identifies the meeting you are attempting to check on.

password

    This parameter is mandatory.
    The moderator password for this meeting.
    You can not get the meeting information using the attendee password.

=cut

sub getmeetinginfo {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'getMeetingInfo', \%params );
    return $self->abstract_request( $data );
}

=item B<getmeetings($self)>

This call will return a list of all the meetings found on this server.

=cut

sub getmeetings {
    my ( $self ) = @_;

    my $data = $self->_generate_data( 'getMeetings' );
    return $self->abstract_request( $data );
}

=item B<getrecordings($self,%params)>

Retrieves the recordings that are available for playback for a given meetingID (or set of meeting IDs).

%params:

meetingID

    This parameter is optional.

=cut

sub getrecordings {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'getRecordings', \%params );
    return $self->abstract_request( $data );
}

=item B<publishrecordings($self,%params)>

Publish and unpublish recordings for a given recordID (or set of record IDs).

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN

    A record ID for specify the recordings to apply the publish action.
    It can be a set of record IDs separated by commas.

publish

    This parameter is mandatory.
    The value for publish or unpublish the recording(s). Available values: true or false.

=cut

sub publishrecordings {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'publishRecordings', \%params );
    return $self->abstract_request( $data );
}

=item B<deleterecordings($self,%params)>

Delete one or more recordings for a given recordID (or set of record IDs).

%params:

recordID

    This parameter is mandatory.
    A record ID for specify the recordings to delete.
    It can be a set of record IDs separated by commas.

=cut

sub deleterecordings {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'deleteRecordings', \%params );
    return $self->abstract_request( $data );
}

=item B<getdefaultconfigxml($self)>

Retrieve the default config.xml.

SEE MORE L<https://code.google.com/p/bigbluebutton/wiki/API#getDefaultConfigXML>

=cut

sub getdefaultconfigxml {
    my ( $self ) = @_;

    my $data = $self->_generate_data( 'getDefaultConfigXML' );
    return $self->abstract_request( $data );
}

=item B<setconfigxml($self,%params)>

Associate an custom config.xml file with the current session.

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN


configXML

    This parameter is mandatory.
    A valid config.xml file

SEE MORE L<https://code.google.com/p/bigbluebutton/wiki/API#setConfigXML>

=cut

sub setconfigxml {
    my ( $self, %params ) = @_;

    my $data = $self->_generate_data( 'setConfigXML', \%params );
    return $self->abstract_request( $data );
}

=item B<generate_checksum($self,$request,$params)>

Create a checksum for the query

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN

    Name of query, e.g. 'create' or 'join'

$params:

    Query parameters

    my $chksum = $self->generate_checksum( 'create', \%params );

=cut

sub generate_checksum {
    my ( $self, $request, $params ) = @_;

    my $string = $request;
    $string .= $self->generate_url_query( $params ) if ( $params && ref $params );
    $string .= $self->{secret};

    return sha1_hex( $string );
}

=item B<generate_url_query($self,$params)>

lib/API/BigBlueButton/Requests.pm  view on Meta::CPAN

$params:

    Query parameters

    $params{checksum} = $self->generate_checksum( 'create', \%params );
    $params{request}  = 'create';
    my $url = $self->generate_url_query( \%params );

=cut

sub generate_url_query {
    my ( $self, $params ) = @_;

    my $string = CORE::join( '&', map { "$_=$params->{$_}" } sort keys %{ $params } );

    return $string;
}

sub _generate_data {
    my ( $self, $request, $params ) = @_;

    $self->_check_params( $request, $params ) if $params;
    $params->{checksum} = $self->generate_checksum( $request, $params );
    $params->{request}  = $request;

    return $params;
}

sub _check_params {
    my ( $self, $request, $params ) = @_;

    my $const = 'REQUIRE_' . uc $request . '_PARAMS';
    return unless $self->can( $const );

    for my $req_param ( @{ $self->$const } ) {
        confess "Parameter $req_param required!" unless $params->{ $req_param };
    }

    return 1;

lib/API/BigBlueButton/Response.pm  view on Meta::CPAN

=item B<new($class,$res)>

Constructor.

$res

    HTTP::Response object.

=cut

sub new {
    my ( $class, $res ) = @_;

    my $success   = $res->is_success;
    my $xml       = $success ? $res->decoded_content : '';
    my $error     = $success ? '' : $res->decoded_content;
    my $status    = $res->status_line;

    my $parsed_response = $xml ? xml2hash( $xml, attr => '' ) : {};

    return bless(

lib/API/BigBlueButton/Response.pm  view on Meta::CPAN

        }, $class
    );
}

=item B<xml($self)>

Returns original XML answer.

=cut

sub xml {
    my ( $self ) = @_;

    return $self->{xml};
}

=item B<success($self)>

Returns 1 if request succeeded, 0 otherwise.

=cut

sub success {
    my ( $self ) = @_;

    return $self->{success};
}

=item B<response($self)>

Returns munged response from service. According to method, it can be scalar, hashref of arrayref.

=cut

sub response {
    my ( $self ) = @_;

    return $self->{response};
}

=item B<error($self)>

Returns munged error text.

=cut

sub error {
    my ( $self ) = @_;

    return $self->{error};
}

=item B<status($self)>

Returns response status line.

=cut

sub status {
    my ( $self ) = @_;

    return $self->{status};
}

1;

__END__

=back

t/002_bigbluebutton.t  view on Meta::CPAN

use strict;
use warnings;
use Test::Spec;

use FindBin qw/ $Bin /;
use lib "$Bin/../lib";

use_ok( 'API::BigBlueButton' );

describe "Constructor" => sub {

    it "Normal creation" => sub {
        my $bbb = API::BigBlueButton->new(
            secret => 'mysecret',
            server => 'myserver',
        );
        ok( $bbb );
        is( $bbb->{server}, 'myserver' );
        is( $bbb->{secret}, 'mysecret' );
    };

    it "Empty required params" => sub {
        my $bbb;
        eval { $bbb = API::BigBlueButton->new };
        ok( $@ );

        eval { $bbb = API::BigBlueButton->new( secret => 'mysecret' ) };
        ok( $@ );
        like( $@, qr/Parameter server required/ );

        eval { $bbb = API::BigBlueButton->new( server => 'myserver' ) };
        ok( $@ );
        like( $@, qr/Parameter secret required/ );
    };
};

describe "abstract_request" => sub {

    my $checksum = '1233dfgdfg';
    my $bbb;

    before each => sub {
        $bbb = API::BigBlueButton->new(
            secret => 'mysecret',
            server => 'myserver',
        );
    };

    it "Without data" => sub {
        my $url;
        API::BigBlueButton->expects( 'request' )
            ->returns( sub { $url = $_[1]; return 1 } )->at_least(1);

        my $res = $bbb->abstract_request( {
            request  => 'create',
            checksum => $checksum,
        } );

        ok( $res );
        like( $url, qr/myserver.+create\?checksum=$checksum/ );
    };

    it "With data" => sub {
        my $url;
        my $key = 'myparam';
        my $val = 'myvalue';

        API::BigBlueButton->expects( 'request' )
            ->returns( sub { $url = $_[1]; return 1 } )->at_least(1);

        API::BigBlueButton->expects( 'generate_url_query' )
            ->returns( sub { return $key . '=' . $_[1]->{ $key } } )->at_least(1);

        my $res = $bbb->abstract_request( {
            request  => 'create',
            checksum => $checksum,
            $key     => $val,
        } );

        ok( $res );
        like( $url, qr/myserver.+create\?$key=$val&checksum=$checksum/ );
    };

    it "Empty param request" => sub {
        eval { $bbb->abstract_request( { checksum => $checksum } ) };

        ok ( $@ );
        like( $@, qr/Parameter request required/ );
    };
};

runtests unless caller;

t/003_bigbluebutton_requests.t  view on Meta::CPAN

use strict;
use warnings;
use Test::Spec;

use FindBin qw/ $Bin /;
use lib "$Bin/../lib";

use_ok( 'API::BigBlueButton' );

describe "Get version" => sub {
    it "Normal run" => sub {
        my $url;

        API::BigBlueButton->expects( 'request' )
            ->returns( sub { $url = $_[1]; return 1; } )->at_least(1);

        my $bbb = API::BigBlueButton->new(
            secret => 'mysecret',
            server => 'myserver',
        );

        ok( $bbb->get_version );
        is( $url, 'http://myserver/bigbluebutton/api' );
    };
};

describe "Other requests" => sub {
    my ( $bbb, $url );

    before all => sub {
        $bbb = API::BigBlueButton->new(
            secret => 'mysecret',
            server => 'myserver',
        );
    };

    before each => sub {
        undef $url;
        API::BigBlueButton->expects( 'request' )
            ->returns( sub { $url = $_[1]; return 1; } )->any_number;
    };

    describe "create" => sub {
        it "Normal run" => sub {
            ok( $bbb->create( meetingID => 'mymeeting' ) );
            like( $url, qr/create\?meetingID=mymeeting/ );
        };

        it "Empty meetingID" => sub {
            eval { $bbb->create };
            ok( $@ );
            like( $@, qr/Parameter meetingID required!/ );
        };
    };

    describe "join" => sub {
        it "Normal run" => sub {
            ok( $bbb->join(
                fullName  => 'myname',
                meetingID => 'mymeeting',
                password  => 'mypass',
                )
            );
            like( $url, qr/join\?fullName=myname&meetingID=mymeeting&password=mypass/ );
        };
    };

    describe "ismeetingrunning" => sub {
        it "Normal run" => sub {
            ok( $bbb->ismeetingrunning( meetingID => 'mymeeting' ) );
            like( $url, qr/isMeetingRunning\?meetingID=mymeeting/ );
        };
    };

    describe "end" => sub {
        it "Normal run" => sub {
            ok( $bbb->end( meetingID => 'mymeeting', password  => 'mypass' ) );
            like( $url, qr/end\?meetingID=mymeeting&password=mypass/ );
        }
    };

    describe "getmeetinginfo" => sub {
        it "Normal run" => sub {
            ok( $bbb->getmeetinginfo( meetingID => 'mymeeting', password  => 'mypass' ) );
            like( $url, qr/getMeetingInfo\?meetingID=mymeeting&password=mypass/ );
        }
    };

    describe "getmeetings" => sub {
        it "Normal run" => sub {
            ok( $bbb->getmeetings );
            like( $url, qr/getMeetings/ );
        }
    };

    describe "getrecordings" => sub {
        it "Normal run" => sub {
            ok( $bbb->getrecordings( meetingID => 'mymeeting', password  => 'mypass' ) );
            like( $url, qr/getRecordings\?meetingID=mymeeting&password=mypass/ );
        }
    };
};

runtests unless caller;



( run in 0.280 second using v1.01-cache-2.11-cpan-a5abf4f5562 )