]> git.99rst.org Git - irssi-scripts.irssi.org.git/commitdiff
Importing MQTT-notify 1.0 from upstream
authorThomas B. Ruecker <redacted>
Tue, 30 Jun 2015 07:08:00 +0000 (07:08 +0000)
committerThomas B. Ruecker <redacted>
Tue, 30 Jun 2015 07:08:00 +0000 (07:08 +0000)
https://github.com/dm8tbr/irssi-mqtt-notify/commit/4b5144bce98d6e3f8ca97787b392c0fd079489ed

scripts/mqtt-notify.pl [new file with mode: 0644]

diff --git a/scripts/mqtt-notify.pl b/scripts/mqtt-notify.pl
new file mode 100644 (file)
index 0000000..202d964
--- /dev/null
@@ -0,0 +1,208 @@
+#!/usr/bin/env perl -w
+#
+# This is a simple irssi script to send out notifications over the network using
+# mosquitto_pub. Currently, it sends notifications when e.g. your name/nick is
+# highlighted, and when you receive private messages.
+# Based on jabber-notify.pl script by Peter Krenesky, Thomas Ruecker.
+# Based on growl-net.pl script by Alex Mason, Jason Adams.
+#
+# You can find the script on GitHub: https://github.com/dm8tbr/irssi-mqtt-notify/
+# Please report bugs to https://github.com/dm8tbr/irssi-mqtt-notify/issues
+#
+# Copyright (c) 2015, Thomas B. Ruecker
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. 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.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+# contributors may be used to endorse or promote products derived from this
+# software without specific prior written permission.
+#
+# 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 HOLDER 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.
+#
+
+use strict;
+use vars qw($VERSION %IRSSI $AppName $MQTTUser $MQTTPass $MQTTServ $MQTTClient $MQTTTopic $MQTTTLS $MQTTPort $MQTTKeepalive $MQTTRetain $MQTTQoS @args  $j);
+
+use Irssi;
+use utf8;
+use POSIX;
+$VERSION = '1.0';
+%IRSSI = (
+  authors      =>   'Thomas B. Ruecker',
+  contact      =>   'thomas@ruecker.fi, tbr on irc.freenode.net',
+  name         =>   'MQTT-notify',
+  description  =>   'Sends out notifications via MQTT',
+  license      =>   'BSD-3-Clause',
+  url          =>   'http://github.com/dm8tbr/irssi-mqtt-notify/',
+
+);
+
+sub cmd_mqtt_notify {
+  Irssi::print('%G>>%n MQTT-notify can be configured with these settings:');
+  Irssi::print('%G>>%n mqtt_show_privmsg : Notify about private messages.');
+  Irssi::print('%G>>%n mqtt_reveal_privmsg : Include content of private messages in notifications.');
+  Irssi::print('%G>>%n mqtt_show_hilight : Notify when your name is hilighted.');
+  Irssi::print('%G>>%n mqtt_show_notify : Notify when someone on your away list joins or leaves.');
+  Irssi::print('%G>>%n mqtt_show_topic : Notify about topic changes.');
+  Irssi::print('%G>>%n mqtt_notify_user : Set to mqtt account to send from.');
+  Irssi::print('%G>>%n mqtt_notify_topic : Set to mqtt topic to publish message to.');;
+  Irssi::print('%G>>%n mqtt_notify_server : Set to the mqtt server host name.');
+  Irssi::print('%G>>%n mqtt_notify_pass : Set to the sending accounts jabber password.');
+  Irssi::print('%G>>%n mqtt_notify_tls : Set to enable TLS connection to mqtt server. [not implemented]');
+  Irssi::print('%G>>%n mqtt_notify_port : Set to the mqtt server port number.');
+  Irssi::print('%G>>%n mqtt_notify_qos : Set to the desired mqtt QoS level.');
+  Irssi::print('%G>>%n mqtt_notify_retain : Set to turn the retain flag on/off.');
+}
+
+sub cmd_mqtt_notify_test {
+  my $body = "Test:\nmoo!";
+  my @message_args = @args;
+  push(@message_args, "-m", $body);
+  mosquitto_pub(@message_args);
+}
+
+Irssi::settings_add_bool($IRSSI{'name'}, 'mqtt_show_privmsg',     1);
+Irssi::settings_add_bool($IRSSI{'name'}, 'mqtt_reveal_privmsg',   1);
+Irssi::settings_add_bool($IRSSI{'name'}, 'mqtt_show_hilight',     1);
+Irssi::settings_add_bool($IRSSI{'name'}, 'mqtt_show_notify',      1);
+Irssi::settings_add_bool($IRSSI{'name'}, 'mqtt_show_topic',       1);
+Irssi::settings_add_str($IRSSI{'name'},  'mqtt_notify_pass',      'password');
+Irssi::settings_add_str($IRSSI{'name'},  'mqtt_notify_server',    'localhost');
+Irssi::settings_add_str($IRSSI{'name'},  'mqtt_notify_user',      'irssi');
+Irssi::settings_add_str($IRSSI{'name'},  'mqtt_notify_topic',     'test');
+Irssi::settings_add_str($IRSSI{'name'},  'mqtt_notify_client',    'irssi_');
+Irssi::settings_add_bool($IRSSI{'name'}, 'mqtt_notify_tls',       0);
+Irssi::settings_add_int($IRSSI{'name'},  'mqtt_notify_port',      1883);
+Irssi::settings_add_int($IRSSI{'name'},  'mqtt_notify_keepalive', 120);
+Irssi::settings_add_int($IRSSI{'name'},  'mqtt_notify_qos',       0);
+Irssi::settings_add_bool($IRSSI{'name'}, 'mqtt_notify_retain',    0);
+
+$MQTTUser      = Irssi::settings_get_str('mqtt_notify_user');
+$MQTTPass      = Irssi::settings_get_str('mqtt_notify_pass');
+$MQTTServ      = Irssi::settings_get_str('mqtt_notify_server');
+$MQTTTopic     = Irssi::settings_get_str('mqtt_notify_topic');
+$MQTTClient    = Irssi::settings_get_str('mqtt_notify_client');
+$MQTTTLS       = Irssi::settings_get_bool('mqtt_notify_tls');
+$MQTTPort      = Irssi::settings_get_int('mqtt_notify_port');
+$MQTTKeepalive = Irssi::settings_get_int('mqtt_notify_keepalive');
+$MQTTQoS       = Irssi::settings_get_int('mqtt_notify_qos');
+$MQTTRetain    = Irssi::settings_get_bool('mqtt_notify_retain');
+$AppName       = "irssi $MQTTServ";
+
+@args = ("mosquitto_pub", "-h", $MQTTServ, "-p", $MQTTPort, "-q", $MQTTQoS, "-I", $MQTTClient, "-u", $MQTTUser, "-P", $MQTTPass, "-t", $MQTTTopic,);
+if (Irssi::settings_get_bool('mqtt_notify_retain')) {
+  push(@args, "-r");
+}
+
+
+sub sig_message_private ($$$$) {
+  return unless Irssi::settings_get_bool('mqtt_show_privmsg');
+
+  my ($server, $data, $nick, $address) = @_;
+
+  my $body = '(Private message from: '.$nick.')';
+  if ((Irssi::settings_get_bool('mqtt_reveal_privmsg'))) {
+    $body = '(PM: '.$nick.")\n".$data;
+  }
+  utf8::decode($body);
+  $body = Irssi::strip_codes($body);
+  my @message_args = @args;
+  push(@message_args, "-m", $body);
+  mosquitto_pub(@message_args);
+}
+
+sub sig_print_text ($$$) {
+  return unless Irssi::settings_get_bool('mqtt_show_hilight');
+
+  my ($dest, $text, $stripped) = @_;
+
+  if ($dest->{level} & MSGLEVEL_HILIGHT) {
+    my $body = '['.$dest->{target}."]\n".$stripped;
+    utf8::decode($body);
+    $body = Irssi::strip_codes($body);
+    my @message_args = @args;
+    push(@message_args, "-m", $body);
+    mosquitto_pub(@message_args);
+  }
+}
+
+sub sig_notify_joined ($$$$$$) {
+  return unless Irssi::settings_get_bool('mqtt_show_notify');
+
+  my ($server, $nick, $user, $host, $realname, $away) = @_;
+
+  my $body = "<$nick!$user\@$host>\nHas joined $server->{chatnet}";
+  my @message_args = @args;
+  push(@message_args, "-m", $body);
+  mosquitto_pub(@message_args);
+}
+
+sub sig_notify_left ($$$$$$) {
+  return unless Irssi::settings_get_bool('mqtt_show_notify');
+
+  my ($server, $nick, $user, $host, $realname, $away) = @_;
+
+  my $body = "<$nick!$user\@$host>\nHas left $server->{chatnet}";
+  my @message_args = @args;
+  push(@message_args, "-m", $body);
+  mosquitto_pub(@message_args);
+}
+
+sub sig_message_topic {
+  return unless Irssi::settings_get_bool('mqtt_show_topic');
+  my($server, $channel, $topic, $nick, $address) = @_;
+
+  my $body = 'Topic for '.$channel."\n".$topic;
+  utf8::decode($body);
+  $body = Irssi::strip_codes($body);
+  my @message_args = @args;
+  push(@message_args, "-m", $body);
+  mosquitto_pub(@message_args);
+}
+
+sub mosquitto_pub {
+  my @message_args = @_;
+  my $pid = fork();
+  if ($pid) { #This is the irssi main process we forked from
+    Irssi::pidwait_add($pid);
+    return;
+  } elsif (defined $pid) { #This is our fork
+    system(@message_args);
+    POSIX::_exit($?);
+  } else { #Uh, oh, bail!
+    Irssi::print("Couldn't fork for mosquitto_pub!");
+  }
+
+}
+
+Irssi::command_bind('mqtt-notify', 'cmd_mqtt_notify');
+Irssi::command_bind('mqtt-test', 'cmd_mqtt_notify_test');
+
+Irssi::signal_add_last('message private', \&sig_message_private);
+Irssi::signal_add_last('print text', \&sig_print_text);
+Irssi::signal_add_last('notifylist joined', \&sig_notify_joined);
+Irssi::signal_add_last('notifylist left', \&sig_notify_left);
+Irssi::signal_add_last('message topic', \&sig_message_topic);
+
+
+Irssi::print('%G>>%n '.$IRSSI{name}.' '.$VERSION.' loaded (/mqtt-notify for help. /mqtt-test to test.)');
git clone https://git.99rst.org/PROJECT