don't screw up on messages with no target_name in hints
[scpubgit/Clifton.git] / lib / App / Clifton / Server.pm
1 package App::Clifton::Server;
2
3 use aliased 'App::Clifton::ConsoleService';
4 use aliased 'App::Clifton::ConfigLoader';
5 use aliased 'App::Clifton::Tower::Jabber' => 'Jabber_Tower';
6 use aliased 'App::Clifton::Tower::IRC' => 'IRC_Tower';
7 use Moo;
8
9 extends 'App::Clifton::Service';
10
11 sub BUILD {
12   my ($self, $args) = @_;
13   $args->{loop}->add($self);
14   $self->$_ for qw(console_service);
15 }
16
17 has config_file => (is => 'ro', required => 1);
18
19 has config_loader => (is => 'lazy');
20
21 has current_config => (is => 'rw');
22
23 sub _build_config_loader { ConfigLoader->new }
24
25 has console_service => (is => 'lazy');
26
27 has jabber_towers => (is => 'ro', default => sub { {} });
28
29 has irc_towers => (is => 'ro', default => sub { {} });
30
31 sub _build_console_service {
32   my ($self) = @_;
33   $self->_new_child(ConsoleService, { server => $self });
34 }
35
36 sub reload_config { shift->_do(reload_config => @_) }
37 sub shutdown { shift->_do(shutdown => @_) }
38
39 sub _body_for_reload_config {
40   my ($self, $args) = @_;
41   my $config = $self->config_loader->config_from_file($self->config_file);
42   my $jt = $self->jabber_towers;
43   foreach my $bridge ($config->bridges->flatten) {
44
45     $jt->{$bridge->name} = $self->_new_child(
46       Jabber_Tower, {
47         jabber_config => $bridge->jabber,
48         irc_config => $bridge->irc,
49         bridge_name => $bridge->name,
50         server => $self,
51       }
52     );
53   }
54   foreach my $user ($config->users->flatten) {
55     $jt->{$_}->userconfig_set->add($user) for @{$user->allow};
56   }
57   $self->current_config($config);
58   $args->{on_finished}->($config);
59 }
60
61 sub start_chain { shift->_do(start_chain => @_) }
62
63 sub _dependencies_for_start_chain {
64   my ($self, $args) = @_;
65   {
66     irc_tower => $self->start_irc_tower($args->{irc_tower})
67   }
68 }
69
70 sub _body_for_start_chain {
71   my ($self, $args) = @_;
72   $args->{irc_tower}->start_chain($args);
73 }
74
75 sub start_irc_tower { shift->_do(start_irc_tower => @_) }
76
77 sub _guard_for_start_irc_tower {
78   my ($self, $args) = @_;
79   if (my $tower = $self->irc_towers->{$args->{server}}{$args->{irc_nick}}) {
80     ($tower);
81   } else {
82     ();
83   }
84 }
85
86 sub _body_for_start_irc_tower {
87   my ($self, $args) = @_;
88   $self->_new_child(IRC_Tower, {
89     irc_server => $args->{server},
90     irc_nick => $args->{irc_nick},
91     on_setup => $args->{on_finished},
92     server => $self,
93   });
94 }
95
96 1;