3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-26 22:09:26 +01:00

New factoid loading/saving -- much more flexible!

This commit is contained in:
Pragmatic Software 2010-05-08 23:36:56 +00:00
parent dfab440437
commit 8ebe546850
4 changed files with 9266 additions and 1087 deletions

View File

@ -170,7 +170,7 @@ sub alias {
$factoids->{$alias}{text} = "/call $command"; $factoids->{$alias}{text} = "/call $command";
$factoids->{$alias}{owner} = $nick; $factoids->{$alias}{owner} = $nick;
$factoids->{$alias}{timestamp} = time(); $factoids->{$alias}{created_on} = time();
$factoids->{$alias}{enabled} = 1; $factoids->{$alias}{enabled} = 1;
$factoids->{$alias}{ref_count} = 0; $factoids->{$alias}{ref_count} = 0;
$factoids->{$alias}{ref_user} = "nobody"; $factoids->{$alias}{ref_user} = "nobody";
@ -207,7 +207,7 @@ sub add_regex {
$factoids->{$keyword}{regex} = $text; $factoids->{$keyword}{regex} = $text;
$factoids->{$keyword}{owner} = $nick; $factoids->{$keyword}{owner} = $nick;
$factoids->{$keyword}{timestamp} = time(); $factoids->{$keyword}{created_on} = time();
$factoids->{$keyword}{enabled} = 1; $factoids->{$keyword}{enabled} = 1;
$factoids->{$keyword}{ref_count} = 0; $factoids->{$keyword}{ref_count} = 0;
$factoids->{$keyword}{ref_user} = "nobody"; $factoids->{$keyword}{ref_user} = "nobody";
@ -242,7 +242,7 @@ sub add_text {
$factoids->{$keyword}{text} = $text; $factoids->{$keyword}{text} = $text;
$factoids->{$keyword}{owner} = $nick; $factoids->{$keyword}{owner} = $nick;
$factoids->{$keyword}{timestamp} = time(); $factoids->{$keyword}{created_on} = time();
$factoids->{$keyword}{enabled} = 1; $factoids->{$keyword}{enabled} = 1;
$factoids->{$keyword}{ref_count} = 0; $factoids->{$keyword}{ref_count} = 0;
$factoids->{$keyword}{ref_user} = "nobody"; $factoids->{$keyword}{ref_user} = "nobody";
@ -319,17 +319,17 @@ sub info {
# factoid # factoid
if(exists $factoids->{$arguments}{text}) { if(exists $factoids->{$arguments}{text}) {
return "$arguments: Factoid submitted by $factoids->{$arguments}{owner} on " . localtime($factoids->{$arguments}{timestamp}) . ", referenced $factoids->{$arguments}{ref_count} times (last by $factoids->{$arguments}{ref_user})"; return "$arguments: Factoid submitted by $factoids->{$arguments}{owner} on " . localtime($factoids->{$arguments}{created_on}) . ", referenced $factoids->{$arguments}{ref_count} times (last by $factoids->{$arguments}{ref_user})";
} }
# module # module
if(exists $factoids->{$arguments}{module}) { if(exists $factoids->{$arguments}{module}) {
return "$arguments: Module loaded by $factoids->{$arguments}{owner} on " . localtime($factoids->{$arguments}{timestamp}) . " -> http://code.google.com/p/pbot2-pl/source/browse/trunk/modules/$factoids->{$arguments}{module}, used $factoids->{$arguments}{ref_count} times (last by $factoids->{$arguments}{ref_user})"; return "$arguments: Module loaded by $factoids->{$arguments}{owner} on " . localtime($factoids->{$arguments}{created_on}) . " -> http://code.google.com/p/pbot2-pl/source/browse/trunk/modules/$factoids->{$arguments}{module}, used $factoids->{$arguments}{ref_count} times (last by $factoids->{$arguments}{ref_user})";
} }
# regex # regex
if(exists $factoids->{$arguments}{regex}) { if(exists $factoids->{$arguments}{regex}) {
return "$arguments: Regex created by $factoids->{$arguments}{owner} on " . localtime($factoids->{$arguments}{timestamp}) . ", used $factoids->{$arguments}{ref_count} times (last by $factoids->{$arguments}{ref_user})"; return "$arguments: Regex created by $factoids->{$arguments}{owner} on " . localtime($factoids->{$arguments}{created_on}) . ", used $factoids->{$arguments}{ref_count} times (last by $factoids->{$arguments}{ref_user})";
} }
return "/msg $nick $arguments is not a factoid or a module"; return "/msg $nick $arguments is not a factoid or a module";
@ -356,8 +356,8 @@ sub top20 {
} else { } else {
if(lc $arguments eq "recent") { if(lc $arguments eq "recent") {
foreach my $command (sort { $factoids->{$b}{timestamp} <=> $factoids->{$a}{timestamp} } keys %{ $factoids }) { foreach my $command (sort { $factoids->{$b}{created_on} <=> $factoids->{$a}{created_on} } keys %{ $factoids }) {
#my ($seconds, $minutes, $hours, $day_of_month, $month, $year, $wday, $yday, $isdst) = localtime($factoids->{$command}{timestamp}); #my ($seconds, $minutes, $hours, $day_of_month, $month, $year, $wday, $yday, $isdst) = localtime($factoids->{$command}{created_on});
#my $t = sprintf("%04d/%02d/%02d", $year+1900, $month+1, $day_of_month); #my $t = sprintf("%04d/%02d/%02d", $year+1900, $month+1, $day_of_month);
$text .= "$command "; $text .= "$command ";
@ -594,7 +594,7 @@ sub load_module {
$factoids->{$keyword}{module} = $module; $factoids->{$keyword}{module} = $module;
$factoids->{$keyword}{enabled} = 1; $factoids->{$keyword}{enabled} = 1;
$factoids->{$keyword}{owner} = $nick; $factoids->{$keyword}{owner} = $nick;
$factoids->{$keyword}{timestamp} = time(); $factoids->{$keyword}{created_on} = time();
$self->{pbot}->logger->log("$nick!$user\@$host loaded $keyword => $module\n"); $self->{pbot}->logger->log("$nick!$user\@$host loaded $keyword => $module\n");
$self->{pbot}->factoids->save_factoids(); $self->{pbot}->factoids->save_factoids();
return "/msg $nick Loaded $keyword => $module"; return "/msg $nick Loaded $keyword => $module";

View File

@ -51,6 +51,43 @@ sub initialize {
$self->{factoidmodulelauncher} = PBot::FactoidModuleLauncher->new(pbot => $pbot); $self->{factoidmodulelauncher} = PBot::FactoidModuleLauncher->new(pbot => $pbot);
} }
sub load_factoids_add {
my ($self, $factoid, $i, $filename) = @_;
if(defined $factoid) {
my $trigger = delete $factoid->{trigger};
if(not defined $trigger) {
Carp::croak "Missing trigger around line $i of $filename\n";
}
if(exists $self->factoids->{$trigger}) {
Carp::croak "Duplicate factoid '$trigger' found in $filename around line $i\n";
}
my $type = delete $factoid->{type};
if(not defined $type) {
Carp::croak "Missing type for factoid '$trigger' around line $i of $filename\n";
}
$type = lc $type;
my $action = delete $factoid->{action};
if(not defined $action) {
Carp::croak "Missing action for factoid '$trigger' around line $i of $filename\n";
}
$self->factoids->{$trigger}{$type} = $action;
foreach my $key (keys %$factoid) {
$self->factoids->{$trigger}{$key} = $factoid->{$key};
}
}
}
sub load_factoids { sub load_factoids {
my $self = shift; my $self = shift;
my $filename; my $filename;
@ -65,37 +102,25 @@ sub load_factoids {
$self->{pbot}->logger->log("Loading factoids from $filename ...\n"); $self->{pbot}->logger->log("Loading factoids from $filename ...\n");
open(FILE, "< $filename") or Carp::croak "Couldn't open $filename: $!\n"; open(FILE, "< $filename") or Carp::croak "Couldn't open $filename: $!\n";
my @contents = <FILE>;
close(FILE);
my $i = 0; my $i = 0;
my ($text, $regex, $modules); my ($text, $regex, $modules, $factoid);
foreach my $line (@contents) { foreach my $line (<FILE>) {
chomp $line;
$i++; $i++;
my ($command, $type, $enabled, $owner, $timestamp, $ref_count, $ref_user, $value) = split(/\s+/, $line, 8); $line =~ s/^\s+//;
$line =~ s/\s+$//;
if(not defined $command || not defined $enabled || not defined $owner || not defined $timestamp if(not $line) {
|| not defined $type || not defined $ref_count print "blank line at $i\n";
|| not defined $ref_user || not defined $value) { next;
Carp::croak "Syntax error around line $i of $filename\n";
} }
if(exists ${ $self->factoids }{$command}) { if($line eq '-') {
Carp::croak "Duplicate factoid $command found in $filename around line $i\n"; # first store the old factoid, if there is one
} if($factoid) {
my $type = lc $factoid->{type};
$type = lc $type;
${ $self->factoids }{$command}{enabled} = $enabled;
${ $self->factoids }{$command}{$type} = $value;
${ $self->factoids }{$command}{owner} = $owner;
${ $self->factoids }{$command}{timestamp} = $timestamp;
${ $self->factoids }{$command}{ref_count} = $ref_count;
${ $self->factoids }{$command}{ref_user} = $ref_user;
if($type eq "text") { if($type eq "text") {
$text++; $text++;
} elsif($type eq "regex") { } elsif($type eq "regex") {
@ -105,9 +130,41 @@ sub load_factoids {
} else { } else {
Carp::croak "Unknown type '$type' in $filename around line $i\n"; Carp::croak "Unknown type '$type' in $filename around line $i\n";
} }
$self->load_factoids_add($factoid, $i, $filename);
} }
$self->{pbot}->logger->log(" $i factoids loaded ($text factoids, $regex regexs, $modules modules).\n"); # start a new factoid
$factoid = {};
next;
}
my ($key, $value) = split /\:/, $line, 2;
$key =~ s/^\s+//;
$key =~ s/\s+$//;
$value =~ s/^\s+//;
$value =~ s/\s+$//;
$factoid->{$key} = $value;
}
close(FILE);
if($factoid) {
my $type = lc $factoid->{type};
if($type eq "text") {
$text++;
} elsif($type eq "regex") {
$regex++;
} elsif($type eq "module") {
$modules++;
} else {
Carp::croak "Unknown type '$type' in $filename around line $i\n";
}
$self->load_factoids_add($factoid, $i, $filename);
}
$self->{pbot}->logger->log(" " . ($text + $regex + $modules) . " factoids loaded ($text text, $regex regexs, $modules modules).\n");
$self->{pbot}->logger->log("Done.\n"); $self->{pbot}->logger->log("Done.\n");
} }
@ -124,32 +181,32 @@ sub save_factoids {
open(FILE, "> $filename") or die "Couldn't open $filename: $!\n"; open(FILE, "> $filename") or die "Couldn't open $filename: $!\n";
foreach my $command (sort keys %{ $self->factoids }) { foreach my $trigger (sort keys %{ $self->factoids }) {
next if $command eq "version"; next if $trigger eq "version";
if(defined ${ $self->factoids }{$command}{module} || defined ${ $self->factoids }{$command}{text} || defined ${ $self->factoids }{$command}{regex}) {
print FILE "$command "; print FILE "-\n";
print FILE "trigger: $trigger\n";
my $type;
if(defined ${ $self->factoids }{$trigger}{module}) {
$type = 'module';
} elsif(defined ${ $self->factoids }{$trigger}{text}) {
$type = 'text';
} elsif(defined ${ $self->factoids }{$trigger}{regex}) {
$type = 'regex';
} else { } else {
$self->{pbot}->logger->log("save_commands: unknown command type $command\n"); $self->{pbot}->logger->log("WARNING: save_factoids: skipping unknown trigger type for $trigger\n");
#todo -- /msg logged in admins greater than level X
next; next;
} }
#bleh, this is ugly - duplicated
if(defined ${ $self->factoids }{$command}{module}) { print FILE "type: $type\n";
print FILE "module "; print FILE "action: ${ $self->factoids }{$trigger}{$type}\n";
print FILE "${ $self->factoids }{$command}{enabled} ${ $self->factoids }{$command}{owner} ${ $self->factoids }{$command}{timestamp} ";
print FILE "${ $self->factoids }{$command}{ref_count} ${ $self->factoids }{$command}{ref_user} "; foreach my $key (sort keys %{ ${ $self->factoids }{$trigger} }) {
print FILE "${ $self->factoids }{$command}{module}\n"; next if $key eq 'text' or $key eq 'module' or $key eq 'regex';
} elsif(defined ${ $self->factoids }{$command}{text}) { print FILE "$key: ${ $self->factoids }{$trigger}{$key}\n";
print FILE "text ";
print FILE "${ $self->factoids }{$command}{enabled} ${ $self->factoids }{$command}{owner} ${ $self->factoids }{$command}{timestamp} ";
print FILE "${ $self->factoids }{$command}{ref_count} ${ $self->factoids }{$command}{ref_user} ";
print FILE "${ $self->factoids }{$command}{text}\n";
} elsif(defined ${ $self->factoids }{$command}{regex}) {
print FILE "regex ";
print FILE "${ $self->factoids }{$command}{enabled} ${ $self->factoids }{$command}{owner} ${ $self->factoids }{$command}{timestamp} ";
print FILE "${ $self->factoids }{$command}{ref_count} ${ $self->factoids }{$command}{ref_user} ";
print FILE "${ $self->factoids }{$command}{regex}\n";
} else {
$self->{pbot}->logger->log("save_commands: skipping unknown command type for $command\n");
} }
} }
close(FILE); close(FILE);
@ -169,7 +226,7 @@ sub add_factoid {
${ $self->factoids }{$command}{$type} = $text; ${ $self->factoids }{$command}{$type} = $text;
${ $self->factoids }{$command}{owner} = $owner; ${ $self->factoids }{$command}{owner} = $owner;
${ $self->factoids }{$command}{channel} = $channel; ${ $self->factoids }{$command}{channel} = $channel;
${ $self->factoids }{$command}{timestamp} = gettimeofday; ${ $self->factoids }{$command}{created_on} = gettimeofday;
${ $self->factoids }{$command}{ref_count} = 0; ${ $self->factoids }{$command}{ref_count} = 0;
${ $self->factoids }{$command}{ref_user} = "nobody"; ${ $self->factoids }{$command}{ref_user} = "nobody";
} }
@ -197,7 +254,7 @@ sub export_factoids {
} }
$text = "<td><b>$command</b> is " . encode_entities(${ $self->factoids }{$command}{text}) . "</td>\n"; $text = "<td><b>$command</b> is " . encode_entities(${ $self->factoids }{$command}{text}) . "</td>\n";
print FILE $text; print FILE $text;
my ($seconds, $minutes, $hours, $day_of_month, $month, $year, $wday, $yday, $isdst) = localtime(${ $self->factoids }{$command}{timestamp}); my ($seconds, $minutes, $hours, $day_of_month, $month, $year, $wday, $yday, $isdst) = localtime(${ $self->factoids }{$command}{created_on});
my $t = sprintf("%02d:%02d:%02d-%04d/%02d/%02d\n", my $t = sprintf("%02d:%02d:%02d-%04d/%02d/%02d\n",
$hours, $minutes, $seconds, $year+1900, $month+1, $day_of_month); $hours, $minutes, $seconds, $year+1900, $month+1, $day_of_month);
print FILE "<td align=\"right\">- submitted by<br> ${ $self->factoids }{$command}{owner}<br><i>$t</i>\n"; print FILE "<td align=\"right\">- submitted by<br> ${ $self->factoids }{$command}{owner}<br><i>$t</i>\n";

View File

@ -9,7 +9,7 @@ use strict;
use warnings; use warnings;
use vars qw($VERSION); use vars qw($VERSION);
$VERSION = "0.6.3-beta"; $VERSION = "0.7.0";
# unbuffer stdout # unbuffer stdout
STDOUT->autoflush(1); STDOUT->autoflush(1);

10148
factoids

File diff suppressed because it is too large Load Diff