| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- use strict;
- use Irssi 20020101.0250 ();
- use vars qw($VERSION %IRSSI);
- $VERSION = "1";
- %IRSSI = (
- authors => "Timo Sirainen, Ian Peters",
- contact => "tss\@iki.fi",
- name => "Nick Color",
- description => "assign a different color for each nick",
- license => "Public Domain",
- url => "http://irssi.org/",
- changed => "2002-03-04T22:47+0100"
- );
- # hm.. i should make it possible to use the existing one..
- Irssi::theme_register([
- 'pubmsg_hilight', '{pubmsghinick $0 $3 $1}$2'
- ]);
- my %saved_colors;
- my %session_colors = {};
- my @colors = qw/2 3 4 5 6 7 9 10 11 12 13/;
- sub load_colors {
- open COLORS, "$ENV{HOME}/.irssi/saved_colors";
- while (<COLORS>) {
- # I don't know why this is necessary only inside of irssi
- my @lines = split "\n";
- foreach my $line (@lines) {
- my($nick, $color) = split ":", $line;
- $saved_colors{$nick} = $color;
- }
- }
- close COLORS;
- }
- 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;
- }
- $counter = $colors[$counter % 11];
- return $counter;
- }
- # FIXME: breaks /HILIGHT etc.
- sub sig_public {
- my ($server, $msg, $nick, $address, $target) = @_;
- my $chanrec = $server->channel_find($target);
- return if not $chanrec;
- my $nickrec = $chanrec->nick_find($nick);
- return if not $nickrec;
- my $nickmode = $nickrec->{op} ? "@" : $nickrec->{voice} ? "+" : "";
- # 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 = "0".$color if ($color < 10);
- $server->command('/^format pubmsg {pubmsgnick $2 {pubnick '.chr(3).$color.'$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");
- } 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::command_bind('color', 'cmd_color');
- Irssi::signal_add('message public', 'sig_public');
- Irssi::signal_add('event nick', 'sig_nick');
|