From d590e29b74472bbe9777bc1377fe6e75c18bdc78 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 21 Dec 2025 13:40:49 -0500 Subject: [PATCH] Add support for priority messages. By default priority regex are saved in ~/.irssi/priority_messages --- README | 7 +++++ sound.pl | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/README b/README index 210cf47..7defff7 100644 --- a/README +++ b/README @@ -13,3 +13,10 @@ If you want to autorun the script, place the script in or simlink to ~/.irssi/sc There is a basic install script, just run: ./install This install script creates the folder ~/.irssi/scripts/autorun if it doesn't exist and simlinks the script to start automatically. + +Priority alerts for public messages: +Create a file at ~/.irssi/priority_messages (one regex per line, # comments allowed). +Example pattern: ^\S+-\d+ is requesting assistance\.$ +Matching public messages will use priority_sound_command instead of pub_sound_command. +Use /set priority_messages_file to change the file path if needed. +Reload the regex file with: /sound priority_reload diff --git a/sound.pl b/sound.pl index 3262a97..ccfda5a 100755 --- a/sound.pl +++ b/sound.pl @@ -24,6 +24,81 @@ $VERSION = '0.0.3'; my $flood_protect = 1; my $sound_tag; +my $priority_patterns_ref = []; +my $priority_patterns_mtime = -1; +my $priority_patterns_file = ''; + +sub expand_home_path { + my ($path) = @_; + if (defined $path && $path =~ /^~(\/|$)/) { + $path =~ s/^~/$ENV{HOME}/; + } + return $path; +} + +sub load_priority_patterns { + my $file = Irssi::settings_get_str("priority_messages_file"); + $file = expand_home_path($file); + return [] if (!defined $file || $file eq ''); + + my $mtime = (stat($file))[9]; + if (!defined $mtime) { + $priority_patterns_ref = []; + $priority_patterns_mtime = -1; + $priority_patterns_file = $file; + return $priority_patterns_ref; + } + + if ($file eq $priority_patterns_file && $mtime == $priority_patterns_mtime) { + return $priority_patterns_ref; + } + + my @patterns = (); + if (open(my $fh, "<", $file)) { + while (my $line = <$fh>) { + chomp $line; + $line =~ s/^\s+//; + $line =~ s/\s+$//; + next if ($line eq '' || $line =~ /^#/); + my $regex = eval { qr/$line/ }; + next if $@; + push @patterns, $regex; + } + close $fh; + } + + $priority_patterns_ref = \@patterns; + $priority_patterns_mtime = $mtime; + $priority_patterns_file = $file; + return $priority_patterns_ref; +} + +sub message_is_priority { + my ($msg) = @_; + my $patterns_ref = load_priority_patterns(); + foreach my $regex (@{$patterns_ref}) { + return 1 if ($msg =~ $regex); + } + return 0; +} + +sub priority_reload { + $priority_patterns_mtime = -1; + $priority_patterns_file = ''; + my $patterns_ref = load_priority_patterns(); + my $patternCount = scalar @{$patterns_ref}; + Irssi::print("Priority message patterns reloaded ($patternCount)."); +} + +sub sound_command { + my ($data, $server, $witem) = @_; + my $command = $data // ''; + if ($command =~ /^\s*priority_reload\s*$/i) { + priority_reload(); + return; + } + Irssi::print("Usage: /sound priority_reload"); +} sub sound_overflow_timeout() { $flood_protect = 1; @@ -90,6 +165,19 @@ sub pub_msg { if ($server && ! Irssi::settings_get_bool("sounds")) { return;; } else { + if (message_is_priority($msg)) { + if (my $prioritycmd = Irssi::settings_get_str("priority_sound_command")) { + if ($flood_protect) { + my $sound_flood = Irssi::settings_get_int('sound_flood'); + $sound_flood = 1000 if $sound_flood < 0; + Irssi::timeout_remove($sound_tag); + $sound_tag = Irssi::timeout_add($sound_flood, 'sound_overflow_timeout', undef); + system($prioritycmd); + $flood_protect = 0; + } + } + return; + } if (my $pubcmd = Irssi::settings_get_str("pub_sound_command")) { if ($flood_protect) { my $sound_flood = Irssi::settings_get_int('sound_flood'); @@ -260,6 +348,8 @@ Irssi::settings_add_str("misc", "quit_sound_command", "play -qnV0 synth pi fade h 0 1 1 pad 0 1 reverb overdrive riaa norm -20 &> /dev/null&"); Irssi::settings_add_str("misc", "pub_sound_command", "play -qnV0 synth 0.09 tri E3:B3 norm -15 &> /dev/null&"); +Irssi::settings_add_str("misc", "priority_sound_command", +"play -q -n synth 2 sine 700:1000 sine 900:1200 fade 0 2 0 remix - norm -12 repeat 3 overdrive reverb speed 4 &> /dev/null&"); Irssi::settings_add_str("misc", "own_act_sound_command", "play -qnV0 synth 0.25 tri G5:E1 tri B5:D1 remix - norm -15 &> /dev/null&"); Irssi::settings_add_str("misc", "own_privmsg_sound_command", @@ -276,6 +366,8 @@ Irssi::settings_add_str("misc", "privmsg_sound_command", "play -qnV0 synth pl G4 pl G4 pl D4 pl D4 pl D4 pl D3 pl G4 pl G3 pl B3 pl B2 pl G3 pl G2 delay 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 remix - phaser fade p 0 0.5 0.3 norm -8 &> /dev/null&"); Irssi::settings_add_str("misc", "hilight_sound_command", "play -qnV0 synth 0.5 tri A3:D3 tri D3:A3 remix - norm -15 &> /dev/null&"); +Irssi::settings_add_str("misc", "priority_messages_file", +"~/.irssi/priority_messages"); #add Signals Irssi::signal_add_last("message public", "pub_msg"); Irssi::signal_add_last("message irc action", "action_msg"); @@ -290,4 +382,5 @@ Irssi::signal_add_last("event join", 'join_msg'); Irssi::signal_add_last("event quit", 'quit_msg'); Irssi::signal_add_last("event part", 'part_msg'); Irssi::signal_add_last("event kick", 'part_msg'); +Irssi::command_bind('sound', 'sound_command'); #- end