Скрипт событий для mcabber

Для меня при первом знакомстве с mcabber главная трудность заключалась в том что бы как-то заставить его уведомлять о пришедших сообщениях, спустя какое-то время это было сделано.

Причем несмотря на файлы примеров в исходниках это было достаточно трудно, но вся трудность заключалась в большей степени нежеланием что-то делать самому а хотелось готового решения удовлетворяющего какому-то минимуму, но в чужих скриптах всегда лень разбираться из-за отсутсвия комментариев.



Теперь же mcabber стал более популярен чем тогда и примеров файла событий уже достаточно много, вот ещё один в котором я заодно постарался в процессе рассказать о принципе его работы и вообще о принципе событий (за исключением хуков post-connect и pre-disconnect которые в дефолтном конфиге описаны, к тому же довольно просты), к тому же этот файл можно будет использовать как базу для дальнейшего подгона уведомлений под себя.






#!/bin/sh
#
# скрипт событий указанный в параметре set events_command
# (set указываю на всякий случай, просто по конфигу искать проще)
# всегда получает 4 или менее параметров вида приблизительно такого:
#
# MSG OUT имя_или_jid
# MSG IN имя_или_jid имя_файла
# UNREAD 1
# MSG MUC конференция имя_файла
# STATUS A имя_или_jid
# UNREAD 0
#
# причем имя файла будет только в том случае если установлена переменная
# set event_log_files в значение 1 и в set event_log_dir указана директория
#
# вообще этот файл может быть любой программой а не только bash-скриптом
# в примерах из исходников был и python

# Соответсвенно от получаемых параметров и пляшем
EV=$1 # главное событие
EVENT=$2 # не знаю, как обозвать - подсобытие, уточнение события
NICK=$3 # ник или jid

# считываем файл если он существует
if [[ $4 != "" ]];then
TEXT=$(cat $4)
# ну и удаляем файл, ибо он нам больше не нужен
rm -f $4
else
TEXT=""
fi


# проверяем главное событие
case "$EV" in

# если событие сообщение то
"MSG")
# уточняем второе событие
case "$EVENT" in
# если событие входящее сообщение то
"IN")
# шлём какое-нибудь уведомление, к примеру notify-send
echo $(notify-send -i /usr/share/gajim/data/iconsets/dcraven/16x16/event.png "$NICK" "$TEXT")
# ну и можно музычку заодно проиграть
aplay ~/.mcabber/sound/incoming.wav &
;;
# если сообщение это сообщение в конференции
"MUC")
# то тоже делаем что-нить, к примеру в данном случае я ищу вхождение своего ника
# и если он есть то вывожу уведомление и играю звук, если его нет то просто звук
FOUND=`echo $TEXT| grep muhas`
if [ -n "$FOUND" ]; then
echo $(notify-send -i /usr/share/gajim/data/iconsets/dcraven/16x16/event.png "$NICK" "те в конфе пишут")
fi
aplay ~/.mcabber/sound/incoming.wav &
;;
"OUT")
# если сообщение исходящее то тоже что-нить делаем, для примера играем звук
aplay /.mcabber/sound/outcoming.wav
;;
esac
;;
# если главное сбытие это смена статуса то
"STATUS")
# уточняем на какой статус меняется
case "$EVENT" in
# и задаем иконку и текст для этого статуса (если надо, конечно)
"O") icon=online.png; s=online;;
"F") icon=chat.png; s="free for chat";;
"A") icon=away.png; s=away;;
"N") icon=xa.png; s=n/a;;
"D") icon=dnd.png; s=DND;;
"_") icon=offline.png; s=offline;;
*) icon=online.png; s=$EVENT;;
esac
# ну и выводим уведомление с соответсвующей иконкой и текстом
echo $(notify-send -t 1000 -i /usr/share/gajim/data/iconsets/dcraven/16x16/$icon "$NICK is $s")
;;
# если главное событие это налиние непрочитанных, учьтите что это количество непросмотренных контактов
# а не количество сообщений
"UNREAD")
# пишем в файл количество
echo $EVENT > ~/.mcabber/unread
# так же тоже самое количество можно получать обработкой файла
# указанного в в конфиге (set statefile), но там список jid'ов написавших
# так что количество будет равным cat file | wc -l
# причем когда число непрочитанных равно нулю, то statfile несуществует
;;
esac

# вот собственно и все
# пытался сделать этот файл более менее полным и понятным, с моей точки зрения вроде как получилось




Кроспост моей же записи c WeLinux
Заметки аскетичного гика    10-12-2009, 11:10

Имя:  http:// mail: проверочный код