En la entrada anterior sobre Hipatisa, el notificador que expliqué era muy minimalista. No quise desarrollarlo más porque la entrada ya era larga de por si.
En esta entrada voy a poner un código bastante más complejo que hace que el notificador sea más útil. Estas son las mejoras que trae:
1- Usa una memoria de mensajes. De esa forma si ordenamos varias notificaciones seguidas, el notificador dejará que cada una se tome su tiempo sin interrumpir la ejecución del programa que notifica.
2- Tiene unos valores de duración y avatar por defecto. Ahora se puede escribir simplemente:
expresa "MENSAJE" ; y especificar la duración y el avatar solo cuando nos haga falta.3- Se puede escribir desde otro programa directamente en la cola de mensajes, y lanzar "expresa" sin argumentos para que los lea. Esto es especialmente útil por seguridad, si no queremos que se puedan ejecutar órdenes en bash al lanzar el notificador.
4- Incluye una notificación sonora al principio de la notificación. Para que se oiga debemos tener instalado "mplayer", y colocar un archivo de sonido en
$HOME/$MyBot/avatar/sonidos/hablando.wavEste es el código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sys import argv
from subprocess import Popen
from commands import getoutput
from time import sleep
from glob import glob
import os
MyBot=getoutput('echo $MyBot')
Home=getoutput('echo $HOME')
output=getoutput('mkdir $HOME/$MyBot/psique/flags')
flags=Home+"/"+MyBot+"/psique/flags/"
# DECIDE SI ESTA INSTANCIA HABLA O NO
if os.path.isfile(flags+"hablando"):
a="nohabla"
else:
output=getoutput('touch $HOME/$MyBot/psique/flags/hablando')
a="hablador"
# TEXTO INTRODUCIDO
texto=""
dur="6"
mascota="normal.mcpx"
print len(argv)
if len(argv)>1:
texto=argv[1]
if len(argv)>2:
dur=argv[2]
if len(argv)>3:
mascota=argv[3]+".mcpx"
fecha=getoutput('date +%s')
# EL TEXTO SE GUARDA EN LA COLA PARA HABLAR
if len(argv)>1:
f=open(flags+fecha+".txt","w")
f.write(texto)
f.close()
f=open(flags+fecha+".dur","w")
f.write(dur)
f.close()
f=open(flags+fecha+".exp","w")
f.write(mascota)
f.close()
# SI ESTA INSTANCIA HABLA...
if a=="hablador":
if os.path.isfile(Home+"/"+MyBot+"/avatar/sonidos/hablando.wav"):
Popen(['mplayer',Home+"/"+MyBot+"/avatar/sonidos/hablando.wav"])
finalizado=0
proceso=""
mascota=""
mascot2=""
while finalizado==0:
ficheros = glob(flags+"*.txt")
ficheros.sort()
if len(ficheros)>0:
for archivo in ficheros:
archivotxt=archivo
archivodur=archivo[:len(archivo)-4]+".dur"
archivoexp=archivo[:len(archivo)-4]+".exp"
f=open(archivotxt,"r")
texto=f.read()
texto=texto.replace("`","")
f.close()
os.remove(archivotxt)
f=open(archivodur,"r")
dur=f.read()
f.close()
os.remove(archivodur)
f=open(archivoexp,"r")
mascota=f.read()
f.close()
os.remove(archivoexp)
if mascota<>mascot2:
output=getoutput('kill '+proceso)
Popen(['macopix',mascota])
sleep(1)
output=getoutput('qnotify -m "'+texto+'" --center -z gold -n black --no-shadow --no-alignment -o 20 -s '+str(dur))
procmacopix=getoutput('ps -C macopix')
procmacopix=procmacopix.replace(" PID TTY TIME CMD","")
print procmacopix
proceso=procmacopix[1:6]
print proceso
mascot2=mascota
else:
finalizado=1
os.remove(flags+"hablando")
output=getoutput('killall macopix')





1 ⚓:
Funcionando :D
He cambiado un poco los tiempos.
Justo antes de q aparezca la notificación he puesto un sleep de 0.1 seg de modo que la aparición de la mascota y la notificación es prácticamente instantánea.
Y al final del todo, para que los dos desaparezcan a la vez tuve que poner 10s. Es mucho, pero al menos ahora son simultáneos :D
A ver la siguiente entrada...
Publicar un comentario en la entrada