#!/usr/bin/python # -*- coding: utf-8 -*- # ------------------------------------- # Event controller for mcabber on N900! # (c) Disabler Production Lab. # ------------------------------------- import sys,os,re,time # ----------------------- Settings ---------------------- # Заголовок, который будет показываться перед каждым сообщением mtitle = 'mcabber: ' # Заголовок, который будет показываться перед каждым статусом ptitle = 'mcabber: ' # Размер сообщения, свыше которого будет обрезаться size_limit = 1024 # Список слов, сообщения с которыми надо показывать. Например можно вписать ваш ник. highlight = ['diSabler',u'Disаbler',u'Disablеr',u'дисаблер',u'дизаблер'] # Список слов, сообщения с которыми не надо показывать. Желательно вписать ваш ник, что-бы сообщения от вас вам же не показывались self_nick = ['diSabler','diSabler.mc'] # Путь к настройкам. Желательно не менять. set_path = '/home/user/.mcabber/%s' # Путь, по которому будет хранится количество пропущенных событий. Нужен для показа в desktop execution widget. # для показа в него надо прописать команду cat /home/user/.mcabber/unread_messages unreads = set_path % 'unread_messages' # Путь, по которому будет хранится последний статус и сообщение. Нужно для показа в desktop execution widget. # для показа в него надо прописать команду cat /home/user/.mcabber/last_message # либо cat /home/user/.mcabber/last_status last_message = set_path % 'last_message' last_status = set_path % 'last_status' # Чёрный список jid'ов, смена статусов которых не должна показываться. status_black = ['disabler_@twitter.tweet.im','rss@isida-bot.com', 'en-ru@isida-bot.com','ru-en@isida-bot.com', 'de-ru@isida-bot.com','ru-de@isida-bot.com', 'isida@isida-bot.com'] # Белый список jid'ов. Смена статусов будет показана только для них. status_white = ['dissy@jabber.ru', 'dissy@isida-bot.com'] # Выбор активного списка показа статусов 'white' или 'black' status_type = 'white' # Информировать о переходе jid'а в офлайн - False или True show_offline = False # Включение отладочных логов событий - False или True logs = False events = set_path % 'events.log' # Проигрывать звуки при сообщениях и смене статусов play_sound = True # Вибра при сообщениях и смене статусов use_vibra = True # Мигать светодиодом при пропущенном событии flash_led = True # Снимать с блокировки при входящем сообщении wakeup_on_presence = True # Снимать с блокировки при смене статуса wakeup_on_message = True # Снимать с блокировки только если n900 не находится в кармане и не лежит экраном вниз wakeup_on_air = True # Настройки звуков play = {'MUC':'chat_their_message', # сообщение из конференции #'2':'connected', #'3':'groupchat_server_message', #'1':'groupchat_their_message', 'IN':'groupchat_their_message_to_me', # сообщение в ростер 'AV':'presence_available', # подключение jid'а 'UNAV':'presence_unavailable'} # отключение jid'а # ----------------------- The end of settings ---------------------- tmp_file = set_path % 'temporary.tmp' def message(text): if wakeup_on_message and air_status(): os.system(unlock_script) os.system(message_script % text) writefile(last_message,'%s\n' % text) def presence(text): if air_status() and (not lock_status() or wakeup_on_presence): os.system(unlock_script) os.system(presence_script % text) writefile(last_status,'%s\n' % text) def readfile(filename): fp = file(filename) data = fp.read() fp.close() return data def appendfile(filename, data): fp = file(filename, 'a') fp.write(data) fp.close() def writefile(filename, data): fp = file(filename, 'w') fp.write(data) fp.close() def player(sound): if play_sound: os.system(sound_cmd % play[sound]) if use_vibra: os.system(vibra_script) def lock_status(): try: os.system('rm -rf %s' % tmp_file) except: pass os.system(get_status_script) try: st = readfile(tmp_file).split('"')[1] except: st = 'locked' return st == 'locked' def air_status(): if not wakeup_on_air: return False try: os.system('rm -rf %s' % tmp_file) except: pass os.system(air_status_script) try: st = readfile(tmp_file).split()[0] except: st = 'closed' return st == 'open' presence_script = 'run-standalone.sh dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"'+ptitle+'%s"' message_script = 'run-standalone.sh dbus-send --print-reply --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteDialog string:"'+mtitle+'%s" uint32:0 string:'' 2> /dev/null 1> /dev/null' vibra_script = 'dbus-send --print-reply --system --dest=com.nokia.mce /com/nokia/mce/request com.nokia.mce.request.req_vibrator_pattern_activate string:"PatternChatAndEmail" &' led_flash_on = 'dbus-send --system --type=method_call --dest=com.nokia.mce /com/nokia/mce/request com.nokia.mce.request.req_led_pattern_activate string:PatternCommunicationIM' led_flash_off = 'dbus-send --system --type=method_call --dest=com.nokia.mce /com/nokia/mce/request com.nokia.mce.request.req_led_pattern_deactivate string:PatternCommunicationIM' get_status_script = 'dbus-send --system --print-reply --type=method_call --dest=com.nokia.mce /com/nokia/mce/request com.nokia.mce.request.get_tklock_mode | grep string | awk \'{print $2}\' >> %s' % tmp_file unlock_script = 'dbus-send --system --type=method_call --dest=com.nokia.mce /com/nokia/mce/request com.nokia.mce.request.req_tklock_mode_change string:"unlocked"' lock_script = 'dbus-send --system --type=method_call --dest=com.nokia.mce /com/nokia/mce/request com.nokia.mce.request.req_tklock_mode_change string:"locked"' air_status_script = 'cat /sys/devices/platform/gpio-switch/proximity/state >> %s' % tmp_file sound_path = set_path % 'sounds/%s.wav' sound_cmd = 'play-sound %s &' % sound_path if logs: appendfile(events,'|'.join(sys.argv)+'\n') type,subtype,j2j = sys.argv[1],sys.argv[2],0 if type == 'MSG': jid,fname = sys.argv[3],sys.argv[4] if jid.count('%') and (jid.count('@j2j.') or jid.count('@j3j.') or jid.count('@xmpp.')): jid,j2j = jid.split('@',1)[0].replace('%','@'),1 if subtype in ['IN','MUC']: try: text = readfile(fname) except: sys.exit() hl = None if subtype == 'MUC': if text[:2] == '~ ' or text[:5] == 'PRIV#': hl = True else: snick = re.findall(r'^<(.*?)> ',text,re.I+re.S+re.U) if snick[0] in self_nick: txt = text.lower().split('> ')[1] else: txt = text.lower() for t in highlight: if t.lower() in txt: hl = True break if (subtype == 'MUC' and hl) or subtype == 'IN': player(subtype) text = text[:text.find(' ',size_limit)].replace('$','\$')#.replace('&','&').replace('"','"').replace('<','<').replace('>','>') me_nick = re.findall(r'^<(.*?)> /me ',text,re.S+re.I+re.U) if me_nick: text = re.sub(r'(^<.*?> /me)','*%s' % me_nick[0],text,re.I+re.S+re.U) message('%s%s\n%s\n%s' % (jid,['',' [j2j]'][j2j],time.ctime(),text)) os.system('rm -rf %s' % fname) elif type == 'UNREAD': try: unr = int(subtype.split(' ',1)[0]) except: unr = 0 if flash_led: if unr: os.system(led_flash_on) else: os.system(led_flash_off) writefile(unreads,'%s event(s)\n' % unr) elif type == 'STATUS': status = {'A':'Away','D':'Dnd','N':'Xa','O':'Online','_':'Offline','F':'Chat'} jid = sys.argv[3] if jid.count('%') and (jid.count('@j2j.') or jid.count('@j3j.') or jid.count('@xmpp.')): jid,j2j = jid.split('@',1)[0].replace('%','@'),True if status_type == 'black' and jid in status_black: sys.exit() elif status_type == 'white' and not jid in status_white: sys.exit() try: stat = status[sys.argv[2]] except: stat = 'Online' if not show_offline and stat == 'Offline': sys.exit() player(['AV','UNAV'][stat == 'Offline']) presence('%s%s - %s' % (jid,['',' [j2j]'][j2j],stat)) # That's all!