Convos
view release on metacpan or search on metacpan
lib/Convos/Core.pm view on Meta::CPAN
sub add_connection {
my ($self, $input, $cb) = @_;
my $validation = $self->_validation($input, qw( login name nick password server username ));
if ($validation->has_error) {
$self->$cb($validation, undef);
return $self;
}
my ($login, $name) = $validation->param([qw( login name )]);
warn "[core:$login] add ", _dumper($validation->output), "\n" if DEBUG;
Scalar::Util::weaken($self);
Mojo::IOLoop->delay(
sub {
my ($delay) = @_;
$self->redis->exists("user:$login:connection:$name", $delay->begin);
},
sub {
my ($delay, $exists) = @_;
if ($exists) {
$validation->error(name => ['exists']);
$self->$cb($validation, undef);
return;
}
$self->redis->execute(
[sadd => "connections", "$login:$name"],
[sadd => "user:$login:connections", $name],
[hmset => "user:$login:connection:$name", %{$validation->output}, state => 'disconnected'],
$delay->begin,
);
},
sub {
my ($delay, @saved) = @_;
$self->control(start => $login, $name, $delay->begin);
},
sub {
my ($delay, $started) = @_;
$self->$cb($validation, $validation->output);
},
);
}
=head2 update_connection
$self->update_connection({
login => $str,
name => $str,
nick => $str,
server => $str, # irc_server[:port]
}, $callback);
Update a connection's settings. This might issue a reconnect or issue
IRC commands to reflect the changes.
=cut
sub update_connection {
my ($self, $input, $cb) = @_;
my $validation = $self->_validation($input, qw( login name nick password server username ));
if ($validation->has_error) {
$self->$cb($validation, undef);
return $self;
}
my ($login, $name) = $validation->param([qw( login name )]);
my $conn = Convos::Core::Connection->new(%{$validation->output});
my $redis = $self->redis;
warn "[core:$login] update ", _dumper($validation->output), "\n" if DEBUG;
Mojo::IOLoop->delay(
sub {
my ($delay) = @_;
$redis->hgetall("user:$login:connection:$name", $delay->begin);
},
sub {
my ($delay, $current) = @_;
unless ($current and %$current) {
$validation->error(name => ['no_such_connection']);
$self->$cb($validation, undef);
return;
}
$delay->begin->(@_); # pass on $current and $conversations
$redis->zrange("user:$login:conversations", 0, 1, $delay->begin);
$redis->hmset("user:$login:connection:$name", $validation->output, $delay->begin);
},
sub {
my ($delay, $current, $conversations) = @_;
$conn = $validation->output; # get rid of the extra junk from Connection->new()
if ($current->{server} ne $conn->{server}) {
$self->control(restart => $login, $name, sub { });
$self->$cb(undef, $conn);
return;
}
if ($current->{nick} ne $conn->{nick}) {
warn "[core:$login] NICK $conn->{nick}\n" if DEBUG;
$redis->publish("convos:user:$login:$name", "dummy-uuid NICK $conn->{nick}");
}
$self->$cb(undef, $conn);
},
);
return $self;
}
=head2 delete_connection
$self->delete_connection({
login => $str,
name => $str,
}, $cb);
( run in 1.373 second using v1.01-cache-2.11-cpan-39bf76dae61 )