diff --git a/src/notify.py b/src/notify.py new file mode 100644 index 000000000..84a0d9714 --- /dev/null +++ b/src/notify.py @@ -0,0 +1,149 @@ +#!/bin/sh +## notify.py +## +## Gajim Team: +## - Yann Le Boulanger +## - Vincent Hanquez +## - Nikos Kouremenos +## - Dimitur Kirov +## - Andrew Sayman +## +## Copyright (C) 2003-2005 Gajim Team +## +## DBUS/libnotify connection code: +## Copyright (C) 2005 by Sebastian Estienne +## +## 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; version 2 only. +## +## 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. +## + +DBUS_MODULE = True + +try: + import dbus +except ImportError: + DBUS_MODULE = False + +import os +import sys +import gajim +import dialogs + +from common import gajim +from common import i18n +i18n.init() +_ = i18n._ + + +def dbus_get_interface(): + try: + session_bus = dbus.SessionBus() + obj = session_bus.get_object('org.freedesktop.Notifications', + '/org/freedesktop/Notifications') + return dbus.Interface(obj, 'org.freedesktop.Notifications') + except Exception, e: + return None + except dbus.dbus_bindings.DBusException, e: + # This exception could give useful info about why notification breaks + print >> sys.stderr, e + return None + +def dbus_available(): + if not DBUS_MODULE: + return False + if dbus_get_interface() is None: + return False + else: + return True + +def dbus_notify(event_type, jid, account, msg_type = '', file_props = None): + if jid in gajim.contacts[account]: + txt = gajim.get_highest_prio_contact_from_contacts( + gajim.contacts[account][jid]).name + else: + txt = jid + + img = 'chat.png' # img to display + ntype = 'im' # Notification Type + + if event_type == _('Contact Signed In'): + img = 'online.png' + ntype = 'presence.online' + elif event_type == _('Contact Signed Out'): + img = 'offline.png' + ntype = 'presence.offline' + elif event_type in (_('New Message'), _('New Single Message'), + _('New Private Message')): + img = 'chat.png' # FIXME: better img and split events + ntype = 'im.received' + if event_type == _('New Private Message'): + room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) + room_name,t = gajim.get_room_name_and_server_from_room_jid(room_jid) + txt = _('From %s in room %s') % (nick, room_name) + else: + txt = _('From %s') % txt + elif event_type == _('File Transfer Request'): + img = 'requested.png' # FIXME: better img + ntype = 'transfer' + txt = _('From %s') % txt + elif event_type == _('File Transfer Error'): + img = 'error.png' # FIXME: better img + ntype = 'transfer.error' + elif event_type in (_('File Transfer Completed'), _('File Transfer Stopped')): + img = 'closed.png' # # FIXME: better img and split events + ntype = 'transfer.complete' + if file_props is not None: + if file_props['type'] == 'r': + # get the name of the sender, as it is in the roster + sender = unicode(file_props['sender']).split('/')[0] + name = gajim.get_first_contact_instance_from_jid( + account, sender).name + txt = _('From %s') % name + else: + receiver = file_props['receiver'] + if hasattr(receiver, 'jid'): + receiver = receiver.jid + receiver = receiver.split('/')[0] + # get the name of the contact, as it is in the roster + name = gajim.get_first_contact_instance_from_jid( + account, receiver).name + txt = _('To %s') % name + else: + txt = '' + + iconset = gajim.config.get('iconset') + if not iconset: + iconset = 'sun' + path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16', img) + path = os.path.abspath(path) + notif = dbus_get_interface() + if notif is None: + raise dbus.dbus_bindings.DBusException() + notif.Notify(dbus.String(_('Gajim')), + dbus.String(path), dbus.UInt32(0), ntype, dbus.Byte(0), + dbus.String(event_type), dbus.String(txt), + [dbus.String(path)], [''], [''], True, dbus.UInt32(3)) + +def notify(event_type, jid, account, msg_type = '', file_props = None): + if dbus_available(): + try: + dbus_notify(event_type, jid, account, msg_type, file_props) + return + except dbus.dbus_bindings.DBusException, e: + # Connection to DBus failed, try popup + pass + except TypeError, e: + # This means that we sent the message incorrectly + print >> sys.stderr, e + instance = dialogs.PopupNotificationWindow(event_type, jid, account, + msg_type, file_props) + #roster = roster_window.RosterWindow() + gajim.interface.roster.popup_notification_windows.append(instance) + +