193 lines
6.1 KiB
Perl
193 lines
6.1 KiB
Perl
|
#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 <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
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');
|