From 12e2cf3187d2a6ec4fbc7e221f4cfd25ab2d0283 Mon Sep 17 00:00:00 2001 From: Jeremiah Ticket Date: Thu, 5 Oct 2023 11:19:26 -0600 Subject: [PATCH] First commit, irssi-autospeak is here! --- README.md | 38 ++++++++++ autospeak.pl | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++ install | 7 ++ 3 files changed, 237 insertions(+) create mode 100644 README.md create mode 100644 autospeak.pl create mode 100755 install diff --git a/README.md b/README.md new file mode 100644 index 0000000..ef8c044 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Irssi Autospeak + Written ByJeremiah Ticket and contributers! + +Adds speech to some events. + +This script requires you have espeak-ng installed and in your path. + +## Usage +Place autospeak.pl in .irssi/scripts/ +Then in irssi do: +/script load autospeak +If you want to autorun the script, place the script in or simlink to ~/.irssi/scripts/autorun/ + +## Automated Install +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. + +## Configuration +This script has some settings. Use the /set command to set them. +- speech_voice - espeak-ng voice to use (default is en-us) +- speech_rate - speech rate in words per minute (default is 175) +- speak_public_messages - Speak public messages; This does not speak all messages. This only speaks when you are directly spoken to. (Default is on) +- speak_indirect_messages - Speaks indirect messages in public channels, reguardless of where your nick sits in the message; If this if off, public messages will only pseak if directly addressed to you. (Default is off) +- speak_private_messages - Speaks incoming private messages. (Default is on) +- speak_active_window - Speaks the currently focused window (Default is off) +- speak_dcc_messages - Speaks DCC messages; Notifys if a file transfer or dcc chat request. + +### Explanation of Public Message Speaking +This script is designed not to be very spammy. Public messages only speak when you are directly addressed, unless you have the speak_indirect_message setting on, then it speaks also when you are mensioned. + +#### Examples +When only speak_public_messages is on, +" jticket: Hi there!" Will be spoken. +" Hi there jticket!" will not automatically be spoken. +When speak_public_messages and speak_indirect_messages is on, both will be spoken. \ No newline at end of file diff --git a/autospeak.pl b/autospeak.pl new file mode 100644 index 0000000..83d8d0f --- /dev/null +++ b/autospeak.pl @@ -0,0 +1,192 @@ +#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'); diff --git a/install b/install new file mode 100755 index 0000000..84a1684 --- /dev/null +++ b/install @@ -0,0 +1,7 @@ +#!/bin/bash +#Basic Install Script +read -p "This will install to~/.irssi/scripts and create a simlink to autostart the script. Press enter to continue or control+c to exit." continue +mkdir -p ~/.irssi/scripts/autorun/ +cp -v autospeak.pl ~/.irssi/scripts/ +[ -L $HOME/.irssi/scripts/autorun/autospeak.pl ] || ln -s $HOME/.irssi/scripts/autospeak.pl $HOME/.irssi/scripts/autorun/autospeak.pl +echo "Done!"