|
| 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/; |
| 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 {pubmsgnick $2 {pubnick '.chr(3).$color.'$0}}$1'); |
| 109 | +} |
| 110 | + |
| 111 | +sub cmd_color { |
| 112 | + my ($data, $server, $witem) = @_; |
| 113 | + my ($op, $nick, $color) = split " ", $data; |
| 114 | + |
| 115 | + $op = lc $op; |
| 116 | + |
| 117 | + if (!$op) { |
| 118 | + Irssi::print ("No operation given"); |
| 119 | + } elsif ($op eq "save") { |
| 120 | + save_colors; |
| 121 | + } elsif ($op eq "set") { |
| 122 | + if (!$nick) { |
| 123 | + Irssi::print ("Nick not given"); |
| 124 | + } elsif (!$color) { |
| 125 | + Irssi::print ("Color not given"); |
| 126 | + } elsif ($color < 2 || $color > 14) { |
| 127 | + Irssi::print ("Color must be between 2 and 14 inclusive"); |
| 128 | + } else { |
| 129 | + $saved_colors{$nick} = $color; |
| 130 | + } |
| 131 | + } elsif ($op eq "clear") { |
| 132 | + if (!$nick) { |
| 133 | + Irssi::print ("Nick not given"); |
| 134 | + } else { |
| 135 | + delete ($saved_colors{$nick}); |
| 136 | + } |
| 137 | + } elsif ($op eq "list") { |
| 138 | + Irssi::print ("\nSaved Colors:"); |
| 139 | + foreach my $nick (keys %saved_colors) { |
| 140 | + Irssi::print (chr (3) . "$saved_colors{$nick}$nick" . |
| 141 | + chr (3) . "1 ($saved_colors{$nick})"); |
| 142 | + } |
| 143 | + } elsif ($op eq "preview") { |
| 144 | + Irssi::print ("\nAvailable colors:"); |
| 145 | + foreach my $i (2..14) { |
| 146 | + Irssi::print (chr (3) . "$i" . "Color #$i"); |
| 147 | + } |
| 148 | + } |
| 149 | +} |
| 150 | + |
| 151 | +load_colors; |
| 152 | + |
| 153 | +Irssi::command_bind('color', 'cmd_color'); |
| 154 | + |
| 155 | +Irssi::signal_add('message public', 'sig_public'); |
| 156 | +Irssi::signal_add('event nick', 'sig_nick'); |
0 commit comments