#autospeak, autospeak incoming events through speech-dispatcher # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; version 3 of the License. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABI- # LITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public # License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . use strict; use warnings; use Encode; use Irssi; # The character encoding of the Irssi client: use constant ENCODING => "UTF-8"; # General script information: our $VERSION = '1.0'; our %IRSSI = ( name => 'autospeak', description => 'Autospeak incoming messages.', authors => 'Jeremiah Ticket', contact => 'seashellpromises@gmail.com', url => 'https://git.stormux.org/jticket/autospeak', license => 'GNU General Public License, version 3', changed => '2023/10/05', ); # Speak Some Text sub speak_message { my ($summary, $body) = @_; # Convert the strings to Perl's internal representation: $summary = decode(ENCODING, $summary); $body = decode(ENCODING, $body); my $SpeechRate = Irssi::settings_get_int("speech_rate"); my $SpeechVoice = Irssi::settings_get_str("speech_voice"); # Speak The Message system("espeak-ng -v $SpeechVoice -s $SpeechRate \"$summary $body\""); } # Handle incoming public messages: sub message_public { my ($server, $message, $nick, $address, $target) = @_; # Check whether to notify the user about public messages: return unless (Irssi::settings_get_bool('speak_public_messages')); # Check whether to notify the user about messages in the active window: unless (Irssi::settings_get_bool('speak_active_window')) { # Get the name of the active window: my $window = Irssi::active_win()->{active}->{name} || ''; # Ignore messages in the active window: return if ($window eq $target); } # Get the user's nick name: my $user = $server->{nick}; # Check whether to notify the user about indirect messages: unless (Irssi::settings_get_bool('speak_indirect_messages')) { # Ignore messages that are not explicitly addressed to the user: return if ($message !~ /^$user[\s:,]/); } else { # Ignore messages that do not mention the user: return if ($message !~ /\b$user\b/); } # Get the server's tag: my $tag = $server->{tag}; # Prepare the message body: (my $body = $message) =~ s/^$user[\s:,]\s*//; # Notify the user about the incoming public message: speak_message("Message from $nick/$tag on $target:", $body); } # Handle incoming private messages: sub message_private { my ($server, $message, $nick, $address) = @_; # Check whether to notify the user about private messages: return unless (Irssi::settings_get_bool('speak_private_messages')); # Check whether to notify the user about messages in the active window: unless (Irssi::settings_get_bool('speak_active_window')) { # Get the name of the active window: my $window = Irssi::active_win()->{active}->{name} || ''; # Ignore messages in the active window: return if ($window eq $nick); } # Get the server's tag: my $tag = $server->{tag}; # Notify the user about the incoming private message: speak_message("Message from $nick/$tag:", $message); } # Handle incoming DCC requests: sub dcc_request { my ($dcc, $sendaddr) = @_; # Check whether to notify the user about DCC requests: return unless (Irssi::settings_get_bool('speak_dcc_messages')); # Check whether to notify the user about messages in the active window: unless (Irssi::settings_get_bool('speak_active_window')) { # Get the name of the active window: my $window = Irssi::active_win()->{active}->{name} || ''; # Ignore messages in the active window: return unless ($window); } # Get the request type: my $type = $dcc->{type}; # Get the sender's nick: my $nick = $dcc->{nick}; # Get the server's tag: my $tag = $dcc->{server}->{tag}; # Check the request type: if ($type eq 'GET') { # Get the file name and size: my $name = $dcc->{arg}; my $size = $dcc->{size}; # Notify the user about the incoming SEND request: speak_message("$nick/$tag offers a file:", "$name ($size B)"); } elsif ($type eq 'CHAT') { # Notify the user about the incoming CHAT request: speak_message("$nick/$tag offers a DCC chat.", ""); } } # Handle incoming DCC CHAT messages: sub dcc_chat_message { my ($dcc, $message) = @_; # Check whether to notify the user about DCC requests: return unless (Irssi::settings_get_bool('speak_dcc_messages')); # Get the sender's nick: my $nick = $dcc->{id}; # Check whether to notify the user about messages in the active window: unless (Irssi::settings_get_bool('speak_active_window')) { # Get the name of the active window: my $window = Irssi::active_win()->{active}->{name} || ''; # Ignore messages in the active window: return if ($window eq "=$nick"); } # Get the server's tag: my $tag = $dcc->{server}->{tag}; # Notify the user about the incoming CHAT message: speak_message("DCC chat message from $nick/$tag:", $message); } # Register configuration options: Irssi::settings_add_int("autospeak", "speech_rate", 175); Irssi::settings_add_str("autospeak", "speech_voice", "en-us"); Irssi::settings_add_bool('autospeak', 'speak_private_messages', 1); Irssi::settings_add_bool('autospeak', 'speak_public_messages', 1); Irssi::settings_add_bool('autospeak', 'speak_indirect_messages',0); Irssi::settings_add_bool('autospeak', 'speak_active_window', 0); Irssi::settings_add_bool('autospeak', 'speak_dcc_messages', 1); # Register signals: Irssi::signal_add('message public', 'message_public'); Irssi::signal_add('message private', 'message_private'); Irssi::signal_add('dcc request', 'dcc_request'); Irssi::signal_add('dcc chat message', 'dcc_chat_message');