summaryrefslogtreecommitdiffstats
path: root/scripts/signal_hilight.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/signal_hilight.pl')
-rw-r--r--scripts/signal_hilight.pl140
1 files changed, 140 insertions, 0 deletions
diff --git a/scripts/signal_hilight.pl b/scripts/signal_hilight.pl
new file mode 100644
index 0000000..30b7efc
--- /dev/null
+++ b/scripts/signal_hilight.pl
@@ -0,0 +1,140 @@
+# signal_hilight.pl - (c) 2017 John Morrissey <jwm@horde.net>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# About
+# =====
+#
+# When you're away, sends highlighted messages to you via Signal.
+#
+#
+# To use
+# ======
+#
+# 1. Install signal-cli (https://github.com/AsamK/signal-cli).
+#
+# 2. Register a new Signal account for this device, or link to an existing
+# one.
+#
+# It's better to create a dedicated Signal account to have this script
+# send messages from. This requires a dedicated phone number to receive
+# the verification code text message for the new Signal account. Google
+# Voice numbers are useful here.
+#
+# Linking gives the host running irssi the same access to the account
+# (such as reading messages, changing account settings, and more) as the
+# Signal app has on your phone or computer.
+#
+# - Register a new account:
+# - signal-cli -u +12128675309 register
+# - Retrieve verification
+# - signal-cli -u +12128675309 verify VERIFICATION-CODE-FROM-SMS
+#
+# - Link to an existing account:
+# - signal-cli link -n $(hostname)
+# - qrencode -o device-link-qrcode.png 'tsdevice:/?uuid=...'
+# - View device-link-qrcode.png.
+# - Scan the QR code with the Signal app
+# (Settings -> Linked Devices -> Link New Device).
+#
+# 3. Load the script and configure:
+# - /script load signal_hilight.pl
+# - /set signal_phonenumber_from +12128675309
+# - /set signal_phonenumber_to +12128675309
+
+use strict;
+use warnings;
+
+use POSIX;
+
+use Irssi;
+
+our $VERSION = '1.0';
+our %IRSSI = (
+ author => 'John Morrissey',
+ contact => 'jwm@horde.net',
+ name => 'signal_hilight',
+ description => 'Send highlighted messages via Signal',
+ licence => 'BSD',
+);
+
+my $IS_AWAY = 0;
+
+sub send_notification {
+ my ($message) = @_;
+
+ my $pid = fork();
+ if ($pid > 0) {
+ Irssi::pidwait_add($pid);
+ } else {
+ eval {
+ my $from = Irssi::settings_get_str('signal_phonenumber_from');
+ my $to = Irssi::settings_get_str('signal_phonenumber_to');
+
+ if ($from && $to &&
+ open(SIGNAL_CLI, '|-', "signal-cli -u $from send $to")) {
+
+ print SIGNAL_CLI "$message";
+ close(SIGNAL_CLI);
+ }
+ };
+ POSIX::_exit(0);
+ }
+}
+
+sub sig_print_text {
+ my ($dest, $text, $stripped) = @_;
+
+ if ($IS_AWAY &&
+ ($dest->{level} & MSGLEVEL_PUBLIC) &&
+ ($dest->{level} & (MSGLEVEL_HILIGHT|MSGLEVEL_MSGS)) &&
+ ($dest->{level} & MSGLEVEL_NOHILIGHT) == 0) {
+
+ send_notification($dest->{target} . ": $stripped");
+ }
+}
+
+sub sig_message_public {
+ my ($server, $msg, $nick, $address, $target) = @_;
+
+ if ($server->{usermode_away}) {
+ $IS_AWAY = 1;
+ } else {
+ $IS_AWAY = 0;
+ }
+}
+
+sub sig_message_private {
+ my ($server, $msg, $nick, $address, $target) = @_;
+
+ if ($server->{usermode_away}) {
+ send_notification("$nick: $msg");
+ }
+}
+
+Irssi::signal_add('print text', \&sig_print_text);
+Irssi::signal_add_last('message public', \&sig_message_public);
+Irssi::signal_add_last('message private', \&sig_message_private);
+
+Irssi::settings_add_str('misc', 'signal_phonenumber_from', '');
+Irssi::settings_add_str('misc', 'signal_phonenumber_to', '');