#!/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; } $body = Irssi::strip_codes($body); utf8::decode($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; $body = Irssi::strip_codes($body); utf8::decode($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; $body = Irssi::strip_codes($body); utf8::decode($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) { # Irssi::pidwait_add($pid); # return; # } elsif (defined $pid) { # system(@message_args); # POSIX::_exit($?); # } else { # Irssi::print("Couldn't fork for mosquitto_pub!"); # } # } sub mosquitto_pub { my @message_args = @_; system(@message_args); } 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.)');