join the dots so server starts on reload_config
[scpubgit/Clifton.git] / lib / App / Clifton / Server.pm
CommitLineData
20038dd8 1package App::Clifton::Server;
2
21a18863 3use aliased 'App::Clifton::ConsoleService';
20038dd8 4use aliased 'App::Clifton::ConfigLoader';
327a4b1a 5use aliased 'App::Clifton::Tower::Jabber' => 'Jabber_Tower';
6use aliased 'App::Clifton::Tower::IRC' => 'IRC_Tower';
20038dd8 7use Moo;
8
9extends 'App::Clifton::Service';
10
11sub BUILD {
12 my ($self, $args) = @_;
13 $args->{loop}->add($self);
21a18863 14 $self->$_ for qw(console_service);
20038dd8 15}
16
17has config_file => (is => 'ro', required => 1);
18
19has config_loader => (is => 'lazy');
20
46b150cd 21has current_config => (is => 'rw');
22
20038dd8 23sub _build_config_loader { ConfigLoader->new }
24
21a18863 25has console_service => (is => 'lazy');
20038dd8 26
327a4b1a 27has jabber_towers => (is => 'ro', default => sub { {} });
28
29has irc_towers => (is => 'ro', default => sub { {} });
30
21a18863 31sub _build_console_service {
32 my ($self) = @_;
33 $self->_new_child(ConsoleService, { server => $self });
20038dd8 34}
35
36sub reload_config { shift->_do(reload_config => @_) }
37sub shutdown { shift->_do(shutdown => @_) }
38
39sub _body_for_reload_config {
40 my ($self, $args) = @_;
46b150cd 41 my $config = $self->config_loader->config_from_file($self->config_file);
38180dc8 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 }
46b150cd 57 $self->current_config($config);
58 $args->{on_finished}->($config);
20038dd8 59}
60
327a4b1a 61sub start_chain { shift->_do(start_chain => @_) }
62
63sub _dependencies_for_start_chain {
64 my ($self, $args) = @_;
65 {
66 irc_tower => $self->start_irc_tower($args->{irc_tower})
67 }
68}
69
70sub _body_for_start_chain {
71 my ($self, $args) = @_;
72 $args->{irc_tower}->start_chain($args);
73}
74
75sub start_irc_tower { shift->_do(start_irc_tower => @_) }
76
77sub _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
86sub _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
20038dd8 961;