Net-YMSG

 view release on metacpan or  search on metacpan

YMSG/EventFactory.pm  view on Meta::CPAN

use constant EVENT_CLASS => {
	1  => 'Net::YMSG::GoesOnline',
	2  => 'Net::YMSG::GoesOffline',
	3  => 'Net::YMSG::ChangeState',
	4  => 'Net::YMSG::ChangeState',
	6  => 'Net::YMSG::ReceiveMessage',
	15 => 'Net::YMSG::NewFriendAlert',
	76 => 'Net::YMSG::ServerIsAlive',
	85 => 'Net::YMSG::ReceiveBuddyList',
	87 => 'Net::YMSG::ChallengeStart',
	152 => 'Net::YMSG::ChatRoomLogon',
	168 => 'Net::YMSG::ChatRoomReceive',
	155 => 'Net::YMSG::ChatRoomLogoff',
};



sub new
{
	my $class = shift;
	my $connection = shift;
	bless { connection => $connection }, $class;
}


sub create_by_raw_data
{
	my $self = shift;
	my $connection = $self->{connection};
	my ($event_code, $identifier, $body) = eval {$self->_get_message_body;};
	if ($@) {
		# print STDERR $@;
		require Net::YMSG::InvalidLogin;
		return Net::YMSG::InvalidLogin->new($connection);
	}

	my ($code, $recipient, $private, $sender,
		@baddy) = split /\xC0\x80/, $body;
	if ($event_code == YMSG_LOGIN && lc $recipient eq lc $sender) {
		require Net::YMSG::Login;
		my $event = Net::YMSG::Login->new($connection);
		$event->source($body);
		$event->from($sender);
		$connection->identifier($identifier);
		return $event if scalar $connection->buddy_list <= 0;

		shift @baddy;
		my $id = shift @baddy;
		my $buddy;
		for (my $i=0; $i < scalar @baddy; $i+=2) {
			if ($baddy[$i] eq BADDY_NAME) {
				$buddy = $connection->get_buddy_by_name($baddy[$i+1]);
			}
			elsif ($baddy[$i] eq STATE) {
				$buddy->status($baddy[$i+1]);
			}
			elsif ($baddy[$i] eq STATE_OF_USER_DEFINITION) {
				$buddy->custom_status($baddy[$i+1]);
			}
			elsif ($baddy[$i] eq BUSYNESS) {
				$buddy->busy($baddy[$i+1]);
			}
			elsif ($baddy[$i] eq SESSION_ID) {
				$buddy->session_id($baddy[$i+1]);
			}
			elsif ($baddy[$i] eq ONLINE_OR_OFFLINE) {
				$buddy->online($baddy[$i+1]);
			}
			else {}
		}
		return $event;

	} else {
		my $class = EVENT_CLASS->{$event_code} || 'Net::YMSG::DummyEvent';
		eval "require $class";
	#	print STDERR "Calling up class: $class with $body\n";
		if ($@) {
		#	print STDERR $@;
			require Net::YMSG::UnImplementEvent;
			my $event = Net::YMSG::UnImplementEvent->new($connection);
			$event->code($event_code);
			$event->source($body);
			return $event;
		}
		my $event = $class->new($connection);
		$event->source($body);
		return $event;
	}
}


sub create_by_name
{
	my $self = shift;
	my $class = 'Net::YMSG::'. shift;
	eval "require $class";
	if ($@) {
		require Net::YMSG::NullEvent;
		return Net::YMSG::NullEvent->new;
	}
	return $class->new($self->{connection});
}


sub _get_message_body
{
	my $self = shift;
	my $handle = $self->{connection}->handle;
	my %command;

	my $header = $self->_recv_by_length(20);
	my (
		$signature,
		$version,
		$length,
		$event_code,
		$return,
		$identifier
	) = unpack "a4Cx3nnNN", $header;

	die 'Wring protocol' if $signature ne Net::YMSG->YMSG_STD_HEADER;



( run in 0.539 second using v1.01-cache-2.11-cpan-39bf76dae61 )