2005-04-18 10:54:47 +02:00
#!/bin/sh
''' : '
2005-05-15 02:00:09 +02:00
exec python - OOt " $0 " $ { 1 + " $@ " }
2005-04-18 10:54:47 +02:00
' ' ' '
## gajim.py
2003-11-30 23:40:24 +01:00
##
## Gajim Team:
2005-03-16 21:48:56 +01:00
## - Yann Le Boulanger <asterix@lagaule.org>
## - Vincent Hanquez <tab@snarc.org>
2005-04-18 13:04:33 +02:00
## - Nikos Kouremenos <kourem@gmail.com>
2005-07-30 16:14:10 +02:00
## - Dimitur Kirov <dkirov@gmail.com>
2005-11-13 02:48:48 +01:00
## - Travis Shirk <travis@pobox.com>
2003-11-30 23:40:24 +01:00
##
2005-01-07 22:52:38 +01:00
## Copyright (C) 2003-2005 Gajim Team
2003-11-30 23:40:24 +01: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 15:55:52 +01:00
2005-05-30 14:53:48 +02:00
import sys
2005-08-16 13:55:29 +02:00
import os
2005-11-10 16:14:17 +01:00
import pygtk
2005-09-07 21:46:09 +02:00
2005-12-01 18:17:20 +01:00
from common import exceptions
2005-09-21 16:42:29 +02:00
from common import i18n
i18n . init ( )
_ = i18n . _
2005-05-30 14:53:48 +02:00
try :
import gtk
except RuntimeError , msg :
if str ( msg ) == ' could not open display ' :
2005-09-08 10:54:59 +02:00
print >> sys . stderr , _ ( ' Gajim needs Xserver to run. Quiting... ' )
2005-05-30 16:19:14 +02:00
sys . exit ( )
2005-12-01 18:17:20 +01:00
pritext = ' '
2005-09-11 16:20:20 +02:00
if gtk . pygtk_version < ( 2 , 6 , 0 ) :
2005-12-01 18:49:10 +01:00
pritext = _ ( ' Gajim needs PyGTK 2.6 or above ' )
sectext = _ ( ' Gajim needs PyGTK 2.6 or above to run. Quiting... ' )
2005-09-11 16:20:20 +02:00
elif gtk . gtk_version < ( 2 , 6 , 0 ) :
2005-12-01 18:56:31 +01:00
pritext = _ ( ' Gajim needs GTK 2.6 or above ' )
2005-12-01 18:49:10 +01:00
sectext = _ ( ' Gajim needs GTK 2.6 or above to run. Quiting... ' )
2005-09-11 16:20:20 +02:00
2005-09-22 18:30:46 +02: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 17:57:03 +02:00
sectext = _ ( ' Please remove your current GTK+ runtime and install the latest stable version from %s ' ) % ' http://gladewin32.sourceforge.net '
2005-09-22 18:30:46 +02:00
else :
sectext = _ ( ' Please make sure that gtk and pygtk have libglade support in your system. ' )
2005-12-01 18:17:20 +01:00
try :
from common import check_paths
except exceptions . PysqliteNotAvailable , e :
2005-12-01 18:56:31 +01:00
pritext = _ ( ' Gajim needs PySQLite2 to run ' )
2005-12-01 18:17:20 +01:00
sectext = str ( e )
if pritext :
2005-09-22 18:30:46 +02: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 12:18:00 +01: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 20:21:46 +01:00
check_paths . check_and_possibly_create_paths ( )
2005-11-23 20:12:52 +01:00
2005-11-12 22:24:54 +01:00
path = os . getcwd ( )
2005-12-01 18:56:31 +01:00
if ' .svn ' in os . listdir ( path ) or ' _svn ' in os . listdir ( path ) :
2005-11-12 22:24:54 +01: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 19:15:48 +01:00
import gobject
2005-12-01 19:03:05 +01:00
if sys . version [ : 4 ] > = ' 2.4 ' : # FIXME: remove me when we abandon python23
2005-09-12 13:23:38 +02:00
gobject . threads_init ( )
2005-10-03 18:14:41 +02:00
2005-08-12 02:08:04 +02:00
import pango
2005-03-20 18:14:55 +01:00
import sre
2005-04-18 16:05:30 +02:00
import signal
2005-05-14 00:38:48 +02:00
import getopt
2005-06-28 21:03:00 +02:00
import time
2005-10-03 18:14:41 +02:00
import base64
2005-08-08 16:53:21 +02:00
2005-07-25 16:38:21 +02:00
import gtkgui_helpers
2005-11-11 20:06:48 +01:00
import notify
2005-02-28 19:15:48 +01:00
2005-05-21 18:01:52 +02:00
import common . sleepy
import check_for_new_version
2005-09-09 19:43:39 +02:00
2005-11-11 20:06:48 +01:00
from common import socks5
2005-05-21 18:01:52 +02:00
from common import gajim
from common import connection
2005-08-10 00:46:13 +02:00
from common import helpers
2005-04-17 00:12:41 +02:00
from common import optparser
2005-04-14 09:05:10 +02:00
2005-05-14 00:38:48 +02:00
profile = ' '
try :
2005-09-07 23:12:30 +02:00
opts , args = getopt . getopt ( sys . argv [ 1 : ] , ' hvp: ' , [ ' help ' , ' verbose ' ,
2005-09-07 21:46:09 +02:00
' profile= ' , ' sm-config-prefix= ' , ' sm-client-id= ' ] )
2005-05-14 00:38:48 +02:00
except getopt . error , msg :
2005-05-28 20:20:27 +02:00
print msg
print ' for help use --help '
sys . exit ( 2 )
2005-05-14 00:38:48 +02:00
for o , a in opts :
2005-05-28 20:20:27 +02:00
if o in ( ' -h ' , ' --help ' ) :
2005-05-30 14:53:48 +02:00
print ' gajim [--help] [--verbose] [--profile name] '
2005-05-30 16:19:14 +02:00
sys . exit ( )
2005-05-28 20:20:27 +02:00
elif o in ( ' -v ' , ' --verbose ' ) :
gajim . verbose = True
elif o in ( ' -p ' , ' --profile ' ) : # gajim --profile name
profile = a
2005-05-14 00:38:48 +02:00
2005-05-20 20:08:24 +02: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 20:13:38 +02:00
# win9x so ./config
config_filename = ' config '
2005-05-20 20:08:24 +02:00
2005-05-14 00:38:48 +02:00
if profile :
2005-05-28 20:20:27 +02:00
config_filename + = ' . %s ' % profile
2005-05-14 00:38:48 +02:00
2005-05-20 20:08:24 +02:00
parser = optparser . OptionsParser ( config_filename )
2005-05-14 00:38:48 +02:00
2005-06-24 16:28:00 +02:00
class Contact :
2005-06-24 15:29:26 +02:00
''' Information concerning each contact '''
2005-10-19 12:39:23 +02:00
def __init__ ( self , jid = ' ' , name = ' ' , groups = [ ] , show = ' ' , status = ' ' , sub = ' ' ,
ask = ' ' , resource = ' ' , priority = 5 , keyID = ' ' , role = ' ' , affiliation = ' ' ,
2005-11-22 01:28:36 +01:00
our_chatstate = None , chatstate = None ) :
2005-06-25 11:18:39 +02: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 23:40:24 +01:00
2005-07-22 02:34:08 +02: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 01:28:36 +01:00
# this holds what WE SEND to contact (our current chatstate)
self . our_chatstate = our_chatstate
# this is contact's chatstate
2005-07-22 02:34:08 +02:00
self . chatstate = chatstate
2005-04-14 19:07:55 +02:00
import roster_window
import systray
import dialogs
2005-11-13 21:25:04 +01:00
import vcard
2005-04-14 19:07:55 +02:00
import config
2005-10-30 10:58:13 +01:00
import disco
2004-06-11 23:36:17 +02:00
2005-04-22 01:20:18 +02:00
GTKGUI_GLADE = ' gtkgui.glade '
2004-06-11 23:36:17 +02:00
2004-03-11 22:14:09 +01:00
2005-04-18 16:05:30 +02:00
class Interface :
2004-08-01 18:25:41 +02:00
def handle_event_roster ( self , account , data ) :
2005-04-26 20:45:54 +02:00
#('ROSTER', account, array)
2005-07-22 16:30:35 +02:00
self . roster . fill_contacts_and_groups_dicts ( data , account )
2004-06-20 23:58:12 +02:00
self . roster . draw_roster ( )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Roster ' , ( account , data ) )
2005-06-24 18:46:45 +02:00
2005-06-07 09:40:15 +02:00
def handle_event_warning ( self , unused , data ) :
#('WARNING', account, (title_text, section_text))
2005-06-10 23:14:16 +02:00
dialogs . WarningDialog ( data [ 0 ] , data [ 1 ] ) . get_response ( )
2005-06-24 18:46:45 +02:00
2005-06-07 09:40:15 +02:00
def handle_event_error ( self , unused , data ) :
#('ERROR', account, (title_text, section_text))
2005-06-10 23:14:16 +02:00
dialogs . ErrorDialog ( data [ 0 ] , data [ 1 ] ) . get_response ( )
2005-06-24 18:46:45 +02:00
def handle_event_information ( self , unused , data ) :
#('INFORMATION', account, (title_text, section_text))
2005-08-14 18:12:36 +02:00
dialogs . InformationDialog ( data [ 0 ] , data [ 1 ] )
2005-09-27 00:29:52 +02:00
2005-10-03 20:19:31 +02: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 23:56:38 +02:00
room_jid = data [ 0 ]
title = data [ 1 ]
prompt = data [ 2 ]
2005-10-03 20:19:31 +02:00
proposed_nick = data [ 3 ]
2005-11-13 16:08:47 +01:00
w = self . instances [ account ] [ ' gc ' ]
2005-10-30 22:41:52 +01: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 18:46:45 +02:00
2005-08-05 15:29:39 +02:00
def handle_event_http_auth ( self , account , data ) :
2005-11-13 02:48:48 +01: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 15:29:39 +02: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 18:53:28 +02:00
def handle_event_error_answer ( self , account , array ) :
2005-09-19 18:13:45 +02:00
#('ERROR_ANSWER', account, (id, jid_from. errmsg, errcode))
2005-08-03 18:21:23 +02:00
id , jid_from , errmsg , errcode = array
2005-10-27 15:15:03 +02:00
if unicode ( errcode ) in ( ' 403 ' , ' 406 ' ) and id :
2005-08-06 18:18:25 +02:00
# show the error dialog
2005-11-13 16:08:47 +01:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 22:31:44 +02: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 02:52:44 +02:00
elif unicode ( errcode ) == ' 404 ' :
2005-08-06 18:18:25 +02:00
conn = gajim . connections [ account ]
2005-08-11 22:31:44 +02: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 16:08:47 +01:00
if jid_from in self . instances [ account ] [ ' gc ' ] :
self . instances [ account ] [ ' gc ' ] [ jid_from ] . print_conversation (
2005-09-06 15:17:10 +02:00
' Error %s : %s ' % ( array [ 2 ] , array [ 1 ] ) , jid_from )
2005-05-10 18:53:28 +02:00
2005-06-29 14:57:46 +02:00
def handle_event_con_type ( self , account , con_type ) :
# ('CON_TYPE', account, con_type) which can be 'ssl', 'tls', 'tcp'
2005-07-18 23:08:31 +02:00
gajim . con_types [ account ] = con_type
2005-06-29 14:57:46 +02:00
2005-05-12 20:55:01 +02:00
def allow_notif ( self , account ) :
2005-07-18 23:08:31 +02:00
gajim . allow_notifications [ account ] = True
2005-05-12 20:55:01 +02:00
2005-04-06 20:51:54 +02:00
def handle_event_status ( self , account , status ) : # OUR status
2004-06-20 23:58:12 +02:00
#('STATUS', account, status)
2005-10-11 00:46:28 +02: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 23:08:31 +02:00
gajim . allow_notifications [ account ] = False
2005-08-03 11:23:36 +02:00
# we are disconnected from all gc
2005-10-14 20:10:14 +02:00
if not gajim . gc_connected . has_key ( account ) :
return
2005-08-03 11:23:36 +02:00
for room_jid in gajim . gc_connected [ account ] :
2005-11-13 16:08:47 +01:00
if self . instances [ account ] [ ' gc ' ] . has_key ( room_jid ) :
self . instances [ account ] [ ' gc ' ] [ room_jid ] . got_disconnected ( room_jid )
2005-10-11 00:46:28 +02: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 23:58:12 +02:00
self . roster . on_status_changed ( account , status )
2005-11-07 16:43:47 +01:00
if account in self . show_vcard_when_connect :
jid = gajim . get_jid_from_account ( account )
2005-11-28 17:26:19 +01:00
if not self . instances [ account ] [ ' infos ' ] . has_key ( jid ) :
2005-11-13 16:08:47 +01:00
self . instances [ account ] [ ' infos ' ] [ jid ] = \
2005-11-13 21:25:04 +01:00
vcard . VcardWindow ( jid , account , True )
2005-11-07 16:43:47 +01:00
gajim . connections [ account ] . request_vcard ( jid )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' AccountPresence ' , ( status , account ) )
2004-06-20 23:58:12 +02:00
def handle_event_notify ( self , account , array ) :
2005-09-19 18:13:45 +02:00
#('NOTIFY', account, (jid, status, message, resource, priority, keyID))
2005-07-21 19:00:05 +02:00
# if we're here it means contact changed show
statuss = [ ' offline ' , ' error ' , ' online ' , ' chat ' , ' away ' , ' xa ' , ' dnd ' ,
' invisible ' ]
2005-02-15 00:48:32 +01:00
old_show = 0
2005-04-12 17:30:09 +02:00
new_show = statuss . index ( array [ 1 ] )
2005-03-05 22:02:38 +01:00
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
2004-10-07 16:43:59 +02:00
keyID = array [ 5 ]
2005-05-29 23:34:01 +02: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 23:58:12 +02:00
resource = array [ 3 ]
if not resource :
resource = ' '
priority = array [ 4 ]
2005-04-18 16:05:30 +02:00
if jid . find ( ' @ ' ) < = 0 :
2005-10-11 00:46:28 +02:00
# It must be an agent
2005-03-05 22:02:38 +01:00
ji = jid . replace ( ' @ ' , ' ' )
2004-06-20 23:58:12 +02:00
else :
ji = jid
2005-10-11 00:46:28 +02:00
# Update contact
2005-07-18 23:08:31 +02:00
if gajim . contacts [ account ] . has_key ( ji ) :
2005-11-01 16:28:19 +01:00
lcontact = gajim . contacts [ account ] [ ji ]
contact1 = None
2004-06-20 23:58:12 +02:00
resources = [ ]
2005-11-01 16:28:19 +01:00
for c in lcontact :
2005-11-01 18:14:15 +01:00
resources . append ( c . resource )
2005-11-01 16:28:19 +01:00
if c . resource == resource :
contact1 = c
2004-06-20 23:58:12 +02:00
break
2005-11-01 16:28:19 +01: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 20:23:27 +02:00
return
2005-02-15 00:48:32 +01:00
else :
2005-11-01 16:28:19 +01: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-15 00:48:32 +01:00
old_show = 0
2005-11-01 16:28:19 +01:00
contact1 = Contact ( jid = contact1 . jid , name = contact1 . name ,
groups = contact1 . groups , show = contact1 . show ,
2005-11-22 01:32:38 +01:00
status = contact1 . status , sub = contact1 . sub ,
ask = contact1 . ask , resource = contact1 . resource ,
priority = contact1 . priority , keyID = contact1 . keyID )
2005-11-01 16:28:19 +01:00
lcontact . append ( contact1 )
contact1 . resource = resource
if contact1 . jid . find ( ' @ ' ) > 0 and len ( lcontact ) == 1 : # It's not an agent
2005-04-12 17:30:09 +02:00
if old_show == 0 and new_show > 1 :
2005-11-01 16:28:19 +01: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 09:20:14 +02:00
if old_show > 1 and new_show == 0 and gajim . connections [ account ] . \
connected > 1 :
2005-11-01 16:28:19 +01: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 22:49:08 +02:00
if not gajim . awaiting_events [ account ] . has_key ( jid ) :
2005-11-01 16:28:19 +01: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 16:05:30 +02:00
if jid . find ( ' @ ' ) < = 0 :
2005-10-11 00:46:28 +02:00
# It must be an agent
2005-07-18 23:08:31 +02:00
if gajim . contacts [ account ] . has_key ( ji ) :
2005-10-11 00:46:28 +02:00
# Update existing iter
2005-04-23 02:37:51 +02:00
self . roster . draw_contact ( ji , account )
2005-09-13 20:46:21 +02:00
elif jid == gajim . get_jid_from_account ( account ) :
2005-10-11 00:46:28 +02:00
# It's another of our resources. We don't need to see that!
2005-09-13 20:46:21 +02:00
return
2005-07-18 23:08:31 +02:00
elif gajim . contacts [ account ] . has_key ( ji ) :
2005-10-11 00:46:28 +02:00
# It isn't an agent
2005-10-20 12:21:51 +02:00
# reset chatstate if needed:
2005-11-01 16:28:19 +01:00
# (when contact signs out or has errors)
2005-10-20 12:21:51 +02:00
if array [ 1 ] in ( ' offline ' , ' error ' ) :
2005-11-22 01:28:36 +01:00
contact1 . our_chatstate = contact1 . chatstate = None
2005-11-01 16:28:19 +01:00
self . roster . chg_contact_status ( contact1 , array [ 1 ] , array [ 2 ] , account )
2005-10-11 00:46:28 +02:00
# play sound
2005-05-07 17:40:58 +02:00
if old_show < 2 and new_show > 1 :
if gajim . config . get_per ( ' soundevents ' , ' contact_connected ' ,
2005-10-31 21:54:40 +01:00
' enabled ' ) :
2005-08-10 00:46:13 +02:00
helpers . play_sound ( ' contact_connected ' )
2005-11-13 16:08:47 +01:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-10-15 22:49:08 +02:00
not gajim . awaiting_events [ account ] . has_key ( jid ) and \
2005-05-21 15:46:23 +02:00
gajim . config . get ( ' notify_on_signin ' ) and \
2005-07-18 23:08:31 +02:00
gajim . allow_notifications [ account ] :
2005-04-19 01:55:13 +02: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 19:14:10 +02:00
elif gajim . connections [ account ] . connected in ( 2 , 3 ) : # we're online or chat
2005-04-19 01:55:13 +02:00
show_notification = True
if show_notification :
2005-11-11 20:06:48 +01:00
notify . notify ( _ ( ' Contact Signed In ' ) , jid , account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' ContactPresence ' ,
2005-08-08 16:43:50 +02:00
( account , array ) )
2005-05-11 17:21:13 +02:00
elif old_show > 1 and new_show < 2 :
if gajim . config . get_per ( ' soundevents ' , ' contact_disconnected ' ,
2005-10-31 21:54:40 +01:00
' enabled ' ) :
2005-08-10 00:46:13 +02:00
helpers . play_sound ( ' contact_disconnected ' )
2005-11-13 16:08:47 +01:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-10-15 22:49:08 +02:00
not gajim . awaiting_events [ account ] . has_key ( jid ) and \
2005-05-21 15:46:23 +02:00
gajim . config . get ( ' notify_on_signout ' ) :
2005-04-19 01:55:13 +02: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 19:14:10 +02:00
elif gajim . connections [ account ] . connected in ( 2 , 3 ) : # we're online or chat
2005-04-19 01:55:13 +02:00
show_notification = True
if show_notification :
2005-11-11 20:06:48 +01:00
notify . notify ( _ ( ' Contact Signed Out ' ) , jid , account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' ContactAbsence ' , ( account , array ) )
# FIXME: stop non active file transfers
2005-10-04 13:33:57 +02:00
else :
2005-10-04 14:26:09 +02: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 13:33:57 +02:00
self . handle_event_gc_notify ( account , ( jid , array [ 1 ] , array [ 2 ] , array [ 3 ] , None , None , None , None , None , None , None ) )
2004-06-21 02:12:25 +02:00
2004-06-20 23:58:12 +02:00
def handle_event_msg ( self , account , array ) :
2005-11-22 01:28:36 +01:00
# ('MSG', account, (jid, msg, time, encrypted, msg_type, subject,
# chatstate))
2005-07-22 02:34:08 +02:00
jid = gajim . get_jid_without_resource ( array [ 0 ] )
2005-10-07 16:01:35 +02:00
resource = gajim . get_resource_from_jid ( array [ 0 ] )
2005-07-16 11:33:43 +02:00
msg_type = array [ 4 ]
2005-07-21 16:56:39 +02:00
chatstate = array [ 6 ]
2005-04-18 16:05:30 +02:00
if jid . find ( ' @ ' ) < = 0 :
2005-03-05 22:02:38 +01:00
jid = jid . replace ( ' @ ' , ' ' )
2005-06-07 18:52:24 +02:00
2005-09-23 23:01:42 +02: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 16:08:47 +01:00
if self . instances [ account ] [ ' gc ' ] . has_key ( jid ) : # it's a Private Message
2005-10-07 16:09:40 +02:00
nick = gajim . get_nick_from_fjid ( array [ 0 ] )
2005-10-07 16:01:35 +02:00
fjid = array [ 0 ]
2005-11-13 16:08:47 +01:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( fjid ) and \
2005-10-15 22:49:08 +02:00
not gajim . awaiting_events [ account ] . has_key ( fjid ) :
2005-09-23 23:01:42 +02:00
if show_notification :
2005-11-13 20:31:47 +01:00
notify . notify ( _ ( ' New Private Message ' ) , fjid , account , ' pm ' )
2005-09-23 23:01:42 +02:00
2005-11-13 16:08:47 +01:00
self . instances [ account ] [ ' gc ' ] [ jid ] . on_private_message ( jid , nick ,
2005-09-23 23:01:42 +02:00
array [ 1 ] , array [ 2 ] )
2005-06-07 18:52:24 +02:00
return
2005-04-14 09:05:10 +02:00
if gajim . config . get ( ' ignore_unknown_contacts ' ) and \
2005-07-18 23:08:31 +02:00
not gajim . contacts [ account ] . has_key ( jid ) :
2005-03-11 00:45:10 +01:00
return
2005-04-06 20:51:54 +02:00
2005-09-08 04:05:46 +02:00
# Handle chat states
contact = gajim . get_first_contact_instance_from_jid ( account , jid )
2005-11-13 16:08:47 +01:00
if self . instances [ account ] [ ' chats ' ] . has_key ( jid ) :
chat_win = self . instances [ account ] [ ' chats ' ] [ jid ]
2005-11-12 15:17:27 +01:00
if chatstate is not None : # he or she sent us reply, so he supports jep85
2005-11-22 01:28:36 +01:00
contact . chatstate = chatstate
if contact . our_chatstate == ' ask ' : # we were jep85 disco?
contact . our_chatstate = ' active ' # no more
2005-07-21 16:56:39 +02:00
2005-11-22 01:28:36 +01:00
chat_win . handle_incoming_chatstate ( account , contact )
2005-09-20 04:24:25 +02:00
elif contact . chatstate != ' active ' :
2005-07-19 21:10:03 +02:00
# got no valid jep85 answer, peer does not support it
2005-07-22 02:34:08 +02:00
contact . chatstate = False
2005-11-22 01:28:36 +01:00
elif contact and chatstate == ' active ' :
2005-09-08 04:05:46 +02:00
# Brand new message, incoming.
2005-11-22 01:28:36 +01:00
contact . our_chatstate = chatstate
contact . chatstate = chatstate
2005-07-19 21:10:03 +02:00
2005-07-22 02:34:08 +02:00
if not array [ 1 ] : #empty message text
2005-07-19 21:10:03 +02:00
return
2005-04-06 20:51:54 +02:00
first = False
2005-11-13 16:08:47 +01:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-10-15 22:49:08 +02:00
not gajim . awaiting_events [ account ] . has_key ( jid ) :
2005-04-06 20:51:54 +02:00
first = True
2005-04-17 23:31:18 +02:00
if gajim . config . get ( ' notify_on_new_message ' ) :
2005-04-19 01:55:13 +02: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 19:14:10 +02:00
elif gajim . connections [ account ] . connected in ( 2 , 3 ) : # we're online or chat
2005-04-19 01:55:13 +02:00
show_notification = True
if show_notification :
2005-07-16 11:33:43 +02:00
if msg_type == ' normal ' : # single message
2005-12-01 19:08:10 +01:00
notify . notify ( _ ( ' New Single Message ' ) , jid , account , msg_type )
2005-07-16 11:33:43 +02:00
else : # chat message
2005-11-13 20:31:47 +01:00
notify . notify ( _ ( ' New Message ' ) , jid , account , msg_type )
2005-07-16 11:33:43 +02:00
2005-07-07 17:41:03 +02:00
# array : (contact, msg, time, encrypted, msg_type, subject)
2005-07-05 23:35:37 +02:00
self . roster . on_message ( jid , array [ 1 ] , array [ 2 ] , account , array [ 3 ] ,
2005-10-07 16:01:35 +02:00
msg_type , array [ 5 ] , resource )
2005-06-03 20:40:43 +02:00
if gajim . config . get_per ( ' soundevents ' , ' first_message_received ' ,
2005-04-16 16:50:26 +02:00
' enabled ' ) and first :
2005-08-10 00:46:13 +02:00
helpers . play_sound ( ' first_message_received ' )
2005-06-03 20:40:43 +02:00
if gajim . config . get_per ( ' soundevents ' , ' next_message_received ' ,
2005-04-16 16:50:26 +02:00
' enabled ' ) and not first :
2005-08-10 00:46:13 +02:00
helpers . play_sound ( ' next_message_received ' )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' NewMessage ' , ( account , array ) )
2005-07-19 21:10:03 +02:00
2004-07-08 21:46:24 +02:00
def handle_event_msgerror ( self , account , array ) :
2005-04-26 00:22:23 +02:00
#('MSGERROR', account, (jid, error_code, error_msg, msg, time))
2005-06-13 00:45:41 +02:00
fjid = array [ 0 ]
2005-06-29 22:50:30 +02:00
jids = fjid . split ( ' / ' , 1 )
2005-06-13 00:45:41 +02:00
jid = jids [ 0 ]
2005-11-13 16:08:47 +01:00
gcs = self . instances [ account ] [ ' gc ' ]
2005-06-13 00:45:41 +02:00
if jid in gcs :
2005-06-18 16:38:37 +02:00
if len ( jids ) > 1 : # it's a pm
2005-06-13 00:45:41 +02:00
nick = jids [ 1 ]
2005-11-13 16:08:47 +01:00
if not self . instances [ account ] [ ' chats ' ] . has_key ( fjid ) :
2005-06-13 00:45:41 +02:00
gc = gcs [ jid ]
tv = gc . list_treeview [ jid ]
model = tv . get_model ( )
2005-07-19 21:41:23 +02:00
i = gc . get_contact_iter ( jid , nick )
if i :
2005-08-06 12:20:04 +02:00
show = model [ i ] [ 3 ]
2005-06-13 00:45:41 +02:00
else :
show = ' offline '
2005-08-06 12:20:04 +02:00
c = Contact ( jid = fjid , name = nick , groups = [ ' none ' ] ,
2005-06-25 11:18:39 +02:00
show = show , ask = ' none ' )
2005-08-06 12:20:04 +02:00
self . roster . new_chat ( c , account )
2005-11-13 16:08:47 +01:00
self . instances [ account ] [ ' chats ' ] [ fjid ] . print_conversation (
2005-06-13 00:45:41 +02:00
' Error %s : %s ' % ( array [ 1 ] , array [ 2 ] ) , fjid , ' status ' )
return
gcs [ jid ] . print_conversation ( ' Error %s : %s ' % \
2005-04-26 00:22:23 +02:00
( array [ 1 ] , array [ 2 ] ) , jid )
2005-06-13 00:45:41 +02:00
if gcs [ jid ] . get_active_jid ( ) == jid :
gcs [ jid ] . set_subject ( jid ,
gcs [ jid ] . subjects [ jid ] )
2005-04-19 00:45:13 +02:00
return
2005-04-18 16:05:30 +02:00
if jid . find ( ' @ ' ) < = 0 :
2005-03-05 22:02:38 +01:00
jid = jid . replace ( ' @ ' , ' ' )
2005-04-14 11:38:08 +02:00
self . roster . on_message ( jid , _ ( ' error while sending ' ) + \
2005-09-15 19:33:02 +02:00
' \" %s \" ( %s ) ' % ( array [ 3 ] , array [ 2 ] ) , array [ 4 ] , account , \
msg_type = ' error ' )
2004-07-08 21:46:24 +02:00
2005-02-15 01:10:10 +01:00
def handle_event_msgsent ( self , account , array ) :
2005-07-20 13:39:01 +02:00
#('MSGSENT', account, (jid, msg, keyID))
2005-07-21 17:23:18 +02: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-10 00:46:13 +02:00
helpers . play_sound ( ' message_sent ' )
2005-02-15 01:10:10 +01:00
2004-06-20 23:58:12 +02:00
def handle_event_subscribe ( self , account , array ) :
#('SUBSCRIBE', account, (jid, text))
2005-10-20 13:17:17 +02:00
dialogs . SubscriptionRequestWindow ( array [ 0 ] , array [ 1 ] , account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Subscribe ' , ( account , array ) )
2004-06-20 23:58:12 +02:00
def handle_event_subscribed ( self , account , array ) :
2005-02-04 08:58:40 +01:00
#('SUBSCRIBED', account, (jid, resource))
2004-06-20 23:58:12 +02:00
jid = array [ 0 ]
2005-07-18 23:08:31 +02:00
if gajim . contacts [ account ] . has_key ( jid ) :
2005-07-22 02:01:05 +02: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 23:58:12 +02:00
else :
2005-05-29 23:34:01 +02: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 22:00:59 +02: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 02:34:08 +02:00
gajim . contacts [ account ] [ jid ] = [ contact1 ]
2005-07-07 18:38:36 +02:00
self . roster . add_contact_to_roster ( jid , account )
2005-06-10 23:14:16 +02:00
dialogs . InformationDialog ( _ ( ' Authorization accepted ' ) ,
2005-11-12 15:15:32 +01:00
_ ( ' The contact " %s " has authorized you to see his or her status. ' )
2005-08-14 18:12:36 +02:00
% jid )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Subscribed ' , ( account , array ) )
2004-06-20 23:58:12 +02:00
def handle_event_unsubscribed ( self , account , jid ) :
2005-06-15 01:31:13 +02:00
dialogs . InformationDialog ( _ ( ' Contact " %s " removed subscription from you ' ) % jid ,
2005-11-12 15:20:20 +01:00
_ ( ' You will always see him or her as offline. ' ) )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Unsubscribed ' , ( account , jid ) )
2005-10-30 10:58:13 +01: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 16:55:10 +02:00
2005-05-08 22:56:11 +02:00
def handle_event_register_agent_info ( self , account , array ) :
2005-10-05 12:13:31 +02:00
#('REGISTER_AGENT_INFO', account, (agent, infos, is_form))
2005-05-08 22:56:11 +02:00
if array [ 1 ] . has_key ( ' instructions ' ) :
2005-10-20 13:17:17 +02:00
config . ServiceRegistrationWindow ( array [ 0 ] , array [ 1 ] , account ,
2005-10-05 12:13:31 +02:00
array [ 2 ] )
2005-05-08 22:56:11 +02:00
else :
2005-06-10 23:14:16 +02:00
dialogs . ErrorDialog ( _ ( ' Contact with " %s " cannot be established ' \
2005-06-07 03:10:24 +02:00
% array [ 0 ] ) , _ ( ' Check your connection or try again later. ' ) ) . get_response ( )
2005-05-08 22:56:11 +02:00
2005-03-27 12:31:26 +02:00
def handle_event_agent_info_items ( self , account , array ) :
2005-04-23 23:54:12 +02:00
#('AGENT_INFO_ITEMS', account, (agent, node, items))
2005-10-30 10:58:13 +01:00
try :
gajim . connections [ account ] . services_cache . agent_items ( array [ 0 ] ,
array [ 1 ] , array [ 2 ] )
except AttributeError :
return
2005-03-27 12:31:26 +02:00
def handle_event_agent_info_info ( self , account , array ) :
2005-10-30 10:58:13 +01: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 12:31:26 +02:00
2004-06-20 23:58:12 +02:00
def handle_event_acc_ok ( self , account , array ) :
2005-11-04 22:27:14 +01:00
#('ACC_OK', account, (config))
2005-11-13 16:08:47 +01:00
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . acc_is_ok ( array )
2005-11-04 22:27:14 +01:00
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' NewAccount ' , ( account , array ) )
2004-06-20 23:58:12 +02:00
2005-11-04 22:27:14 +01:00
def handle_event_acc_not_ok ( self , account , array ) :
#('ACC_NOT_OK', account, (reason))
2005-11-13 16:08:47 +01:00
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . acc_is_not_ok ( array )
2005-11-04 22:27:14 +01:00
2004-06-20 23:58:12 +02:00
def handle_event_quit ( self , p1 , p2 ) :
2005-10-20 13:17:17 +02:00
self . roster . quit_gtkgui_interface ( )
2005-04-12 17:30:09 +02:00
2004-06-21 02:12:25 +02:00
def handle_event_myvcard ( self , account , array ) :
2004-06-20 23:58:12 +02:00
nick = ' '
2004-06-21 02:12:25 +02:00
if array . has_key ( ' NICKNAME ' ) :
nick = array [ ' NICKNAME ' ]
2005-06-30 08:16:32 +02:00
if nick :
2005-07-18 23:08:31 +02:00
gajim . nicks [ account ] = nick
2005-11-13 16:08:47 +01:00
if self . instances [ account ] [ ' infos ' ] . has_key ( array [ ' jid ' ] ) :
win = self . instances [ account ] [ ' infos ' ] [ array [ ' jid ' ] ]
2005-11-07 16:43:47 +01: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 23:58:12 +02:00
2005-10-03 18:14:41 +02:00
def handle_event_vcard ( self , account , vcard ) :
2005-10-12 22:10:42 +02:00
# ('VCARD', account, data)
2005-10-03 18:14:41 +02:00
''' vcard holds the vcard data '''
jid = vcard [ ' jid ' ]
2005-11-28 17:26:19 +01:00
resource = ' '
if vcard . has_key ( ' resource ' ) :
resource = vcard [ ' resource ' ]
2005-10-03 18:14:41 +02:00
# vcard window
2005-06-26 21:59:34 +02:00
win = None
2005-11-13 16:08:47 +01:00
if self . instances [ account ] [ ' infos ' ] . has_key ( jid ) :
win = self . instances [ account ] [ ' infos ' ] [ jid ]
2005-11-28 17:26:19 +01:00
elif resource and self . instances [ account ] [ ' infos ' ] . has_key (
jid + ' / ' + resource ) :
2005-11-13 16:08:47 +01:00
win = self . instances [ account ] [ ' infos ' ] [ jid + ' / ' + resource ]
2005-06-26 21:40:57 +02:00
if win :
2005-10-30 22:39:09 +01:00
win . set_values ( vcard )
2005-07-20 15:13:52 +02:00
2005-10-03 18:14:41 +02:00
# show avatar in chat
2005-07-20 15:13:52 +02:00
win = None
2005-11-13 16:08:47 +01:00
if self . instances [ account ] [ ' chats ' ] . has_key ( jid ) :
win = self . instances [ account ] [ ' chats ' ] [ jid ]
2005-11-28 17:26:19 +01:00
elif resource and self . instances [ account ] [ ' chats ' ] . has_key (
jid + ' / ' + resource ) :
2005-11-13 16:08:47 +01:00
win = self . instances [ account ] [ ' chats ' ] [ jid + ' / ' + resource ]
2005-07-20 15:20:47 +02:00
if win :
2005-10-03 22:17:55 +02:00
win . show_avatar ( jid , resource )
2005-11-14 19:14:28 +01:00
# Show avatar in roster
2005-11-19 17:59:09 +01:00
self . roster . draw_avatar ( jid , account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' VcardInfo ' , ( account , vcard ) )
2004-06-20 23:58:12 +02:00
2005-04-06 22:18:55 +02:00
def handle_event_os_info ( self , account , array ) :
2005-07-20 14:48:11 +02:00
win = None
2005-11-13 16:08:47 +01: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 14:48:11 +02:00
if win :
win . set_os_info ( array [ 1 ] , array [ 2 ] , array [ 3 ] )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' OsInfo ' , ( account , array ) )
2005-04-06 22:18:55 +02:00
2005-09-19 18:13:45 +02: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 16:08:47 +01:00
if self . instances [ account ] [ ' gc ' ] . has_key ( jid ) : # ji is then room_jid
2005-09-19 18:13:45 +02:00
#FIXME: upgrade the chat instances (for pm)
#FIXME: real_jid can be None
2005-11-13 16:08:47 +01:00
self . instances [ account ] [ ' gc ' ] [ jid ] . chg_contact_status ( jid , resource ,
2005-09-19 18:13:45 +02:00
array [ 1 ] , array [ 2 ] , array [ 4 ] , array [ 5 ] , array [ 6 ] , array [ 7 ] ,
array [ 8 ] , array [ 9 ] , array [ 10 ] , account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' GCPresence ' , ( account , array ) )
2005-09-19 18:13:45 +02:00
2004-08-05 00:40:22 +02:00
def handle_event_gc_msg ( self , account , array ) :
2005-09-23 23:01:42 +02:00
# ('GC_MSG', account, (jid, msg, time))
2005-06-29 22:50:30 +02:00
jids = array [ 0 ] . split ( ' / ' , 1 )
2005-09-23 23:01:42 +02:00
room_jid = jids [ 0 ]
2005-11-13 16:08:47 +01:00
if not self . instances [ account ] [ ' gc ' ] . has_key ( room_jid ) :
2004-08-05 00:40:22 +02:00
return
if len ( jids ) == 1 :
2005-09-23 23:01:42 +02:00
# message from server
nick = ' '
2004-08-05 00:40:22 +02:00
else :
2005-09-23 23:01:42 +02:00
# message from someone
nick = jids [ 1 ]
2005-12-01 19:03:05 +01:00
self . instances [ account ] [ ' gc ' ] [ room_jid ] . on_message ( room_jid , nick ,
array [ 1 ] , array [ 2 ] )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' GCMessage ' , ( account , array ) )
2004-08-05 00:40:22 +02:00
2005-03-04 22:27:45 +01:00
def handle_event_gc_subject ( self , account , array ) :
#('GC_SUBJECT', account, (jid, subject))
2005-06-29 22:50:30 +02:00
jids = array [ 0 ] . split ( ' / ' , 1 )
2005-03-04 22:27:45 +01:00
jid = jids [ 0 ]
2005-11-13 16:08:47 +01:00
if not self . instances [ account ] [ ' gc ' ] . has_key ( jid ) :
2005-03-04 22:27:45 +01:00
return
2005-11-13 16:08:47 +01:00
self . instances [ account ] [ ' gc ' ] [ jid ] . set_subject ( jid , array [ 1 ] )
2005-03-04 22:52:27 +01:00
if len ( jids ) > 1 :
2005-11-13 16:08:47 +01:00
self . instances [ account ] [ ' gc ' ] [ jid ] . print_conversation (
2005-03-04 22:52:27 +01:00
' %s has set the subject to %s ' % ( jids [ 1 ] , array [ 1 ] ) , jid )
2005-03-04 22:27:45 +01:00
2005-04-20 12:21:33 +02: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 16:08:47 +01:00
if not self . instances [ account ] [ ' gc_config ' ] . has_key ( jid ) :
self . instances [ account ] [ ' gc_config ' ] [ jid ] = \
2005-10-20 13:17:17 +02:00
config . GroupchatConfigWindow ( account , jid , array [ 1 ] )
2005-09-11 17:02:22 +02:00
def handle_event_gc_invitation ( self , account , array ) :
2005-10-04 12:59:11 +02:00
#('GC_INVITATION', (room_jid, jid_from, reason, password))
2005-10-20 13:17:17 +02:00
dialogs . InvitationReceivedDialog ( account , array [ 0 ] , array [ 1 ] ,
2005-10-04 12:59:11 +02:00
array [ 3 ] , array [ 2 ] )
2005-09-11 17:02:22 +02:00
2004-10-10 20:44:38 +02:00
def handle_event_bad_passphrase ( self , account , array ) :
2005-08-30 23:10:14 +02:00
use_gpg_agent = gajim . config . get ( ' use_gpg_agent ' )
if use_gpg_agent :
return
2005-06-18 19:00:54 +02:00
keyID = gajim . config . get_per ( ' accounts ' , account , ' keyid ' )
self . roster . forget_gpg_passphrase ( keyID )
2005-08-02 00:48:58 +02:00
dialogs . WarningDialog ( _ ( ' Your passphrase is incorrect ' ) ,
_ ( ' You are currently connected without your OpenPGP key. ' ) ) . get_response ( )
2004-10-10 20:44:38 +02:00
2004-11-18 18:15:15 +01:00
def handle_event_roster_info ( self , account , array ) :
#('ROSTER_INFO', account, (jid, name, sub, ask, groups))
jid = array [ 0 ]
2005-07-18 23:08:31 +02:00
if not gajim . contacts [ account ] . has_key ( jid ) :
2004-11-18 18:15:15 +01:00
return
2005-11-01 16:28:19 +01:00
contacts = gajim . contacts [ account ] [ jid ]
2004-11-18 18:15:15 +01:00
if not ( array [ 2 ] or array [ 3 ] ) :
2005-11-01 16:28:19 +01:00
self . roster . remove_contact ( contacts [ 0 ] , account )
2005-07-18 23:08:31 +02:00
del gajim . contacts [ account ] [ jid ]
2005-11-13 18:43:41 +01:00
#FIXME if it was the only one in its group, remove the group
2004-11-18 18:15:15 +01:00
return
2005-11-01 16:28:19 +01:00
for contact in contacts :
2004-11-18 20:21:20 +01:00
name = array [ 1 ]
2005-02-04 08:58:40 +01:00
if name :
2005-11-01 16:28:19 +01:00
contact . name = name
contact . sub = array [ 2 ]
contact . ask = array [ 3 ]
2005-03-27 23:35:55 +02:00
if array [ 4 ] :
2005-11-01 16:28:19 +01:00
contact . groups = array [ 4 ]
2005-04-23 02:37:51 +02:00
self . roster . draw_contact ( jid , account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' RosterInfo ' , ( account , array ) )
2004-11-18 18:15:15 +01:00
2005-06-11 19:21:30 +02:00
def handle_event_bookmarks ( self , account , bms ) :
2005-08-18 21:06:24 +02: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 11:35:11 +01: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 13:29:30 +01:00
# join autojoinable rooms
2005-11-27 10:41:48 +01: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 18:18:25 +02:00
def handle_event_file_send_error ( self , account , array ) :
jid = array [ 0 ]
file_props = array [ 1 ]
2005-11-13 16:08:47 +01:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 22:31:44 +02:00
ft . set_status ( file_props [ ' type ' ] , file_props [ ' sid ' ] , ' stop ' )
2005-10-19 22:16:22 +02: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 20:06:48 +01:00
notify . notify ( _ ( ' File Transfer Error ' ) ,
2005-11-01 01:02:31 +01:00
jid , account , ' file-send-error ' , file_props )
2005-10-18 22:30:26 +02: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 18:18:25 +02:00
def handle_event_file_request_error ( self , account , array ) :
jid = array [ 0 ]
file_props = array [ 1 ]
2005-11-13 16:08:47 +01:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 22:31:44 +02:00
ft . set_status ( file_props [ ' type ' ] , file_props [ ' sid ' ] , ' stop ' )
2005-10-19 22:16:22 +02:00
errno = file_props [ ' error ' ]
2005-10-18 22:30:26 +02: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 22:16:22 +02:00
if errno in ( - 4 , - 5 ) :
msg_type = ' file-error '
else :
msg_type = ' file-request-error '
2005-11-01 18:12:40 +01:00
self . add_event ( account , jid , msg_type , file_props )
2005-10-18 22:30:26 +02:00
if gajim . show_notification ( account ) :
2005-08-06 18:18:25 +02:00
# check if we should be notified
2005-11-11 20:06:48 +01:00
notify . notify ( _ ( ' File Transfer Error ' ) ,
2005-11-01 01:02:31 +01:00
jid , account , msg_type , file_props )
2005-10-18 22:30:26 +02:00
2005-07-30 12:20:46 +02: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 11:59:59 +02:00
contact = gajim . contacts [ account ] [ jid ] [ 0 ]
2005-10-18 11:07:52 +02:00
2005-10-18 22:30:26 +02:00
if gajim . popup_window ( account ) :
2005-11-13 16:08:47 +01:00
self . instances [ ' file_transfers ' ] . show_file_request ( account , contact ,
2005-10-18 11:07:52 +02:00
file_props )
return
2005-10-19 12:39:23 +02:00
self . add_event ( account , jid , ' file-request ' , file_props )
2005-10-18 11:07:52 +02:00
2005-10-18 22:30:26 +02:00
if gajim . show_notification ( account ) :
2005-11-11 20:06:48 +01:00
notify . notify ( _ ( ' File Transfer Request ' ) ,
2005-10-20 13:40:29 +02:00
jid , account , ' file-request ' )
2005-10-18 11:07:52 +02:00
2005-08-01 17:02:46 +02:00
def handle_event_file_progress ( self , account , file_props ) :
2005-11-13 16:08:47 +01:00
self . instances [ ' file_transfers ' ] . set_progress ( file_props [ ' type ' ] ,
2005-08-01 17:02:46 +02:00
file_props [ ' sid ' ] , file_props [ ' received-len ' ] )
2005-08-04 13:17:16 +02:00
2005-07-30 16:14:10 +02:00
def handle_event_file_rcv_completed ( self , account , file_props ) :
2005-11-13 16:08:47 +01:00
ft = self . instances [ ' file_transfers ' ]
2005-08-01 17:02:46 +02: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 13:17:16 +02:00
if file_props . has_key ( ' stalled ' ) and file_props [ ' stalled ' ] or \
file_props . has_key ( ' paused ' ) and file_props [ ' paused ' ] :
2005-08-04 09:23:14 +02:00
return
2005-08-26 02:52:44 +02:00
jid = unicode ( file_props [ ' sender ' ] )
2005-10-19 23:14:51 +02:00
if gajim . popup_window ( account ) :
2005-08-04 13:17:16 +02:00
if file_props [ ' error ' ] == 0 :
2005-11-01 12:25:01 +01:00
if gajim . config . get ( ' notify_on_file_complete ' ) :
ft . show_completed ( jid , file_props )
2005-08-04 13:17:16 +02:00
elif file_props [ ' error ' ] == - 1 :
2005-10-19 23:14:51 +02:00
ft . show_stopped ( jid , file_props )
return
2005-11-01 12:25:01 +01:00
msg_type = ' '
2005-11-21 10:59:19 +01:00
event_type = ' '
2005-11-01 12:25:01 +01:00
if file_props [ ' error ' ] == 0 and gajim . config . get ( ' notify_on_file_complete ' ) :
2005-10-19 23:14:51 +02: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 10:59:19 +01:00
2005-12-01 19:03:05 +01:00
if event_type == ' ' :
# FIXME: ugly workaround (this can happen Gajim sent, Gaim recvs)
2005-11-21 10:59:19 +01: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 23:14:51 +02:00
2005-11-01 12:25:01 +01:00
if msg_type :
self . add_event ( account , jid , msg_type , file_props )
2005-10-19 23:14:51 +02:00
if gajim . config . get ( ' notify_on_file_complete ' ) and \
2005-11-08 17:53:33 +01: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 19:03:05 +01:00
notify . notify ( event_type , jid , account , msg_type , file_props )
2005-08-04 22:32:38 +02:00
def handle_event_stanza_arrived ( self , account , stanza ) :
2005-11-13 16:08:47 +01:00
if not self . instances . has_key ( account ) :
2005-08-10 13:52:37 +02:00
return
2005-11-13 16:08:47 +01:00
if self . instances [ account ] . has_key ( ' xml_console ' ) :
self . instances [ account ] [ ' xml_console ' ] . print_stanza ( stanza , ' incoming ' )
2005-08-06 01:43:28 +02:00
def handle_event_stanza_sent ( self , account , stanza ) :
2005-11-13 16:08:47 +01:00
if not self . instances . has_key ( account ) :
2005-08-10 13:52:37 +02:00
return
2005-11-13 16:08:47 +01:00
if self . instances [ account ] . has_key ( ' xml_console ' ) :
self . instances [ account ] [ ' xml_console ' ] . print_stanza ( stanza , ' outgoing ' )
2005-08-04 22:32:38 +02:00
2005-09-10 11:25:06 +02:00
def handle_event_vcard_published ( self , account , array ) :
2005-10-02 23:56:38 +02:00
dialogs . InformationDialog ( _ ( ' vCard publication succeeded ' ) , _ ( ' Your personal information has been published successfully. ' ) )
2005-09-10 11:25:06 +02:00
def handle_event_vcard_not_published ( self , account , array ) :
2005-10-02 23:56:38 +02:00
dialogs . InformationDialog ( _ ( ' vCard publication failed ' ) , _ ( ' There was an error while publishing your personal information, try again later. ' ) )
2005-11-27 13:29:30 +01:00
2005-11-27 13:42:42 +01:00
def handle_event_signed_in ( self , account , empty ) :
2005-11-30 19:19:25 +01:00
''' SIGNED_IN event is emitted when we sign in, so handle it '''
2005-11-27 13:29:30 +01:00
# join already open groupchats
2005-11-30 18:45:34 +01: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 13:29:30 +01:00
2004-01-20 13:46:27 +01:00
def read_sleepy ( self ) :
2005-07-22 13:07:06 +02:00
''' Check idle status and change that status if needed '''
2004-10-21 00:53:15 +02:00
if not self . sleeper . poll ( ) :
2005-09-11 01:44:53 +02:00
# idle detection is not supported in that OS
return False # stop looping in vain
2004-05-29 06:05:06 +02:00
state = self . sleeper . getState ( )
2005-04-14 09:05:10 +02:00
for account in gajim . connections :
2005-07-19 00:39:59 +02:00
if not gajim . sleeper_state . has_key ( account ) or \
not gajim . sleeper_state [ account ] :
2004-05-29 06:05:06 +02:00
continue
if state == common . sleepy . STATE_AWAKE and \
2005-07-23 13:52:53 +02:00
gajim . sleeper_state [ account ] in ( ' autoaway ' , ' autoxa ' ) :
2005-09-14 02:02:32 +02:00
#we go online
2005-07-22 23:27:04 +02:00
self . roster . send_status ( account , ' online ' ,
2005-09-14 02:02:32 +02:00
gajim . status_before_autoaway [ account ] )
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] = ' online '
2004-05-29 06:05:06 +02:00
elif state == common . sleepy . STATE_AWAY and \
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] == ' online ' and \
2005-04-14 09:05:10 +02:00
gajim . config . get ( ' autoaway ' ) :
2005-07-22 23:27:04 +02:00
#we save out online status
gajim . status_before_autoaway [ account ] = \
gajim . connections [ account ] . status
2005-08-30 23:38:59 +02:00
#we go away (no auto status) [we pass True to auto param]
2005-08-06 17:17:20 +02:00
self . roster . send_status ( account , ' away ' ,
2005-09-14 02:02:32 +02:00
gajim . config . get ( ' autoaway_message ' ) , auto = True )
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] = ' autoaway '
2005-09-11 01:44:53 +02:00
elif state == common . sleepy . STATE_XA and ( \
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] == ' autoaway ' or \
gajim . sleeper_state [ account ] == ' online ' ) and \
2005-04-14 09:05:10 +02:00
gajim . config . get ( ' autoxa ' ) :
2005-08-30 23:38:59 +02:00
#we go extended away [we pass True to auto param]
2005-08-06 17:17:20 +02:00
self . roster . send_status ( account , ' xa ' ,
2005-09-14 02:02:32 +02:00
gajim . config . get ( ' autoxa_message ' ) , auto = True )
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] = ' autoxa '
2005-04-18 16:05:30 +02:00
return True # renew timeout (loop for ever)
2003-11-30 23:40:24 +01:00
2004-12-01 21:47:37 +01:00
def autoconnect ( self ) :
2005-04-18 16:05:30 +02:00
''' auto connect at startup '''
2005-07-22 13:07:52 +02:00
ask_message = False
2005-04-14 09:05:10 +02:00
for a in gajim . connections :
if gajim . config . get_per ( ' accounts ' , a , ' autoconnect ' ) :
2005-07-22 13:07:52 +02:00
ask_message = True
2005-04-14 09:05:10 +02:00
break
2005-03-15 21:01:04 +01:00
if ask_message :
2005-05-12 02:22:36 +02:00
message = self . roster . get_status_message ( ' online ' )
2005-03-15 21:01:04 +01:00
if message == - 1 :
return
2005-04-14 09:05:10 +02:00
for a in gajim . connections :
if gajim . config . get_per ( ' accounts ' , a , ' autoconnect ' ) :
2005-05-12 02:22:36 +02:00
self . roster . send_status ( a , ' online ' , message )
2005-04-18 16:05:30 +02:00
return False
2004-12-01 21:47:37 +01:00
2004-12-14 13:57:45 +01:00
def show_systray ( self ) :
self . systray . show_icon ( )
2005-03-28 03:20:47 +02:00
self . systray_enabled = True
2004-12-14 13:57:45 +01:00
def hide_systray ( self ) :
self . systray . hide_icon ( )
2005-03-28 03:20:47 +02:00
self . systray_enabled = False
2005-03-09 22:29:20 +01: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 16:57:25 +02:00
return False
2005-06-18 17:57:06 +02:00
t = img . get_storage_type ( )
if t != gtk . IMAGE_PIXBUF and t != gtk . IMAGE_ANIMATION :
2005-03-09 22:29:20 +01:00
return False
return True
2005-03-10 19:20:23 +01:00
2005-03-13 18:04:57 +01:00
def make_regexps ( self ) :
2005-03-10 19:20:23 +01: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 23:53:40 +01: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 03:35:54 +01:00
# ^ matches at the beginning of lines
2005-03-10 23:53:40 +01:00
#
2005-03-10 19:20:23 +01:00
# * means 0 or more times
# + means 1 or more times
2005-03-10 23:53:40 +01:00
# ? means 0 or 1 time
2005-03-10 19:20:23 +01:00
# | means or
# [^*] anything but '*' (inside [] you don't have to escape metachars)
# [^\s*] anything but whitespaces and '*'
2005-03-11 17:24:04 +01: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 18:16:42 +02:00
# even if the the text is just '*foo*'
2005-03-11 23:52:28 +01:00
# (?!\S) is the same thing but it's a lookahead assertion
2005-08-01 16:38:21 +02:00
# \S*[^\s\W] --> in the matching string don't match ? or ) etc.. if at the end
2005-03-29 23:28:58 +02:00
# so http://be) will match http://be and http://be)be) will match http://be)be
2005-11-01 00:31:18 +01:00
2005-11-01 00:59:26 +01:00
prefixes = ( r ' http:// ' , r ' https:// ' , r ' news:// ' , r ' ftp:// ' , r ' ed2k:// ' ,
2005-11-27 23:28:33 +01:00
r ' magnet: ' , r ' www \ . ' , r ' ftp \ . ' )
2005-11-01 00:33:33 +01:00
# NOTE: it's ok to catch www.gr such stuff exist!
2005-11-01 00:31:18 +01:00
2005-11-27 23:05:10 +01:00
#FIXME: recognize xmpp: and treat it specially
2005-11-01 00:31:18 +01:00
prefix_pattern = ' '
for prefix in prefixes :
prefix_pattern + = prefix + ' | '
2005-11-01 00:48:36 +01:00
prefix_pattern = prefix_pattern [ : - 1 ] # remove last |
2005-11-01 00:31:18 +01:00
prefix_pattern = ' ( ' + prefix_pattern + ' ) '
links = r ' \ b ' + prefix_pattern + r ' \ S*[^ \ s \ W]| '
2005-03-10 19:20:23 +01:00
#2nd one: at_least_one_char@at_least_one_char.at_least_one_char
2005-08-01 16:38:21 +02:00
mail = r ' \ bmailto: \ S*[^ \ s \ W]| ' r ' \ b \ S+@ \ S+ \ . \ S*[^ \ s \ W]| '
2005-03-10 19:20:23 +01:00
2005-11-13 22:46:04 +01:00
#detects eg. *b* *bold* *bold bold* test *bold* *bold*! (*bold*)
2005-03-11 13:55:38 +01:00
#doesn't detect (it's a feature :P) * bold* *bold * * bold * test*bold*
2005-11-13 22:46:04 +01:00
formatting = r ' (?<! \ w) ' r ' \ *[^ \ s*] ' r ' ([^*]*[^ \ s*])? ' r ' \ *(?! \ w)| ' \
2005-11-14 22:26:20 +01:00
r ' (?<! \ w| \ <) ' r ' /[^ \ s/] ' r ' ([^/]*[^ \ s/])? ' r ' /(?! \ w)| ' \
2005-11-13 22:50:54 +01:00
r ' (?<! \ w) ' r ' _[^ \ s_] ' r ' ([^_]*[^ \ s_])? ' r ' _(?! \ w) '
2005-03-11 17:24:04 +01:00
2005-03-13 18:04:57 +01:00
basic_pattern = links + mail + formatting
self . basic_pattern_re = sre . compile ( basic_pattern , sre . IGNORECASE )
2005-11-15 15:17:02 +01:00
emoticons_pattern = ' '
2005-11-15 12:52:40 +01: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 19:35:40 +01: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 12:52:40 +01:00
keys = self . emoticons . keys ( )
keys . sort ( self . on_emoticon_sort )
2005-11-30 19:35:40 +01:00
emoticons_pattern_prematch = ' '
emoticons_pattern_postmatch = ' '
emoticon_length = 0
2005-11-15 12:52:40 +01: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 19:35:40 +01: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 22:46:04 +01:00
# because emoticons match later (in the string) they need to be after
# basic matches that may occur earlier
2005-11-30 19:35:40 +01:00
emot_and_basic_pattern = basic_pattern + emoticons_pattern
2005-11-13 21:47:15 +01:00
self . emot_and_basic_re = sre . compile ( emot_and_basic_pattern , sre . IGNORECASE )
2005-03-13 18:04:57 +01:00
# at least one character in 3 parts (before @, after @, after .)
2005-08-01 16:27:23 +02:00
self . sth_at_sth_dot_sth_re = sre . compile ( r ' \ S+@ \ S+ \ . \ S*[^ \ s)?] ' )
2005-11-27 22:57:41 +01:00
sre . purge ( ) # clear the regular expression cache
2005-03-10 19:20:23 +01:00
2005-11-01 00:48:36 +01:00
def on_emoticon_sort ( self , emot1 , emot2 ) :
2005-09-08 13:25:47 +02:00
len1 = len ( emot1 )
len2 = len ( emot2 )
if len1 < len2 :
return 1
elif len1 > len2 :
return - 1
return 0
2005-03-13 00:43:17 +01:00
def on_launch_browser_mailer ( self , widget , url , kind ) :
2005-08-27 16:26:08 +02:00
helpers . launch_browser_mailer ( kind , url )
2004-12-14 13:57:45 +01:00
2005-11-15 12:52:40 +01: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 20:51:54 +02:00
self . emoticons = dict ( )
2005-11-15 12:52:40 +01:00
2005-04-16 16:50:26 +02:00
emots = gajim . config . get_per ( ' emoticons ' )
for emot in emots :
emot_file = gajim . config . get_per ( ' emoticons ' , emot , ' path ' )
2005-04-06 20:51:54 +02:00
if not self . image_is_ok ( emot_file ) :
continue
2005-11-15 15:31:27 +01:00
# This avoids duplicated emoticons with the same image eg. :) and :-)
2005-11-15 12:52:40 +01: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 12:11:30 +02:00
self . emoticons [ emot . upper ( ) ] = emot_file
2005-11-15 12:52:40 +01:00
2005-11-10 11:16:25 +01:00
def register_handlers ( self ) :
2005-08-09 19:21:35 +02: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 10:58:13 +01:00
' AGENT_ERROR_INFO ' : self . handle_event_agent_info_error ,
' AGENT_ERROR_ITEMS ' : self . handle_event_agent_items_error ,
2005-08-09 19:21:35 +02: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 22:27:14 +01:00
' ACC_NOT_OK ' : self . handle_event_acc_not_ok ,
2005-08-09 19:21:35 +02:00
' MYVCARD ' : self . handle_event_myvcard ,
' VCARD ' : self . handle_event_vcard ,
' OS_INFO ' : self . handle_event_os_info ,
2005-09-19 18:13:45 +02:00
' GC_NOTIFY ' : self . handle_event_gc_notify ,
2005-08-09 19:21:35 +02: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 17:02:22 +02:00
' GC_INVITATION ' : self . handle_event_gc_invitation ,
2005-08-09 19:21:35 +02: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 11:25:06 +02:00
' VCARD_PUBLISHED ' : self . handle_event_vcard_published ,
' VCARD_NOT_PUBLISHED ' : self . handle_event_vcard_not_published ,
2005-09-27 00:29:52 +02:00
' ASK_NEW_NICK ' : self . handle_event_ask_new_nick ,
2005-11-27 13:42:42 +01:00
' SIGNED_IN ' : self . handle_event_signed_in ,
2005-08-09 19:21:35 +02:00
}
2005-04-14 09:58:54 +02:00
2005-08-09 20:45:16 +02:00
def exec_event ( self , account ) :
ev = gajim . events_for_ui [ account ] . pop ( 0 )
self . handlers [ ev [ 0 ] ] ( account , ev [ 1 ] )
2005-04-14 13:06:58 +02:00
def process_connections ( self ) :
2005-12-01 19:03:05 +01: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 13:06:58 +02:00
2005-04-16 19:03:21 +02:00
def save_config ( self ) :
2005-11-22 11:56:25 +01:00
err_str = parser . write ( )
if err_str is not None :
print >> sys . stderr , err_str
2005-08-23 11:32:44 +02:00
# it is good to notify the user
2005-11-12 15:17:27 +01:00
# in case he or she cannot see the output of the console
2005-11-22 11:56:25 +01:00
dialogs . ErrorDialog ( _ ( ' Could not save your settings and preferences ' ) ,
err_str ) . get_response ( )
2005-12-01 19:03:05 +01:00
sys . exit ( )
2005-04-16 19:03:21 +02:00
2005-04-12 23:09:06 +02:00
def __init__ ( self ) :
2005-10-20 13:17:17 +02:00
gajim . interface = self
2005-04-29 11:47:09 +02:00
self . default_values = {
' inmsgcolor ' : gajim . config . get ( ' inmsgcolor ' ) ,
' outmsgcolor ' : gajim . config . get ( ' outmsgcolor ' ) ,
' statusmsgcolor ' : gajim . config . get ( ' statusmsgcolor ' ) ,
}
2005-10-03 18:14:41 +02:00
2005-04-29 11:47:09 +02:00
parser . read ( )
2005-06-13 18:53:23 +02:00
# Do not set gajim.verbose to False if -v option was given
if gajim . config . get ( ' verbose ' ) :
gajim . verbose = True
2005-06-14 00:11:09 +02:00
#add default emoticons if there is not in the config file
2005-06-01 22:03:37 +02: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 19:03:05 +01:00
gajim . config . set_per ( ' emoticons ' , emot , ' path ' ,
gajim . config . emoticons_default [ emot ] )
2005-06-14 00:11:09 +02:00
#add default status messages if there is not in the config file
2005-06-01 22:03:37 +02: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 19:03:05 +01:00
gajim . config . set_per ( ' statusmsg ' , msg , ' message ' ,
gajim . config . statusmsg_default [ msg ] )
2005-06-14 00:11:09 +02:00
#add default themes if there is not in the config file
2005-09-02 16:03:00 +02:00
theme = gajim . config . get ( ' roster_theme ' )
if not theme in gajim . config . get_per ( ' themes ' ) :
2005-10-29 18:56:33 +02:00
gajim . config . set ( ' roster_theme ' , ' green ' )
2005-06-14 00:11:09 +02:00
if len ( gajim . config . get_per ( ' themes ' ) ) == 0 :
2005-12-01 19:03:05 +01:00
d = [ ' accounttextcolor ' , ' accountbgcolor ' , ' accountfont ' ,
' accountfontattrs ' , ' grouptextcolor ' , ' groupbgcolor ' , ' groupfont ' ,
' groupfontattrs ' , ' contacttextcolor ' , ' contactbgcolor ' ,
' contactfont ' , ' contactfontattrs ' , ' bannertextcolor ' ,
' bannerbgcolor ' ]
2005-11-15 12:52:40 +01:00
2005-06-14 00:11:09 +02:00
default = gajim . config . themes_default
2005-08-12 02:08:04 +02:00
for theme_name in default :
gajim . config . add_per ( ' themes ' , theme_name )
theme = default [ theme_name ]
2005-06-14 00:11:09 +02:00
for o in d :
2005-08-12 02:08:04 +02:00
gajim . config . set_per ( ' themes ' , theme_name , o ,
theme [ d . index ( o ) ] )
2005-07-25 16:38:21 +02:00
if gajim . config . get ( ' autodetect_browser_mailer ' ) :
2005-08-05 01:11:55 +02:00
gtkgui_helpers . autodetect_browser_mailer ( )
2005-07-25 16:38:21 +02:00
2005-05-28 20:20:27 +02:00
if gajim . verbose :
2005-05-18 11:17:41 +02:00
gajim . log . setLevel ( gajim . logging . DEBUG )
2005-05-18 09:38:47 +02:00
else :
gajim . log . setLevel ( None )
2005-08-02 00:44:05 +02:00
gajim . socks5queue = socks5 . SocksQueue (
self . handle_event_file_rcv_completed ,
self . handle_event_file_progress )
2005-11-10 11:16:25 +01:00
self . register_handlers ( )
2005-04-29 11:47:09 +02:00
for account in gajim . config . get_per ( ' accounts ' ) :
gajim . connections [ account ] = common . connection . Connection ( account )
2005-07-17 23:41:54 +02:00
2005-09-11 15:56:38 +02: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 18:14:41 +02:00
2005-11-13 16:08:47 +01:00
self . instances = { ' logs ' : { } }
2005-10-03 18:14:41 +02:00
2005-04-12 23:09:06 +02:00
for a in gajim . connections :
2005-11-13 16:08:47 +01:00
self . instances [ a ] = { ' infos ' : { } , ' disco ' : { } , ' chats ' : { } ,
2005-10-30 10:58:13 +01:00
' gc ' : { } , ' gc_config ' : { } }
2005-07-18 23:08:31 +02:00
gajim . contacts [ a ] = { }
gajim . groups [ a ] = { }
2005-07-25 22:04:24 +02:00
gajim . gc_contacts [ a ] = { }
2005-08-03 11:23:36 +02:00
gajim . gc_connected [ a ] = { }
2005-07-18 23:08:31 +02:00
gajim . newly_added [ a ] = [ ]
gajim . to_be_removed [ a ] = [ ]
2005-10-15 22:49:08 +02:00
gajim . awaiting_events [ a ] = { }
2005-07-18 23:08:31 +02:00
gajim . nicks [ a ] = gajim . config . get_per ( ' accounts ' , a , ' name ' )
gajim . allow_notifications [ a ] = False
gajim . sleeper_state [ a ] = 0
2005-07-02 13:06:02 +02:00
gajim . encrypted_chats [ a ] = [ ]
2005-07-03 17:27:41 +02:00
gajim . last_message_time [ a ] = { }
2005-07-22 23:27:04 +02:00
gajim . status_before_autoaway [ a ] = ' '
2005-08-09 19:21:35 +02:00
gajim . events_for_ui [ a ] = [ ]
2005-04-12 17:30:09 +02:00
2005-10-20 13:17:17 +02:00
self . roster = roster_window . RosterWindow ( )
2005-11-19 23:01:10 +01:00
2005-11-19 22:45:34 +01:00
if gajim . config . get ( ' remote_control ' ) :
2005-11-19 23:01:10 +01:00
try :
import remote_control
self . remote_ctrl = remote_control . Remote ( )
2005-12-01 22:07:30 +01:00
except ( exceptions . DbusNotSupported , exceptions . SessionBusNotPresent ) :
2005-11-19 23:01:10 +01:00
self . remote_ctrl = None
2005-07-17 23:41:54 +02:00
else :
2005-11-19 23:01:10 +01:00
self . remote_ctrl = None
2005-07-21 10:05:10 +02:00
2005-11-07 16:43:47 +01:00
self . show_vcard_when_connect = [ ]
2005-06-03 19:35:48 +02: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-11 01:44:53 +02:00
gajim . config . get ( ' autoawaytime ' ) * 60 , # make minutes to seconds
2005-04-22 01:20:18 +02:00
gajim . config . get ( ' autoxatime ' ) * 60 )
2005-08-11 15:20:46 +02:00
2005-03-28 03:20:47 +02:00
self . systray_enabled = False
2005-08-11 15:20:46 +02:00
self . systray_capabilities = False
2005-08-23 20:03:18 +02:00
if os . name == ' nt ' :
try :
import systraywin32
except : # user doesn't have trayicon capabilities
pass
else :
self . systray_capabilities = True
2005-10-20 13:17:17 +02:00
self . systray = systraywin32 . SystrayWin32 ( )
2005-08-11 15:20:46 +02:00
else :
2005-03-14 14:25:34 +01:00
try :
2005-08-11 15:20:46 +02: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 13:17:17 +02:00
self . systray = systray . Systray ( )
2005-03-14 18:39:18 +01:00
else :
2005-03-29 18:16:42 +02:00
self . systray_capabilities = True
2005-10-20 13:17:17 +02:00
self . systray = systray . Systray ( )
2005-08-11 15:20:46 +02:00
2005-06-06 01:17:59 +02:00
if self . systray_capabilities and gajim . config . get ( ' trayicon ' ) :
2004-12-14 13:57:45 +01:00
self . show_systray ( )
2005-05-08 17:06:24 +02:00
if gajim . config . get ( ' check_for_new_version ' ) :
2005-10-20 13:17:17 +02:00
check_for_new_version . Check_for_new_version_dialog ( )
2005-04-17 01:15:03 +02:00
2005-11-15 12:52:40 +01:00
self . init_emoticons ( )
self . make_regexps ( )
2005-03-26 22:09:49 +01:00
# get instances for windows/dialogs that will show_all()/hide()
2005-11-13 16:08:47 +01:00
self . instances [ ' file_transfers ' ] = dialogs . FileTransfersWindow ( )
self . instances [ ' preferences ' ] = config . PreferencesWindow ( )
2005-04-14 09:58:54 +02:00
for account in gajim . connections :
2005-12-01 19:03:05 +01:00
self . instances [ account ] [ ' xml_console ' ] = dialogs . XMLConsoleWindow (
account )
2005-03-10 19:29:03 +01:00
2005-03-15 11:20:10 +01:00
gobject . timeout_add ( 100 , self . autoconnect )
2005-04-14 19:07:55 +02:00
gobject . timeout_add ( 200 , self . process_connections )
2005-04-18 16:05:30 +02:00
gobject . timeout_add ( 500 , self . read_sleepy )
2003-11-30 23:40:24 +01:00
2005-04-12 23:09:06 +02:00
if __name__ == ' __main__ ' :
2005-04-18 16:05:30 +02:00
signal . signal ( signal . SIGINT , signal . SIG_DFL ) # ^C exits the application
2005-08-11 15:20:46 +02:00
try : # Import Psyco if available
2005-04-12 23:09:06 +02:00
import psyco
psyco . full ( )
except ImportError :
pass
2005-09-07 21:46:09 +02:00
2005-10-10 15:12:28 +02:00
if os . name != ' nt ' :
2005-10-10 15:15:32 +02:00
# Session Management support
2005-10-10 15:12:28 +02: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 23:12:30 +02:00
if path_to_gajim_script :
2005-10-10 15:12:28 +02: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 15:15:32 +02:00
# register (by default only the first time) xmmpi: to Gajim
2005-10-10 15:12:28 +02:00
try :
import gconf
# in try because daemon may not be there
client = gconf . client_get_default ( )
2005-10-13 21:44:33 +02:00
2005-10-10 15:12:28 +02: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 21:44:33 +02:00
except :
pass
2005-09-07 23:12:30 +02:00
2005-12-02 12:18:00 +01:00
# Migrate old logs if user wnats that
if NO_DB :
dialog = dialogs . ConfirmationDialog ( _ ( ' It is the first time you rin Gajim since the way logs are save changed. You can ask Gajim to migrate your old logs by pressing Ok button. This can take some minutes. ' ) , _ ( ' Do you want to migrate your logs? ' ) )
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 16:05:30 +02:00
Interface ( )
2005-04-12 23:09:06 +02:00
gtk . main ( )