mirror of
https://github.com/captn3m0/dotfiles.git
synced 2024-09-10 22:46:42 +00:00
146 lines
3.7 KiB
Perl
146 lines
3.7 KiB
Perl
|
|
use strict;
|
|
use Irssi 20020101.0250 ();
|
|
use vars qw($VERSION %IRSSI);
|
|
$VERSION = "2";
|
|
%IRSSI = (
|
|
authors => "Timo Sirainen, Ian Peters, David Leadbeater",
|
|
contact => "tss\@iki.fi",
|
|
name => "Nick Color",
|
|
description => "assign a different color for each nick",
|
|
license => "Public Domain",
|
|
url => "http://irssi.org/",
|
|
changed => "Sun 15 Jun 19:10:44 BST 2014",
|
|
);
|
|
|
|
# Settings:
|
|
# nickcolor_colors: List of color codes to use.
|
|
# e.g. /set nickcolor_colors 2 3 4 5 6 7 9 10 11 12 13
|
|
# (avoid 8, as used for hilights in the default theme).
|
|
|
|
my %saved_colors;
|
|
my %session_colors = {};
|
|
|
|
sub load_colors {
|
|
open my $color_fh, "<", "$ENV{HOME}/.irssi/saved_colors";
|
|
while (<$color_fh>) {
|
|
chomp;
|
|
my($nick, $color) = split ":";
|
|
$saved_colors{$nick} = $color;
|
|
}
|
|
}
|
|
|
|
sub save_colors {
|
|
open COLORS, ">", "$ENV{HOME}/.irssi/saved_colors";
|
|
|
|
foreach my $nick (keys %saved_colors) {
|
|
print COLORS "$nick:$saved_colors{$nick}\n";
|
|
}
|
|
|
|
close COLORS;
|
|
}
|
|
|
|
# If someone we've colored (either through the saved colors, or the hash
|
|
# function) changes their nick, we'd like to keep the same color associated
|
|
# with them (but only in the session_colors, ie a temporary mapping).
|
|
|
|
sub sig_nick {
|
|
my ($server, $newnick, $nick, $address) = @_;
|
|
my $color;
|
|
|
|
$newnick = substr ($newnick, 1) if ($newnick =~ /^:/);
|
|
|
|
if ($color = $saved_colors{$nick}) {
|
|
$session_colors{$newnick} = $color;
|
|
} elsif ($color = $session_colors{$nick}) {
|
|
$session_colors{$newnick} = $color;
|
|
}
|
|
}
|
|
|
|
# This gave reasonable distribution values when run across
|
|
# /usr/share/dict/words
|
|
|
|
sub simple_hash {
|
|
my ($string) = @_;
|
|
chomp $string;
|
|
my @chars = split //, $string;
|
|
my $counter;
|
|
|
|
foreach my $char (@chars) {
|
|
$counter += ord $char;
|
|
}
|
|
|
|
my @colors = split / /, Irssi::settings_get_str('nickcolor_colors');
|
|
$counter = $colors[$counter % @colors];
|
|
|
|
return $counter;
|
|
}
|
|
|
|
sub sig_public {
|
|
my ($server, $msg, $nick, $address, $target) = @_;
|
|
|
|
# Has the user assigned this nick a color?
|
|
my $color = $saved_colors{$nick};
|
|
|
|
# Have -we- already assigned this nick a color?
|
|
if (!$color) {
|
|
$color = $session_colors{$nick};
|
|
}
|
|
|
|
# Let's assign this nick a color
|
|
if (!$color) {
|
|
$color = simple_hash $nick;
|
|
$session_colors{$nick} = $color;
|
|
}
|
|
|
|
$color = sprintf "\003%02d", $color;
|
|
$server->command('/^format pubmsg {pubmsgnick $2 {pubnick '.chr(3).$color.'$[-10]0}}$1');
|
|
}
|
|
|
|
sub cmd_color {
|
|
my ($data, $server, $witem) = @_;
|
|
my ($op, $nick, $color) = split " ", $data;
|
|
|
|
$op = lc $op;
|
|
|
|
if (!$op) {
|
|
Irssi::print ("No operation given (save/set/clear/list/preview)");
|
|
} elsif ($op eq "save") {
|
|
save_colors;
|
|
} elsif ($op eq "set") {
|
|
if (!$nick) {
|
|
Irssi::print ("Nick not given");
|
|
} elsif (!$color) {
|
|
Irssi::print ("Color not given");
|
|
} elsif ($color < 2 || $color > 14) {
|
|
Irssi::print ("Color must be between 2 and 14 inclusive");
|
|
} else {
|
|
$saved_colors{$nick} = $color;
|
|
}
|
|
} elsif ($op eq "clear") {
|
|
if (!$nick) {
|
|
Irssi::print ("Nick not given");
|
|
} else {
|
|
delete ($saved_colors{$nick});
|
|
}
|
|
} elsif ($op eq "list") {
|
|
Irssi::print ("\nSaved Colors:");
|
|
foreach my $nick (keys %saved_colors) {
|
|
Irssi::print (chr (3) . "$saved_colors{$nick}$nick" .
|
|
chr (3) . "1 ($saved_colors{$nick})");
|
|
}
|
|
} elsif ($op eq "preview") {
|
|
Irssi::print ("\nAvailable colors:");
|
|
foreach my $i (2..14) {
|
|
Irssi::print (chr (3) . "$i" . "Color #$i");
|
|
}
|
|
}
|
|
}
|
|
|
|
load_colors;
|
|
|
|
Irssi::settings_add_str('misc', 'nickcolor_colors', '2 3 4 5 6 7 9 10 11 12 13');
|
|
Irssi::command_bind('color', 'cmd_color');
|
|
|
|
Irssi::signal_add('message public', 'sig_public');
|
|
Irssi::signal_add('event nick', 'sig_nick'); |