Files
drunkendotfiles/.irssi/scripts/autorun/rainbow-timestamp.pl
dissimulo 4ca7f9714d rainbow-dark: drop rainbow dashes, add rainbow-timestamp.pl
- rainbow-dark.theme: revert line_start back to the stock '-!-' pattern.
- .irssi/scripts/autorun/rainbow-timestamp.pl: new autorun script that
  hooks 'print text', matches a leading HH:MM[:SS], and reruns it
  through rainbow.pl's make_colors (same palette [4,8,9,11,12,13],
  same 2-char stride, same phase-advance on each line). The result
  is that every successive timestamp is a 5-character rainbow
  gradient that also shifts starting colour line-to-line.
2026-04-21 09:27:03 -07:00

68 lines
2.7 KiB
Perl

#
# rainbow-timestamp.pl — paint each printed line's leading timestamp with
# the rotating rainbow palette from rainbow.pl, so every successive line
# advances the colour phase. Each individual timestamp is itself a
# gradient across its own characters (HH:MM -> five different colours).
#
# Drops into ~/.irssi/scripts/autorun/; loads automatically on irssi start.
#
use strict;
use warnings;
use vars qw($VERSION %IRSSI);
use Irssi;
$VERSION = '0.1';
%IRSSI = (
authors => 'dissimulo',
contact => 'connect+gitea@dustin-williams.com',
name => 'rainbow-timestamp',
description => 'Rotating-rainbow timestamps (same palette/logic as rainbow.pl).',
license => 'GNU GPLv2 or later',
);
# mIRC colour palette — identical to rainbow.pl:
# 4 = light red, 8 = yellow, 9 = light green,
# 11 = light cyan, 12 = light blue, 13 = light magenta
my @colors = ('4', '8', '9', '11', '12', '13');
my $last_color = 0;
my $colorrep = 2; # how many chars share each colour before advancing
sub make_colors {
my ($string) = @_;
my $out = '';
my $last = $last_color;
for (my $c = 0; $c < length($string); $c++) {
my $char = substr($string, $c, 1);
$last++;
my $color = int($last / $colorrep) % scalar(@colors);
$out .= "\003" . sprintf('%02d', $colors[$color]);
$out .= ($char eq ',') ? "\," : $char;
}
$last_color += 2; # advance phase so the next call starts shifted
return $out;
}
# Hook 'print text' — fires once per window line, with the fully-rendered
# text (including the leading timestamp if info_eol is off, which is the
# default). We match a leading HH:MM or HH:MM:SS, recolour it, and pass
# the line back through signal_continue with the rest of the text intact.
Irssi::signal_add('print text', sub {
my ($dest, $text, $stripped) = @_;
return unless defined $text;
# Strip any existing colour codes from just the prefix to find the
# raw timestamp (irssi's theme abstract may have wrapped it).
# Match (optional colour prefix) + HH:MM[:SS] + (optional colour suffix) + space
if ($text =~ /^((?:\003\d{1,2}(?:,\d{1,2})?)*)(\d{2}:\d{2}(?::\d{2})?)((?:\017|\003)?)(\s)/) {
my $pre = $1; # existing colour codes before the timestamp
my $ts = $2; # the timestamp itself
my $post = $3; # colour reset (if any)
my $sep = $4; # whitespace between ts and rest
my $rest = substr($text, length($pre) + length($ts) + length($post) + length($sep));
my $coloured = make_colors($ts) . "\017"; # \017 = reset colour
Irssi::signal_continue($dest, $coloured . $sep . $rest, $stripped);
}
});