/usr/local/CPAN/SVL/SVL/OpenDHT.pm


package SVL::OpenDHT;
use strict;
use warnings;
use base qw(Class::Accessor::Chained::Fast);
use Digest::MD5 qw(md5_base64);
use Net::OpenDHT;
__PACKAGE__->mk_accessors(qw(opendht));

sub new {
  my $class   = shift;
  my $self    = $class->SUPER::new();
  my $opendht = Net::OpenDHT->new();
  $opendht->application("svl");
  $self->opendht($opendht);
  return $self;
}

sub show {
  my ($self, $target) = @_;
  my $munged_target = $self->_munge($target);
  my @shares;
  foreach my $value ($self->opendht->fetch($munged_target)) {
    push @shares, SVL::Share->parse($value);
  }
  return @shares;
}

sub publish {
  my ($self, $shares) = @_;
  my $opendht = $self->opendht;
  foreach my $share (@$shares) {
    my $uuid = $share->uuid;
    my $dump = $share->dump;
    my @tags = @{ $share->tags };
    warn "opendht: $uuid or @tags\n";
    $opendht->put($self->_munge($uuid), $dump, 60);
    foreach my $tag (@tags) {
      $opendht->put($self->_munge($tag), $dump, 60);
    }
  }
}

# keys can only be 20 chars long, so we hash and substr and
# deal with collisions later
sub _munge {
  my ($self, $id) = @_;
  return 'svl:' . substr(md5_base64($id), 0, 16);
}

1;