Net-YahooMessenger

 view release on metacpan or  search on metacpan

lib/Net/YahooMessenger.pm  view on Meta::CPAN

        84, 0,
        '1'   => $self->id,
        '0'   => $self->id,
        '277' => $https->y_string,
        '278' => $https->t_string,
        '307' => $https->md5_string,
        '244' => '4194239',
        '2'   => $self->id,
        '2'   => $self->id,
        '135' => '9.0.0.2152',
    );
    $server->send($auth);
    my $user_info  = $self->recv();
    my $buddy_list = $self->recv();

    my $login   = $self->recv();
    my $handler = $self->get_event_handler();
    $handler->accept($login) if $handler;

    $self->add_event_source(
        $server,
        sub {
            my $event   = $self->recv;
            my $handler = $self->get_event_handler;
            $handler->accept($event);
        },
        'r'
    );

    return $login->is_enable();
}

sub _dump_packet {
    my $source = shift;
    print join ' ',
      map { sprintf '%02x(%s)', ord $_, (/^[\w\-_]$/) ? $_ : '.'; } split //,
      $source;
    print "\n";
}

=head2 $yahoo->send($yahoo_id, $message)

This method send an Instant-Message C<$message> to the user specified by C<$yahoo_id>. A kanji code is Shift_JIS when including Japanese in $message.

=cut

sub send {
    my $self      = shift;
    my $recipient = shift;
    my $message   = join '', @_;
    my $server    = $self->handle;

    my $event = $self->create('SendMessage');
    $event->from( $self->id );
    $event->to($recipient);
    $event->body($message);
    $event->option(1515563606);  # in Buddy list then 1515563606 else 1515563605
    $server->send( $event->to_raw_string, 0 );
}

=head2 $yahoo->change_state($busy, $status_message)

This method sets the I<status messages> for the current user. 'Status message' is set by C<$status_message>. 'Busy icon' is set by the numerical value of C<$busy>.

The C<$busy> should be called with following arguments:

	0 - I'm Available
	1 - Busy
	2 - Sleep

=cut

sub change_state {
    my $self    = shift;
    my $busy    = shift;
    my $message = join '', @_;
    my $server  = $self->handle;

    my $event = $self->create('ChangeState');
    $event->status_code(99);    # 99 : Custom status
    $event->busy($busy);
    $event->body($message);

    $server->send( $event->to_raw_string, 0 );
}

sub change_status_by_code {
    my $self        = shift;
    my $status_code = shift || 0;
    my $server      = $self->handle;

    my $event = $self->create('ChangeState');
    $event->status_code($status_code);
    $event->busy(1);

    $server->send( $event->to_raw_string, 0 );
}

sub ping {
    my $self    = shift;
    my $server  = $self->get_connection;
    my $command = $self->_create_message( 76, 0, 0, '' );
    $server->send( $command, 0 );
    my $pong = $self->recv();
    return $pong->is_enable;
}

=head2 $yahoo->recv()

This method reads the message from a server socket and returns a corresponding B<Event object>.
The B<Event object> which will be returned is as follows:

	Net::YahooMessenger::InvalidLogin     - Invalid Login
	Net::YahooMessenger::Login            - Succeeded in Login.
	Net::YahooMessenger::GoesOnline       - Buddy has logged in.
	Net::YahooMessenger::ReceiveMessage   - Message was received.
	Net::YahooMessenger::ChangeState      - Buddy has change status.
	Net::YahooMessenger::GoesOffline      - Buddy logged out.
	Net::YahooMessenger::NewFriendAlert   - New Friend Alert.
	Net::YahooMessenger::UnImplementEvent - Un-implemented event was received.

All event objects have the following attributes:

=over 4

=item $event->from

B<Yahoo id> which invoked the event.

=item $event->to

B<Yahoo id> which should receive an event.

=item $event->body

The contents of an event. The message and state which were transmitted.

=item $event->code

The event number on Yahoo Messenger Protocol.

=back

=cut

sub recv {
    my $self = shift;
    require Net::YahooMessenger::EventFactory;
    my $event_factory = Net::YahooMessenger::EventFactory->new($self);
    return $event_factory->create_by_raw_data();
}

=head2 $yahoo->get_connection()

lib/Net/YahooMessenger.pm  view on Meta::CPAN

#		$self->_get_list_by_name('BUDDYLIST', $response->content)
#	);
#	$self->buddy_list(@buddy);

sub _get_list_by_name {
    my $self   = shift;
    my $name   = shift;
    my $string = shift;

    if ( $string =~ /BEGIN $name\r?\n(.*)\r?\nEND $name/s ) {
        my @list = split /\r?\n/, $1;
        return @list;
    }
}

sub add_buddy_by_name {
    my $self       = shift;
    my $group      = shift;
    my @buddy_name = @_;
    my @buddy_list = $self->buddy_list();
    for my $name (@buddy_name) {
        my $buddy = Net::YahooMessenger::Buddy->new;
        $buddy->name($name);
        push @buddy_list, $buddy;
    }
    $self->buddy_list(@buddy_list);
}

1;
__END__

=head1 EXAMPLE

=head2 Send message

	#!perl
	use Net::YahooMessenger;
	use strict;

	my $yahoo = Net::YahooMessenger->new;
	$yahoo->id('yahoo_id');
	$yahoo->password('password');
	$yahoo->login or die "Can't login Yahoo!Messenger";

	$yahoo->send('recipient_yahoo_id', 'Hello World!');
	__END__

=head2 Change Status message

	#!perl
	use Net::YahooMessenger;
	use strict;
	use constant IN_BUSY => 1;

	my $yahoo = Net::YahooMessenger->new(
		id       => 'yahoo_id',
		password => 'password',
	);
	$yahoo->login or die "Can't login Yahoo!Messenger";;

	$yahoo->change_state(IN_BUSY, q{I'm very busy now!});
	sleep 5;
	__END__

=head2 Received message output to STDOUT

	#!perl
	use Net::YahooMessenger;
	use strict;

	my $yahoo = Net::YahooMessenger->new(
		id       => 'yahoo_id',
		password => 'password',
	);
	$yahoo->set_event_handler(new ToStdoutEventHandler);
	$yahoo->login or die "Can't login Yahoo!Messenger";
	$yahoo->start;



	package ToStdoutEventHandler;
	use base 'Net::YahooMessenger::EventHandler';
	use strict;

	sub ChangeState {}
	sub GoesOffline {}
	sub GoesOnline {}
	sub UnImplementEvent {}

	sub ReceiveMessage
	{
		my $self = shift;
		my $event = shift;
		printf "%s: %s\n", $event->from, $event->body;
	}
	__END__

=head2 Connect to Yahoo!Japan Messege server

	#!perl
	use Net::YahooMessenger;
	use strict;

	my $yahoo = Net::YahooMessenger->new(
		pre_login_url => 'http://edit.my.yahoo.co.jp/config/',
		hostname      => 'cs.yahoo.co.jp',
	);
	$yahoo->id('yahoo_id');
	$yahoo->password('password');
	$yahoo->login or die "Can't login Yahoo!Messenger";

	$yahoo->send('recipient_yahoo_id', 'Konnitiwa Sekai!');
	__END__

=head1 AUTHOR

Hiroyuki OYAMA <oyama@cpan.org> http://ymca.infoware.ne.jp/

From October 2003, this module is taken over and maintained by
Tatsuhiko Miyagawa L<lt>miyagawa@bulknews.netL<gt>



( run in 2.266 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )