Instalar notificador para irssi

Spanish Forum

Moderator: JCSenar

Post Reply
carlos_
Level 1
Level 1
Posts: 2
Joined: Tue May 10, 2016 10:26 am

Instalar notificador para irssi

Post by carlos_ » Mon May 16, 2016 1:25 am

En el post anterior expliqué la instalación, configuración y los comandos básicos de irssi, en esta ocasión les voy a indicar los pasos para que nuestro cliente IRC nos notifique. Irssi no tiene por defecto notificador después de su configuración básica, sin embargo se le pueden agregar scripts para ir realizando las tareas que necesitemos debido a que es un programa altamente personalizable pudiendo adaptarse al gusto y necesidad del usuario.

La fuente original es esta: https://github.com/stickster/irssi-libnotify. Lo voy a explicar en español lo mas sencillo posible.

El procedimiento puede parecer complejo, no lo es una vez que empiezan. Si tienen alguna duda o comentario por comentarios los pueden plantear.

Van a necesitar:

* irssi
* libnotify >= 0.7 o superior
* pygobject >= 3.0
* perl-HTML-Parser
(descargarlos via sudo apt-get install o a través del gestor de software)

Paso 1

Vamos a crear la carpeta bin en home (por terminal mkdir bin) queda asi

Code: Select all

mkdir bin
Tecla enter, después

Code: Select all

cd bin
Paso 2

Dentro de bin vamos a crear 2 archivos: irssi-notifier.sh y notify-listener.py
Una vez creados vamos a añadirle las instrucciones (copiar de aqui y pegar dentro del documento vacío):

irssi-notifier.sh

Code: Select all

#!/bin/bash
NLPID=`pgrep -u $UID notify-listener`
if [ ! -z "$NLPID" ]; then
    DSBA=`cat /proc/$NLPID/environ | tr '\0' '\n' | grep DBUS_SESSION_BUS_ADDRESS | cut -d '=' -f2-`
    DBUS_SESSION_BUS_ADDRESS=$DSBA exec "$@"
fi
notify-listener.py

Code: Select all

#!/usr/bin/python
#
# Copyright (C) 2012 Paul W. Frields <stickster@gmail.com>
#
# 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, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY 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/>.


import os, sys
try:
    from gi.repository import Notify, GObject
except:
    print >> sys.stderr, 'Could not locate pygobject'
    sys.exit(-1)
import dbus
import dbus.mainloop.glib
from subprocess import call

player = None
for path in os.environ['PATH'].split(os.pathsep):
    if os.path.isfile(os.path.join(path, 'canberra-gtk-play')):
        player = os.path.join(path, 'canberra-gtk-play')
        break

class IrssiListener:
    def __init__(self):
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
        self.bus = dbus.SessionBus()
        self.bus.add_signal_receiver(self.notify,
                                     signal_name='IrssiNotify',
                                     dbus_interface='org.irssi.Irssi',
                                     path='/org/irssi/Irssi')
        Notify.init('irssi')

    def notify(self, subject, message):
        print subject, message
        n = Notify.Notification.new(subject.encode('utf-8'),
                                    message.encode('utf-8'),
                                    'dialog-information')
        # Concatenate messages for certain distros
        n.set_hint_string('x-canonical-append', 'true')
        n.show()

        # It would be more kosher to do this with GStreamer, but in
        # the interest of time:
        if player is not None:
            retcode = call([player, '-i', 'message-new-instant'])
            if retcode < 0:
                print "ERROR: Player returned code %d" % (retcode)

    def __del__(self):
        Notify.uninit()

if __name__ == '__main__':
    l = IrssiListener()
    loop = GObject.MainLoop()
    loop.run()
Cuando hayan pegado el script a los dos archivos, deben darle los permisos de ejecución para q los puedan usar: chmod +x irssi-notifier.sh y chmod +x notify-listener.py

Creamos un acceso directo a home de notify-listener.py

Paso 3

En home dentro de la terminal (control alt t o por menu) escribimos

Code: Select all

cd .irssi
tecla enter

Añadimos dos directorios dentro de .irssi

Code: Select all

mkdir scripts
tecla enter

escribimos

Code: Select all

cd scripts
y estamos dentro de scripts

Code: Select all

/.irssi/scripts
creamos otra carpeta autorun

Code: Select all

mkdir autorun
Si escribimos cd autorun tecla enter vemos esto:

Code: Select all

.irssi/scripts/autorun
Paso 4

Crear un script dentro de la carpeta scripts (este es el último script del notificador para irssi). Si estas en autorun escribe cd .. y quedas en scripts. Crea un archivo nuevo por ejemplo notificador.pl

Dentro de notificador.pl vas a pegar el siguiente script:

Code: Select all

##
## Put me in ~/.irssi/scripts, and then execute the following in irssi:
##
##       /load perl
##       /script load notify
##

use strict;
use Irssi;
use vars qw($VERSION %IRSSI);
use HTML::Entities;

$VERSION = "0.5";
%IRSSI = (
    authors     => 'Luke Macken, Paul W. Frields',
    contact     => 'lewk@csh.rit.edu, stickster@gmail.com',
    name        => 'notify.pl',
    description => 'Use D-Bus to alert user to hilighted messages',
    license     => 'GNU General Public License',
    url         => 'http://code.google.com/p/irssi-libnotify',
);

Irssi::settings_add_str('notify', 'notify_remote', '');
Irssi::settings_add_str('notify', 'notify_debug', '');

sub sanitize {
  my ($text) = @_;
  encode_entities($text,'\'<>&');
  my $apos = "'";
  my $aposenc = "\&apos;";
  $text =~ s/$apos/$aposenc/g;
  $text =~ s/"/\\"/g;
  $text =~ s/\$/\\\$/g;
  $text =~ s/`/\\"/g;
  return $text;
}

sub notify_linux {
    my ($server, $nodebugstr, $remote, $summary, $message) = @_;
    my $cmd = "EXEC " . $nodebugstr . "ssh -q " . $remote . " \"".
	" ~/bin/irssi-notifier.sh".
	" dbus-send --session /org/irssi/Irssi org.irssi.Irssi.IrssiNotify" .
	" string:'" . $summary . "'" .
	" string:'" . $message . "'\"";
    #print $cmd;
    $server->command($cmd);
}

sub notify_mac {
    my ($server, $nodebugstr, $remote, $summary, $message) = @_;
    $message =~ s/\\"/\\\\\\"/g;
    my $cmd = "EXEC " . $nodebugstr . "ssh -q " . $remote . " \"".
	" osascript -e".
	" 'display notification \\\"". $message . "\\\"" .
	" with title \\\"" . $summary . "\\\"" .
	" sound name \\\"Basso\\\"'\"";
    $server->command($cmd);
}
    
sub notify {
    my ($server, $summary, $message) = @_;

    # Make the message entity-safe
    $summary = sanitize($summary);
    $message = sanitize($message);

    my $debug = Irssi::settings_get_str('notify_debug');
    my $nodebugstr = '- ';
    if ($debug ne '') {
	$nodebugstr = '';
    }
    my $cmd = "EXEC " . $nodebugstr .
	" ~/bin/irssi-notifier.sh " .
	"dbus-send --session /org/irssi/Irssi org.irssi.Irssi.IrssiNotify" .
	" string:'" . $summary . "'" .
	" string:'" . $message . "'";
    $server->command($cmd);

    my $remote = Irssi::settings_get_str('notify_remote');
    if ($remote ne '') {
	if (substr($remote, length($remote)-1) ne 'M') {
	    notify_linux($server, $nodebugstr, $remote, $summary, $message);
	}
	else {
	    $remote = substr($remote, 0, length($remote)-1);
	    notify_mac($server, $nodebugstr, $remote, $summary, $message);
	}
    }

}

sub print_text_notify {
    my ($dest, $text, $stripped) = @_;
    my $server = $dest->{server};

    return if (!$server || !($dest->{level} & MSGLEVEL_HILIGHT));
    my $sender = $stripped;
    $sender =~ s/^\<.([^\>]+)\>.+/\1/ ;
    $stripped =~ s/^\<.[^\>]+\>.// ;
    my $summary = $dest->{target} . ": " . $sender;
    notify($server, $summary, $stripped);
}

sub message_private_notify {
    my ($server, $msg, $nick, $address) = @_;

    return if (!$server);
    notify($server, "PM from ".$nick, $msg);
}

sub dcc_request_notify {
    my ($dcc, $sendaddr) = @_;
    my $server = $dcc->{server};

    return if (!$dcc);
    notify($server, "DCC ".$dcc->{type}." request", $dcc->{nick});
}

Irssi::signal_add('print text', 'print_text_notify');
Irssi::signal_add('message private', 'message_private_notify');
Irssi::signal_add('dcc request', 'dcc_request_notify');
Después de pegar el script guardan el documento y lo cierran
Escriben lo siguiente (estando en .irssi/scripts) para crear un acceso directo en el directorio autorun:

Code: Select all

ln -s ../notificador.pl $HOME/.irssi/scripts/autorun/
Estamos casi listos

Paso 5

Debemos ejecutar notify-listener.py para que nos avise.

Creamos otro documento vacío dentro de home: nombre_que_quieran.pl

Pegan dentro de ese documento este script (lo q hace es abrir una terminal con dos pestañas, una con irssi y otra pestaña con notify-listener.py):

Code: Select all

#!/bin/bash

gnome-terminal --tab -e irssi --title=Irssi --tab -e notify-listener.py
Reemplazando gnome-terminal por el terminal que tengan instalado o instalan el terminal de gnome, como les sea más fácil.

Resultado final

Ejecutan el script y se abren irssi y el "que escucha" al mismo tiempo en dos pestañas separadas. Una vez abierto irssi, escriben:

Code: Select all

/hilight su_nick
después

Code: Select all

/save
/save mantiene las palabras a resaltar, si no lo escriben los cambios son temporales.

Pueden agregar mas palabras si asi lo desean. Cuando en los canales a los q se hayan unido se mencione su nick aparece un rectangulo indicando: canal donde mencionan el nick, quien nombra el nick y el texto que escribió el otro usuario. El rectangulo desaparece a los pocos segundos.

Además en la otra pestaña queda registrado lo que se dijo, es un registro temporal que pueden consultar en cualquier momento.

Disfruten de su irssi mejorado :D

Hasta otra oportunidad, no olviden comentar.

Carlos Manuel

User avatar
JOPETA
Level 14
Level 14
Posts: 5047
Joined: Thu Nov 20, 2014 6:10 am
Location: En un lugar de cuyo nombre no quiero acordarme

Re: Instalar notificador para irssi

Post by JOPETA » Wed May 18, 2016 12:25 pm

Gracias por compartir Carlos. :wink:
Ni cola de león ni cabeza de ratón, prefiero ser diente de ajo.( J. Krahe)

Post Reply

Return to “Español (Spanish)”