karma.pl


use strict;
use vars qw($VERSION %IRSSI);

use Irssi;

$VERSION = '1.05';

# 1.00
#   Initial release.
# 1.01
#   Fixed regex matches for single tokens
# 1.02
#   Added own_public sub to catch own messages.
# 1.03
#   Added !karma querying ability
# 1.04
#   Irssi::get_irssi_dir() works.
# 1.05
#   Filtering through lc() to avoid havoc!

%IRSSI = (
    authors	=> 'Jared Burke',
    contact	=> 'Jared@anal0g.org',
    name	=> 'Karma',
    description	=> 'Karma',
    license	=> 'Public Domain',
    url		=> 'http://anal0g.org/dev',
    changed	=> 'Tue Jun 27 09:14 CET 2008',
);

my $directory = Irssi::get_irssi_dir() . "/karma";
mkdir $directory or die "$directory: $!" unless -d $directory;

sub public {
    my ($server, $msg, $nick, $address, $target) = @_;
    if ($msg =~ /^\w+\+\+$/s) {
	$msg =~ s/\+\+$//;
	karma_add($msg);
	$server->command('msg ' . $target . ' ' . $msg . '\'s new karma is ' . query($msg));
	return 0;
    }
    elsif ($msg =~ /^\w+--$/s) {
	$msg =~ s/--$//;
	karma_rem($msg);
	$server->command('msg ' . $target . ' ' . $msg . '\'s new karma is ' . query($msg));
	return 0;
    }
    elsif ($msg =~ /^\!karma \w+$/s) {
	$msg =~ s/^\!karma //;
	$server->command('msg ' . $target . ' ' . $msg . '\'s karma is ' . query($msg));
    }
}

sub own_public {
    my ($server, $msg, $target) = @_;
    if ($msg =~ /^\w+\+\+$/s) {
        $msg =~ s/\+\+$//;
	karma_add($msg);
        $server->command('msg ' . $target . ' ' . $msg . '\'s new karma is ' . query($msg));
        return 0;
    }
    elsif ($msg =~ /^\w+--$/) {
        $msg =~ s/--$//;
        karma_rem($msg);
	$server->command('msg ' . $target . ' ' . $msg . '\'s new karma is ' . query($msg));
        return 0;
    }
    elsif ($msg =~ /^!karma \w+$/s) {
	$msg =~s/^\!karma //;
        $server->command('msg ' . $target . ' ' . $msg. '\'s karma is ' . query($msg));
    }
}

sub karma_add {
    my $target = @_[0];
    my $old_karma = query($target);
    my $new_karma = $old_karma + 1;
    update($target,$new_karma);
}

sub karma_rem {
    my $target = @_[0];
    my $old_karma = query($target);
    my $new_karma = $old_karma - 1;
    update($target,$new_karma);
}

sub query {
    my $target = $directory . "/" . lc(@_[0]);
    if (-e $target) {
	open FILE, $target or die "$target: $!";
	my $value = <FILE>;
	close(FILE);
	return $value;
    }
    else {
	return 0;
    }
}

sub update {
    my ($target, $value) = @_;
    $target = lc($target);
    # This is lazy.
    `touch $directory/$target` unless -e "$directory/$target";
    # This is even lazier.
    `echo $value > $directory/$target`;
}

Irssi::signal_add("message public", "public");
Irssi::signal_add("message own_public", "own_public");