mirror of
https://github.com/pragma-/pbot.git
synced 2024-12-23 03:02:47 +01:00
factoids: allow factset/factunset by regular users; factset/factunset now has list of metadata levels, and does ownership checking; added action_with_args metadata field to be substituted for action if factoid triggered with arguments
This commit is contained in:
parent
45a2a66d0f
commit
44b737a8c3
@ -27,6 +27,21 @@ sub new {
|
|||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# TODO - move this someplace better so it can be more accessible to user-customisation
|
||||||
|
my %factoid_metadata_levels = (
|
||||||
|
created_on => 999,
|
||||||
|
enabled => 10,
|
||||||
|
last_referenced_in => 60,
|
||||||
|
last_referenced_on => 60,
|
||||||
|
modulelauncher_subpattern => 60,
|
||||||
|
owner => 60,
|
||||||
|
rate_limit => 10,
|
||||||
|
ref_count => 60,
|
||||||
|
ref_user => 60,
|
||||||
|
type => 60,
|
||||||
|
# all others are allowed to be factset by anybody/default to level 0
|
||||||
|
);
|
||||||
|
|
||||||
sub initialize {
|
sub initialize {
|
||||||
my ($self, %conf) = @_;
|
my ($self, %conf) = @_;
|
||||||
|
|
||||||
@ -43,8 +58,8 @@ sub initialize {
|
|||||||
$pbot->commands->register(sub { return $self->factrem(@_) }, "factrem", 0);
|
$pbot->commands->register(sub { return $self->factrem(@_) }, "factrem", 0);
|
||||||
$pbot->commands->register(sub { return $self->factshow(@_) }, "factshow", 0);
|
$pbot->commands->register(sub { return $self->factshow(@_) }, "factshow", 0);
|
||||||
$pbot->commands->register(sub { return $self->factinfo(@_) }, "factinfo", 0);
|
$pbot->commands->register(sub { return $self->factinfo(@_) }, "factinfo", 0);
|
||||||
$pbot->commands->register(sub { return $self->factset(@_) }, "factset", 10);
|
$pbot->commands->register(sub { return $self->factset(@_) }, "factset", 0);
|
||||||
$pbot->commands->register(sub { return $self->factunset(@_) }, "factunset", 10);
|
$pbot->commands->register(sub { return $self->factunset(@_) }, "factunset", 0);
|
||||||
$pbot->commands->register(sub { return $self->factchange(@_) }, "factchange", 0);
|
$pbot->commands->register(sub { return $self->factchange(@_) }, "factchange", 0);
|
||||||
$pbot->commands->register(sub { return $self->factalias(@_) }, "factalias", 0);
|
$pbot->commands->register(sub { return $self->factalias(@_) }, "factalias", 0);
|
||||||
$pbot->commands->register(sub { return $self->call_factoid(@_) }, "fact", 0);
|
$pbot->commands->register(sub { return $self->call_factoid(@_) }, "fact", 0);
|
||||||
@ -90,6 +105,39 @@ sub factset {
|
|||||||
return "Usage: factset <channel> <factoid> [key <value>]"
|
return "Usage: factset <channel> <factoid> [key <value>]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $admininfo = $self->{pbot}->admins->loggedin($from, "$nick!$user\@$host");
|
||||||
|
|
||||||
|
my $level = 0;
|
||||||
|
my $meta_level = 0;
|
||||||
|
|
||||||
|
if(defined $admininfo) {
|
||||||
|
$level = $admininfo->{level};
|
||||||
|
}
|
||||||
|
|
||||||
|
if(defined $key) {
|
||||||
|
if(defined $factoid_metadata_levels{$key}) {
|
||||||
|
$meta_level = $factoid_metadata_levels{$key};
|
||||||
|
}
|
||||||
|
|
||||||
|
if($meta_level > 0) {
|
||||||
|
if($level == 0) {
|
||||||
|
return "You must login to set '$key'";
|
||||||
|
} elsif($level < $meta_level) {
|
||||||
|
return "You must be at least level $meta_level to set '$key'";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my ($owner_channel, $owner_trigger) = $self->{pbot}->factoids->find_factoid($channel, $trigger, undef, 1);
|
||||||
|
|
||||||
|
if(defined $owner_channel) {
|
||||||
|
my $factoid = $self->{pbot}->factoids->factoids->hash->{$owner_channel}->{$owner_trigger};
|
||||||
|
|
||||||
|
if(lc $nick ne lc $factoid->{'owner'} and $level == 0) {
|
||||||
|
return "You are not the owner of $trigger.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $self->{pbot}->factoids->factoids->set($channel, $trigger, $key, $value);
|
return $self->{pbot}->factoids->factoids->set($channel, $trigger, $key, $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,10 +146,41 @@ sub factunset {
|
|||||||
my ($from, $nick, $user, $host, $arguments) = @_;
|
my ($from, $nick, $user, $host, $arguments) = @_;
|
||||||
my ($channel, $trigger, $key) = split / /, $arguments, 3 if defined $arguments;
|
my ($channel, $trigger, $key) = split / /, $arguments, 3 if defined $arguments;
|
||||||
|
|
||||||
if(not defined $channel or not defined $trigger) {
|
if(not defined $channel or not defined $trigger or not defined $key) {
|
||||||
return "Usage: factunset <channel> <factoid> <key>"
|
return "Usage: factunset <channel> <factoid> <key>"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $admininfo = $self->{pbot}->admins->loggedin($from, "$nick!$user\@$host");
|
||||||
|
|
||||||
|
my $level = 0;
|
||||||
|
my $meta_level = 0;
|
||||||
|
|
||||||
|
if(defined $admininfo) {
|
||||||
|
$level = $admininfo->{level};
|
||||||
|
}
|
||||||
|
|
||||||
|
if(defined $factoid_metadata_levels{$key}) {
|
||||||
|
$meta_level = $factoid_metadata_levels{$key};
|
||||||
|
}
|
||||||
|
|
||||||
|
if($meta_level > 0) {
|
||||||
|
if($level == 0) {
|
||||||
|
return "You must login to unset '$key'";
|
||||||
|
} elsif($level < $meta_level) {
|
||||||
|
return "You must be at least level $meta_level to unset '$key'";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my ($owner_channel, $owner_trigger) = $self->{pbot}->factoids->find_factoid($channel, $trigger, undef, 1);
|
||||||
|
|
||||||
|
if(defined $owner_channel) {
|
||||||
|
my $factoid = $self->{pbot}->factoids->factoids->hash->{$owner_channel}->{$owner_trigger};
|
||||||
|
|
||||||
|
if(lc $nick ne lc $factoid->{'owner'} and $level == 0) {
|
||||||
|
return "You are not the owner of $trigger.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $self->{pbot}->factoids->factoids->unset($channel, $trigger, $key);
|
return $self->{pbot}->factoids->factoids->unset($channel, $trigger, $key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,9 +205,6 @@ sub interpreter {
|
|||||||
|
|
||||||
$from = lc $from;
|
$from = lc $from;
|
||||||
|
|
||||||
# (COMMENTED OUT) remove trailing comma or colon from keyword if keyword has other characters beforehand
|
|
||||||
# $keyword =~ s/^(.+)[:,]$/$1/;
|
|
||||||
|
|
||||||
return undef if not length $keyword;
|
return undef if not length $keyword;
|
||||||
|
|
||||||
my $original_keyword = $keyword;
|
my $original_keyword = $keyword;
|
||||||
@ -232,7 +229,7 @@ sub interpreter {
|
|||||||
$command = $1;
|
$command = $1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$pbot->logger->log("[" . (defined $from ? $from : "(undef)") . "] ($nick!$user\@$host) [$keyword] aliased to: [$command]\n");
|
$pbot->logger->log("[" . (defined $from ? $from : "stdin") . "] ($nick!$user\@$host) [$keyword] aliased to: [$command]\n");
|
||||||
|
|
||||||
$self->factoids->hash->{$channel}->{$keyword}->{ref_count}++;
|
$self->factoids->hash->{$channel}->{$keyword}->{ref_count}++;
|
||||||
$self->factoids->hash->{$channel}->{$keyword}->{ref_user} = $nick;
|
$self->factoids->hash->{$channel}->{$keyword}->{ref_user} = $nick;
|
||||||
@ -274,7 +271,7 @@ sub interpreter {
|
|||||||
|
|
||||||
# Don't allow user-custom /msg factoids, unless factoid triggered by admin
|
# Don't allow user-custom /msg factoids, unless factoid triggered by admin
|
||||||
if(($self->factoids->hash->{$channel}->{$keyword}->{action} =~ m/^\/msg/i) and (not $self->{pbot}->admins->loggedin($from, "$nick!$user\@$host"))) {
|
if(($self->factoids->hash->{$channel}->{$keyword}->{action} =~ m/^\/msg/i) and (not $self->{pbot}->admins->loggedin($from, "$nick!$user\@$host"))) {
|
||||||
$self->{pbot}->logger->log("[HACK] Bad factoid (contains /msg): " . $self->factoids->hash->{$channel}->{$keyword}->{action} . "\n");
|
$self->{pbot}->logger->log("[ABUSE] Bad factoid (contains /msg): " . $self->factoids->hash->{$channel}->{$keyword}->{action} . "\n");
|
||||||
return "You must login to use this command."
|
return "You must login to use this command."
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,21 +296,25 @@ sub interpreter {
|
|||||||
$result = "/msg $tonick $fromnick$keyword is $result";
|
$result = "/msg $tonick $fromnick$keyword is $result";
|
||||||
}
|
}
|
||||||
|
|
||||||
$self->{pbot}->logger->log("text set to [$result]\n");
|
$self->{pbot}->logger->log("result set to [$result]\n");
|
||||||
} else {
|
} else {
|
||||||
$result = $self->factoids->hash->{$channel}->{$keyword}->{action};
|
$result = $self->factoids->hash->{$channel}->{$keyword}->{action};
|
||||||
}
|
}
|
||||||
|
|
||||||
if(defined $arguments) {
|
if(defined $arguments) {
|
||||||
# TODO - extract and remove $tonick from end of $arguments
|
if(exists $self->factoids->hash->{$channel}->{$keyword}->{action_with_args}) {
|
||||||
|
$result = $self->factoids->hash->{$channel}->{$keyword}->{action_with_args};
|
||||||
|
}
|
||||||
|
|
||||||
if(not $result =~ s/\$args/$arguments/gi) {
|
if(not $result =~ s/\$args/$arguments/gi) {
|
||||||
# factoid doesn't take an argument
|
# factoid doesn't take an argument, so assume argument is a nick if it is a single-word 20 characters or less
|
||||||
|
# TODO - maintain list of channel nicks and compare against this list to ensure nick exists
|
||||||
if($arguments =~ /^[^ ]{1,20}$/) {
|
if($arguments =~ /^[^ ]{1,20}$/) {
|
||||||
# might be a nick
|
# might be a nick
|
||||||
if($result =~ /^\/.+? /) {
|
if($result =~ /^\/.+? /) {
|
||||||
$result =~ s/^(\/.+?) /$1 $arguments: /;
|
$result =~ s/^(\/.+?) /$1 $arguments: /;
|
||||||
} else {
|
} else {
|
||||||
$result =~ s/^/\/say $arguments: $keyword is / unless (defined $tonick);
|
$result =~ s/^/\/say $arguments: $keyword is / unless defined $tonick;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
# return undef;
|
# return undef;
|
||||||
|
@ -13,8 +13,8 @@ use warnings;
|
|||||||
# These are set automatically by the build/commit script
|
# These are set automatically by the build/commit script
|
||||||
use constant {
|
use constant {
|
||||||
BUILD_NAME => "PBot",
|
BUILD_NAME => "PBot",
|
||||||
BUILD_REVISION => 252,
|
BUILD_REVISION => 253,
|
||||||
BUILD_DATE => "2011-01-24",
|
BUILD_DATE => "2011-01-25",
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
Loading…
Reference in New Issue
Block a user