From: ailin-nemui Date: Wed, 4 Oct 2023 06:19:16 +0000 (+0200) Subject: nickcolor_expando_simple: new script X-Git-Url: http://git.99rst.org/?a=commitdiff_plain;h=b1d0672c7269269f57e3cff1ab3e95ba662da1a1;p=irssi-scripts.irssi.org.git nickcolor_expando_simple: new script simple hash based $nickcolor expando --- diff --git a/scripts/nickcolor_expando_simple.pl b/scripts/nickcolor_expando_simple.pl new file mode 100644 index 0000000..4713a62 --- /dev/null +++ b/scripts/nickcolor_expando_simple.pl @@ -0,0 +1,183 @@ +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 + }); +}