handle advanced notification for new_message event only (without systray / roster / urgency hint that require a event refactorizatin)

use subprocess module as we depend on python2.4
This commit is contained in:
Yann Leboulanger 2006-08-26 22:51:33 +00:00
parent 3c4333b66b
commit 75fe384da4
5 changed files with 167 additions and 45 deletions

View File

@ -18,6 +18,7 @@
import sre import sre
import os import os
import subprocess
import urllib import urllib
import errno import errno
import select import select
@ -360,6 +361,11 @@ def is_in_path(name_of_command, return_abs_path = False):
else: else:
return is_in_dir return is_in_dir
def exec_command(command):
'''command is a string that contain arguments'''
# os.system(command)
subprocess.Popen(command.split())
def launch_browser_mailer(kind, uri): def launch_browser_mailer(kind, uri):
#kind = 'url' or 'mail' #kind = 'url' or 'mail'
if os.name == 'nt': if os.name == 'nt':
@ -383,11 +389,9 @@ def launch_browser_mailer(kind, uri):
command = gajim.config.get('custommailapp') command = gajim.config.get('custommailapp')
if command == '': # if no app is configured if command == '': # if no app is configured
return return
# we add the uri in "" so we have good parsing from shell command = command + ' ' + uri
uri = uri.replace('"', '\\"') # escape " try:
command = command + ' "' + uri + '" &' exec_command(command)
try: #FIXME: when we require python2.4+ use subprocess module
os.system(command)
except: except:
pass pass
@ -406,11 +410,9 @@ def launch_file_manager(path_to_open):
command = gajim.config.get('custom_file_manager') command = gajim.config.get('custom_file_manager')
if command == '': # if no app is configured if command == '': # if no app is configured
return return
# we add the path in "" so we have good parsing from shell command = command + ' ' + path_to_open
path_to_open = path_to_open.replace('"', '\\"') # escape " try:
command = command + ' "' + path_to_open + '" &' exec_command(command)
try: #FIXME: when we require python2.4+ use subprocess module
os.system(command)
except: except:
pass pass
@ -436,11 +438,8 @@ def play_sound_file(path_to_soundfile):
if gajim.config.get('soundplayer') == '': if gajim.config.get('soundplayer') == '':
return return
player = gajim.config.get('soundplayer') player = gajim.config.get('soundplayer')
# we add the path in "" so we have good parsing from shell command = player + ' ' + path_to_soundfile
path_to_soundfile = path_to_soundfile.replace('"', '\\"') # escape " exec_command(command)
command = player + ' "' + path_to_soundfile + '" &'
#FIXME: when we require 2.4+ use subprocess module
os.system(command)
def get_file_path_from_dnd_dropped_uri(uri): def get_file_path_from_dnd_dropped_uri(uri):
path = urllib.url2pathname(uri) # escape special chars path = urllib.url2pathname(uri) # escape special chars
@ -727,20 +726,49 @@ def sanitize_filename(filename):
return filename return filename
def allow_showing_notification(account): def allow_showing_notification(account, type = None, advanced_notif_num = None):
'''is it allowed to show nofication? '''is it allowed to show nofication?
check OUR status and if we allow notifications for that status''' check OUR status and if we allow notifications for that status
type is the option that need to be True ex: notify_on_signin'''
if advanced_notif_num != None:
popup = gajim.config.get_per('notifications', str(advanced_notif_num),
'popup')
if popup == 'yes':
return True
if popup == 'no':
return False
if type and not gajim.config.get(type):
return False
if gajim.config.get('autopopupaway'): # always show notification if gajim.config.get('autopopupaway'): # always show notification
return True return True
if gajim.connections[account].connected in (2, 3): # we're online or chat if gajim.connections[account].connected in (2, 3): # we're online or chat
return True return True
return False return False
def allow_popup_window(account): def allow_popup_window(account, advanced_notif_num = None):
'''is it allowed to popup windows?''' '''is it allowed to popup windows?'''
if advanced_notif_num != None:
popup = gajim.config.get_per('notifications', str(advanced_notif_num),
'auto_open')
if popup == 'yes':
return True
if popup == 'no':
return False
autopopup = gajim.config.get('autopopup') autopopup = gajim.config.get('autopopup')
autopopupaway = gajim.config.get('autopopupaway') autopopupaway = gajim.config.get('autopopupaway')
if autopopup and (autopopupaway or \ if autopopup and (autopopupaway or \
gajim.connections[account].connected in (2, 3)): # we're online or chat gajim.connections[account].connected in (2, 3)): # we're online or chat
return True return True
return False return False
def allow_sound_notification(sound_event, advanced_notif_num = None):
if advanced_notif_num != None:
sound = gajim.config.get_per('notifications', str(advanced_notif_num),
'sound')
if sound == 'yes':
return True
if sound == 'no':
return False
if gajim.config.get_per('soundevents', sound_event, 'enabled'):
return True
return False

View File

@ -557,6 +557,9 @@ class Interface:
not gajim.contacts.get_contact(account, jid) and not pm: not gajim.contacts.get_contact(account, jid) and not pm:
return return
advanced_notif_num = notify.get_advanced_notification('message_received',
account, contact)
# Is it a first or next message received ? # Is it a first or next message received ?
first = False first = False
if not chat_control and not gajim.awaiting_events[account].has_key( if not chat_control and not gajim.awaiting_events[account].has_key(
@ -571,14 +574,14 @@ class Interface:
else: else:
# array: (jid, msg, time, encrypted, msg_type, subject) # array: (jid, msg, time, encrypted, msg_type, subject)
self.roster.on_message(jid, message, array[2], account, array[3], self.roster.on_message(jid, message, array[2], account, array[3],
msg_type, subject, resource, msg_id, array[9]) msg_type, subject, resource, msg_id, array[9], advanced_notif_num)
nickname = gajim.get_name_from_jid(account, jid) nickname = gajim.get_name_from_jid(account, jid)
# Check and do wanted notifications # Check and do wanted notifications
msg = message msg = message
if subject: if subject:
msg = _('Subject: %s') % subject + '\n' + msg msg = _('Subject: %s') % subject + '\n' + msg
notify.notify('new_message', jid, account, [msg_type, first, nickname, notify.notify('new_message', jid, account, [msg_type, first, nickname,
msg]) msg], advanced_notif_num)
if self.remote_ctrl: if self.remote_ctrl:
self.remote_ctrl.raise_signal('NewMessage', (account, array)) self.remote_ctrl.raise_signal('NewMessage', (account, array))
@ -930,8 +933,7 @@ class Interface:
self.add_event(account, jid, 'gc-invitation', (room_jid, array[2], self.add_event(account, jid, 'gc-invitation', (room_jid, array[2],
array[3])) array[3]))
if gajim.config.get('notify_on_new_message') and \ if helpers.allow_showing_notification(account, 'notify_on_new_message'):
helpers.allow_showing_notification(account):
path = os.path.join(gajim.DATA_DIR, 'pixmaps', 'events', path = os.path.join(gajim.DATA_DIR, 'pixmaps', 'events',
'gc_invitation.png') 'gc_invitation.png')
path = gtkgui_helpers.get_path_to_generic_or_avatar(path) path = gtkgui_helpers.get_path_to_generic_or_avatar(path)

View File

@ -32,12 +32,78 @@ if dbus_support.supported:
import dbus.glib import dbus.glib
import dbus.service import dbus.service
def notify(event, jid, account, parameters): def get_advanced_notification(event, account, contact):
num = 0
notif = gajim.config.get_per('notifications', str(num))
while notif:
recipient_ok = False
status_ok = False
tab_opened_ok = False
# test event
if gajim.config.get_per('notifications', str(num), 'event') == event:
# test recipient
recipient_type = gajim.config.get_per('notifications', str(num),
'recipient_type')
recipients = gajim.config.get_per('notifications', str(num),
'recipients').split()
if recipient_type == 'all':
recipient_ok = True
elif recipient_type == 'contact' and contact.jid in recipients:
recipient_ok = True
elif recipient_type == 'group':
for group in contact.groups:
if group in contact.groups:
recipient_ok = True
break
if recipient_ok:
# test status
our_status = gajim.SHOW_LIST[gajim.connections[account].connected]
status = gajim.config.get_per('notifications', str(num), 'status')
if status == 'all' or our_status in status.split():
status_ok = True
if status_ok:
# test window_opened
tab_opened = gajim.config.get_per('notifications', str(num),
'tab_opened')
if tab_opened == 'both':
tab_opened_ok = True
else:
chat_control = False
full_jid_with_resource = contact.jid
if contact.resource:
full_jid_with_resource += '/' + contact.resource
highest_contact = gajim.contacts.get_contact_with_highest_priority(
account, contact.jid)
# Look for a chat control that has the given resource, or default to
# one without resource
if gajim.interface.msg_win_mgr.get_control(full_jid_with_resource,
account):
chat_control = True
elif not highest_contact or not highest_contact.resource:
# unknow contact or offline message
if gajim.interface.msg_win_mgr.get_control(contact.jid, account):
chat_control = True
elif highest_contact and contact.resource != \
highest_contact.resource:
chat_control = False
elif gajim.interface.msg_win_mgr.get_control(contact.jid, account):
chat_control = True
if (chat_control and tab_opened == 'yes') or (not chat_control and \
tab_opened == 'no'):
tab_opened_ok = True
if tab_opened_ok:
return num
num += 1
notif = gajim.config.get_per('notifications', str(num))
def notify(event, jid, account, parameters, advanced_notif_num = None):
'''Check what type of notifications we want, depending on basic configuration '''Check what type of notifications we want, depending on basic configuration
of notifications and advanced one and do these notifications''' of notifications and advanced one and do these notifications'''
# First, find what notifications we want # First, find what notifications we want
do_popup = False do_popup = False
do_sound = False do_sound = False
do_cmd = False
if (event == 'status_change'): if (event == 'status_change'):
new_show = parameters[0] new_show = parameters[0]
status_message = parameters[1] status_message = parameters[1]
@ -51,9 +117,8 @@ def notify(event, jid, account, parameters):
if account_server in gajim.block_signed_in_notifications and \ if account_server in gajim.block_signed_in_notifications and \
gajim.block_signed_in_notifications[account_server]: gajim.block_signed_in_notifications[account_server]:
block_transport = True block_transport = True
if gajim.config.get('notify_on_signin') and \ if helpers.allow_showing_notification(account, 'notify_on_signin') and \
not gajim.block_signed_in_notifications[account] and not block_transport \ not gajim.block_signed_in_notifications[account] and not block_transport:
and helpers.allow_showing_notification(account):
do_popup = True do_popup = True
if gajim.config.get_per('soundevents', 'contact_connected', if gajim.config.get_per('soundevents', 'contact_connected',
'enabled') and not gajim.block_signed_in_notifications[account] and \ 'enabled') and not gajim.block_signed_in_notifications[account] and \
@ -61,8 +126,7 @@ def notify(event, jid, account, parameters):
do_sound = True do_sound = True
elif (event == 'contact_disconnected'): elif (event == 'contact_disconnected'):
status_message = parameters status_message = parameters
if gajim.config.get('notify_on_signout') \ if helpers.allow_showing_notification(account, 'notify_on_signout'):
and helpers.allow_showing_notification(account):
do_popup = True do_popup = True
if gajim.config.get_per('soundevents', 'contact_disconnected', if gajim.config.get_per('soundevents', 'contact_disconnected',
'enabled'): 'enabled'):
@ -72,18 +136,22 @@ def notify(event, jid, account, parameters):
first = parameters[1] first = parameters[1]
nickname = parameters[2] nickname = parameters[2]
message = parameters[3] message = parameters[3]
if gajim.config.get('notify_on_new_message') and \ if helpers.allow_showing_notification(account, 'notify_on_new_message',
helpers.allow_showing_notification(account) and first: advanced_notif_num) and first:
do_popup = True do_popup = True
if first and gajim.config.get_per('soundevents', 'first_message_received', if first and helpers.allow_sound_notification('first_message_received',
'enabled'): advanced_notif_num):
do_sound = True do_sound = True
elif not first and gajim.config.get_per('soundevents', 'next_message_received', elif not first and helpers.allow_sound_notification(
'enabled'): 'next_message_received', advanced_notif_num):
do_sound = True do_sound = True
else: else:
print '*Event not implemeted yet*' print '*Event not implemeted yet*'
if advanced_notif_num != None and gajim.config.get_per('notifications',
str(advanced_notif_num), 'run_command'):
do_cmd = True
# Do the wanted notifications # Do the wanted notifications
if (do_popup): if (do_popup):
if (event == 'contact_connected' or event == 'contact_disconnected' or \ if (event == 'contact_connected' or event == 'contact_disconnected' or \
@ -161,14 +229,34 @@ def notify(event, jid, account, parameters):
path_to_image = path, title = title, text = text) path_to_image = path, title = title, text = text)
if (do_sound): if (do_sound):
snd_file = None
snd_event = None # If not snd_file, play the event
if (event == 'new_message'): if (event == 'new_message'):
if first: if advanced_notif_num != None and gajim.config.get_per('notifications',
helpers.play_sound('first_message_received') str(advanced_notif_num), 'sound') == 'yes':
snd_file = gajim.config.get_per('notifications',
str(advanced_notif_num), 'sound_file')
elif advanced_notif_num != None and gajim.config.get_per(
'notifications', str(advanced_notif_num), 'sound') == 'no':
pass # do not set snd_event
elif first:
snd_event = 'first_message_received'
else: else:
helpers.play_sound('next_message_received') snd_event = 'next_message_received'
elif event in ('contact_connected', 'contact_disconnected'): elif event in ('contact_connected', 'contact_disconnected'):
helpers.play_sound(event) snd_event = event
if snd_file:
helpers.play_sound_file(snd_file)
if snd_event:
helpers.play_sound(snd_event)
if do_cmd:
command = gajim.config.get_per('notifications', str(advanced_notif_num),
'command')
try:
helpers.exec_command(command)
except:
pass
def popup(event_type, jid, account, msg_type = '', path_to_image = None, def popup(event_type, jid, account, msg_type = '', path_to_image = None,
title = None, text = None): title = None, text = None):

View File

@ -2439,7 +2439,7 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
def on_message(self, jid, msg, tim, account, encrypted = False, def on_message(self, jid, msg, tim, account, encrypted = False,
msg_type = '', subject = None, resource = '', msg_id = None, msg_type = '', subject = None, resource = '', msg_id = None,
user_nick = ''): user_nick = '', advanced_notif_num = None):
'''when we receive a message''' '''when we receive a message'''
contact = None contact = None
# if chat window will be for specific resource # if chat window will be for specific resource
@ -2496,7 +2496,7 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
if qs.has_key(fjid): if qs.has_key(fjid):
no_queue = False no_queue = False
popup = helpers.allow_popup_window(account) popup = helpers.allow_popup_window(account, advanced_notif_num)
if msg_type == 'normal' and popup: # it's single message to be autopopuped if msg_type == 'normal' and popup: # it's single message to be autopopuped
dialogs.SingleMessageWindow(account, contact.jid, dialogs.SingleMessageWindow(account, contact.jid,
@ -2554,7 +2554,7 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
self.tree.scroll_to_cell(path) self.tree.scroll_to_cell(path)
self.tree.set_cursor(path) self.tree.set_cursor(path)
if gajim.interface.systray_capabilities: if gajim.interface.systray_capabilities:
gajim.interface.systray.add_jid(fjid, account, kind) gajim.interface.systray.add_jid(fjid, account, kind, advanced_notif_num)
def on_preferences_menuitem_activate(self, widget): def on_preferences_menuitem_activate(self, widget):
if gajim.interface.instances.has_key('preferences'): if gajim.interface.instances.has_key('preferences'):

View File

@ -58,9 +58,13 @@ class Systray:
self.xml.signal_autoconnect(self) self.xml.signal_autoconnect(self)
self.popup_menus = [] self.popup_menus = []
def set_img(self): def set_img(self, advanced_notif_num = None):
if not gajim.interface.systray_enabled: if not gajim.interface.systray_enabled:
return return
if advanced_notif_num:
if gajim.config.get_per('notifications', str(advanced_notif_num),
'systray') == 'no':
return
if len(self.jids) > 0: if len(self.jids) > 0:
state = 'message' state = 'message'
else: else:
@ -71,12 +75,12 @@ class Systray:
elif image.get_storage_type() == gtk.IMAGE_PIXBUF: elif image.get_storage_type() == gtk.IMAGE_PIXBUF:
self.img_tray.set_from_pixbuf(image.get_pixbuf()) self.img_tray.set_from_pixbuf(image.get_pixbuf())
def add_jid(self, jid, account, typ): def add_jid(self, jid, account, typ, advanced_notif_num = None):
l = [account, jid, typ] l = [account, jid, typ]
# We can keep several single message 'cause we open them one by one # We can keep several single message 'cause we open them one by one
if not l in self.jids or typ == 'normal': if not l in self.jids or typ == 'normal':
self.jids.append(l) self.jids.append(l)
self.set_img() self.set_img(advanced_notif_num)
def remove_jid(self, jid, account, typ): def remove_jid(self, jid, account, typ):
l = [account, jid, typ] l = [account, jid, typ]