/usr/local/CPAN/POE-Component-Client-MSN/POE/Component/Client/MSN/Command.pm
package POE::Component::Client::MSN::Command;
use strict;
use URI::Escape;
use Mail::Internet;
# XXX Validation should be done
# Transaction ID: 4294967295
# Friendly Name: 129 characters
# Messages: 1664 characters
# Forward List: 150 buddies
# Number of groups: 30
my %errors = (
200 => 'INVALID_SYNTAX',
201 => 'INVALID_PARAMETER',
205 => 'INVALID_USER',
206 => 'FQDN_MISSING',
207 => 'ALREADY_LOGGED_IN',
208 => 'INVALID_USERNAME',
209 => 'INVALID_FRIENDLY_NAME',
210 => 'USER_LIST_FULL',
215 => 'USER_ALREADY_THERE',
216 => 'USER_NOT_ON_LIST',
217 => 'USER_NOT_ONLINE',
218 => 'ALREADY_IN_MODE',
219 => 'ALREADY_IN_OPPOSITE_LIST',
224 => 'INVALID_GROUP',
225 => 'USER_NOT_IN_GROUP',
229 => 'GROUP_NAME_TOO_LONG',
230 => 'CANNOT_REMOVE_GROUP_0',
231 => 'INVALID_GROUP',
280 => 'SWITCHBOARD_FAILED',
281 => 'XFR_SWITCHBOARD_FAILED',
300 => 'REQUIRED_FIELDS_MISSING',
301 => 'TOO_MANY_RESULTS',
302 => 'NOT_LOGGED_IN',
500 => 'INTERNAL_SERVER',
501 => 'DB_ERROR',
502 => 'COMMAND_DISABLED',
510 => 'FILE_OPERATION_FAILED',
520 => 'MEMORY_ALLOC_FAILED',
540 => 'CHL_RESPONSE_FAILED',
600 => 'SERVER_BUSY',
601 => 'SERVER_UNAVAILABLE',
602 => 'PEER_NS_DOWN',
603 => 'DB_CONNECT_FAILED',
604 => 'SERVER_GOING_DOWN',
707 => 'CREATE_CONNECTION',
710 => 'BAD_CVR_LCID',
711 => 'BLOCKING_WRITE',
712 => 'SESSION_OVERLOAD',
713 => 'TOO_MANY_ACTIVE_USERS',
714 => 'TOO_MANY_SESSIONS',
715 => 'NOT_EXPECTED',
717 => 'BAD_FRIEND_FILE',
731 => 'BAD_CVR_NOT_EXPECTED',
800 => 'TOO_RAPID_NAME_CHANGE',
910 => 'SERVER_TOO_BUSY',
911 => 'AUTHENTICATION_FAILED',
912 => 'SERVER_TOO_BUSY',
913 => 'NOT_ALLOWED_WHEN_OFFLINE',
914 => 'SERVER_UNAVAILABLE',
915 => 'SERVER_UNAVAILABLE',
916 => 'SERVER_UNAVAILABLE',
917 => 'AUTHENTICATION_FAILED',
918 => 'SERVER_TOO_BUSY',
919 => 'SERVER_TOO_BUSY',
920 => 'NOT_ACCEPTING_NEW_USERS',
921 => 'SERVER_TOO_BUSY',
922 => 'SERVER_TOO_BUSY',
923 => 'NO_PARENTAL_CONSENT',
924 => 'ACCOUNT_NOT_VERIFIED',
);
sub new {
my($class, $name, $data, $stuff, $no_newline) = @_;
my $transaction = ref($stuff) eq 'HASH' # heap?
? $stuff->{transaction}++ : $stuff;
# error is in \d\d\d
my ($errcode, $errname);
if ($name =~ /^\d{3}$/) {
$errcode = $name;
if (exists($errors{$errcode})) {
$errname = $errors{$errcode};
} else {
$errname = 'UNKNOWN';
}
}
bless {
name => $name,
data => $data,
errcode => $errcode,
errname => $errname,
transaction => $transaction,
message => undef,
_args => undef,
no_newline => $no_newline,
}, $class;
}
sub name { shift->{name} }
sub data { shift->{data} }
sub errcode { shift->{errcode} }
sub errname { shift->{errname} }
sub transaction { shift->{transaction} }
sub no_newline { shift->{no_newline} }
sub message {
my $self = shift;
if (@_) {
$self->{message} = Mail::Internet->new([ split /\r\n/, shift ]);
}
return $self->{message};
}
sub body {
my $self = shift;
return join '', map "$_\n", @{$self->message->body};
}
sub header {
my($self, $key) = @_;
my $value = $self->message->head->get($key);
chomp($value);
return $value;
}
sub args {
my $self = shift;
$self->{_args} ||= [ map URI::Escape::uri_unescape($_), split / /, $self->data ];
return wantarray ? @{$self->{_args}} : $self->{_args};
}
1;