use strict;
use warnings;
use experimental 'signatures';
use Irssi;
our $VERSION = '0.0.2'; # 4003f16d601cf51
our %IRSSI = (
authors => 'Nei',
name => 'nickcolor_expando_simple',
description => 'provide a simple hash based $nickcolor expando',
license => 'ISC',
);
die "This script requires Irssi 1.3 or later"
if (Irssi::parse_special('$abiversion')||0) < 36;
# Usage
# =====
# after loading the script, add the colour expando to the format
# (themes' abstracts are not supported)
#
# /format pubmsg {pubmsgnick $2 {pubnick $nickcolor$0}}$1
#
# or use the install routine
#
# /script exec Irssi::Script::nickcolor_expando_simple::install
#
# alternatively, use it together with nm2 script
# Options
# =======
# /set nick_colors
# * list of colour codes to use for $nickcolor
#
# /set nick_char_sum_hash
# * whether to use sum of chars as the hash function
#
# To replicate the account-notify colour scheme, try
# /set nick_colors %b %R %Y %G %M %w
# /set nick_char_sum_hash ON
# /run nickcolor_expando_simple
our $nickcolor;
my $char_sum_hash;
my %session_colours;
my @colours;
sub lc1459 {
my $x = shift;
$x =~ y/][\\^/}{|~/;
lc $x
}
sub expando_nickcolor {
$nickcolor // ''
}
sub char_sum {
my ($string) = @_;
chomp $string;
my @chars = split //, $string;
my $counter;
foreach my $char (@chars) {
$counter += ord $char;
}
$counter
}
sub one_at_a_time {
use integer;
my $hash = 0x5065526c + length $_[0];
for my $ord (unpack 'U*', $_[0]) {
$hash += $ord;
$hash += $hash << 10;
$hash &= 0xffffffff;
$hash ^= $hash >> 6;
}
$hash += $hash << 3;
$hash &= 0xffffffff;
$hash ^= $hash >> 11;
$hash = $hash + ($hash << 15);
$hash &= 0xffffffff;
}
sub simple_hash {
if ($char_sum_hash) {
&char_sum
} else {
&one_at_a_time
}
}
sub sig_expando_incoming ($server, $line, $in_nick, $address, $tags_str) {
return unless defined $in_nick;
my $_colour;
my $hash = $session_colours{$in_nick} //= simple_hash($in_nick);
if (@colours && defined $hash) {
$_colour = Irssi::format_string_expand($colours[ $hash % @colours ]);
}
local $nickcolor = $_colour;
&Irssi::signal_continue;
}
sub get_nick_color2 ($tag, $chanstr, $nickstr, $format) {
return unless $format;
my $hash = $session_colours{$nickstr} //= simple_hash($nickstr);
if (@colours && defined $hash) {
return Irssi::format_string_expand($colours[ $hash % @colours ]);
}
return;
}
sub setup_changed {
$char_sum_hash = Irssi::settings_get_bool('nick_char_sum_hash');
@colours = split ' ', Irssi::settings_get_str('nick_colors');
}
sub init {
setup_changed();
}
Irssi::settings_add_str('misc', 'nick_colors', '%r %R %g %G %y %b %B %m %M %c %C %X42 %X3A %X5E %X4N %X3H %X3C %X32');
Irssi::settings_add_bool('misc', 'nick_char_sum_hash', 0);
Irssi::signal_add('server event tags' => 'sig_expando_incoming');
Irssi::signal_add_last('setup changed' => 'setup_changed');
Irssi::expando_create('nickcolor' => \&expando_nickcolor, { 'server incoming' => 'none' });
init();
my %formats = (
action_public => [4, '{pubaction ' ,'$0','' ,'}','$1' ],
action_public_channel => [4, '{pubaction ' ,'$0','{msgchannel $1}' ,'}','$2' ],
action_private => [4, '{pvtaction ' ,'$0','' ,'}','$2' ],
action_private_query => [4, '{pvtaction_query ','$0','' ,'}','$2' ],
notice_public => [6, '{notice ' ,'$0','{pubnotice_channel $1}','}','$2' ],
notice_private => [6, '{notice ' ,'$0','{pvtnotice_host $1}' ,'}','$2' ],
# * * * # * *
msg_private => [2, '{privmsg ' ,'' ,'' ,'$0','' ,' $1' ,'}','$2' ],
msg_private_query => [2, '{privmsgnick ' ,'' ,'' ,'$0','' ,'' ,'}','$2' ],
pubmsg_me => [0, '{pubmsgmenick ' ,'$2',' {menick ' ,'$0','}','' ,'}','$1' ],
pubmsg_me_channel => [0, '{pubmsgmenick ' ,'$3',' {menick ' ,'$0','}','{msgchannel $1}','}','$2' ],
pubmsg_hilight => [0, '{pubmsghinick $0 ','$3',' ' ,'$1', '','', ,'}','$2' ],
pubmsg_hilight_channel => [0, '{pubmsghinick $0 ','$4',' ' ,'$1', '','{msgchannel $2}','}','$3' ],
pubmsg => [0, '{pubmsgnick ' ,'$2',' {pubnick ' ,'$0','}','' ,'}','$1' ],
pubmsg_channel => [0, '{pubmsgnick ' ,'$3',' {pubnick ' ,'$0','}','{msgchannel $1}','}','$2' ],
# * * * * * # * * * *
ctcp_reply => [8, 'CTCP {hilight $0} reply from ' ,'{nick ' ,'$1', '}','' ,': $2' ],
ctcp_reply_channel => [8, 'CTCP {hilight $0} reply from ' ,'{nick ' ,'$1', '}',' in channel {channel $3}',': $2' ],
ctcp_ping_reply => [8, 'CTCP {hilight PING} reply from ' ,'{nick ' ,'$0', '}','' ,': $1.$[-3.0]2 seconds' ],
ctcp_requested => [8, '{ctcp ' ,'{hilight ' ,'$0', '}',' {comment $1} requested CTCP {hilight $2} from {nick $4}}' ,': $3' ],
ctcp_requested_unknown => [8, '{ctcp ' ,'{hilight ' ,'$0', '}',' {comment $1} requested unknown CTCP {hilight $2} from {nick $4}}',': $3' ],
);
sub do_install ($impl) {
for my $fmt (sort keys %formats) {
my $fs = join '', $impl->(@{ $formats{$fmt} });
Irssi::command("^format $fmt $fs");
}
}
sub install {
do_install(sub ($t, @fs) {
my $pos = $t <= 2 ? 3 : $t <= 6 ? 1 : 2;
$fs[ $pos ] = '$nickcolor' . $fs[ $pos ];
@fs
});
}
sub uninstall {
do_install(sub ($t, @fs) {
@fs
});
}