Alice

 view release on metacpan or  search on metacpan

lib/Alice/Config.pm  view on Meta::CPAN

  isa     => 'HashRef',
  default => sub {{}},
);

has static_prefix => (
  is      => 'rw',
  isa     => 'Str',
  default => '/static/',
);

has image_prefix => (
  is      => 'rw',
  isa     => 'Str',
  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;



( run in 1.168 second using v1.01-cache-2.11-cpan-39bf76dae61 )