Alice
view release on metacpan or search on metacpan
lib/Alice/Config.pm view on Meta::CPAN
default => 'https://noembed.com/i/',
);
has message_store => (
is => 'rw',
isa => 'Str',
default => 'Memory',
);
has callback => (
is => 'ro',
isa => 'CodeRef',
);
sub BUILD {
my $self = shift;
$self->load;
mkdir $self->path unless -d $self->path;
}
sub load {
my $self = shift;
my $config = {};
my $loaded = sub {
$self->read_commandline_args;
$self->merge($config);
$self->callback->();
my $class = "Alice::MessageStore::".$self->message_store;
eval "require $class";
delete $self->{callback};
$self->{loaded} = 1;
};
if (-e $self->fullpath) {
my $body;
aio_load $self->fullpath, $body, sub {
$config = eval $body;
# upgrade ignore to new format
if ($config->{ignore} and ref $config->{ignore} eq "ARRAY") {
$config->{ignore} = {msg => $config->{ignore}};
}
if ($@) {
warn "error loading config: $@\n";
}
$loaded->();
}
}
else {
say STDERR "No config found, writing a few config to ".$self->fullpath;
$self->write($loaded);
}
}
sub read_commandline_args {
my $self = shift;
my ($port, $debug, $address, $log);
GetOptions("port=i" => \$port, "debug=s" => \$debug, "log=s" => \$log, "address=s" => \$address);
$self->commandline->{port} = $port if $port and $port =~ /\d+/;
$self->commandline->{address} = $address if $address;
$AnyEvent::Log::FILTER->level($debug || "info");
if ($log) {
$AnyEvent::Log::COLLECT->attach(AnyEvent::Log::Ctx->new(
level => ($debug || "info"),
log_to_file => $log
));
}
}
sub http_port {
my $self = shift;
if ($self->commandline->{port}) {
return $self->commandline->{port};
}
return $self->port;
}
sub http_address {
my $self = shift;
if ($self->commandline->{address}) {
return $self->commandline->{address};
}
if ($self->address eq "localhost") {
$self->address("127.0.0.1");
}
return $self->address;
}
sub merge {
my ($self, $config) = @_;
for my $key (keys %$config) {
if (exists $config->{$key} and my $attr = $self->meta->get_attribute($key)) {
$self->$key($config->{$key}) if $attr->has_write_method;
}
else {
say STDERR "$key is not a valid config option";
}
}
}
sub write {
my $self = shift;
my $callback = pop;
mkdir $self->path if !-d $self->path;
aio_open $self->fullpath, POSIX::O_CREAT | POSIX::O_WRONLY | POSIX::O_TRUNC, 0644, sub {
my $fh = shift;
if ($fh) {
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Indent = 1;
my $config = Dumper $self->serialized;
aio_write $fh, 0, length $config, $config, 0, sub {
$callback->() if $callback;
};
}
else {
warn "Can not write config file: $!\n";
}
}
}
sub serialized {
my $self = shift;
return {
map {
( run in 0.497 second using v1.01-cache-2.11-cpan-39bf76dae61 )