1 package App::Clifton::Tower::Jabber;
3 use aliased 'App::Clifton::UserConfigSet';
4 use aliased 'App::Clifton::ChainSetByJabberUser' => 'ChainSet';
5 use aliased 'Net::Async::XMPP::Client' => 'XMPP_Client';
6 use Log::Contextual qw(:log);
9 extends 'App::Clifton::Component';
11 has xmpp_client => (is => 'lazy');
13 sub xmpp_active { shift->xmpp_client->xmpp->is_loggedin }
15 has $_ => (is => 'ro', required => 1)
16 for qw(bridge_name jabber_config irc_config);
18 has server => (is => 'ro', required => 1, weak_ref => 1);
20 has userconfig_set => (
21 is => 'ro', # Moobug init_arg => undef,
22 default => sub { UserConfigSet->new }
26 is => 'ro', # Moobug init_arg => undef,
27 default => sub { ChainSet->new }
30 sub _build_xmpp_client {
32 $self->_login_xmpp_client($self->_new_child(XMPP_Client, { }));
35 sub _login_xmpp_client {
36 my ($self, $xmpp) = @_;
37 my $conf = $self->jabber_config;
39 jid => $conf->user, host => $conf->server, password => $conf->pass,
40 on_message => $self->_replace_weakself('handle_message'),
45 sub BUILD { $_[0]->xmpp_client }
48 my ($self, $msg) = @_;
50 my $me = $self->jabber_config->user;
53 "Received message for ${\$msg->to} instead of $me - ignoring"
54 } unless $msg->to eq $me;
56 (my $from = $msg->from) =~ s/\/.*//;
59 "Received message from me ($me) - ignoring"
63 "Received message from user ${from} not in my config"
64 } unless my $user = $self->userconfig_set->get({ name => $from });
66 if (my $chain = $self->chain_set->get({ jabber_user => $from })) {
67 $chain->handle_xmpp_message($msg);
69 if ($msg->body =~ m{^\s*/start\s*$}) {
70 $self->send_xmpp_message({
71 to => $from, body => 'Connecting ...'
73 $self->start_chain_for($user)->on_finished(
74 $self->_capture_weakself(sub {
75 my ($self, $result) = @_;
76 if ($result->{chain}) {
77 $self->chain_set->add($result->{chain});
79 $self->send_xmpp_message({
80 to => $from, body => 'Connection result: '.$result->{message}
85 $self->send_xmpp_message({
87 body => 'Not currently connected - send /start to connect'
93 sub send_xmpp_message {
94 my ($self, $args) = @_;
95 $self->xmpp_client->compose(%$args)->send;
99 my ($self, $user) = @_;
100 $self->server->start_chain({
101 jabber_tower => $self,
102 jabber_user => $user->name,
104 server => $self->irc_config->server,
105 irc_nick => $user->irc_nick
107 irc_channel => $self->irc_config->channel,
115 # package App::Clifton::Tower::IRC;
119 # has irc_server_name
125 # package App::Clifton::Chain