dotfiles

Personal dotfiles
git clone https://git.bracken.jp/dotfiles.git
Log | Files | Refs | LICENSE

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');