xchatnickcolor.pl (4000B)
1 use strict; 2 use Irssi 20020101.0250 (); 3 use vars qw($VERSION %IRSSI); 4 $VERSION = "1"; 5 %IRSSI = ( 6 authors => "Timo Sirainen, Ian Peters", 7 contact => "tss\@iki.fi", 8 name => "Nick Color", 9 description => "assign a different color for each nick", 10 license => "Public Domain", 11 url => "http://irssi.org/", 12 changed => "2002-03-04T22:47+0100" 13 ); 14 15 # hm.. i should make it possible to use the existing one.. 16 Irssi::theme_register([ 17 'pubmsg_hilight', '{pubmsghinick $0 $3 $1}$2' 18 ]); 19 20 my %saved_colors; 21 my %session_colors = {}; 22 my @colors = qw/ 2 3 4 5 6 7 9 10 11 12 13 14 15/; 23 24 sub load_colors { 25 open COLORS, "$ENV{HOME}/.irssi/saved_colors"; 26 27 while (<COLORS>) { 28 # I don't know why this is necessary only inside of irssi 29 my @lines = split "\n"; 30 foreach my $line (@lines) { 31 my($nick, $color) = split ":", $line; 32 $saved_colors{$nick} = $color; 33 } 34 } 35 36 close COLORS; 37 } 38 39 sub save_colors { 40 open COLORS, ">$ENV{HOME}/.irssi/saved_colors"; 41 42 foreach my $nick (keys %saved_colors) { 43 print COLORS "$nick:$saved_colors{$nick}\n"; 44 } 45 46 close COLORS; 47 } 48 49 # If someone we've colored (either through the saved colors, or the hash 50 # function) changes their nick, we'd like to keep the same color associated 51 # with them (but only in the session_colors, ie a temporary mapping). 52 53 sub sig_nick { 54 my ($server, $newnick, $nick, $address) = @_; 55 my $color; 56 57 $newnick = substr ($newnick, 1) if ($newnick =~ /^:/); 58 59 if ($color = $saved_colors{$nick}) { 60 $session_colors{$newnick} = $color; 61 } elsif ($color = $session_colors{$nick}) { 62 $session_colors{$newnick} = $color; 63 } 64 } 65 66 # This gave reasonable distribution values when run across 67 # /usr/share/dict/words 68 69 sub simple_hash { 70 my ($string) = @_; 71 chomp $string; 72 my @chars = split //, $string; 73 my $counter; 74 75 foreach my $char (@chars) { 76 $counter += ord $char; 77 } 78 79 $counter = $colors[$counter % 11]; 80 81 return $counter; 82 } 83 84 # FIXME: breaks /HILIGHT etc. 85 sub sig_public { 86 my ($server, $msg, $nick, $address, $target) = @_; 87 my $chanrec = $server->channel_find($target); 88 return if not $chanrec; 89 my $nickrec = $chanrec->nick_find($nick); 90 return if not $nickrec; 91 my $nickmode = $nickrec->{op} ? "@" : $nickrec->{voice} ? "+" : ""; 92 93 # Has the user assigned this nick a color? 94 my $color = $saved_colors{$nick}; 95 96 # Have -we- already assigned this nick a color? 97 if (!$color) { 98 $color = $session_colors{$nick}; 99 } 100 101 # Let's assign this nick a color 102 if (!$color) { 103 $color = simple_hash $nick; 104 $session_colors{$nick} = $color; 105 } 106 107 $color = "0".$color if ($color < 10); 108 $server->command('/^format pubmsg %b<%w$2'.chr(3).$color.'$[-11]0%b> %K|%n $1'); 109 # $server->command('/^format action_public {pubaction '.chr(3).$color.'$0}$1'); 110 } 111 112 sub cmd_color { 113 my ($data, $server, $witem) = @_; 114 my ($op, $nick, $color) = split " ", $data; 115 116 $op = lc $op; 117 118 if (!$op) { 119 Irssi::print ("No operation given"); 120 } elsif ($op eq "save") { 121 save_colors; 122 } elsif ($op eq "set") { 123 if (!$nick) { 124 Irssi::print ("Nick not given"); 125 } elsif (!$color) { 126 Irssi::print ("Color not given"); 127 } elsif ($color < 2 || $color > 14) { 128 Irssi::print ("Color must be between 2 and 14 inclusive"); 129 } else { 130 $saved_colors{$nick} = $color; 131 } 132 } elsif ($op eq "clear") { 133 if (!$nick) { 134 Irssi::print ("Nick not given"); 135 } else { 136 delete ($saved_colors{$nick}); 137 } 138 } elsif ($op eq "list") { 139 Irssi::print ("\nSaved Colors:"); 140 foreach my $nick (keys %saved_colors) { 141 Irssi::print (chr (3) . "$saved_colors{$nick}$nick" . 142 chr (3) . "1 ($saved_colors{$nick})"); 143 } 144 } elsif ($op eq "preview") { 145 Irssi::print ("\nAvailable colors:"); 146 foreach my $i (2..14) { 147 Irssi::print (chr (3) . "$i" . "Color #$i"); 148 } 149 } 150 } 151 152 load_colors; 153 154 Irssi::command_bind('color', 'cmd_color'); 155 156 Irssi::signal_add('message public', 'sig_public'); 157 Irssi::signal_add('event nick', 'sig_nick');