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:
parent
3c4333b66b
commit
75fe384da4
|
@ -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
|
||||||
|
|
10
src/gajim.py
10
src/gajim.py
|
@ -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)
|
||||||
|
|
120
src/notify.py
120
src/notify.py
|
@ -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):
|
||||||
|
|
|
@ -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'):
|
||||||
|
|
|
@ -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]
|
||||||
|
|
Loading…
Reference in New Issue