2005-04-18 08:54:47 +00:00
#!/bin/sh
''' : '
2005-05-15 00:00:09 +00:00
exec python - OOt " $0 " $ { 1 + " $@ " }
2005-04-18 08:54:47 +00:00
' ' ' '
## gajim.py
2003-11-30 22:40:24 +00:00
##
## Gajim Team:
2005-03-16 20:48:56 +00:00
## - Yann Le Boulanger <asterix@lagaule.org>
## - Vincent Hanquez <tab@snarc.org>
2005-04-18 11:04:33 +00:00
## - Nikos Kouremenos <kourem@gmail.com>
2005-07-30 14:14:10 +00:00
## - Dimitur Kirov <dkirov@gmail.com>
2005-11-13 01:48:48 +00:00
## - Travis Shirk <travis@pobox.com>
2003-11-30 22:40:24 +00:00
##
2005-01-07 21:52:38 +00:00
## Copyright (C) 2003-2005 Gajim Team
2003-11-30 22:40:24 +00:00
##
## 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.
##
2005-11-13 14:55:52 +00:00
2005-05-30 12:53:48 +00:00
import sys
2005-08-16 11:55:29 +00:00
import os
2005-11-10 15:14:17 +00:00
import pygtk
2005-09-07 19:46:09 +00:00
2005-12-01 17:17:20 +00:00
from common import exceptions
2005-09-21 14:42:29 +00:00
from common import i18n
i18n . init ( )
_ = i18n . _
2005-05-30 12:53:48 +00:00
try :
import gtk
except RuntimeError , msg :
if str ( msg ) == ' could not open display ' :
2005-09-08 08:54:59 +00:00
print >> sys . stderr , _ ( ' Gajim needs Xserver to run. Quiting... ' )
2005-05-30 14:19:14 +00:00
sys . exit ( )
2005-12-01 17:17:20 +00:00
pritext = ' '
2005-09-11 14:20:20 +00:00
if gtk . pygtk_version < ( 2 , 6 , 0 ) :
2005-12-01 17:49:10 +00:00
pritext = _ ( ' Gajim needs PyGTK 2.6 or above ' )
sectext = _ ( ' Gajim needs PyGTK 2.6 or above to run. Quiting... ' )
2005-09-11 14:20:20 +00:00
elif gtk . gtk_version < ( 2 , 6 , 0 ) :
2005-12-01 17:56:31 +00:00
pritext = _ ( ' Gajim needs GTK 2.6 or above ' )
2005-12-01 17:49:10 +00:00
sectext = _ ( ' Gajim needs GTK 2.6 or above to run. Quiting... ' )
2005-09-11 14:20:20 +00:00
2005-09-22 16:30:46 +00:00
try :
import gtk . glade # check if user has libglade (in pygtk and in gtk)
except ImportError :
pritext = _ ( ' GTK+ runtime is missing libglade support ' )
if os . name == ' nt ' :
2005-10-17 15:57:03 +00:00
sectext = _ ( ' Please remove your current GTK+ runtime and install the latest stable version from %s ' ) % ' http://gladewin32.sourceforge.net '
2005-09-22 16:30:46 +00:00
else :
sectext = _ ( ' Please make sure that gtk and pygtk have libglade support in your system. ' )
2005-12-01 17:17:20 +00:00
try :
from common import check_paths
except exceptions . PysqliteNotAvailable , e :
2005-12-01 17:56:31 +00:00
pritext = _ ( ' Gajim needs PySQLite2 to run ' )
2005-12-01 17:17:20 +00:00
sectext = str ( e )
if pritext :
2005-09-22 16:30:46 +00:00
dlg = gtk . MessageDialog ( None ,
gtk . DIALOG_DESTROY_WITH_PARENT | gtk . DIALOG_MODAL ,
gtk . MESSAGE_ERROR , gtk . BUTTONS_OK , message_format = pritext )
dlg . format_secondary_text ( sectext )
dlg . run ( )
dlg . destroy ( )
sys . exit ( )
2005-12-02 11:18:00 +00:00
from common import logger
LOG_DB_PATH = logger . LOG_DB_PATH
NO_DB = False
if not os . path . isfile ( LOG_DB_PATH ) :
NO_DB = True
2005-11-23 19:21:46 +00:00
check_paths . check_and_possibly_create_paths ( )
2005-11-23 19:12:52 +00:00
2005-11-12 21:24:54 +00:00
path = os . getcwd ( )
2005-12-01 17:56:31 +00:00
if ' .svn ' in os . listdir ( path ) or ' _svn ' in os . listdir ( path ) :
2005-11-12 21:24:54 +00:00
# import gtkexcepthook only for those that run svn
# those than run with --verbose run from terminal so no need to care
# about those
import gtkexcepthook
del path
2005-02-28 18:15:48 +00:00
import gobject
2005-12-01 18:03:05 +00:00
if sys . version [ : 4 ] > = ' 2.4 ' : # FIXME: remove me when we abandon python23
2005-09-12 11:23:38 +00:00
gobject . threads_init ( )
2005-10-03 16:14:41 +00:00
2005-08-12 00:08:04 +00:00
import pango
2005-03-20 17:14:55 +00:00
import sre
2005-04-18 14:05:30 +00:00
import signal
2005-05-13 22:38:48 +00:00
import getopt
2005-06-28 19:03:00 +00:00
import time
2005-10-03 16:14:41 +00:00
import base64
2005-08-08 14:53:21 +00:00
2005-07-25 14:38:21 +00:00
import gtkgui_helpers
2005-11-11 19:06:48 +00:00
import notify
2005-02-28 18:15:48 +00:00
2005-05-21 16:01:52 +00:00
import common . sleepy
import check_for_new_version
2005-09-09 17:43:39 +00:00
2005-11-11 19:06:48 +00:00
from common import socks5
2005-05-21 16:01:52 +00:00
from common import gajim
from common import connection
2005-08-09 22:46:13 +00:00
from common import helpers
2005-04-16 22:12:41 +00:00
from common import optparser
2005-04-14 07:05:10 +00:00
2005-05-13 22:38:48 +00:00
profile = ' '
try :
2005-09-07 21:12:30 +00:00
opts , args = getopt . getopt ( sys . argv [ 1 : ] , ' hvp: ' , [ ' help ' , ' verbose ' ,
2005-09-07 19:46:09 +00:00
' profile= ' , ' sm-config-prefix= ' , ' sm-client-id= ' ] )
2005-05-13 22:38:48 +00:00
except getopt . error , msg :
2005-05-28 18:20:27 +00:00
print msg
print ' for help use --help '
sys . exit ( 2 )
2005-05-13 22:38:48 +00:00
for o , a in opts :
2005-05-28 18:20:27 +00:00
if o in ( ' -h ' , ' --help ' ) :
2005-05-30 12:53:48 +00:00
print ' gajim [--help] [--verbose] [--profile name] '
2005-05-30 14:19:14 +00:00
sys . exit ( )
2005-05-28 18:20:27 +00:00
elif o in ( ' -v ' , ' --verbose ' ) :
gajim . verbose = True
elif o in ( ' -p ' , ' --profile ' ) : # gajim --profile name
profile = a
2005-05-13 22:38:48 +00:00
2005-05-20 18:08:24 +00:00
config_filename = os . path . expanduser ( ' ~/.gajim/config ' )
if os . name == ' nt ' :
try :
# Documents and Settings\[User Name]\Application Data\Gajim\logs
config_filename = os . environ [ ' appdata ' ] + ' /Gajim/config '
except KeyError :
2005-05-20 18:13:38 +00:00
# win9x so ./config
config_filename = ' config '
2005-05-20 18:08:24 +00:00
2005-05-13 22:38:48 +00:00
if profile :
2005-05-28 18:20:27 +00:00
config_filename + = ' . %s ' % profile
2005-05-13 22:38:48 +00:00
2005-05-20 18:08:24 +00:00
parser = optparser . OptionsParser ( config_filename )
2005-05-13 22:38:48 +00:00
2005-06-24 14:28:00 +00:00
class Contact :
2005-06-24 13:29:26 +00:00
''' Information concerning each contact '''
2005-10-19 10:39:23 +00:00
def __init__ ( self , jid = ' ' , name = ' ' , groups = [ ] , show = ' ' , status = ' ' , sub = ' ' ,
ask = ' ' , resource = ' ' , priority = 5 , keyID = ' ' , role = ' ' , affiliation = ' ' ,
2005-11-22 00:28:36 +00:00
our_chatstate = None , chatstate = None ) :
2005-06-25 09:18:39 +00:00
self . jid = jid
self . name = name
self . groups = groups
self . show = show
self . status = status
self . sub = sub
self . ask = ask
self . resource = resource
self . priority = priority
self . keyID = keyID
self . role = role
self . affiliation = affiliation
2003-11-30 22:40:24 +00:00
2005-07-22 00:34:08 +00:00
# please read jep-85 http://www.jabber.org/jeps/jep-0085.html
# we keep track of jep85 support by the peer by three extra states:
# None, False and 'ask'
# None if no info about peer
# False if peer does not support jep85
# 'ask' if we sent the first 'active' chatstate and are waiting for reply
2005-11-22 00:28:36 +00:00
# this holds what WE SEND to contact (our current chatstate)
self . our_chatstate = our_chatstate
# this is contact's chatstate
2005-07-22 00:34:08 +00:00
self . chatstate = chatstate
2005-04-14 17:07:55 +00:00
import roster_window
import systray
import dialogs
2005-11-13 20:25:04 +00:00
import vcard
2005-04-14 17:07:55 +00:00
import config
2005-10-30 09:58:13 +00:00
import disco
2004-06-11 21:36:17 +00:00
2005-04-21 23:20:18 +00:00
GTKGUI_GLADE = ' gtkgui.glade '
2004-06-11 21:36:17 +00:00
2004-03-11 21:14:09 +00:00
2005-04-18 14:05:30 +00:00
class Interface :
2004-08-01 16:25:41 +00:00
def handle_event_roster ( self , account , data ) :
2005-04-26 18:45:54 +00:00
#('ROSTER', account, array)
2005-07-22 14:30:35 +00:00
self . roster . fill_contacts_and_groups_dicts ( data , account )
2004-06-20 21:58:12 +00:00
self . roster . draw_roster ( )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Roster ' , ( account , data ) )
2005-06-24 16:46:45 +00:00
2005-06-07 07:40:15 +00:00
def handle_event_warning ( self , unused , data ) :
#('WARNING', account, (title_text, section_text))
2005-06-10 21:14:16 +00:00
dialogs . WarningDialog ( data [ 0 ] , data [ 1 ] ) . get_response ( )
2005-06-24 16:46:45 +00:00
2005-06-07 07:40:15 +00:00
def handle_event_error ( self , unused , data ) :
#('ERROR', account, (title_text, section_text))
2005-06-10 21:14:16 +00:00
dialogs . ErrorDialog ( data [ 0 ] , data [ 1 ] ) . get_response ( )
2005-06-24 16:46:45 +00:00
def handle_event_information ( self , unused , data ) :
#('INFORMATION', account, (title_text, section_text))
2005-08-14 16:12:36 +00:00
dialogs . InformationDialog ( data [ 0 ] , data [ 1 ] )
2005-09-26 22:29:52 +00:00
2005-10-03 18:19:31 +00:00
def handle_event_ask_new_nick ( self , account , data ) :
#('ASK_NEW_NICK', account, (room_jid, title_text, prompt_text, proposed_nick))
2005-10-02 21:56:38 +00:00
room_jid = data [ 0 ]
title = data [ 1 ]
prompt = data [ 2 ]
2005-10-03 18:19:31 +00:00
proposed_nick = data [ 3 ]
2005-11-13 15:08:47 +00:00
w = self . instances [ account ] [ ' gc ' ]
2005-10-30 21:41:52 +00:00
if w . has_key ( room_jid ) : # user may close the window before we are here
w [ room_jid ] . show_change_nick_input_dialog ( title , prompt , proposed_nick ,
room_jid )
2005-06-24 16:46:45 +00:00
2005-08-05 13:29:39 +00:00
def handle_event_http_auth ( self , account , data ) :
2005-11-13 01:48:48 +00:00
#('HTTP_AUTH', account, (method, url, transaction_id, iq_obj))
dialog = dialogs . ConfirmationDialog ( _ ( ' HTTP ( %s ) Authorization for %s (id: %s ) ' ) \
% ( data [ 0 ] , data [ 1 ] , data [ 2 ] ) , _ ( ' Do you accept this request? ' ) )
2005-08-05 13:29:39 +00:00
if dialog . get_response ( ) == gtk . RESPONSE_OK :
answer = ' yes '
else :
answer = ' no '
gajim . connections [ account ] . build_http_auth_answer ( data [ 2 ] , answer )
2005-05-10 16:53:28 +00:00
def handle_event_error_answer ( self , account , array ) :
2005-09-19 16:13:45 +00:00
#('ERROR_ANSWER', account, (id, jid_from. errmsg, errcode))
2005-08-03 16:21:23 +00:00
id , jid_from , errmsg , errcode = array
2005-10-27 13:15:03 +00:00
if unicode ( errcode ) in ( ' 403 ' , ' 406 ' ) and id :
2005-08-06 16:18:25 +00:00
# show the error dialog
2005-11-13 15:08:47 +00:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 20:31:44 +00:00
sid = id
if len ( id ) > 3 and id [ 2 ] == ' _ ' :
sid = id [ 3 : ]
if ft . files_props [ ' s ' ] . has_key ( sid ) :
file_props = ft . files_props [ ' s ' ] [ sid ]
file_props [ ' error ' ] = - 4
self . handle_event_file_request_error ( account ,
( jid_from , file_props ) )
conn = gajim . connections [ account ]
conn . disconnect_transfer ( file_props )
return
2005-08-26 00:52:44 +00:00
elif unicode ( errcode ) == ' 404 ' :
2005-08-06 16:18:25 +00:00
conn = gajim . connections [ account ]
2005-08-11 20:31:44 +00:00
sid = id
if len ( id ) > 3 and id [ 2 ] == ' _ ' :
sid = id [ 3 : ]
if conn . files_props . has_key ( sid ) :
file_props = conn . files_props [ sid ]
self . handle_event_file_send_error ( account ,
( jid_from , file_props ) )
conn . disconnect_transfer ( file_props )
return
2005-11-13 15:08:47 +00:00
if jid_from in self . instances [ account ] [ ' gc ' ] :
self . instances [ account ] [ ' gc ' ] [ jid_from ] . print_conversation (
2005-09-06 13:17:10 +00:00
' Error %s : %s ' % ( array [ 2 ] , array [ 1 ] ) , jid_from )
2005-05-10 16:53:28 +00:00
2005-06-29 12:57:46 +00:00
def handle_event_con_type ( self , account , con_type ) :
# ('CON_TYPE', account, con_type) which can be 'ssl', 'tls', 'tcp'
2005-07-18 21:08:31 +00:00
gajim . con_types [ account ] = con_type
2005-06-29 12:57:46 +00:00
2005-05-12 18:55:01 +00:00
def allow_notif ( self , account ) :
2005-07-18 21:08:31 +00:00
gajim . allow_notifications [ account ] = True
2005-05-12 18:55:01 +00:00
2005-04-06 18:51:54 +00:00
def handle_event_status ( self , account , status ) : # OUR status
2004-06-20 21:58:12 +00:00
#('STATUS', account, status)
2005-10-10 22:46:28 +00:00
model = self . roster . status_combobox . get_model ( )
if status == ' offline ' :
model [ self . roster . status_message_menuitem_iter ] [ 3 ] = False # sensitivity for this menuitem
2005-07-18 21:08:31 +00:00
gajim . allow_notifications [ account ] = False
2005-08-03 09:23:36 +00:00
# we are disconnected from all gc
2005-10-14 18:10:14 +00:00
if not gajim . gc_connected . has_key ( account ) :
return
2005-08-03 09:23:36 +00:00
for room_jid in gajim . gc_connected [ account ] :
2005-11-13 15:08:47 +00:00
if self . instances [ account ] [ ' gc ' ] . has_key ( room_jid ) :
self . instances [ account ] [ ' gc ' ] [ room_jid ] . got_disconnected ( room_jid )
2005-10-10 22:46:28 +00:00
else :
gobject . timeout_add ( 30000 , self . allow_notif , account )
model [ self . roster . status_message_menuitem_iter ] [ 3 ] = True # sensitivity for this menuitem
2004-06-20 21:58:12 +00:00
self . roster . on_status_changed ( account , status )
2005-11-07 15:43:47 +00:00
if account in self . show_vcard_when_connect :
jid = gajim . get_jid_from_account ( account )
2005-11-28 16:26:19 +00:00
if not self . instances [ account ] [ ' infos ' ] . has_key ( jid ) :
2005-11-13 15:08:47 +00:00
self . instances [ account ] [ ' infos ' ] [ jid ] = \
2005-11-13 20:25:04 +00:00
vcard . VcardWindow ( jid , account , True )
2005-11-07 15:43:47 +00:00
gajim . connections [ account ] . request_vcard ( jid )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' AccountPresence ' , ( status , account ) )
2004-06-20 21:58:12 +00:00
def handle_event_notify ( self , account , array ) :
2005-09-19 16:13:45 +00:00
#('NOTIFY', account, (jid, status, message, resource, priority, keyID))
2005-07-21 17:00:05 +00:00
# if we're here it means contact changed show
statuss = [ ' offline ' , ' error ' , ' online ' , ' chat ' , ' away ' , ' xa ' , ' dnd ' ,
' invisible ' ]
2005-02-14 23:48:32 +00:00
old_show = 0
2005-04-12 15:30:09 +00:00
new_show = statuss . index ( array [ 1 ] )
2005-03-05 21:02:38 +00:00
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
2004-10-07 14:43:59 +00:00
keyID = array [ 5 ]
2005-05-29 21:34:01 +00:00
attached_keys = gajim . config . get_per ( ' accounts ' , account ,
' attached_gpg_keys ' ) . split ( )
if jid in attached_keys :
keyID = attached_keys [ attached_keys . index ( jid ) + 1 ]
2004-06-20 21:58:12 +00:00
resource = array [ 3 ]
if not resource :
resource = ' '
priority = array [ 4 ]
2005-04-18 14:05:30 +00:00
if jid . find ( ' @ ' ) < = 0 :
2005-10-10 22:46:28 +00:00
# It must be an agent
2005-03-05 21:02:38 +00:00
ji = jid . replace ( ' @ ' , ' ' )
2004-06-20 21:58:12 +00:00
else :
ji = jid
2005-10-10 22:46:28 +00:00
# Update contact
2005-07-18 21:08:31 +00:00
if gajim . contacts [ account ] . has_key ( ji ) :
2005-11-01 15:28:19 +00:00
lcontact = gajim . contacts [ account ] [ ji ]
contact1 = None
2004-06-20 21:58:12 +00:00
resources = [ ]
2005-11-01 15:28:19 +00:00
for c in lcontact :
2005-11-01 17:14:15 +00:00
resources . append ( c . resource )
2005-11-01 15:28:19 +00:00
if c . resource == resource :
contact1 = c
2004-06-20 21:58:12 +00:00
break
2005-11-01 15:28:19 +00:00
if contact1 :
if contact1 . show in statuss :
old_show = statuss . index ( contact1 . show )
if old_show == new_show and contact1 . status == array [ 2 ] : #no change
2005-07-19 18:23:27 +00:00
return
2005-02-14 23:48:32 +00:00
else :
2005-11-01 15:28:19 +00:00
contact1 = gajim . contacts [ account ] [ ji ] [ 0 ]
if contact1 . show in statuss :
old_show = statuss . index ( contact1 . show )
if ( resources != [ ' ' ] and ( len ( lcontact ) != 1 or
lcontact [ 0 ] . show != ' offline ' ) ) and jid . find ( ' @ ' ) > 0 :
2005-02-14 23:48:32 +00:00
old_show = 0
2005-11-01 15:28:19 +00:00
contact1 = Contact ( jid = contact1 . jid , name = contact1 . name ,
groups = contact1 . groups , show = contact1 . show ,
2005-11-22 00:32:38 +00:00
status = contact1 . status , sub = contact1 . sub ,
ask = contact1 . ask , resource = contact1 . resource ,
priority = contact1 . priority , keyID = contact1 . keyID )
2005-11-01 15:28:19 +00:00
lcontact . append ( contact1 )
contact1 . resource = resource
if contact1 . jid . find ( ' @ ' ) > 0 and len ( lcontact ) == 1 : # It's not an agent
2005-04-12 15:30:09 +00:00
if old_show == 0 and new_show > 1 :
2005-11-01 15:28:19 +00:00
if not contact1 . jid in gajim . newly_added [ account ] :
gajim . newly_added [ account ] . append ( contact1 . jid )
if contact1 . jid in gajim . to_be_removed [ account ] :
gajim . to_be_removed [ account ] . remove ( contact1 . jid )
gobject . timeout_add ( 5000 , self . roster . remove_newly_added ,
contact1 . jid , account )
2005-04-14 07:20:14 +00:00
if old_show > 1 and new_show == 0 and gajim . connections [ account ] . \
connected > 1 :
2005-11-01 15:28:19 +00:00
if not contact1 . jid in gajim . to_be_removed [ account ] :
gajim . to_be_removed [ account ] . append ( contact1 . jid )
if contact1 . jid in gajim . newly_added [ account ] :
gajim . newly_added [ account ] . remove ( contact1 . jid )
self . roster . draw_contact ( contact1 . jid , account )
2005-10-15 20:49:08 +00:00
if not gajim . awaiting_events [ account ] . has_key ( jid ) :
2005-11-01 15:28:19 +00:00
gobject . timeout_add ( 5000 , self . roster . really_remove_contact ,
contact1 , account )
contact1 . show = array [ 1 ]
contact1 . status = array [ 2 ]
contact1 . priority = priority
contact1 . keyID = keyID
2005-04-18 14:05:30 +00:00
if jid . find ( ' @ ' ) < = 0 :
2005-10-10 22:46:28 +00:00
# It must be an agent
2005-07-18 21:08:31 +00:00
if gajim . contacts [ account ] . has_key ( ji ) :
2005-10-10 22:46:28 +00:00
# Update existing iter
2005-04-23 00:37:51 +00:00
self . roster . draw_contact ( ji , account )
2005-09-13 18:46:21 +00:00
elif jid == gajim . get_jid_from_account ( account ) :
2005-10-10 22:46:28 +00:00
# It's another of our resources. We don't need to see that!
2005-09-13 18:46:21 +00:00
return
2005-07-18 21:08:31 +00:00
elif gajim . contacts [ account ] . has_key ( ji ) :
2005-10-10 22:46:28 +00:00
# It isn't an agent
2005-10-20 10:21:51 +00:00
# reset chatstate if needed:
2005-11-01 15:28:19 +00:00
# (when contact signs out or has errors)
2005-10-20 10:21:51 +00:00
if array [ 1 ] in ( ' offline ' , ' error ' ) :
2005-11-22 00:28:36 +00:00
contact1 . our_chatstate = contact1 . chatstate = None
2005-11-01 15:28:19 +00:00
self . roster . chg_contact_status ( contact1 , array [ 1 ] , array [ 2 ] , account )
2005-10-10 22:46:28 +00:00
# play sound
2005-05-07 15:40:58 +00:00
if old_show < 2 and new_show > 1 :
if gajim . config . get_per ( ' soundevents ' , ' contact_connected ' ,
2005-10-31 20:54:40 +00:00
' enabled ' ) :
2005-08-09 22:46:13 +00:00
helpers . play_sound ( ' contact_connected ' )
2005-11-13 15:08:47 +00:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-10-15 20:49:08 +00:00
not gajim . awaiting_events [ account ] . has_key ( jid ) and \
2005-05-21 13:46:23 +00:00
gajim . config . get ( ' notify_on_signin ' ) and \
2005-07-18 21:08:31 +00:00
gajim . allow_notifications [ account ] :
2005-04-18 23:55:13 +00:00
show_notification = False
# check OUR status and if we allow notifications for that status
if gajim . config . get ( ' autopopupaway ' ) : # always notify
show_notification = True
2005-05-11 17:14:10 +00:00
elif gajim . connections [ account ] . connected in ( 2 , 3 ) : # we're online or chat
2005-04-18 23:55:13 +00:00
show_notification = True
if show_notification :
2005-11-11 19:06:48 +00:00
notify . notify ( _ ( ' Contact Signed In ' ) , jid , account )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' ContactPresence ' ,
2005-08-08 14:43:50 +00:00
( account , array ) )
2005-05-11 15:21:13 +00:00
elif old_show > 1 and new_show < 2 :
if gajim . config . get_per ( ' soundevents ' , ' contact_disconnected ' ,
2005-10-31 20:54:40 +00:00
' enabled ' ) :
2005-08-09 22:46:13 +00:00
helpers . play_sound ( ' contact_disconnected ' )
2005-11-13 15:08:47 +00:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-10-15 20:49:08 +00:00
not gajim . awaiting_events [ account ] . has_key ( jid ) and \
2005-05-21 13:46:23 +00:00
gajim . config . get ( ' notify_on_signout ' ) :
2005-04-18 23:55:13 +00:00
show_notification = False
# check OUR status and if we allow notifications for that status
if gajim . config . get ( ' autopopupaway ' ) : # always notify
show_notification = True
2005-05-11 17:14:10 +00:00
elif gajim . connections [ account ] . connected in ( 2 , 3 ) : # we're online or chat
2005-04-18 23:55:13 +00:00
show_notification = True
if show_notification :
2005-11-11 19:06:48 +00:00
notify . notify ( _ ( ' Contact Signed Out ' ) , jid , account )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' ContactAbsence ' , ( account , array ) )
# FIXME: stop non active file transfers
2005-10-04 11:33:57 +00:00
else :
2005-10-04 12:26:09 +00:00
# FIXME: Msn transport (CMSN1.2.1 and PyMSN0.10) doesn't follow the JEP
# remove in 2007
# It's maybe a GC_NOTIFY (specialy for MSN gc)
2005-10-04 11:33:57 +00:00
self . handle_event_gc_notify ( account , ( jid , array [ 1 ] , array [ 2 ] , array [ 3 ] , None , None , None , None , None , None , None ) )
2004-06-21 00:12:25 +00:00
2004-06-20 21:58:12 +00:00
def handle_event_msg ( self , account , array ) :
2005-11-22 00:28:36 +00:00
# ('MSG', account, (jid, msg, time, encrypted, msg_type, subject,
# chatstate))
2005-07-22 00:34:08 +00:00
jid = gajim . get_jid_without_resource ( array [ 0 ] )
2005-10-07 14:01:35 +00:00
resource = gajim . get_resource_from_jid ( array [ 0 ] )
2005-07-16 09:33:43 +00:00
msg_type = array [ 4 ]
2005-07-21 14:56:39 +00:00
chatstate = array [ 6 ]
2005-04-18 14:05:30 +00:00
if jid . find ( ' @ ' ) < = 0 :
2005-03-05 21:02:38 +00:00
jid = jid . replace ( ' @ ' , ' ' )
2005-06-07 16:52:24 +00:00
2005-09-23 21:01:42 +00:00
show_notification = False
if gajim . config . get ( ' notify_on_new_message ' ) :
# check OUR status and if we allow notifications for that status
if gajim . config . get ( ' autopopupaway ' ) : # always show notification
show_notification = True
elif gajim . connections [ account ] . connected in ( 2 , 3 ) : # we're online or chat
show_notification = True
2005-11-13 15:08:47 +00:00
if self . instances [ account ] [ ' gc ' ] . has_key ( jid ) : # it's a Private Message
2005-10-07 14:09:40 +00:00
nick = gajim . get_nick_from_fjid ( array [ 0 ] )
2005-10-07 14:01:35 +00:00
fjid = array [ 0 ]
2005-11-13 15:08:47 +00:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( fjid ) and \
2005-10-15 20:49:08 +00:00
not gajim . awaiting_events [ account ] . has_key ( fjid ) :
2005-09-23 21:01:42 +00:00
if show_notification :
2005-11-13 19:31:47 +00:00
notify . notify ( _ ( ' New Private Message ' ) , fjid , account , ' pm ' )
2005-09-23 21:01:42 +00:00
2005-11-13 15:08:47 +00:00
self . instances [ account ] [ ' gc ' ] [ jid ] . on_private_message ( jid , nick ,
2005-09-23 21:01:42 +00:00
array [ 1 ] , array [ 2 ] )
2005-06-07 16:52:24 +00:00
return
2005-04-14 07:05:10 +00:00
if gajim . config . get ( ' ignore_unknown_contacts ' ) and \
2005-07-18 21:08:31 +00:00
not gajim . contacts [ account ] . has_key ( jid ) :
2005-03-10 23:45:10 +00:00
return
2005-04-06 18:51:54 +00:00
2005-09-08 02:05:46 +00:00
# Handle chat states
contact = gajim . get_first_contact_instance_from_jid ( account , jid )
2005-11-13 15:08:47 +00:00
if self . instances [ account ] [ ' chats ' ] . has_key ( jid ) :
chat_win = self . instances [ account ] [ ' chats ' ] [ jid ]
2005-11-12 14:17:27 +00:00
if chatstate is not None : # he or she sent us reply, so he supports jep85
2005-11-22 00:28:36 +00:00
contact . chatstate = chatstate
if contact . our_chatstate == ' ask ' : # we were jep85 disco?
contact . our_chatstate = ' active ' # no more
2005-07-21 14:56:39 +00:00
2005-11-22 00:28:36 +00:00
chat_win . handle_incoming_chatstate ( account , contact )
2005-09-20 02:24:25 +00:00
elif contact . chatstate != ' active ' :
2005-07-19 19:10:03 +00:00
# got no valid jep85 answer, peer does not support it
2005-07-22 00:34:08 +00:00
contact . chatstate = False
2005-11-22 00:28:36 +00:00
elif contact and chatstate == ' active ' :
2005-09-08 02:05:46 +00:00
# Brand new message, incoming.
2005-11-22 00:28:36 +00:00
contact . our_chatstate = chatstate
contact . chatstate = chatstate
2005-07-19 19:10:03 +00:00
2005-07-22 00:34:08 +00:00
if not array [ 1 ] : #empty message text
2005-07-19 19:10:03 +00:00
return
2005-04-06 18:51:54 +00:00
first = False
2005-11-13 15:08:47 +00:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-10-15 20:49:08 +00:00
not gajim . awaiting_events [ account ] . has_key ( jid ) :
2005-04-06 18:51:54 +00:00
first = True
2005-04-17 21:31:18 +00:00
if gajim . config . get ( ' notify_on_new_message ' ) :
2005-04-18 23:55:13 +00:00
show_notification = False
# check OUR status and if we allow notifications for that status
if gajim . config . get ( ' autopopupaway ' ) : # always show notification
show_notification = True
2005-05-11 17:14:10 +00:00
elif gajim . connections [ account ] . connected in ( 2 , 3 ) : # we're online or chat
2005-04-18 23:55:13 +00:00
show_notification = True
if show_notification :
2005-07-16 09:33:43 +00:00
if msg_type == ' normal ' : # single message
2005-12-01 18:08:10 +00:00
notify . notify ( _ ( ' New Single Message ' ) , jid , account , msg_type )
2005-07-16 09:33:43 +00:00
else : # chat message
2005-11-13 19:31:47 +00:00
notify . notify ( _ ( ' New Message ' ) , jid , account , msg_type )
2005-07-16 09:33:43 +00:00
2005-07-07 15:41:03 +00:00
# array : (contact, msg, time, encrypted, msg_type, subject)
2005-07-05 21:35:37 +00:00
self . roster . on_message ( jid , array [ 1 ] , array [ 2 ] , account , array [ 3 ] ,
2005-10-07 14:01:35 +00:00
msg_type , array [ 5 ] , resource )
2005-06-03 18:40:43 +00:00
if gajim . config . get_per ( ' soundevents ' , ' first_message_received ' ,
2005-04-16 14:50:26 +00:00
' enabled ' ) and first :
2005-08-09 22:46:13 +00:00
helpers . play_sound ( ' first_message_received ' )
2005-06-03 18:40:43 +00:00
if gajim . config . get_per ( ' soundevents ' , ' next_message_received ' ,
2005-04-16 14:50:26 +00:00
' enabled ' ) and not first :
2005-08-09 22:46:13 +00:00
helpers . play_sound ( ' next_message_received ' )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' NewMessage ' , ( account , array ) )
2005-07-19 19:10:03 +00:00
2004-07-08 19:46:24 +00:00
def handle_event_msgerror ( self , account , array ) :
2005-04-25 22:22:23 +00:00
#('MSGERROR', account, (jid, error_code, error_msg, msg, time))
2005-06-12 22:45:41 +00:00
fjid = array [ 0 ]
2005-06-29 20:50:30 +00:00
jids = fjid . split ( ' / ' , 1 )
2005-06-12 22:45:41 +00:00
jid = jids [ 0 ]
2005-11-13 15:08:47 +00:00
gcs = self . instances [ account ] [ ' gc ' ]
2005-06-12 22:45:41 +00:00
if jid in gcs :
2005-06-18 14:38:37 +00:00
if len ( jids ) > 1 : # it's a pm
2005-06-12 22:45:41 +00:00
nick = jids [ 1 ]
2005-11-13 15:08:47 +00:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( fjid ) :
2005-06-12 22:45:41 +00:00
gc = gcs [ jid ]
tv = gc . list_treeview [ jid ]
model = tv . get_model ( )
2005-07-19 19:41:23 +00:00
i = gc . get_contact_iter ( jid , nick )
if i :
2005-08-06 10:20:04 +00:00
show = model [ i ] [ 3 ]
2005-06-12 22:45:41 +00:00
else :
show = ' offline '
2005-08-06 10:20:04 +00:00
c = Contact ( jid = fjid , name = nick , groups = [ ' none ' ] ,
2005-06-25 09:18:39 +00:00
show = show , ask = ' none ' )
2005-08-06 10:20:04 +00:00
self . roster . new_chat ( c , account )
2005-11-13 15:08:47 +00:00
self . instances [ account ] [ ' chats ' ] [ fjid ] . print_conversation (
2005-06-12 22:45:41 +00:00
' Error %s : %s ' % ( array [ 1 ] , array [ 2 ] ) , fjid , ' status ' )
return
gcs [ jid ] . print_conversation ( ' Error %s : %s ' % \
2005-04-25 22:22:23 +00:00
( array [ 1 ] , array [ 2 ] ) , jid )
2005-06-12 22:45:41 +00:00
if gcs [ jid ] . get_active_jid ( ) == jid :
gcs [ jid ] . set_subject ( jid ,
gcs [ jid ] . subjects [ jid ] )
2005-04-18 22:45:13 +00:00
return
2005-04-18 14:05:30 +00:00
if jid . find ( ' @ ' ) < = 0 :
2005-03-05 21:02:38 +00:00
jid = jid . replace ( ' @ ' , ' ' )
2005-04-14 09:38:08 +00:00
self . roster . on_message ( jid , _ ( ' error while sending ' ) + \
2005-09-15 17:33:02 +00:00
' \" %s \" ( %s ) ' % ( array [ 3 ] , array [ 2 ] ) , array [ 4 ] , account , \
msg_type = ' error ' )
2004-07-08 19:46:24 +00:00
2005-02-15 00:10:10 +00:00
def handle_event_msgsent ( self , account , array ) :
2005-07-20 11:39:01 +00:00
#('MSGSENT', account, (jid, msg, keyID))
2005-07-21 15:23:18 +00:00
msg = array [ 1 ]
# do not play sound when standalone chatstate message (eg no msg)
if msg and gajim . config . get_per ( ' soundevents ' , ' message_sent ' , ' enabled ' ) :
2005-08-09 22:46:13 +00:00
helpers . play_sound ( ' message_sent ' )
2005-02-15 00:10:10 +00:00
2004-06-20 21:58:12 +00:00
def handle_event_subscribe ( self , account , array ) :
#('SUBSCRIBE', account, (jid, text))
2005-10-20 11:17:17 +00:00
dialogs . SubscriptionRequestWindow ( array [ 0 ] , array [ 1 ] , account )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Subscribe ' , ( account , array ) )
2004-06-20 21:58:12 +00:00
def handle_event_subscribed ( self , account , array ) :
2005-02-04 07:58:40 +00:00
#('SUBSCRIBED', account, (jid, resource))
2004-06-20 21:58:12 +00:00
jid = array [ 0 ]
2005-07-18 21:08:31 +00:00
if gajim . contacts [ account ] . has_key ( jid ) :
2005-07-22 00:01:05 +00:00
c = gajim . get_first_contact_instance_from_jid ( account , jid )
c . resource = array [ 1 ]
self . roster . remove_contact ( c , account )
if _ ( ' not in the roster ' ) in c . groups :
c . groups . remove ( _ ( ' not in the roster ' ) )
if len ( c . groups ) == 0 :
c . groups = [ _ ( ' General ' ) ]
self . roster . add_contact_to_roster ( c . jid , account )
gajim . connections [ account ] . update_contact ( c . jid , c . name , c . groups )
2004-06-20 21:58:12 +00:00
else :
2005-05-29 21:34:01 +00:00
keyID = ' '
attached_keys = gajim . config . get_per ( ' accounts ' , account ,
' attached_gpg_keys ' ) . split ( )
if jid in attached_keys :
keyID = attached_keys [ attached_keys . index ( jid ) + 1 ]
2005-10-12 20:00:59 +00:00
name = jid . split ( ' @ ' , 1 ) [ 0 ]
name = name . split ( ' % ' , 1 ) [ 0 ]
contact1 = Contact ( jid = jid , name = name , groups = [ _ ( ' General ' ) ] ,
show = ' online ' , status = ' online ' , ask = ' to ' ,
resource = array [ 1 ] , keyID = keyID )
2005-07-22 00:34:08 +00:00
gajim . contacts [ account ] [ jid ] = [ contact1 ]
2005-07-07 16:38:36 +00:00
self . roster . add_contact_to_roster ( jid , account )
2005-06-10 21:14:16 +00:00
dialogs . InformationDialog ( _ ( ' Authorization accepted ' ) ,
2005-11-12 14:15:32 +00:00
_ ( ' The contact " %s " has authorized you to see his or her status. ' )
2005-08-14 16:12:36 +00:00
% jid )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Subscribed ' , ( account , array ) )
2004-06-20 21:58:12 +00:00
def handle_event_unsubscribed ( self , account , jid ) :
2005-06-14 23:31:13 +00:00
dialogs . InformationDialog ( _ ( ' Contact " %s " removed subscription from you ' ) % jid ,
2005-11-12 14:20:20 +00:00
_ ( ' You will always see him or her as offline. ' ) )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Unsubscribed ' , ( account , jid ) )
2005-10-30 09:58:13 +00:00
def handle_event_agent_info_error ( self , account , agent ) :
#('AGENT_ERROR_INFO', account, (agent))
try :
gajim . connections [ account ] . services_cache . agent_info_error ( agent )
except AttributeError :
return
def handle_event_agent_items_error ( self , account , agent ) :
#('AGENT_ERROR_INFO', account, (agent))
try :
gajim . connections [ account ] . services_cache . agent_items_error ( agent )
except AttributeError :
return
2004-09-06 14:55:10 +00:00
2005-05-08 20:56:11 +00:00
def handle_event_register_agent_info ( self , account , array ) :
2005-10-05 10:13:31 +00:00
#('REGISTER_AGENT_INFO', account, (agent, infos, is_form))
2005-05-08 20:56:11 +00:00
if array [ 1 ] . has_key ( ' instructions ' ) :
2005-10-20 11:17:17 +00:00
config . ServiceRegistrationWindow ( array [ 0 ] , array [ 1 ] , account ,
2005-10-05 10:13:31 +00:00
array [ 2 ] )
2005-05-08 20:56:11 +00:00
else :
2005-06-10 21:14:16 +00:00
dialogs . ErrorDialog ( _ ( ' Contact with " %s " cannot be established ' \
2005-06-07 01:10:24 +00:00
% array [ 0 ] ) , _ ( ' Check your connection or try again later. ' ) ) . get_response ( )
2005-05-08 20:56:11 +00:00
2005-03-27 10:31:26 +00:00
def handle_event_agent_info_items ( self , account , array ) :
2005-04-23 21:54:12 +00:00
#('AGENT_INFO_ITEMS', account, (agent, node, items))
2005-10-30 09:58:13 +00:00
try :
gajim . connections [ account ] . services_cache . agent_items ( array [ 0 ] ,
array [ 1 ] , array [ 2 ] )
except AttributeError :
return
2005-03-27 10:31:26 +00:00
def handle_event_agent_info_info ( self , account , array ) :
2005-10-30 09:58:13 +00:00
#('AGENT_INFO_INFO', account, (agent, node, identities, features, data))
try :
gajim . connections [ account ] . services_cache . agent_info ( array [ 0 ] ,
array [ 1 ] , array [ 2 ] , array [ 3 ] , array [ 4 ] )
except AttributeError :
return
2005-03-27 10:31:26 +00:00
2004-06-20 21:58:12 +00:00
def handle_event_acc_ok ( self , account , array ) :
2005-11-04 21:27:14 +00:00
#('ACC_OK', account, (config))
2005-11-13 15:08:47 +00:00
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . acc_is_ok ( array )
2005-11-04 21:27:14 +00:00
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' NewAccount ' , ( account , array ) )
2004-06-20 21:58:12 +00:00
2005-11-04 21:27:14 +00:00
def handle_event_acc_not_ok ( self , account , array ) :
#('ACC_NOT_OK', account, (reason))
2005-11-13 15:08:47 +00:00
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . acc_is_not_ok ( array )
2005-11-04 21:27:14 +00:00
2004-06-20 21:58:12 +00:00
def handle_event_quit ( self , p1 , p2 ) :
2005-10-20 11:17:17 +00:00
self . roster . quit_gtkgui_interface ( )
2005-04-12 15:30:09 +00:00
2004-06-21 00:12:25 +00:00
def handle_event_myvcard ( self , account , array ) :
2004-06-20 21:58:12 +00:00
nick = ' '
2004-06-21 00:12:25 +00:00
if array . has_key ( ' NICKNAME ' ) :
nick = array [ ' NICKNAME ' ]
2005-06-30 06:16:32 +00:00
if nick :
2005-07-18 21:08:31 +00:00
gajim . nicks [ account ] = nick
2005-11-13 15:08:47 +00:00
if self . instances [ account ] [ ' infos ' ] . has_key ( array [ ' jid ' ] ) :
win = self . instances [ account ] [ ' infos ' ] [ array [ ' jid ' ] ]
2005-11-07 15:43:47 +00:00
win . set_values ( array )
if account in self . show_vcard_when_connect :
win . xml . get_widget ( ' information_notebook ' ) . set_current_page ( - 1 )
win . xml . get_widget ( ' set_avatar_button ' ) . clicked ( )
self . show_vcard_when_connect . remove ( account )
2004-06-20 21:58:12 +00:00
2005-10-03 16:14:41 +00:00
def handle_event_vcard ( self , account , vcard ) :
2005-10-12 20:10:42 +00:00
# ('VCARD', account, data)
2005-10-03 16:14:41 +00:00
''' vcard holds the vcard data '''
jid = vcard [ ' jid ' ]
2005-11-28 16:26:19 +00:00
resource = ' '
if vcard . has_key ( ' resource ' ) :
resource = vcard [ ' resource ' ]
2005-10-03 16:14:41 +00:00
# vcard window
2005-06-26 19:59:34 +00:00
win = None
2005-11-13 15:08:47 +00:00
if self . instances [ account ] [ ' infos ' ] . has_key ( jid ) :
win = self . instances [ account ] [ ' infos ' ] [ jid ]
2005-11-28 16:26:19 +00:00
elif resource and self . instances [ account ] [ ' infos ' ] . has_key (
jid + ' / ' + resource ) :
2005-11-13 15:08:47 +00:00
win = self . instances [ account ] [ ' infos ' ] [ jid + ' / ' + resource ]
2005-06-26 19:40:57 +00:00
if win :
2005-10-30 21:39:09 +00:00
win . set_values ( vcard )
2005-07-20 13:13:52 +00:00
2005-10-03 16:14:41 +00:00
# show avatar in chat
2005-07-20 13:13:52 +00:00
win = None
2005-11-13 15:08:47 +00:00
if self . instances [ account ] [ ' chats ' ] . has_key ( jid ) :
win = self . instances [ account ] [ ' chats ' ] [ jid ]
2005-11-28 16:26:19 +00:00
elif resource and self . instances [ account ] [ ' chats ' ] . has_key (
jid + ' / ' + resource ) :
2005-11-13 15:08:47 +00:00
win = self . instances [ account ] [ ' chats ' ] [ jid + ' / ' + resource ]
2005-07-20 13:20:47 +00:00
if win :
2005-10-03 20:17:55 +00:00
win . show_avatar ( jid , resource )
2005-11-14 18:14:28 +00:00
# Show avatar in roster
2005-11-19 16:59:09 +00:00
self . roster . draw_avatar ( jid , account )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' VcardInfo ' , ( account , vcard ) )
2004-06-20 21:58:12 +00:00
2005-04-06 20:18:55 +00:00
def handle_event_os_info ( self , account , array ) :
2005-07-20 12:48:11 +00:00
win = None
2005-11-13 15:08:47 +00:00
if self . instances [ account ] [ ' infos ' ] . has_key ( array [ 0 ] ) :
win = self . instances [ account ] [ ' infos ' ] [ array [ 0 ] ]
elif self . instances [ account ] [ ' infos ' ] . has_key ( array [ 0 ] + ' / ' + array [ 1 ] ) :
win = self . instances [ account ] [ ' infos ' ] [ array [ 0 ] + ' / ' + array [ 1 ] ]
2005-07-20 12:48:11 +00:00
if win :
win . set_os_info ( array [ 1 ] , array [ 2 ] , array [ 3 ] )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' OsInfo ' , ( account , array ) )
2005-04-06 20:18:55 +00:00
2005-09-19 16:13:45 +00:00
def handle_event_gc_notify ( self , account , array ) :
#('GC_NOTIFY', account, (jid, status, message, resource,
# role, affiliation, jid, reason, actor, statusCode, newNick))
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
resource = array [ 3 ]
if not resource :
resource = ' '
2005-11-13 15:08:47 +00:00
if self . instances [ account ] [ ' gc ' ] . has_key ( jid ) : # ji is then room_jid
2005-09-19 16:13:45 +00:00
#FIXME: upgrade the chat instances (for pm)
#FIXME: real_jid can be None
2005-11-13 15:08:47 +00:00
self . instances [ account ] [ ' gc ' ] [ jid ] . chg_contact_status ( jid , resource ,
2005-09-19 16:13:45 +00:00
array [ 1 ] , array [ 2 ] , array [ 4 ] , array [ 5 ] , array [ 6 ] , array [ 7 ] ,
array [ 8 ] , array [ 9 ] , array [ 10 ] , account )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' GCPresence ' , ( account , array ) )
2005-09-19 16:13:45 +00:00
2004-08-04 22:40:22 +00:00
def handle_event_gc_msg ( self , account , array ) :
2005-09-23 21:01:42 +00:00
# ('GC_MSG', account, (jid, msg, time))
2005-06-29 20:50:30 +00:00
jids = array [ 0 ] . split ( ' / ' , 1 )
2005-09-23 21:01:42 +00:00
room_jid = jids [ 0 ]
2005-11-13 15:08:47 +00:00
if not self . instances [ account ] [ ' gc ' ] . has_key ( room_jid ) :
2004-08-04 22:40:22 +00:00
return
if len ( jids ) == 1 :
2005-09-23 21:01:42 +00:00
# message from server
nick = ' '
2004-08-04 22:40:22 +00:00
else :
2005-09-23 21:01:42 +00:00
# message from someone
nick = jids [ 1 ]
2005-12-01 18:03:05 +00:00
self . instances [ account ] [ ' gc ' ] [ room_jid ] . on_message ( room_jid , nick ,
array [ 1 ] , array [ 2 ] )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' GCMessage ' , ( account , array ) )
2004-08-04 22:40:22 +00:00
2005-03-04 21:27:45 +00:00
def handle_event_gc_subject ( self , account , array ) :
#('GC_SUBJECT', account, (jid, subject))
2005-06-29 20:50:30 +00:00
jids = array [ 0 ] . split ( ' / ' , 1 )
2005-03-04 21:27:45 +00:00
jid = jids [ 0 ]
2005-11-13 15:08:47 +00:00
if not self . instances [ account ] [ ' gc ' ] . has_key ( jid ) :
2005-03-04 21:27:45 +00:00
return
2005-11-13 15:08:47 +00:00
self . instances [ account ] [ ' gc ' ] [ jid ] . set_subject ( jid , array [ 1 ] )
2005-03-04 21:52:27 +00:00
if len ( jids ) > 1 :
2005-11-13 15:08:47 +00:00
self . instances [ account ] [ ' gc ' ] [ jid ] . print_conversation (
2005-03-04 21:52:27 +00:00
' %s has set the subject to %s ' % ( jids [ 1 ] , array [ 1 ] ) , jid )
2005-03-04 21:27:45 +00:00
2005-04-20 10:21:33 +00:00
def handle_event_gc_config ( self , account , array ) :
#('GC_CONFIG', account, (jid, config)) config is a dict
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
2005-11-13 15:08:47 +00:00
if not self . instances [ account ] [ ' gc_config ' ] . has_key ( jid ) :
self . instances [ account ] [ ' gc_config ' ] [ jid ] = \
2005-10-20 11:17:17 +00:00
config . GroupchatConfigWindow ( account , jid , array [ 1 ] )
2005-09-11 15:02:22 +00:00
def handle_event_gc_invitation ( self , account , array ) :
2005-10-04 10:59:11 +00:00
#('GC_INVITATION', (room_jid, jid_from, reason, password))
2005-10-20 11:17:17 +00:00
dialogs . InvitationReceivedDialog ( account , array [ 0 ] , array [ 1 ] ,
2005-10-04 10:59:11 +00:00
array [ 3 ] , array [ 2 ] )
2005-09-11 15:02:22 +00:00
2004-10-10 18:44:38 +00:00
def handle_event_bad_passphrase ( self , account , array ) :
2005-08-30 21:10:14 +00:00
use_gpg_agent = gajim . config . get ( ' use_gpg_agent ' )
if use_gpg_agent :
return
2005-06-18 17:00:54 +00:00
keyID = gajim . config . get_per ( ' accounts ' , account , ' keyid ' )
self . roster . forget_gpg_passphrase ( keyID )
2005-08-01 22:48:58 +00:00
dialogs . WarningDialog ( _ ( ' Your passphrase is incorrect ' ) ,
_ ( ' You are currently connected without your OpenPGP key. ' ) ) . get_response ( )
2004-10-10 18:44:38 +00:00
2004-11-18 17:15:15 +00:00
def handle_event_roster_info ( self , account , array ) :
#('ROSTER_INFO', account, (jid, name, sub, ask, groups))
jid = array [ 0 ]
2005-07-18 21:08:31 +00:00
if not gajim . contacts [ account ] . has_key ( jid ) :
2004-11-18 17:15:15 +00:00
return
2005-11-01 15:28:19 +00:00
contacts = gajim . contacts [ account ] [ jid ]
2004-11-18 17:15:15 +00:00
if not ( array [ 2 ] or array [ 3 ] ) :
2005-11-01 15:28:19 +00:00
self . roster . remove_contact ( contacts [ 0 ] , account )
2005-07-18 21:08:31 +00:00
del gajim . contacts [ account ] [ jid ]
2005-11-13 17:43:41 +00:00
#FIXME if it was the only one in its group, remove the group
2004-11-18 17:15:15 +00:00
return
2005-11-01 15:28:19 +00:00
for contact in contacts :
2004-11-18 19:21:20 +00:00
name = array [ 1 ]
2005-02-04 07:58:40 +00:00
if name :
2005-11-01 15:28:19 +00:00
contact . name = name
contact . sub = array [ 2 ]
contact . ask = array [ 3 ]
2005-03-27 21:35:55 +00:00
if array [ 4 ] :
2005-11-01 15:28:19 +00:00
contact . groups = array [ 4 ]
2005-04-23 00:37:51 +00:00
self . roster . draw_contact ( jid , account )
2005-11-19 22:01:10 +00:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' RosterInfo ' , ( account , array ) )
2004-11-18 17:15:15 +00:00
2005-06-11 17:21:30 +00:00
def handle_event_bookmarks ( self , account , bms ) :
2005-08-18 19:06:24 +00:00
# ('BOOKMARKS', account, [{name,jid,autojoin,password,nick}, {}])
# We received a bookmark item from the server (JEP48)
# Auto join GC windows if neccessary
2005-11-16 10:35:11 +00:00
self . roster . make_menu ( ) # update the menu to show our bookmarks
invisible_show = gajim . SHOW_LIST . index ( ' invisible ' )
# do not autojoin if we are invisible
if gajim . connections [ account ] . connected == invisible_show :
return
2005-11-27 12:29:30 +00:00
# join autojoinable rooms
2005-11-27 09:41:48 +00:00
for bm in bms :
if bm [ ' autojoin ' ] in ( ' 1 ' , ' true ' ) :
self . roster . join_gc_room ( account , bm [ ' jid ' ] , bm [ ' nick ' ] ,
bm [ ' password ' ] )
2005-08-06 16:18:25 +00:00
def handle_event_file_send_error ( self , account , array ) :
jid = array [ 0 ]
file_props = array [ 1 ]
2005-11-13 15:08:47 +00:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 20:31:44 +00:00
ft . set_status ( file_props [ ' type ' ] , file_props [ ' sid ' ] , ' stop ' )
2005-10-19 20:16:22 +00:00
if gajim . popup_window ( account ) :
ft . show_send_error ( file_props )
return
self . add_event ( account , jid , ' file-send-error ' , file_props )
if gajim . show_notification ( account ) :
2005-11-11 19:06:48 +00:00
notify . notify ( _ ( ' File Transfer Error ' ) ,
2005-11-01 00:02:31 +00:00
jid , account , ' file-send-error ' , file_props )
2005-10-18 20:30:26 +00:00
def add_event ( self , account , jid , typ , args ) :
''' add an event to the awaiting_events var '''
# We add it to the awaiting_events queue
# Do we have a queue?
qs = gajim . awaiting_events [ account ]
no_queue = False
if not qs . has_key ( jid ) :
no_queue = True
qs [ jid ] = [ ]
qs [ jid ] . append ( ( typ , args ) )
self . roster . nb_unread + = 1
self . roster . show_title ( )
if no_queue : # We didn't have a queue: we change icons
self . roster . draw_contact ( jid , account )
if self . systray_enabled :
self . systray . add_jid ( jid , account , typ )
def remove_first_event ( self , account , jid , typ = None ) :
qs = gajim . awaiting_events [ account ]
event = gajim . get_first_event ( account , jid , typ )
qs [ jid ] . remove ( event )
self . roster . nb_unread - = 1
self . roster . show_title ( )
# Is it the last event?
if not len ( qs [ jid ] ) :
del qs [ jid ]
self . roster . draw_contact ( jid , account )
if self . systray_enabled :
self . systray . remove_jid ( jid , account , typ )
2005-08-06 16:18:25 +00:00
def handle_event_file_request_error ( self , account , array ) :
jid = array [ 0 ]
file_props = array [ 1 ]
2005-11-13 15:08:47 +00:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 20:31:44 +00:00
ft . set_status ( file_props [ ' type ' ] , file_props [ ' sid ' ] , ' stop ' )
2005-10-19 20:16:22 +00:00
errno = file_props [ ' error ' ]
2005-10-18 20:30:26 +00:00
if gajim . popup_window ( account ) :
if errno in ( - 4 , - 5 ) :
ft . show_stopped ( jid , file_props )
else :
ft . show_request_error ( file_props )
return
2005-10-19 20:16:22 +00:00
if errno in ( - 4 , - 5 ) :
msg_type = ' file-error '
else :
msg_type = ' file-request-error '
2005-11-01 17:12:40 +00:00
self . add_event ( account , jid , msg_type , file_props )
2005-10-18 20:30:26 +00:00
if gajim . show_notification ( account ) :
2005-08-06 16:18:25 +00:00
# check if we should be notified
2005-11-11 19:06:48 +00:00
notify . notify ( _ ( ' File Transfer Error ' ) ,
2005-11-01 00:02:31 +00:00
jid , account , msg_type , file_props )
2005-10-18 20:30:26 +00:00
2005-07-30 10:20:46 +00:00
def handle_event_file_request ( self , account , array ) :
jid = array [ 0 ]
if not gajim . contacts [ account ] . has_key ( jid ) :
return
file_props = array [ 1 ]
2005-08-17 09:59:59 +00:00
contact = gajim . contacts [ account ] [ jid ] [ 0 ]
2005-10-18 09:07:52 +00:00
2005-10-18 20:30:26 +00:00
if gajim . popup_window ( account ) :
2005-11-13 15:08:47 +00:00
self . instances [ ' file_transfers ' ] . show_file_request ( account , contact ,
2005-10-18 09:07:52 +00:00
file_props )
return
2005-10-19 10:39:23 +00:00
self . add_event ( account , jid , ' file-request ' , file_props )
2005-10-18 09:07:52 +00:00
2005-10-18 20:30:26 +00:00
if gajim . show_notification ( account ) :
2005-11-11 19:06:48 +00:00
notify . notify ( _ ( ' File Transfer Request ' ) ,
2005-10-20 11:40:29 +00:00
jid , account , ' file-request ' )
2005-10-18 09:07:52 +00:00
2005-08-01 15:02:46 +00:00
def handle_event_file_progress ( self , account , file_props ) :
2005-11-13 15:08:47 +00:00
self . instances [ ' file_transfers ' ] . set_progress ( file_props [ ' type ' ] ,
2005-08-01 15:02:46 +00:00
file_props [ ' sid ' ] , file_props [ ' received-len ' ] )
2005-08-04 11:17:16 +00:00
2005-07-30 14:14:10 +00:00
def handle_event_file_rcv_completed ( self , account , file_props ) :
2005-11-13 15:08:47 +00:00
ft = self . instances [ ' file_transfers ' ]
2005-08-01 15:02:46 +00:00
if file_props [ ' error ' ] == 0 :
ft . set_progress ( file_props [ ' type ' ] , file_props [ ' sid ' ] ,
file_props [ ' received-len ' ] )
else :
ft . set_status ( file_props [ ' type ' ] , file_props [ ' sid ' ] , ' stop ' )
2005-08-04 11:17:16 +00:00
if file_props . has_key ( ' stalled ' ) and file_props [ ' stalled ' ] or \
file_props . has_key ( ' paused ' ) and file_props [ ' paused ' ] :
2005-08-04 07:23:14 +00:00
return
2005-08-26 00:52:44 +00:00
jid = unicode ( file_props [ ' sender ' ] )
2005-10-19 21:14:51 +00:00
if gajim . popup_window ( account ) :
2005-08-04 11:17:16 +00:00
if file_props [ ' error ' ] == 0 :
2005-11-01 11:25:01 +00:00
if gajim . config . get ( ' notify_on_file_complete ' ) :
ft . show_completed ( jid , file_props )
2005-08-04 11:17:16 +00:00
elif file_props [ ' error ' ] == - 1 :
2005-10-19 21:14:51 +00:00
ft . show_stopped ( jid , file_props )
return
2005-11-01 11:25:01 +00:00
msg_type = ' '
2005-11-21 09:59:19 +00:00
event_type = ' '
2005-11-01 11:25:01 +00:00
if file_props [ ' error ' ] == 0 and gajim . config . get ( ' notify_on_file_complete ' ) :
2005-10-19 21:14:51 +00:00
msg_type = ' file-completed '
event_type = _ ( ' File Transfer Completed ' )
elif file_props [ ' error ' ] == - 1 :
msg_type = ' file-stopped '
event_type = _ ( ' File Transfer Stopped ' )
2005-11-21 09:59:19 +00:00
2005-12-01 18:03:05 +00:00
if event_type == ' ' :
# FIXME: ugly workaround (this can happen Gajim sent, Gaim recvs)
2005-11-21 09:59:19 +00:00
# this should never happen but it does. see process_result() in socks5.py
# who calls this func (sth is really wrong unless this func is also registered
# as progress_cb
return
2005-10-19 21:14:51 +00:00
2005-11-01 11:25:01 +00:00
if msg_type :
self . add_event ( account , jid , msg_type , file_props )
2005-10-19 21:14:51 +00:00
if gajim . config . get ( ' notify_on_file_complete ' ) and \
2005-11-08 16:53:33 +00:00
( gajim . config . get ( ' autopopupaway ' ) or \
gajim . connections [ account ] . connected in ( 2 , 3 ) ) :
# we want to be notified and we are online/chat or we don't mind
# bugged when away/na/busy
2005-12-01 18:03:05 +00:00
notify . notify ( event_type , jid , account , msg_type , file_props )
2005-08-04 20:32:38 +00:00
def handle_event_stanza_arrived ( self , account , stanza ) :
2005-11-13 15:08:47 +00:00
if not self . instances . has_key ( account ) :
2005-08-10 11:52:37 +00:00
return
2005-11-13 15:08:47 +00:00
if self . instances [ account ] . has_key ( ' xml_console ' ) :
self . instances [ account ] [ ' xml_console ' ] . print_stanza ( stanza , ' incoming ' )
2005-08-05 23:43:28 +00:00
def handle_event_stanza_sent ( self , account , stanza ) :
2005-11-13 15:08:47 +00:00
if not self . instances . has_key ( account ) :
2005-08-10 11:52:37 +00:00
return
2005-11-13 15:08:47 +00:00
if self . instances [ account ] . has_key ( ' xml_console ' ) :
self . instances [ account ] [ ' xml_console ' ] . print_stanza ( stanza , ' outgoing ' )
2005-08-04 20:32:38 +00:00
2005-09-10 09:25:06 +00:00
def handle_event_vcard_published ( self , account , array ) :
2005-10-02 21:56:38 +00:00
dialogs . InformationDialog ( _ ( ' vCard publication succeeded ' ) , _ ( ' Your personal information has been published successfully. ' ) )
2005-09-10 09:25:06 +00:00
def handle_event_vcard_not_published ( self , account , array ) :
2005-10-02 21:56:38 +00:00
dialogs . InformationDialog ( _ ( ' vCard publication failed ' ) , _ ( ' There was an error while publishing your personal information, try again later. ' ) )
2005-11-27 12:29:30 +00:00
2005-11-27 12:42:42 +00:00
def handle_event_signed_in ( self , account , empty ) :
2005-11-30 18:19:25 +00:00
''' SIGNED_IN event is emitted when we sign in, so handle it '''
2005-11-27 12:29:30 +00:00
# join already open groupchats
2005-11-30 17:45:34 +00:00
for room_jid in self . instances [ account ] [ ' gc ' ] :
if room_jid == ' tabbed ' :
continue
if gajim . gc_connected [ account ] [ room_jid ] :
continue
room , server = gajim . get_room_name_and_server_from_room_jid (
room_jid )
nick = self . instances [ account ] [ ' gc ' ] [ room_jid ] . nicks [ room_jid ]
password = ' '
if gajim . gc_passwords . has_key ( room_jid ) :
password = gajim . gc_passwords [ room_jid ]
gajim . connections [ account ] . join_gc ( nick , room , server , password )
2005-11-27 12:29:30 +00:00
2004-01-20 12:46:27 +00:00
def read_sleepy ( self ) :
2005-07-22 11:07:06 +00:00
''' Check idle status and change that status if needed '''
2004-10-20 22:53:15 +00:00
if not self . sleeper . poll ( ) :
2005-09-10 23:44:53 +00:00
# idle detection is not supported in that OS
return False # stop looping in vain
2004-05-29 04:05:06 +00:00
state = self . sleeper . getState ( )
2005-04-14 07:05:10 +00:00
for account in gajim . connections :
2005-07-18 22:39:59 +00:00
if not gajim . sleeper_state . has_key ( account ) or \
not gajim . sleeper_state [ account ] :
2004-05-29 04:05:06 +00:00
continue
if state == common . sleepy . STATE_AWAKE and \
2005-07-23 11:52:53 +00:00
gajim . sleeper_state [ account ] in ( ' autoaway ' , ' autoxa ' ) :
2005-09-14 00:02:32 +00:00
#we go online
2005-07-22 21:27:04 +00:00
self . roster . send_status ( account , ' online ' ,
2005-09-14 00:02:32 +00:00
gajim . status_before_autoaway [ account ] )
2005-07-22 11:07:06 +00:00
gajim . sleeper_state [ account ] = ' online '
2004-05-29 04:05:06 +00:00
elif state == common . sleepy . STATE_AWAY and \
2005-07-22 11:07:06 +00:00
gajim . sleeper_state [ account ] == ' online ' and \
2005-04-14 07:05:10 +00:00
gajim . config . get ( ' autoaway ' ) :
2005-07-22 21:27:04 +00:00
#we save out online status
gajim . status_before_autoaway [ account ] = \
gajim . connections [ account ] . status
2005-08-30 21:38:59 +00:00
#we go away (no auto status) [we pass True to auto param]
2005-08-06 15:17:20 +00:00
self . roster . send_status ( account , ' away ' ,
2005-09-14 00:02:32 +00:00
gajim . config . get ( ' autoaway_message ' ) , auto = True )
2005-07-22 11:07:06 +00:00
gajim . sleeper_state [ account ] = ' autoaway '
2005-09-10 23:44:53 +00:00
elif state == common . sleepy . STATE_XA and ( \
2005-07-22 11:07:06 +00:00
gajim . sleeper_state [ account ] == ' autoaway ' or \
gajim . sleeper_state [ account ] == ' online ' ) and \
2005-04-14 07:05:10 +00:00
gajim . config . get ( ' autoxa ' ) :
2005-08-30 21:38:59 +00:00
#we go extended away [we pass True to auto param]
2005-08-06 15:17:20 +00:00
self . roster . send_status ( account , ' xa ' ,
2005-09-14 00:02:32 +00:00
gajim . config . get ( ' autoxa_message ' ) , auto = True )
2005-07-22 11:07:06 +00:00
gajim . sleeper_state [ account ] = ' autoxa '
2005-04-18 14:05:30 +00:00
return True # renew timeout (loop for ever)
2003-11-30 22:40:24 +00:00
2004-12-01 20:47:37 +00:00
def autoconnect ( self ) :
2005-04-18 14:05:30 +00:00
''' auto connect at startup '''
2005-07-22 11:07:52 +00:00
ask_message = False
2005-04-14 07:05:10 +00:00
for a in gajim . connections :
if gajim . config . get_per ( ' accounts ' , a , ' autoconnect ' ) :
2005-07-22 11:07:52 +00:00
ask_message = True
2005-04-14 07:05:10 +00:00
break
2005-03-15 20:01:04 +00:00
if ask_message :
2005-05-12 00:22:36 +00:00
message = self . roster . get_status_message ( ' online ' )
2005-03-15 20:01:04 +00:00
if message == - 1 :
return
2005-04-14 07:05:10 +00:00
for a in gajim . connections :
if gajim . config . get_per ( ' accounts ' , a , ' autoconnect ' ) :
2005-05-12 00:22:36 +00:00
self . roster . send_status ( a , ' online ' , message )
2005-04-18 14:05:30 +00:00
return False
2004-12-01 20:47:37 +00:00
2004-12-14 12:57:45 +00:00
def show_systray ( self ) :
self . systray . show_icon ( )
2005-03-28 01:20:47 +00:00
self . systray_enabled = True
2004-12-14 12:57:45 +00:00
def hide_systray ( self ) :
self . systray . hide_icon ( )
2005-03-28 01:20:47 +00:00
self . systray_enabled = False
2005-03-09 21:29:20 +00:00
def image_is_ok ( self , image ) :
if not os . path . exists ( image ) :
return False
img = gtk . Image ( )
try :
img . set_from_file ( image )
except :
2005-06-18 14:57:25 +00:00
return False
2005-06-18 15:57:06 +00:00
t = img . get_storage_type ( )
if t != gtk . IMAGE_PIXBUF and t != gtk . IMAGE_ANIMATION :
2005-03-09 21:29:20 +00:00
return False
return True
2005-03-10 18:20:23 +00:00
2005-03-13 17:04:57 +00:00
def make_regexps ( self ) :
2005-03-10 18:20:23 +00:00
# regexp meta characters are: . ^ $ * + ? { } [ ] \ | ( )
# one escapes the metachars with \
# \S matches anything but ' ' '\t' '\n' '\r' '\f' and '\v'
# \s matches any whitespace character
# \w any alphanumeric character
# \W any non-alphanumeric character
2005-03-10 22:53:40 +00:00
# \b means word boundary. This is a zero-width assertion that
# matches only at the beginning or end of a word.
2005-03-11 02:35:54 +00:00
# ^ matches at the beginning of lines
2005-03-10 22:53:40 +00:00
#
2005-03-10 18:20:23 +00:00
# * means 0 or more times
# + means 1 or more times
2005-03-10 22:53:40 +00:00
# ? means 0 or 1 time
2005-03-10 18:20:23 +00:00
# | means or
# [^*] anything but '*' (inside [] you don't have to escape metachars)
# [^\s*] anything but whitespaces and '*'
2005-03-11 16:24:04 +00:00
# (?<!\S) is a one char lookbehind assertion and asks for any leading whitespace
# and mathces beginning of lines so we have correct formatting detection
2005-03-29 16:16:42 +00:00
# even if the the text is just '*foo*'
2005-03-11 22:52:28 +00:00
# (?!\S) is the same thing but it's a lookahead assertion
2005-08-01 14:38:21 +00:00
# \S*[^\s\W] --> in the matching string don't match ? or ) etc.. if at the end
2005-03-29 21:28:58 +00:00
# so http://be) will match http://be and http://be)be) will match http://be)be
2005-10-31 23:31:18 +00:00
2005-10-31 23:59:26 +00:00
prefixes = ( r ' http:// ' , r ' https:// ' , r ' news:// ' , r ' ftp:// ' , r ' ed2k:// ' ,
2005-11-27 22:28:33 +00:00
r ' magnet: ' , r ' www \ . ' , r ' ftp \ . ' )
2005-10-31 23:33:33 +00:00
# NOTE: it's ok to catch www.gr such stuff exist!
2005-10-31 23:31:18 +00:00
2005-11-27 22:05:10 +00:00
#FIXME: recognize xmpp: and treat it specially
2005-10-31 23:31:18 +00:00
prefix_pattern = ' '
for prefix in prefixes :
prefix_pattern + = prefix + ' | '
2005-10-31 23:48:36 +00:00
prefix_pattern = prefix_pattern [ : - 1 ] # remove last |
2005-10-31 23:31:18 +00:00
prefix_pattern = ' ( ' + prefix_pattern + ' ) '
links = r ' \ b ' + prefix_pattern + r ' \ S*[^ \ s \ W]| '
2005-03-10 18:20:23 +00:00
#2nd one: at_least_one_char@at_least_one_char.at_least_one_char
2005-08-01 14:38:21 +00:00
mail = r ' \ bmailto: \ S*[^ \ s \ W]| ' r ' \ b \ S+@ \ S+ \ . \ S*[^ \ s \ W]| '
2005-03-10 18:20:23 +00:00
2005-11-13 21:46:04 +00:00
#detects eg. *b* *bold* *bold bold* test *bold* *bold*! (*bold*)
2005-03-11 12:55:38 +00:00
#doesn't detect (it's a feature :P) * bold* *bold * * bold * test*bold*
2005-11-13 21:46:04 +00:00
formatting = r ' (?<! \ w) ' r ' \ *[^ \ s*] ' r ' ([^*]*[^ \ s*])? ' r ' \ *(?! \ w)| ' \
2005-11-14 21:26:20 +00:00
r ' (?<! \ w| \ <) ' r ' /[^ \ s/] ' r ' ([^/]*[^ \ s/])? ' r ' /(?! \ w)| ' \
2005-11-13 21:50:54 +00:00
r ' (?<! \ w) ' r ' _[^ \ s_] ' r ' ([^_]*[^ \ s_])? ' r ' _(?! \ w) '
2005-03-11 16:24:04 +00:00
2005-03-13 17:04:57 +00:00
basic_pattern = links + mail + formatting
self . basic_pattern_re = sre . compile ( basic_pattern , sre . IGNORECASE )
2005-11-15 14:17:02 +00:00
emoticons_pattern = ' '
2005-11-15 11:52:40 +00:00
if gajim . config . get ( ' useemoticons ' ) :
# When an emoticon is bordered by an alpha-numeric character it is NOT
# expanded. e.g., foo:) NO, foo :) YES, (brb) NO, (:)) YES, etc.
2005-11-30 18:35:40 +00:00
# We still allow multiple emoticons side-by-side like :P:P:P
# sort keys by length so :qwe emot is checked before :q
2005-11-15 11:52:40 +00:00
keys = self . emoticons . keys ( )
keys . sort ( self . on_emoticon_sort )
2005-11-30 18:35:40 +00:00
emoticons_pattern_prematch = ' '
emoticons_pattern_postmatch = ' '
emoticon_length = 0
2005-11-15 11:52:40 +00:00
for emoticon in keys : # travel thru emoticons list
emoticon_escaped = sre . escape ( emoticon ) # espace regexp metachars
emoticons_pattern + = emoticon_escaped + ' | ' # | means or in regexp
2005-11-30 18:35:40 +00:00
if ( emoticon_length != len ( emoticon ) ) :
# Build up expressions to match emoticons next to other emoticons
emoticons_pattern_prematch = emoticons_pattern_prematch [ : - 1 ] + ' )|(?<= '
emoticons_pattern_postmatch = emoticons_pattern_postmatch [ : - 1 ] + ' )|(?= '
emoticon_length = len ( emoticon )
emoticons_pattern_prematch + = emoticon_escaped + ' | '
emoticons_pattern_postmatch + = emoticon_escaped + ' | '
# We match from our list of emoticons, but they must either have
# whitespace, or another emoticon next to it to match successfully
emoticons_pattern = ' | ' + \
' (?:(?<! \ w ' + emoticons_pattern_prematch [ : - 1 ] + ' )) ' + \
' (?: ' + emoticons_pattern [ : - 1 ] + ' ) ' + \
' (?:(?! \ w ' + emoticons_pattern_postmatch [ : - 1 ] + ' )) '
2005-11-13 21:46:04 +00:00
# because emoticons match later (in the string) they need to be after
# basic matches that may occur earlier
2005-11-30 18:35:40 +00:00
emot_and_basic_pattern = basic_pattern + emoticons_pattern
2005-11-13 20:47:15 +00:00
self . emot_and_basic_re = sre . compile ( emot_and_basic_pattern , sre . IGNORECASE )
2005-03-13 17:04:57 +00:00
# at least one character in 3 parts (before @, after @, after .)
2005-08-01 14:27:23 +00:00
self . sth_at_sth_dot_sth_re = sre . compile ( r ' \ S+@ \ S+ \ . \ S*[^ \ s)?] ' )
2005-11-27 21:57:41 +00:00
sre . purge ( ) # clear the regular expression cache
2005-03-10 18:20:23 +00:00
2005-10-31 23:48:36 +00:00
def on_emoticon_sort ( self , emot1 , emot2 ) :
2005-09-08 11:25:47 +00:00
len1 = len ( emot1 )
len2 = len ( emot2 )
if len1 < len2 :
return 1
elif len1 > len2 :
return - 1
return 0
2005-03-12 23:43:17 +00:00
def on_launch_browser_mailer ( self , widget , url , kind ) :
2005-08-27 14:26:08 +00:00
helpers . launch_browser_mailer ( kind , url )
2004-12-14 12:57:45 +00:00
2005-11-15 11:52:40 +00:00
def init_emoticons ( self ) :
if not gajim . config . get ( ' useemoticons ' ) :
return
#initialize emoticons dictionary and unique images list
self . emoticons_images = list ( )
2005-04-06 18:51:54 +00:00
self . emoticons = dict ( )
2005-11-15 11:52:40 +00:00
2005-04-16 14:50:26 +00:00
emots = gajim . config . get_per ( ' emoticons ' )
for emot in emots :
emot_file = gajim . config . get_per ( ' emoticons ' , emot , ' path ' )
2005-04-06 18:51:54 +00:00
if not self . image_is_ok ( emot_file ) :
continue
2005-11-15 14:31:27 +00:00
# This avoids duplicated emoticons with the same image eg. :) and :-)
2005-11-15 11:52:40 +00:00
if not emot_file in self . emoticons . values ( ) :
pix = gtk . gdk . pixbuf_new_from_file ( emot_file )
if emot_file . endswith ( ' .gif ' ) :
pix = gtk . gdk . PixbufAnimation ( emot_file )
self . emoticons_images . append ( ( emot , pix ) )
2005-09-08 10:11:30 +00:00
self . emoticons [ emot . upper ( ) ] = emot_file
2005-11-15 11:52:40 +00:00
2005-11-10 10:16:25 +00:00
def register_handlers ( self ) :
2005-08-09 17:21:35 +00:00
self . handlers = {
' ROSTER ' : self . handle_event_roster ,
' WARNING ' : self . handle_event_warning ,
' ERROR ' : self . handle_event_error ,
' INFORMATION ' : self . handle_event_information ,
' ERROR_ANSWER ' : self . handle_event_error_answer ,
' STATUS ' : self . handle_event_status ,
' NOTIFY ' : self . handle_event_notify ,
' MSG ' : self . handle_event_msg ,
' MSGERROR ' : self . handle_event_msgerror ,
' MSGSENT ' : self . handle_event_msgsent ,
' SUBSCRIBED ' : self . handle_event_subscribed ,
' UNSUBSCRIBED ' : self . handle_event_unsubscribed ,
' SUBSCRIBE ' : self . handle_event_subscribe ,
2005-10-30 09:58:13 +00:00
' AGENT_ERROR_INFO ' : self . handle_event_agent_info_error ,
' AGENT_ERROR_ITEMS ' : self . handle_event_agent_items_error ,
2005-08-09 17:21:35 +00:00
' REGISTER_AGENT_INFO ' : self . handle_event_register_agent_info ,
' AGENT_INFO_ITEMS ' : self . handle_event_agent_info_items ,
' AGENT_INFO_INFO ' : self . handle_event_agent_info_info ,
' QUIT ' : self . handle_event_quit ,
' ACC_OK ' : self . handle_event_acc_ok ,
2005-11-04 21:27:14 +00:00
' ACC_NOT_OK ' : self . handle_event_acc_not_ok ,
2005-08-09 17:21:35 +00:00
' MYVCARD ' : self . handle_event_myvcard ,
' VCARD ' : self . handle_event_vcard ,
' OS_INFO ' : self . handle_event_os_info ,
2005-09-19 16:13:45 +00:00
' GC_NOTIFY ' : self . handle_event_gc_notify ,
2005-08-09 17:21:35 +00:00
' GC_MSG ' : self . handle_event_gc_msg ,
' GC_SUBJECT ' : self . handle_event_gc_subject ,
' GC_CONFIG ' : self . handle_event_gc_config ,
2005-09-11 15:02:22 +00:00
' GC_INVITATION ' : self . handle_event_gc_invitation ,
2005-08-09 17:21:35 +00:00
' BAD_PASSPHRASE ' : self . handle_event_bad_passphrase ,
' ROSTER_INFO ' : self . handle_event_roster_info ,
' BOOKMARKS ' : self . handle_event_bookmarks ,
' CON_TYPE ' : self . handle_event_con_type ,
' FILE_REQUEST ' : self . handle_event_file_request ,
' FILE_REQUEST_ERROR ' : self . handle_event_file_request_error ,
' FILE_SEND_ERROR ' : self . handle_event_file_send_error ,
' STANZA_ARRIVED ' : self . handle_event_stanza_arrived ,
' STANZA_SENT ' : self . handle_event_stanza_sent ,
' HTTP_AUTH ' : self . handle_event_http_auth ,
2005-09-10 09:25:06 +00:00
' VCARD_PUBLISHED ' : self . handle_event_vcard_published ,
' VCARD_NOT_PUBLISHED ' : self . handle_event_vcard_not_published ,
2005-09-26 22:29:52 +00:00
' ASK_NEW_NICK ' : self . handle_event_ask_new_nick ,
2005-11-27 12:42:42 +00:00
' SIGNED_IN ' : self . handle_event_signed_in ,
2005-08-09 17:21:35 +00:00
}
2005-04-14 07:58:54 +00:00
2005-08-09 18:45:16 +00:00
def exec_event ( self , account ) :
ev = gajim . events_for_ui [ account ] . pop ( 0 )
self . handlers [ ev [ 0 ] ] ( account , ev [ 1 ] )
2005-04-14 11:06:58 +00:00
def process_connections ( self ) :
2005-12-01 18:03:05 +00:00
# We copy the list of connections because one can disappear while we
# process()
accounts = [ ]
for account in gajim . connections :
accounts . append ( account )
for account in accounts :
if gajim . connections [ account ] . connected :
gajim . connections [ account ] . process ( 0.01 )
if gajim . socks5queue . connected :
gajim . socks5queue . process ( 0 )
for account in gajim . events_for_ui : #when we create a new account we don't have gajim.connection
while len ( gajim . events_for_ui [ account ] ) :
gajim . mutex_events_for_ui . lock ( self . exec_event , account )
gajim . mutex_events_for_ui . unlock ( )
time . sleep ( 0.01 ) # so threads in connection.py have time to run
return True # renew timeout (loop for ever)
2005-04-14 11:06:58 +00:00
2005-04-16 17:03:21 +00:00
def save_config ( self ) :
2005-11-22 10:56:25 +00:00
err_str = parser . write ( )
if err_str is not None :
print >> sys . stderr , err_str
2005-08-23 09:32:44 +00:00
# it is good to notify the user
2005-11-12 14:17:27 +00:00
# in case he or she cannot see the output of the console
2005-11-22 10:56:25 +00:00
dialogs . ErrorDialog ( _ ( ' Could not save your settings and preferences ' ) ,
err_str ) . get_response ( )
2005-12-01 18:03:05 +00:00
sys . exit ( )
2005-04-16 17:03:21 +00:00
2005-04-12 21:09:06 +00:00
def __init__ ( self ) :
2005-10-20 11:17:17 +00:00
gajim . interface = self
2005-04-29 09:47:09 +00:00
self . default_values = {
' inmsgcolor ' : gajim . config . get ( ' inmsgcolor ' ) ,
' outmsgcolor ' : gajim . config . get ( ' outmsgcolor ' ) ,
' statusmsgcolor ' : gajim . config . get ( ' statusmsgcolor ' ) ,
}
2005-10-03 16:14:41 +00:00
2005-04-29 09:47:09 +00:00
parser . read ( )
2005-06-13 16:53:23 +00:00
# Do not set gajim.verbose to False if -v option was given
if gajim . config . get ( ' verbose ' ) :
gajim . verbose = True
2005-06-13 22:11:09 +00:00
#add default emoticons if there is not in the config file
2005-06-01 20:03:37 +00:00
if len ( gajim . config . get_per ( ' emoticons ' ) ) == 0 :
for emot in gajim . config . emoticons_default :
gajim . config . add_per ( ' emoticons ' , emot )
2005-12-01 18:03:05 +00:00
gajim . config . set_per ( ' emoticons ' , emot , ' path ' ,
gajim . config . emoticons_default [ emot ] )
2005-06-13 22:11:09 +00:00
#add default status messages if there is not in the config file
2005-06-01 20:03:37 +00:00
if len ( gajim . config . get_per ( ' statusmsg ' ) ) == 0 :
for msg in gajim . config . statusmsg_default :
gajim . config . add_per ( ' statusmsg ' , msg )
2005-12-01 18:03:05 +00:00
gajim . config . set_per ( ' statusmsg ' , msg , ' message ' ,
gajim . config . statusmsg_default [ msg ] )
2005-06-13 22:11:09 +00:00
#add default themes if there is not in the config file
2005-09-02 14:03:00 +00:00
theme = gajim . config . get ( ' roster_theme ' )
if not theme in gajim . config . get_per ( ' themes ' ) :
2005-10-29 16:56:33 +00:00
gajim . config . set ( ' roster_theme ' , ' green ' )
2005-06-13 22:11:09 +00:00
if len ( gajim . config . get_per ( ' themes ' ) ) == 0 :
2005-12-01 18:03:05 +00:00
d = [ ' accounttextcolor ' , ' accountbgcolor ' , ' accountfont ' ,
' accountfontattrs ' , ' grouptextcolor ' , ' groupbgcolor ' , ' groupfont ' ,
' groupfontattrs ' , ' contacttextcolor ' , ' contactbgcolor ' ,
' contactfont ' , ' contactfontattrs ' , ' bannertextcolor ' ,
' bannerbgcolor ' ]
2005-11-15 11:52:40 +00:00
2005-06-13 22:11:09 +00:00
default = gajim . config . themes_default
2005-08-12 00:08:04 +00:00
for theme_name in default :
gajim . config . add_per ( ' themes ' , theme_name )
theme = default [ theme_name ]
2005-06-13 22:11:09 +00:00
for o in d :
2005-08-12 00:08:04 +00:00
gajim . config . set_per ( ' themes ' , theme_name , o ,
theme [ d . index ( o ) ] )
2005-07-25 14:38:21 +00:00
if gajim . config . get ( ' autodetect_browser_mailer ' ) :
2005-08-04 23:11:55 +00:00
gtkgui_helpers . autodetect_browser_mailer ( )
2005-07-25 14:38:21 +00:00
2005-05-28 18:20:27 +00:00
if gajim . verbose :
2005-05-18 09:17:41 +00:00
gajim . log . setLevel ( gajim . logging . DEBUG )
2005-05-18 07:38:47 +00:00
else :
gajim . log . setLevel ( None )
2005-08-01 22:44:05 +00:00
gajim . socks5queue = socks5 . SocksQueue (
self . handle_event_file_rcv_completed ,
self . handle_event_file_progress )
2005-11-10 10:16:25 +00:00
self . register_handlers ( )
2005-04-29 09:47:09 +00:00
for account in gajim . config . get_per ( ' accounts ' ) :
gajim . connections [ account ] = common . connection . Connection ( account )
2005-07-17 21:41:54 +00:00
2005-09-11 13:56:38 +00:00
gtk . about_dialog_set_email_hook ( self . on_launch_browser_mailer , ' mail ' )
gtk . about_dialog_set_url_hook ( self . on_launch_browser_mailer , ' url ' )
2005-10-03 16:14:41 +00:00
2005-11-13 15:08:47 +00:00
self . instances = { ' logs ' : { } }
2005-10-03 16:14:41 +00:00
2005-04-12 21:09:06 +00:00
for a in gajim . connections :
2005-11-13 15:08:47 +00:00
self . instances [ a ] = { ' infos ' : { } , ' disco ' : { } , ' chats ' : { } ,
2005-10-30 09:58:13 +00:00
' gc ' : { } , ' gc_config ' : { } }
2005-07-18 21:08:31 +00:00
gajim . contacts [ a ] = { }
gajim . groups [ a ] = { }
2005-07-25 20:04:24 +00:00
gajim . gc_contacts [ a ] = { }
2005-08-03 09:23:36 +00:00
gajim . gc_connected [ a ] = { }
2005-07-18 21:08:31 +00:00
gajim . newly_added [ a ] = [ ]
gajim . to_be_removed [ a ] = [ ]
2005-10-15 20:49:08 +00:00
gajim . awaiting_events [ a ] = { }
2005-07-18 21:08:31 +00:00
gajim . nicks [ a ] = gajim . config . get_per ( ' accounts ' , a , ' name ' )
gajim . allow_notifications [ a ] = False
gajim . sleeper_state [ a ] = 0
2005-07-02 11:06:02 +00:00
gajim . encrypted_chats [ a ] = [ ]
2005-07-03 15:27:41 +00:00
gajim . last_message_time [ a ] = { }
2005-07-22 21:27:04 +00:00
gajim . status_before_autoaway [ a ] = ' '
2005-08-09 17:21:35 +00:00
gajim . events_for_ui [ a ] = [ ]
2005-04-12 15:30:09 +00:00
2005-10-20 11:17:17 +00:00
self . roster = roster_window . RosterWindow ( )
2005-11-19 22:01:10 +00:00
2005-11-19 21:45:34 +00:00
if gajim . config . get ( ' remote_control ' ) :
2005-11-19 22:01:10 +00:00
try :
import remote_control
self . remote_ctrl = remote_control . Remote ( )
2005-12-01 21:07:30 +00:00
except ( exceptions . DbusNotSupported , exceptions . SessionBusNotPresent ) :
2005-11-19 22:01:10 +00:00
self . remote_ctrl = None
2005-07-17 21:41:54 +00:00
else :
2005-11-19 22:01:10 +00:00
self . remote_ctrl = None
2005-07-21 08:05:10 +00:00
2005-11-07 15:43:47 +00:00
self . show_vcard_when_connect = [ ]
2005-06-03 17:35:48 +00:00
path_to_file = os . path . join ( gajim . DATA_DIR , ' pixmaps/gajim.png ' )
pix = gtk . gdk . pixbuf_new_from_file ( path_to_file )
gtk . window_set_default_icon ( pix ) # set the icon to all newly opened windows
self . roster . window . set_icon_from_file ( path_to_file ) # and to roster window
self . sleeper = common . sleepy . Sleepy (
2005-09-10 23:44:53 +00:00
gajim . config . get ( ' autoawaytime ' ) * 60 , # make minutes to seconds
2005-04-21 23:20:18 +00:00
gajim . config . get ( ' autoxatime ' ) * 60 )
2005-08-11 13:20:46 +00:00
2005-03-28 01:20:47 +00:00
self . systray_enabled = False
2005-08-11 13:20:46 +00:00
self . systray_capabilities = False
2005-08-23 18:03:18 +00:00
if os . name == ' nt ' :
try :
import systraywin32
except : # user doesn't have trayicon capabilities
pass
else :
self . systray_capabilities = True
2005-10-20 11:17:17 +00:00
self . systray = systraywin32 . SystrayWin32 ( )
2005-08-11 13:20:46 +00:00
else :
2005-03-14 13:25:34 +00:00
try :
2005-08-11 13:20:46 +00:00
import egg . trayicon # use gnomepythonextras trayicon
except :
try :
import trayicon # use the one we distribute
except : # user doesn't have trayicon capabilities
pass
else :
self . systray_capabilities = True
2005-10-20 11:17:17 +00:00
self . systray = systray . Systray ( )
2005-03-14 17:39:18 +00:00
else :
2005-03-29 16:16:42 +00:00
self . systray_capabilities = True
2005-10-20 11:17:17 +00:00
self . systray = systray . Systray ( )
2005-08-11 13:20:46 +00:00
2005-06-05 23:17:59 +00:00
if self . systray_capabilities and gajim . config . get ( ' trayicon ' ) :
2004-12-14 12:57:45 +00:00
self . show_systray ( )
2005-05-08 15:06:24 +00:00
if gajim . config . get ( ' check_for_new_version ' ) :
2005-10-20 11:17:17 +00:00
check_for_new_version . Check_for_new_version_dialog ( )
2005-04-16 23:15:03 +00:00
2005-11-15 11:52:40 +00:00
self . init_emoticons ( )
self . make_regexps ( )
2005-03-26 21:09:49 +00:00
# get instances for windows/dialogs that will show_all()/hide()
2005-11-13 15:08:47 +00:00
self . instances [ ' file_transfers ' ] = dialogs . FileTransfersWindow ( )
self . instances [ ' preferences ' ] = config . PreferencesWindow ( )
2005-04-14 07:58:54 +00:00
for account in gajim . connections :
2005-12-01 18:03:05 +00:00
self . instances [ account ] [ ' xml_console ' ] = dialogs . XMLConsoleWindow (
account )
2005-03-10 18:29:03 +00:00
2005-03-15 10:20:10 +00:00
gobject . timeout_add ( 100 , self . autoconnect )
2005-04-14 17:07:55 +00:00
gobject . timeout_add ( 200 , self . process_connections )
2005-04-18 14:05:30 +00:00
gobject . timeout_add ( 500 , self . read_sleepy )
2003-11-30 22:40:24 +00:00
2005-04-12 21:09:06 +00:00
if __name__ == ' __main__ ' :
2005-04-18 14:05:30 +00:00
signal . signal ( signal . SIGINT , signal . SIG_DFL ) # ^C exits the application
2005-08-11 13:20:46 +00:00
try : # Import Psyco if available
2005-04-12 21:09:06 +00:00
import psyco
psyco . full ( )
except ImportError :
pass
2005-09-07 19:46:09 +00:00
2005-10-10 13:12:28 +00:00
if os . name != ' nt ' :
2005-10-10 13:15:32 +00:00
# Session Management support
2005-10-10 13:12:28 +00:00
try :
import gnome . ui
except ImportError :
print >> sys . stderr , _ ( ' Session Management support not available (missing gnome.ui module) ' )
else :
def die_cb ( cli ) :
gtk . main_quit ( )
gnome . program_init ( ' gajim ' , gajim . version )
cli = gnome . ui . master_client ( )
cli . connect ( ' die ' , die_cb )
path_to_gajim_script = gtkgui_helpers . get_abspath_for_script ( ' gajim ' )
2005-09-07 21:12:30 +00:00
if path_to_gajim_script :
2005-10-10 13:12:28 +00:00
argv = [ path_to_gajim_script ]
# FIXME: remove this typeerror catch when gnome python is old and
# not bad patched by distro men [2.12.0 + should not need all that
# NORMALLY]
try :
cli . set_restart_command ( argv )
except TypeError :
cli . set_restart_command ( len ( argv ) , argv )
2005-10-10 13:15:32 +00:00
# register (by default only the first time) xmmpi: to Gajim
2005-10-10 13:12:28 +00:00
try :
import gconf
# in try because daemon may not be there
client = gconf . client_get_default ( )
2005-10-13 19:44:33 +00:00
2005-10-10 13:12:28 +00:00
we_set = False
if gajim . config . get ( ' set_xmpp://_handler_everytime ' ) :
we_set = True
elif client . get_string ( ' /desktop/gnome/url-handlers/xmpp/command ' ) is None :
we_set = True
if we_set :
path_to_gajim_script , type = gtkgui_helpers . get_abspath_for_script (
' gajim-remote ' , True )
if path_to_gajim_script :
if type == ' svn ' :
command = path_to_gajim_script + ' open_chat %s '
else : # 'installed'
command = ' gajim-remote open_chat %s '
client . set_bool ( ' /desktop/gnome/url-handlers/xmpp/enabled ' , True )
client . set_string ( ' /desktop/gnome/url-handlers/xmpp/command ' , command )
client . set_bool ( ' /desktop/gnome/url-handlers/xmpp/needs_terminal ' , False )
2005-10-13 19:44:33 +00:00
except :
pass
2005-09-07 21:12:30 +00:00
2005-12-02 11:42:17 +00:00
# Migrate old logs if user wants that
2005-12-02 11:18:00 +00:00
if NO_DB :
2005-12-02 11:42:17 +00:00
dialog = dialogs . ConfirmationDialog ( _ ( ' Do you want to migrate your logs? ' ) , _ ( ' It is the first time you run Gajim since the way logs are stored has changed. Gajim can migrate your logs at this state. Migrate? ' ) )
2005-12-02 11:18:00 +00:00
if dialog . get_response ( ) == gtk . RESPONSE_OK :
from common import migrate_logs_to_dot9_db
migrate_logs_to_dot9_db . migrate ( )
del NO_DB
2005-04-18 14:05:30 +00:00
Interface ( )
2005-04-12 21:09:06 +00:00
gtk . main ( )