mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-20 02:49:49 +01:00
Timer: eventqueue
command can now add and remove events
This commit is contained in:
parent
766c8ef877
commit
86a1ed42ae
105
PBot/Timer.pm
105
PBot/Timer.pm
@ -43,7 +43,8 @@ sub initialize {
|
|||||||
$self->{last} = $seconds;
|
$self->{last} = $seconds;
|
||||||
$self->{timeout} = $timeout;
|
$self->{timeout} = $timeout;
|
||||||
|
|
||||||
$self->{pbot}->{commands}->register(sub { $self->event_queue_cmd(@_) }, 'eventqueue', 0);
|
$self->{pbot}->{commands}->register(sub { $self->event_queue_cmd(@_) }, 'eventqueue', 1);
|
||||||
|
$self->{pbot}->{capabilities}->add('admin', 'can-eventqueue', 1);
|
||||||
|
|
||||||
$self->{timer_func} = sub { $self->on_tick_handler(@_) };
|
$self->{timer_func} = sub { $self->on_tick_handler(@_) };
|
||||||
}
|
}
|
||||||
@ -51,35 +52,72 @@ sub initialize {
|
|||||||
sub event_queue_cmd {
|
sub event_queue_cmd {
|
||||||
my ($self, $from, $nick, $user, $host, $arguments, $stuff) = @_;
|
my ($self, $from, $nick, $user, $host, $arguments, $stuff) = @_;
|
||||||
|
|
||||||
return "No events queued." if not @{$self->{event_queue}};
|
my $usage = "Usage: eventqueue list [filter regex] | add <relative time> <command> | remove <regex>";
|
||||||
|
|
||||||
my $result = eval {
|
my $command = $self->{pbot}->{interpreter}->shift_arg($stuff->{arglist});
|
||||||
my $text = "Queued events:\n";
|
|
||||||
|
|
||||||
my $i = 0;
|
if (not defined $command) {
|
||||||
foreach my $event (@{$self->{event_queue}}) {
|
return $usage;
|
||||||
$i++;
|
|
||||||
|
|
||||||
if ($arguments) {
|
|
||||||
next unless $event->{id} =~ /$arguments/;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $duration = concise duration $event->{timeout} - $seconds;
|
|
||||||
$text .= " $i) in $duration: $event->{id}";
|
|
||||||
$text .= ' [R]' if $event->{repeating};
|
|
||||||
$text .= ";\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $text;
|
|
||||||
};
|
|
||||||
|
|
||||||
if ($@) {
|
|
||||||
my $error = $@;
|
|
||||||
$error =~ s/ at PBot.*//;
|
|
||||||
return "Bad regex: $error";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
if ($command eq 'list') {
|
||||||
|
return "No events queued." if not @{$self->{event_queue}};
|
||||||
|
|
||||||
|
my $result = eval {
|
||||||
|
my $text = "Queued events:\n";
|
||||||
|
my ($regex) = $self->{pbot}->{interpreter}->shift_arg($stuff->{arglist});
|
||||||
|
|
||||||
|
my $i = 0;
|
||||||
|
foreach my $event (@{$self->{event_queue}}) {
|
||||||
|
$i++;
|
||||||
|
|
||||||
|
if ($regex) {
|
||||||
|
next unless $event->{id} =~ /$regex/;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $duration = concise duration $event->{timeout} - $seconds;
|
||||||
|
$text .= " $i) in $duration: $event->{id}";
|
||||||
|
$text .= ' [R]' if $event->{repeating};
|
||||||
|
$text .= ";\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($@) {
|
||||||
|
my $error = $@;
|
||||||
|
$error =~ s/ at PBot.*//;
|
||||||
|
return "Bad regex: $error";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($command eq 'add') {
|
||||||
|
my ($duration, $command) = $self->{pbot}->{interpreter}->split_args($stuff->{arglist}, 2);
|
||||||
|
return "Usage: eventqueue add <relative time> <command>" if not defined $duration or not defined $command;
|
||||||
|
|
||||||
|
my ($delay, $error) = $self->{pbot}->{parsedate}->parsedate($duration);
|
||||||
|
return $error if defined $error;
|
||||||
|
|
||||||
|
my $cmd = {
|
||||||
|
nick => $nick,
|
||||||
|
user => $user,
|
||||||
|
host => $host,
|
||||||
|
command => $command,
|
||||||
|
};
|
||||||
|
|
||||||
|
$self->{pbot}->{interpreter}->add_to_command_queue($from, $cmd, $delay);
|
||||||
|
return "Command added to event queue.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($command eq 'remove') {
|
||||||
|
my $regex = $self->{pbot}->{interpreter}->shift_arg($stuff->{arglist});
|
||||||
|
return "Usage: eventqueue add <regex>" if not defined $regex;
|
||||||
|
return $self->dequeue_event($regex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown command '$command'. $usage";
|
||||||
}
|
}
|
||||||
|
|
||||||
sub start {
|
sub start {
|
||||||
@ -159,17 +197,26 @@ sub enqueue_event {
|
|||||||
sub dequeue_event {
|
sub dequeue_event {
|
||||||
my ($self, $id) = @_;
|
my ($self, $id) = @_;
|
||||||
|
|
||||||
eval {
|
my $result = eval {
|
||||||
$id = quotemeta $id;
|
$id = quotemeta $id;
|
||||||
$id =~ s/\\\.\\\*\\\?/.*?/g;
|
$id =~ s/\\\.\\\*\\\?/.*?/g;
|
||||||
$id =~ s/\\\.\\\*/.*/g;
|
$id =~ s/\\\.\\\*/.*/g;
|
||||||
my $regex = qr/^$id$/;
|
my $regex = qr/^$id$/;
|
||||||
|
my $count = @{$self->{event_queue}};
|
||||||
@{$self->{event_queue}} = grep { $_->{id} !~ /$regex/i; } @{$self->{event_queue}};
|
@{$self->{event_queue}} = grep { $_->{id} !~ /$regex/i; } @{$self->{event_queue}};
|
||||||
|
my $removed = $count - @{$self->{event_queue}};
|
||||||
|
return "No matching events." if not $removed;
|
||||||
|
return "Removed $removed event" . ($removed == 1 ? '' : 's') . '.';
|
||||||
};
|
};
|
||||||
|
|
||||||
if ($@) {
|
if ($@) {
|
||||||
$self->{pbot}->{logger}->log("Error in dequeue_event: $@\n");
|
my $error = $@;
|
||||||
|
$self->{pbot}->{logger}->log("Error in dequeue_event: $error\n");
|
||||||
|
$error =~ s/ at PBot.*//;
|
||||||
|
return "$error";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub register {
|
sub register {
|
||||||
@ -223,8 +270,8 @@ sub on_tick_handler {
|
|||||||
my $debug = $self->{pbot}->{registry}->get_value('timer', 'debug') // 0;
|
my $debug = $self->{pbot}->{registry}->get_value('timer', 'debug') // 0;
|
||||||
$self->{pbot}->{logger}->log("$self->{name} tick $seconds\n") if $debug;
|
$self->{pbot}->{logger}->log("$self->{name} tick $seconds\n") if $debug;
|
||||||
|
|
||||||
my $next_tick = 1;
|
|
||||||
if (@{$self->{event_queue}}) {
|
if (@{$self->{event_queue}}) {
|
||||||
|
my $next_tick = 1;
|
||||||
my @enqueue = ();
|
my @enqueue = ();
|
||||||
for (my $i = 0; $i < @{$self->{event_queue}}; $i++) {
|
for (my $i = 0; $i < @{$self->{event_queue}}; $i++) {
|
||||||
if ($seconds >= $self->{event_queue}->[$i]->{timeout}) {
|
if ($seconds >= $self->{event_queue}->[$i]->{timeout}) {
|
||||||
|
Loading…
Reference in New Issue
Block a user