our
$VERSION
=
'0.3.3'
;
has
'mailbox'
=> (
is
=>
'ro'
,
isa
=>
'App::Wubot::LocalMessageStore'
,
lazy
=> 1,
default
=>
sub
{
return
App::Wubot::LocalMessageStore->new();
},
);
has
'reactor'
=> (
is
=>
'ro'
,
isa
=>
'CodeRef'
,
required
=> 1,
);
has
'logger'
=> (
is
=>
'ro'
,
isa
=>
'Log::Log4perl::Logger'
,
lazy
=> 1,
default
=>
sub
{
return
Log::Log4perl::get_logger( __PACKAGE__ );
},
);
sub
check {
my
(
$self
,
$inputs
) =
@_
;
my
$config
=
$inputs
->{config};
my
$cache
=
$inputs
->{cache};
if
(
$self
->{cl} ) {
return
{}
unless
$self
->{session_ready};
return
{}
unless
$config
->{directory};
my
@count
= 1 .. 10;
MESSAGE:
while
(
@count
) {
pop
@count
;
my
(
$message
,
$callback
) =
$self
->mailbox->get(
$config
->{directory} );
last
unless
$message
;
if
(
$message
->{noforward} ) {
$self
->logger->debug(
"not forwarding message with 'noforward' flag"
);
push
@count
, 1;
}
else
{
$message
->{noforward} = 1;
my
$message_text
= MIME::Base64::encode( Encode::encode(
"UTF-8"
, YAML::Dump
$message
) );
$self
->{cl}->send_message(
$message_text
=>
$config
->{user},
undef
,
'chat'
);
}
$callback
->();
}
return
{};
}
my
$debug
=
$config
->{debug} || 0;
$self
->{cl} = AnyEvent::XMPP::Client->new(
debug
=>
$debug
);
$self
->{cl}->add_account(
$config
->{account},
$config
->{password},
$config
->{host},
$config
->{port} );
$self
->{cl}->reg_cb(
session_ready
=>
sub
{
my
(
$cl
,
$acc
) =
@_
;
$self
->{session_ready} = 1;
$self
->logger->
warn
(
"XMPP: connected to server"
);
$self
->reactor->( {
subject
=>
"XMPP: session ready"
,
coalesce
=>
'XMPP'
,
} );
},
disconnect
=>
sub
{
my
(
$cl
,
$acc
,
$h
,
$p
,
$reas
) =
@_
;
my
$details
=
""
;
if
(
$h
&&
$p
) {
$details
=
"($h:$p)"
};
$self
->logger->error(
"XMPP: disconnect $details: $reas"
);
$self
->reactor->( {
subject
=>
"XMPP: disconnect $details: $reas"
,
noforward
=> 1 } );
delete
$self
->{cl};
delete
$self
->{session_ready};
},
error
=>
sub
{
my
(
$cl
,
$acc
,
$err
) =
@_
;
$self
->logger->error(
"XMPP: ERROR: "
.
$err
->string );
$self
->reactor->( {
subject
=>
"XMPP: ERROR: "
.
$err
->string,
coalesce
=>
'XMPP'
,
} );
},
message
=>
sub
{
my
(
$cl
,
$acc
,
$msg
) =
@_
;
my
$body
=
$msg
->any_body;
my
$data
;
eval
{
$data
= YAML::Load( Encode::decode(
"UTF-8"
, MIME::Base64::decode(
$body
) ) );
$data
->{noforward} = 1;
$self
->reactor->(
$data
);
1;
} or
do
{
$self
->logger->error(
"UNABLE TO DECODE MESSAGE"
);
$self
->logger->info(
$body
);
};
$self
->logger->debug(
"XMPP: Message received from: "
.
$msg
->from );
}
);
$self
->{cl}->start;
return
{};
}
__PACKAGE__->meta->make_immutable;
1;