* Move karma from homebrew storage to CHI * Use cachedir for CHI file storage heap * Use cachedir in drink.pm * Use cachedir in weather.pm
104 lines
2.1 KiB
Perl
104 lines
2.1 KiB
Perl
package karma;
|
|
|
|
use 5.018;
|
|
use strict;
|
|
use warnings;
|
|
use utf8;
|
|
use open qw (:std :utf8);
|
|
use English qw ( -no_match_vars );
|
|
use Carp qw (cluck);
|
|
use CHI;
|
|
use CHI::Driver::BerkeleyDB;
|
|
use conf qw (loadConf);
|
|
|
|
use version; our $VERSION = qw (1.0);
|
|
use Exporter qw (import);
|
|
our @EXPORT_OK = qw (karmaSet karmaGet);
|
|
|
|
my $c = loadConf ();
|
|
my $cachedir = $c->{cachedir};
|
|
my $max = 5;
|
|
|
|
# swallow phrase and return answer
|
|
sub karmaSet (@) {
|
|
my $chatid = shift;
|
|
my $phrase = shift;
|
|
my $action = shift;
|
|
|
|
if (($phrase eq '') || ($phrase =~ /^ +$/)) {
|
|
$phrase = ' ';
|
|
}
|
|
|
|
my $cache = CHI->new (
|
|
driver => 'BerkeleyDB',
|
|
root_dir => $cachedir,
|
|
namespace => __PACKAGE__ . '_' . $chatid
|
|
);
|
|
|
|
my $score = $cache->get ($phrase);
|
|
|
|
if (defined $score) {
|
|
if ($action eq '++') {
|
|
$score++;
|
|
} else {
|
|
$score--;
|
|
}
|
|
} else {
|
|
if ($action eq '++') {
|
|
$score = 1;
|
|
} else {
|
|
$score = -1;
|
|
}
|
|
}
|
|
|
|
if ($cache->set ($phrase, $score, 'never') != $score) {
|
|
cluck 'Cache error: unable to set karma.';
|
|
}
|
|
|
|
if ($score < -1 && (($score % (0 - $max)) + 1) == 0) {
|
|
if ($phrase eq ' ') {
|
|
return sprintf 'Зарегистрировано пробитие дна, карма пустоты составляет %d', $score;
|
|
} else {
|
|
return sprintf 'Зарегистрировано пробитие дна, карма %s составляет %d', $phrase, $score;
|
|
}
|
|
} else {
|
|
if ($phrase eq ' ') {
|
|
return sprintf 'Карма пустоты составляет %d', $score;
|
|
} else {
|
|
return sprintf 'Карма %s составляет %d', $phrase, $score;
|
|
}
|
|
}
|
|
}
|
|
|
|
# just return answer
|
|
sub karmaGet (@) {
|
|
my $chatid = shift;
|
|
my $phrase = shift;
|
|
|
|
if (($phrase eq '') || ($phrase =~ /^ +$/)) {
|
|
$phrase = ' ';
|
|
}
|
|
|
|
my $cache = CHI->new (
|
|
driver => 'BerkeleyDB',
|
|
root_dir => $cachedir,
|
|
namespace => __PACKAGE__ . '_' . $chatid
|
|
);
|
|
|
|
my $score = $cache->get ($phrase);
|
|
|
|
unless (defined $score) {
|
|
$score = 0;
|
|
}
|
|
|
|
if ($phrase eq ' ') {
|
|
return sprintf 'Карма пустоты составляет %d', $score;
|
|
} else {
|
|
return sprintf 'Карма %s составляет %d', $phrase, $score;
|
|
}
|
|
}
|
|
|
|
1;
|
|
|
|
# vim: ft=perl noet ai ts=4 sw=4 sts=4:
|