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>
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-04-01 14:55:56 +00:00
2005-05-30 12:53:48 +00:00
import sys
2003-11-30 22:40:24 +00:00
import pygtk
pygtk . require ( ' 2.0 ' )
2005-05-30 12:53:48 +00:00
try :
import gtk
except RuntimeError , msg :
if str ( msg ) == ' could not open display ' :
print ' Gajim needs Xserver to run. Exiting... '
2005-05-30 14:19:14 +00:00
sys . exit ( )
2005-02-28 18:15:48 +00:00
import gtk . glade
import gobject
import os
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-02-28 18:15:48 +00:00
2005-04-14 07:05:10 +00:00
from common import i18n
i18n . init ( )
_ = i18n . _
APP = i18n . APP
gtk . glade . bindtextdomain ( APP , i18n . DIR )
gtk . glade . textdomain ( APP )
2005-05-21 16:01:52 +00:00
import common . sleepy
import check_for_new_version
from common import gajim
from common import connection
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-06-05 23:17:59 +00:00
opts , args = getopt . getopt ( sys . argv [ 1 : ] , ' hvp: ' , [ ' help ' , ' verbose ' ,
2005-05-28 18:20:27 +00:00
' profile= ' ] )
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-04-12 15:30:09 +00:00
try :
import winsound # windows-only built-in module for playing wav
except ImportError :
pass
2005-06-24 14:28:00 +00:00
class Contact :
2005-06-24 13:29:26 +00:00
''' Information concerning each contact '''
2005-06-25 09:18:39 +00:00
def __init__ ( self , jid = ' ' , name = ' ' , groups = [ ] , show = ' ' , status = ' ' , sub = ' ' ,
ask = ' ' , resource = ' ' , priority = 5 , keyID = ' ' , role = ' ' , affiliation = ' ' ) :
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-04-14 17:07:55 +00:00
import roster_window
import systray
import dialogs
import config
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 :
2005-06-23 23:25:20 +00:00
def launch_browser_mailer ( self , kind , uri ) :
2005-03-09 22:30:47 +00:00
#kind = 'url' or 'mail'
2005-05-17 15:04:54 +00:00
if os . name == ' nt ' :
try :
2005-06-25 01:21:30 +00:00
os . startfile ( uri ) # if pywin32 is installed we open
except :
pass
2005-06-30 13:33:21 +00:00
2005-06-25 01:21:30 +00:00
else :
2005-06-30 23:24:39 +00:00
if kind == ' url ' and not \
2005-06-30 23:30:16 +00:00
( uri . startswith ( ' http:// ' ) or uri . startswith ( ' https:// ' ) ) :
2005-06-30 13:33:21 +00:00
uri = ' http:// ' + uri
elif kind == ' mail ' and not uri . startswith ( ' mailto: ' ) :
uri = ' mailto: ' + uri
2005-06-25 01:21:30 +00:00
if gajim . config . get ( ' openwith ' ) == ' gnome-open ' :
command = ' gnome-open '
elif gajim . config . get ( ' openwith ' ) == ' kfmclient exec ' :
command = ' kfmclient exec '
elif gajim . config . get ( ' openwith ' ) == ' custom ' :
if kind == ' url ' :
command = gajim . config . get ( ' custombrowser ' )
if kind == ' mail ' :
command = gajim . config . get ( ' custommailapp ' )
if command == ' ' : # if no app is configured
return
# we add the uri in "" so we have good parsing from shell
command = command + ' " ' + uri + ' " & '
try : #FIXME: when we require 2.4+ use subprocess module
os . system ( command )
2005-05-17 15:04:54 +00:00
except :
pass
2005-03-09 22:30:47 +00:00
2005-02-10 00:07:55 +00:00
def play_sound ( self , event ) :
2005-04-12 21:09:06 +00:00
if not gajim . config . get ( ' sounds_on ' ) :
2005-02-16 00:24:36 +00:00
return
2005-04-16 17:36:27 +00:00
path_to_soundfile = gajim . config . get_per ( ' soundevents ' , event , ' path ' )
2005-04-12 15:30:09 +00:00
if not os . path . exists ( path_to_soundfile ) :
2005-02-14 22:30:04 +00:00
return
2005-04-12 15:30:09 +00:00
if os . name == ' nt ' :
2005-05-17 08:01:49 +00:00
try :
2005-06-10 16:45:54 +00:00
winsound . PlaySound ( path_to_soundfile ,
2005-04-12 15:30:09 +00:00
winsound . SND_FILENAME | winsound . SND_ASYNC )
2005-05-17 08:01:49 +00:00
except :
pass
2005-04-12 15:30:09 +00:00
elif os . name == ' posix ' :
2005-04-12 21:09:06 +00:00
if gajim . config . get ( ' soundplayer ' ) == ' ' :
2005-04-12 15:30:09 +00:00
return
2005-06-24 13:29:26 +00:00
player = gajim . config . get ( ' soundplayer ' )
2005-06-25 01:21:30 +00:00
# we add the path in "" so we have good parsing from shell
command = player + ' " ' + path_to_soundfile + ' " & '
#FIXME: when we require 2.4+ use subprocess module
2005-06-24 13:29:26 +00:00
os . system ( command )
2005-02-10 00:07:55 +00:00
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)
self . roster . mklists ( data , account )
2004-06-20 21:58:12 +00:00
self . roster . draw_roster ( )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . 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))
dialogs . InformationDialog ( data [ 0 ] , data [ 1 ] ) . get_response ( )
2005-05-10 16:53:28 +00:00
def handle_event_error_answer ( self , account , array ) :
#('ERROR_ANSWER', account, (jid_from. errmsg, errcode))
jid_from = array [ 0 ]
if jid_from in self . windows [ account ] [ ' gc ' ] :
self . windows [ account ] [ ' gc ' ] [ jid_from ] . print_conversation (
' Error %s : %s ' % ( array [ 2 ] , array [ 1 ] ) , jid_from )
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-05-12 18:55:01 +00:00
if status != ' offline ' :
2005-05-15 15:42:57 +00:00
gobject . timeout_add ( 30000 , self . allow_notif , account )
2005-05-15 16:54:04 +00:00
else :
2005-07-18 21:08:31 +00:00
gajim . allow_notifications [ account ] = False
2004-06-20 21:58:12 +00:00
self . roster . on_status_changed ( account , status )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . raise_signal ( ' AccountPresence ' , ( status , account ) )
2004-06-20 21:58:12 +00:00
def handle_event_notify ( self , account , array ) :
2004-10-07 14:43:59 +00:00
#('NOTIFY', account, (jid, status, message, resource, priority, keyID,
2005-06-18 22:09:31 +00:00
# role, affiliation, real_jid, reason, actor, statusCode, new_nick))
2005-02-26 20:25:01 +00:00
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 :
2004-06-20 21:58:12 +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
#Update user
2005-07-18 21:08:31 +00:00
if gajim . contacts [ account ] . has_key ( ji ) :
luser = gajim . contacts [ account ] [ ji ]
2004-06-20 21:58:12 +00:00
user1 = None
resources = [ ]
for u in luser :
resources . append ( u . resource )
if u . resource == resource :
user1 = u
break
2005-02-14 23:48:32 +00:00
if user1 :
2005-03-12 08:25:45 +00:00
if user1 . show in statuss :
old_show = statuss . index ( user1 . show )
2005-07-19 18:58:50 +00:00
if old_show == new_show and user1 . status == array [ 2 ] : #no change
2005-07-19 18:23:27 +00:00
return
2005-02-14 23:48:32 +00:00
else :
2005-07-18 21:08:31 +00:00
user1 = gajim . contacts [ account ] [ ji ] [ 0 ]
2005-02-16 15:00:28 +00:00
if user1 . show in statuss :
old_show = statuss . index ( user1 . show )
2004-06-24 21:37:27 +00:00
if ( resources != [ ' ' ] and ( len ( luser ) != 1 or
2005-07-19 18:23:27 +00:00
luser [ 0 ] . show != ' offline ' ) ) and jid . find ( ' @ ' ) > 0 :
2005-02-14 23:48:32 +00:00
old_show = 0
2005-06-25 09:18:39 +00:00
user1 = Contact ( jid = user1 . jid , name = user1 . name ,
groups = user1 . groups , show = user1 . show ,
status = user1 . status , sub = user1 . sub , ask = user1 . ask ,
resource = user1 . resource , priority = user1 . priority ,
keyID = user1 . keyID )
2004-06-20 21:58:12 +00:00
luser . append ( user1 )
user1 . resource = resource
2005-04-18 18:24:43 +00:00
if user1 . jid . find ( ' @ ' ) > 0 and len ( luser ) == 1 : # It's not an agent
2005-04-12 15:30:09 +00:00
if old_show == 0 and new_show > 1 :
2005-07-18 21:08:31 +00:00
if not user1 . jid in gajim . newly_added [ account ] :
gajim . newly_added [ account ] . append ( user1 . jid )
if user1 . jid in gajim . to_be_removed [ account ] :
gajim . to_be_removed [ account ] . remove ( user1 . jid )
2005-04-12 15:30:09 +00:00
gobject . timeout_add ( 5000 , self . roster . remove_newly_added , \
user1 . 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-07-18 21:08:31 +00:00
if not user1 . jid in gajim . to_be_removed [ account ] :
gajim . to_be_removed [ account ] . append ( user1 . jid )
if user1 . jid in gajim . newly_added [ account ] :
gajim . newly_added [ account ] . remove ( user1 . jid )
2005-04-23 00:37:51 +00:00
self . roster . draw_contact ( user1 . jid , account )
2005-07-18 21:08:31 +00:00
if not gajim . awaiting_messages [ account ] . has_key ( jid ) :
2005-04-12 15:30:09 +00:00
gobject . timeout_add ( 5000 , self . roster . really_remove_user , \
user1 , account )
2004-06-20 21:58:12 +00:00
user1 . show = array [ 1 ]
user1 . status = array [ 2 ]
user1 . priority = priority
2004-10-07 14:43:59 +00:00
user1 . keyID = keyID
2005-04-18 14:05:30 +00:00
if jid . find ( ' @ ' ) < = 0 :
2004-06-20 21:58:12 +00:00
#It must be an agent
2005-07-18 21:08:31 +00:00
if gajim . contacts [ account ] . has_key ( ji ) :
2004-06-20 21:58:12 +00:00
#Update existing iter
2005-04-23 00:37:51 +00:00
self . roster . draw_contact ( ji , account )
2005-07-18 21:08:31 +00:00
elif gajim . contacts [ account ] . has_key ( ji ) :
2004-06-20 21:58:12 +00:00
#It isn't an agent
2005-07-07 16:38:36 +00:00
self . roster . chg_contact_status ( user1 , array [ 1 ] , array [ 2 ] , account )
2005-04-18 08:54:47 +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 ' ,
' enabled ' ) :
self . play_sound ( ' contact_connected ' )
2005-04-06 18:51:54 +00:00
if not self . windows [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-07-18 21:08:31 +00:00
not gajim . awaiting_messages [ 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-06-10 18:40:19 +00:00
instance = dialogs . PopupNotificationWindow ( self ,
2005-06-03 18:40:43 +00:00
_ ( ' Contact Signed In ' ) , jid , account )
2005-04-21 21:23:41 +00:00
self . roster . popup_notification_windows . append ( instance )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . raise_signal ( ' ContactPresence ' , ( account , array ) )
2005-04-18 23:55:13 +00:00
2005-05-11 15:21:13 +00:00
elif old_show > 1 and new_show < 2 :
if gajim . config . get_per ( ' soundevents ' , ' contact_disconnected ' ,
' enabled ' ) :
self . play_sound ( ' contact_disconnected ' )
2005-04-18 08:54:47 +00:00
if not self . windows [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-07-18 21:08:31 +00:00
not gajim . awaiting_messages [ 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-06-10 18:40:19 +00:00
instance = dialogs . PopupNotificationWindow ( self ,
2005-06-03 18:40:43 +00:00
_ ( ' Contact Signed Out ' ) , jid , account )
2005-04-21 21:23:41 +00:00
self . roster . popup_notification_windows . append ( instance )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . raise_signal ( ' ContactAbsence ' , ( account , array ) )
2005-02-14 23:48:32 +00:00
2004-08-05 21:56:54 +00:00
elif self . windows [ account ] [ ' gc ' ] . has_key ( ji ) :
#it is a groupchat presence
2005-07-19 18:23:27 +00:00
#TODO: upgrade the chat instances (for pm)
2005-07-07 16:38:36 +00:00
self . windows [ account ] [ ' gc ' ] [ ji ] . chg_contact_status ( ji , resource ,
2005-06-03 18:40:43 +00:00
array [ 1 ] , array [ 2 ] , array [ 6 ] , array [ 7 ] , array [ 8 ] , array [ 9 ] ,
2005-06-18 22:09:31 +00:00
array [ 10 ] , array [ 11 ] , array [ 12 ] , account )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . raise_signal ( ' GCPresence ' , ( account , array ) )
2004-06-21 00:12:25 +00:00
2004-06-20 21:58:12 +00:00
def handle_event_msg ( self , account , array ) :
2005-07-19 14:38:58 +00:00
#('MSG', account, (contact, msg, time, encrypted, msg_type, subject, chatstate_tag))
2005-03-05 21:02:38 +00:00
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
2005-07-16 09:33:43 +00:00
msg_type = array [ 4 ]
2005-07-19 14:38:58 +00:00
chatstate_tag = 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
if self . windows [ account ] [ ' gc ' ] . has_key ( jid ) : # it's a Private Message
nick = array [ 0 ] . split ( ' / ' , 1 ) [ 1 ]
fjid = jid + ' / ' + nick
2005-07-01 22:13:45 +00:00
if self . windows [ account ] [ ' chats ' ] . has_key ( fjid ) :
chat_win = self . windows [ account ] [ ' chats ' ] [ fjid ]
chat_win . print_conversation ( array [ 1 ] , fjid , tim = array [ 2 ] )
return
2005-07-18 21:08:31 +00:00
qs = gajim . awaiting_messages [ account ]
2005-07-01 22:13:45 +00:00
if not qs . has_key ( fjid ) :
qs [ fjid ] = [ ]
qs [ fjid ] . append ( ( array [ 1 ] , array [ 2 ] , array [ 3 ] ) )
self . roster . nb_unread + = 1
gc = self . windows [ account ] [ ' gc ' ] [ jid ]
show = gc . contacts [ jid ] [ nick ] . show
2005-07-05 21:35:37 +00:00
c = Contact ( jid = fjid , name = nick , groups = [ ' none ' ] , show = show ,
2005-07-01 22:13:45 +00:00
ask = ' none ' )
2005-07-05 21:35:37 +00:00
self . roster . new_chat ( c , account )
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-07-19 19:10:03 +00:00
if self . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
chat_win = self . windows [ account ] [ ' chats ' ] [ jid ]
# chatstates - display jep85 events in window
if chatstate_tag != None :
if chat_win . chatstates [ jid ] == ' ask ' :
chat_win . chatstates [ jid ] = ' active '
chat_win . print_conversation ( jid + ' is now ' + chatstate_tag , jid , ' status ' , tim = array [ 2 ] )
else :
# got no valid jep85 answer, peer does not support it
chat_win . chatstates [ jid ] = - 1
if not array [ 1 ] : #empty message
return
2005-04-06 18:51:54 +00:00
first = False
2005-02-14 22:30:04 +00:00
if not self . windows [ account ] [ ' chats ' ] . has_key ( jid ) and \
2005-07-18 21:08:31 +00:00
not gajim . awaiting_messages [ 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
instance = dialogs . PopupNotificationWindow ( self ,
_ ( ' New Single Message ' ) , jid , account , msg_type )
else : # chat message
instance = dialogs . PopupNotificationWindow ( self ,
_ ( ' New Message ' ) , jid , account , msg_type )
2005-04-21 21:23:41 +00:00
self . roster . popup_notification_windows . append ( instance )
2005-07-05 21:35:37 +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 ] ,
array [ 4 ] , array [ 5 ] )
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 :
self . 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 :
self . play_sound ( ' next_message_received ' )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . 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 ]
gcs = self . windows [ account ] [ ' gc ' ]
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 ]
if not self . windows [ account ] [ ' chats ' ] . has_key ( fjid ) :
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 :
show = model . get_value ( i , 3 )
2005-06-12 22:45:41 +00:00
else :
show = ' offline '
2005-06-25 09:18:39 +00:00
u = Contact ( jid = fjid , name = nick , groups = [ ' none ' ] ,
show = show , ask = ' none ' )
2005-06-12 22:45:41 +00:00
self . roster . new_chat ( u , account )
self . windows [ account ] [ ' chats ' ] [ fjid ] . print_conversation (
' 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-03-27 19:39:50 +00:00
' \" %s \" ( %s ) ' % ( array [ 3 ] , array [ 2 ] ) , array [ 4 ] , account )
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-04-16 14:50:26 +00:00
if gajim . config . get_per ( ' soundevents ' , ' message_sent ' , ' enabled ' ) :
self . 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-06-13 10:48:07 +00:00
dialogs . SubscriptionRequestWindow ( self , array [ 0 ] , array [ 1 ] , account )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . 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 ) :
u = gajim . contacts [ account ] [ jid ] [ 0 ]
2005-02-04 07:58:40 +00:00
u . resource = array [ 1 ]
2004-12-08 19:56:33 +00:00
self . roster . remove_user ( u , account )
2005-07-07 17:33:15 +00:00
if _ ( ' not in the roster ' ) in u . groups :
u . groups . remove ( _ ( ' not in the roster ' ) )
2004-12-08 19:56:33 +00:00
if len ( u . groups ) == 0 :
2005-07-04 23:18:29 +00:00
u . groups = [ _ ( ' General ' ) ]
2005-07-07 16:38:36 +00:00
self . roster . add_contact_to_roster ( u . jid , account )
2005-07-18 14:52:28 +00:00
gajim . connections [ account ] . update_contact ( u . jid , u . name , u . 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-06-25 09:18:39 +00:00
user1 = Contact ( jid = jid , name = jid . split ( ' @ ' ) [ 0 ] ,
2005-07-04 23:18:29 +00:00
groups = [ _ ( ' General ' ) ] , show = ' online ' , status = ' online ' ,
2005-06-25 09:18:39 +00:00
ask = ' to ' , resource = array [ 1 ] , keyID = keyID )
2005-07-18 21:08:31 +00:00
gajim . contacts [ account ] [ jid ] = [ user1 ]
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-06-07 01:10:24 +00:00
_ ( ' The contact " %s " has authorized you to see his status. ' )
% jid ) . get_response ( )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . 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 ,
_ ( ' You will always see him as offline. ' ) ) . get_response ( )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-19 19:41:23 +00:00
self . remote . raise_signal ( ' Unsubscribed ' , ( account , jid ) )
2004-06-20 21:58:12 +00:00
def handle_event_agent_info ( self , account , array ) :
2004-09-06 14:55:10 +00:00
#('AGENT_INFO', account, (agent, identities, features, items))
2005-04-04 17:15:08 +00:00
if self . windows [ account ] . has_key ( ' disco ' ) :
self . windows [ account ] [ ' disco ' ] . agent_info ( array [ 0 ] , array [ 1 ] , \
2004-09-06 14:55:10 +00:00
array [ 2 ] , array [ 3 ] )
2005-05-08 20:56:11 +00:00
def handle_event_register_agent_info ( self , account , array ) :
#('AGENT_INFO', account, (agent, infos))
if array [ 1 ] . has_key ( ' instructions ' ) :
2005-06-10 21:14:16 +00:00
config . ServiceRegistrationWindow ( array [ 0 ] , array [ 1 ] , self , account )
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-04-04 17:15:08 +00:00
if self . windows [ account ] . has_key ( ' disco ' ) :
2005-04-23 21:54:12 +00:00
self . windows [ account ] [ ' disco ' ] . agent_info_items ( array [ 0 ] , array [ 1 ] ,
array [ 2 ] )
2005-03-27 10:31:26 +00:00
def handle_event_agent_info_info ( self , account , array ) :
2005-04-24 15:47:08 +00:00
#('AGENT_INFO_INFO', account, (agent, node, identities, features))
2005-04-04 17:15:08 +00:00
if self . windows [ account ] . has_key ( ' disco ' ) :
self . windows [ account ] [ ' disco ' ] . agent_info_info ( array [ 0 ] , array [ 1 ] , \
2005-04-24 15:47:08 +00:00
array [ 2 ] , array [ 3 ] )
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-05-10 09:20:35 +00:00
#('ACC_OK', account, (name, config))
name = array [ 0 ]
2005-06-10 21:14:16 +00:00
dialogs . InformationDialog ( _ ( ' Account registration successful ' ) ,
2005-06-07 01:10:24 +00:00
_ ( ' The account " %s " has been registered with the Jabber server. ' ) % name ) . get_response ( )
2005-05-10 09:20:35 +00:00
gajim . config . add_per ( ' accounts ' , name )
for opt in array [ 1 ] :
gajim . config . set_per ( ' accounts ' , name , opt , array [ 1 ] [ opt ] )
2005-05-11 22:00:48 +00:00
if self . windows . has_key ( ' account_modification ' ) :
2005-05-10 09:20:35 +00:00
self . windows [ ' account_modification ' ] . account_is_ok ( array [ 0 ] )
2005-04-20 10:21:33 +00:00
self . windows [ name ] = { ' infos ' : { } , ' chats ' : { } , ' gc ' : { } , ' gc_config ' : { } }
2005-07-18 21:08:31 +00:00
gajim . awaiting_messages [ name ] = { }
2005-04-14 07:05:10 +00:00
gajim . connections [ name ] . connected = 0
2005-07-18 21:08:31 +00:00
gajim . nicks [ name ] = array [ 1 ] [ ' name ' ]
gajim . allow_notifications [ name ] = False
gajim . groups [ name ] = { }
gajim . contacts [ name ] = { }
gajim . newly_added [ name ] = [ ]
gajim . to_be_removed [ name ] = [ ]
gajim . sleeper_state [ name ] = 0
2005-07-02 11:06:02 +00:00
gajim . encrypted_chats [ name ] = [ ]
2005-07-03 15:27:41 +00:00
gajim . last_message_time [ name ] = { }
2005-04-04 15:51:29 +00:00
if self . windows . has_key ( ' accounts ' ) :
self . windows [ ' accounts ' ] . init_accounts ( )
2004-07-01 19:49:26 +00:00
self . roster . draw_roster ( )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . raise_signal ( ' NewAccount ' , ( account , array ) )
2004-06-20 21:58:12 +00:00
def handle_event_quit ( self , p1 , p2 ) :
2005-04-16 17:36:27 +00:00
self . roster . quit_gtkgui_plugin ( )
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
2004-06-20 21:58:12 +00:00
2004-06-21 00:12:25 +00:00
def handle_event_vcard ( self , account , array ) :
2005-06-26 19:59:34 +00:00
win = None
2004-06-21 00:12:25 +00:00
if self . windows [ account ] [ ' infos ' ] . has_key ( array [ ' jid ' ] ) :
2005-06-26 19:40:57 +00:00
win = self . windows [ account ] [ ' infos ' ] [ array [ ' jid ' ] ]
elif self . windows [ account ] [ ' infos ' ] . has_key ( array [ ' jid ' ] + ' / ' + \
array [ ' resource ' ] ) :
win = self . windows [ account ] [ ' infos ' ] [ array [ ' jid ' ] + ' / ' + \
array [ ' resource ' ] ]
if win :
win . set_values ( array )
2005-06-09 20:35:44 +00:00
if self . windows [ account ] [ ' chats ' ] . has_key ( array [ ' jid ' ] ) :
self . windows [ account ] [ ' chats ' ] [ array [ ' jid ' ] ] . set_avatar ( array )
2004-06-20 21:58:12 +00:00
2005-04-06 20:18:55 +00:00
def handle_event_os_info ( self , account , array ) :
if self . windows [ account ] [ ' infos ' ] . has_key ( array [ 0 ] ) :
self . windows [ account ] [ ' infos ' ] [ array [ 0 ] ] . set_os_info ( array [ 1 ] , \
2005-04-24 22:58:41 +00:00
array [ 2 ] , array [ 3 ] )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . raise_signal ( ' OsInfo ' , ( account , array ) )
2005-04-06 20:18:55 +00:00
2004-08-04 22:40:22 +00:00
def handle_event_gc_msg ( self , account , array ) :
2004-09-27 17:51:51 +00:00
#('GC_MSG', account, (jid, msg, time))
2005-06-29 20:50:30 +00:00
jids = array [ 0 ] . split ( ' / ' , 1 )
2004-08-04 22:40:22 +00:00
jid = jids [ 0 ]
2004-08-05 21:56:54 +00:00
if not self . windows [ account ] [ ' gc ' ] . has_key ( jid ) :
2004-08-04 22:40:22 +00:00
return
if len ( jids ) == 1 :
#message from server
2005-01-27 11:02:01 +00:00
self . windows [ account ] [ ' gc ' ] [ jid ] . print_conversation ( array [ 1 ] , jid , \
2004-09-27 17:51:51 +00:00
tim = array [ 2 ] )
2004-08-04 22:40:22 +00:00
else :
#message from someone
2005-01-27 11:02:01 +00:00
self . windows [ account ] [ ' gc ' ] [ jid ] . print_conversation ( array [ 1 ] , jid , \
2004-09-27 17:51:51 +00:00
jids [ 1 ] , array [ 2 ] )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . 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 ]
if not self . windows [ account ] [ ' gc ' ] . has_key ( jid ) :
return
2005-03-05 13:16:52 +00:00
self . windows [ account ] [ ' gc ' ] [ jid ] . set_subject ( jid , array [ 1 ] )
2005-03-04 21:52:27 +00:00
if len ( jids ) > 1 :
self . windows [ account ] [ ' gc ' ] [ jid ] . print_conversation ( \
' %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 ]
if not self . windows [ account ] [ ' gc_config ' ] . has_key ( jid ) :
self . windows [ account ] [ ' gc_config ' ] [ jid ] = \
2005-06-10 21:14:16 +00:00
config . GroupchatConfigWindow ( self , account , jid , array [ 1 ] )
2005-04-20 10:21:33 +00:00
2004-10-10 18:44:38 +00:00
def handle_event_bad_passphrase ( self , account , array ) :
2005-06-18 17:00:54 +00:00
keyID = gajim . config . get_per ( ' accounts ' , account , ' keyid ' )
self . roster . forget_gpg_passphrase ( keyID )
2005-06-10 21:14:16 +00:00
dialogs . WarningDialog ( _ ( ' Your GPG passphrase is incorrect ' ) ,
2005-06-07 01:10:24 +00:00
_ ( ' You are currently connected without your GPG 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-07-18 21:08:31 +00:00
users = gajim . contacts [ account ] [ jid ]
2004-11-18 17:15:15 +00:00
if not ( array [ 2 ] or array [ 3 ] ) :
self . roster . remove_user ( users [ 0 ] , account )
2005-07-18 21:08:31 +00:00
del gajim . contacts [ account ] [ jid ]
2004-11-18 17:15:15 +00:00
#TODO if it was the only one in its group, remove the group
return
for user in users :
2004-11-18 19:21:20 +00:00
name = array [ 1 ]
2005-02-04 07:58:40 +00:00
if name :
user . name = name
2004-11-18 17:15:15 +00:00
user . sub = array [ 2 ]
user . ask = array [ 3 ]
2005-03-27 21:35:55 +00:00
if array [ 4 ] :
user . groups = array [ 4 ]
2005-04-23 00:37:51 +00:00
self . roster . draw_contact ( jid , account )
2005-07-19 15:07:00 +00:00
if self . remote and self . remote . is_enabled ( ) :
2005-07-17 21:41:54 +00:00
self . remote . 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 ) :
#('BOOKMARKS', account, [{name,jid,autojoin,password,nick}, {}])
2005-06-09 20:35:44 +00:00
#We received a bookmark item from the server (JEP48)
2005-06-11 17:21:30 +00:00
#Auto join GC windows if neccessary
for bm in bms :
if bm [ ' autojoin ' ] == ' 1 ' :
2005-06-13 10:49:48 +00:00
self . roster . join_gc_room ( account , bm [ ' jid ' ] , bm [ ' nick ' ] ,
2005-06-11 17:21:30 +00:00
bm [ ' password ' ] )
self . roster . make_menu ( )
2005-06-07 18:21:36 +00:00
2004-01-20 12:46:27 +00:00
def read_sleepy ( self ) :
2005-04-18 14:05:30 +00:00
''' Check if we are idle '''
2004-10-20 22:53:15 +00:00
if not self . sleeper . poll ( ) :
2005-04-18 14:05:30 +00:00
return True # renew timeout (loop for ever)
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-18 21:08:31 +00:00
gajim . sleeper_state [ account ] > 1 :
2004-05-29 04:05:06 +00:00
#we go online
2005-05-20 21:55:04 +00:00
self . roster . send_status ( account , ' online ' , ' Online ' )
2005-07-18 21:08:31 +00:00
gajim . sleeper_state [ account ] = 1
2004-05-29 04:05:06 +00:00
elif state == common . sleepy . STATE_AWAY and \
2005-07-18 21:08:31 +00:00
gajim . sleeper_state [ account ] == 1 and \
2005-04-14 07:05:10 +00:00
gajim . config . get ( ' autoaway ' ) :
2004-05-29 04:05:06 +00:00
#we go away
2005-05-20 21:55:04 +00:00
self . roster . send_status ( account , ' away ' , ' auto away (idle) ' )
2005-07-18 21:08:31 +00:00
gajim . sleeper_state [ account ] = 2
2004-05-29 04:05:06 +00:00
elif state == common . sleepy . STATE_XAWAY and ( \
2005-07-18 21:08:31 +00:00
gajim . sleeper_state [ account ] == 2 or \
gajim . sleeper_state [ account ] == 1 ) and \
2005-04-14 07:05:10 +00:00
gajim . config . get ( ' autoxa ' ) :
2004-05-29 04:05:06 +00:00
#we go extended away
2005-05-20 21:55:04 +00:00
self . roster . send_status ( account , ' xa ' , ' auto away (idle) ' )
2005-07-18 21:08:31 +00:00
gajim . sleeper_state [ account ] = 3
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-03-15 20:01:04 +00:00
ask_message = 0
2005-04-14 07:05:10 +00:00
for a in gajim . connections :
if gajim . config . get_per ( ' accounts ' , a , ' autoconnect ' ) :
ask_message = 1
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-03-29 21:28:58 +00:00
# \S*[^\s)?!,.;] --> in the matching string don't match ? or ) etc.. if at the end
# so http://be) will match http://be and http://be)be) will match http://be)be
links = r ' \ bhttp:// \ S*[^ \ s)?!,.;]| ' r ' \ bhttps:// \ S*[^ \ s)?!,.;]| ' r ' \ bnews:// \ S*[^ \ s)?!,.;]| ' r ' \ bftp:// \ S*[^ \ s)?!,.;]| ' r ' \ bed2k:// \ S*[^ \ s)?!,.;]| ' r ' \ bwww \ . \ S*[^ \ s)?!,.;]| ' r ' \ bftp \ . \ S*[^ \ s)?!,.;]| '
2005-03-10 18:20:23 +00:00
#2nd one: at_least_one_char@at_least_one_char.at_least_one_char
2005-03-29 21:28:58 +00:00
mail = r ' \ bmailto: \ S*[^ \ s)?!,.;]| ' r ' \ b \ S+@ \ S+ \ . \ S*[^ \ s)?]| '
2005-03-10 18:20:23 +00:00
2005-03-11 12:55:38 +00:00
#detects eg. *b* *bold* *bold bold* test *bold*
#doesn't detect (it's a feature :P) * bold* *bold * * bold * test*bold*
2005-03-11 22:52:28 +00:00
formatting = r ' (?<! \ S) \ *[^ \ s*]([^*]*[^ \ s*])? \ *(?! \ S)| ' r ' (?<! \ S)/[^ \ s/]([^/]*[^ \ s/])?/(?! \ S)| ' r ' (?<! \ S)_[^ \ s_]([^_]*[^ \ s_])?_(?! \ S) '
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 )
emoticons_pattern = ' '
2005-04-06 18:51:54 +00:00
for emoticon in self . emoticons : # travel thru emoticons list
2005-03-13 17:04:57 +00:00
emoticon_escaped = sre . escape ( emoticon ) # espace regexp metachars
emoticons_pattern + = emoticon_escaped + ' | ' # | means or in regexp
emot_and_basic_pattern = emoticons_pattern + basic_pattern
2005-06-18 14:57:25 +00:00
self . emot_and_basic_re = sre . compile ( emot_and_basic_pattern ,
2005-03-13 17:04:57 +00:00
sre . IGNORECASE )
# at least one character in 3 parts (before @, after @, after .)
2005-03-29 21:28:58 +00:00
self . sth_at_sth_dot_sth_re = sre . compile ( r ' \ S+@ \ S+ \ . \ S*[^ \ s)?] ' )
2005-03-10 18:20:23 +00:00
2005-03-12 23:43:17 +00:00
def on_launch_browser_mailer ( self , widget , url , kind ) :
self . launch_browser_mailer ( kind , url )
2004-12-14 12:57:45 +00:00
2005-03-27 20:30:00 +00:00
def init_regexp ( self ) :
2005-04-06 18:51:54 +00:00
#initialize emoticons dictionary
self . emoticons = dict ( )
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-06-18 15:57:06 +00:00
self . emoticons [ emot ] = emot_file
2005-04-06 18:51:54 +00:00
# update regular expressions
2005-03-14 21:46:55 +00:00
self . make_regexps ( )
2005-06-29 12:57:46 +00:00
def register_handlers ( self , con ) :
con . register_handler ( ' ROSTER ' , self . handle_event_roster )
con . register_handler ( ' WARNING ' , self . handle_event_warning )
con . register_handler ( ' ERROR ' , self . handle_event_error )
con . register_handler ( ' INFORMATION ' , self . handle_event_information )
con . register_handler ( ' ERROR_ANSWER ' , self . handle_event_error_answer )
con . register_handler ( ' STATUS ' , self . handle_event_status )
con . register_handler ( ' NOTIFY ' , self . handle_event_notify )
con . register_handler ( ' MSG ' , self . handle_event_msg )
con . register_handler ( ' MSGERROR ' , self . handle_event_msgerror )
con . register_handler ( ' MSGSENT ' , self . handle_event_msgsent )
con . register_handler ( ' SUBSCRIBED ' , self . handle_event_subscribed )
con . register_handler ( ' UNSUBSCRIBED ' , self . handle_event_unsubscribed )
con . register_handler ( ' SUBSCRIBE ' , self . handle_event_subscribe )
con . register_handler ( ' AGENT_INFO ' , self . handle_event_agent_info )
con . register_handler ( ' REGISTER_AGENT_INFO ' ,
2005-05-08 20:56:11 +00:00
self . handle_event_register_agent_info )
2005-06-29 12:57:46 +00:00
con . register_handler ( ' AGENT_INFO_ITEMS ' ,
2005-04-14 07:58:54 +00:00
self . handle_event_agent_info_items )
2005-06-29 12:57:46 +00:00
con . register_handler ( ' AGENT_INFO_INFO ' ,
2005-04-14 07:58:54 +00:00
self . handle_event_agent_info_info )
2005-06-29 12:57:46 +00:00
con . register_handler ( ' QUIT ' , self . handle_event_quit )
con . register_handler ( ' ACC_OK ' , self . handle_event_acc_ok )
con . register_handler ( ' MYVCARD ' , self . handle_event_myvcard )
con . register_handler ( ' VCARD ' , self . handle_event_vcard )
con . register_handler ( ' OS_INFO ' , self . handle_event_os_info )
con . register_handler ( ' GC_MSG ' , self . handle_event_gc_msg )
con . register_handler ( ' GC_SUBJECT ' , self . handle_event_gc_subject )
con . register_handler ( ' GC_CONFIG ' , self . handle_event_gc_config )
con . register_handler ( ' BAD_PASSPHRASE ' , self . handle_event_bad_passphrase )
con . register_handler ( ' ROSTER_INFO ' , self . handle_event_roster_info )
con . register_handler ( ' BOOKMARKS ' , self . handle_event_bookmarks )
con . register_handler ( ' CON_TYPE ' , self . handle_event_con_type )
2005-04-14 07:58:54 +00:00
2005-04-14 11:06:58 +00:00
def process_connections ( self ) :
2005-04-18 14:05:30 +00:00
try :
for account in gajim . connections :
if gajim . connections [ account ] . connected :
gajim . connections [ account ] . process ( 0.01 )
2005-06-28 19:03:00 +00:00
time . sleep ( 0.01 ) # threads in connection.py have time to run
2005-04-18 14:05:30 +00:00
return True # renew timeout (loop for ever)
except KeyboardInterrupt :
sys . exit ( )
2005-07-19 19:41:23 +00:00
return False
2005-04-14 11:06:58 +00:00
2005-04-16 17:03:21 +00:00
def save_config ( self ) :
2005-04-26 23:45:25 +00:00
parser . write ( )
2005-04-16 17:03:21 +00:00
2005-07-19 15:07:00 +00:00
def enable_dbus ( self , is_initial = False ) :
2005-07-18 08:18:30 +00:00
if ' remote_control ' not in globals ( ) :
2005-07-17 23:03:40 +00:00
import remote_control
2005-07-19 15:07:00 +00:00
if not hasattr ( self , ' remote ' ) or not self . remote :
try :
self . remote = remote_control . Remote ( self )
2005-07-19 19:41:23 +00:00
except remote_control . DbusNotSupported :
2005-07-19 21:03:17 +00:00
if not is_initial : # show only the first time
dialog = dialogs . ErrorDialog (
_ ( ' D-Bus is not present on this machine ' ) ,
_ ( ' Please install D-Bus if you want to use remote control. ' ) ) . get_response ( )
2005-07-19 15:07:00 +00:00
self . remote = None
return False
2005-07-19 19:41:23 +00:00
except remote_control . SessionBusNotPresent :
2005-07-19 21:03:17 +00:00
if not is_initial : # show only the first time
dialog = dialogs . ErrorDialog ( _ ( ' Session bus is not started ' ) ,
2005-07-19 21:09:30 +00:00
_ ( ' Your system is running without session bus daemon. \n See: http://trac.gajim.org/wiki/GajimDBus for instructions on how to enable it. ' ) ) . get_response ( )
2005-07-19 15:07:00 +00:00
self . remote = None
return False
else :
# enable the previously disabled object
self . remote . set_enabled ( True )
return True
2005-07-17 22:52:15 +00:00
def disable_dbus ( self ) :
2005-07-18 08:37:43 +00:00
if hasattr ( self , ' remote ' ) and self . remote is not None :
2005-07-19 15:07:00 +00:00
# just tell the remote object to skip remote messages
self . remote . set_enabled ( False )
else :
self . remote = None
2005-07-17 22:52:15 +00:00
2005-04-12 21:09:06 +00:00
def __init__ ( 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 ' ) ,
}
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 )
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 )
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
if len ( gajim . config . get_per ( ' themes ' ) ) == 0 :
d = [ ' accounttextcolor ' , ' accountbgcolor ' , ' accountfont ' ,
' grouptextcolor ' , ' groupbgcolor ' , ' groupfont ' , ' contacttextcolor ' ,
' contactbgcolor ' , ' contactfont ' , ' bannertextcolor ' , ' bannerbgcolor ' ]
default = gajim . config . themes_default
for theme in default :
gajim . config . add_per ( ' themes ' , theme )
for o in d :
gajim . config . set_per ( ' themes ' , theme , o ,
default [ theme ] [ d . index ( o ) ] )
2005-05-18 07:38:47 +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-05-05 17:11:48 +00:00
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-03-14 21:51:25 +00:00
if gtk . pygtk_version > = ( 2 , 6 , 0 ) :
2005-03-14 20:21:49 +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 ' )
2004-04-04 22:09:56 +00:00
self . windows = { ' logs ' : { } }
2005-04-12 21:09:06 +00:00
for a in gajim . connections :
2005-04-20 10:21:33 +00:00
self . windows [ a ] = { ' infos ' : { } , ' chats ' : { } , ' gc ' : { } , ' gc_config ' : { } }
2005-07-18 21:08:31 +00:00
gajim . contacts [ a ] = { }
gajim . groups [ a ] = { }
gajim . newly_added [ a ] = [ ]
gajim . to_be_removed [ a ] = [ ]
gajim . awaiting_messages [ a ] = { }
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-04-12 15:30:09 +00:00
2005-06-10 22:45:50 +00:00
self . roster = roster_window . RosterWindow ( self )
2005-07-17 21:41:54 +00:00
if gajim . config . get ( ' use_dbus ' ) :
2005-07-19 15:07:00 +00:00
self . enable_dbus ( True )
2005-07-17 21:41:54 +00:00
else :
2005-07-17 22:52:15 +00:00
self . disable_dbus ( )
2005-07-17 21:41:54 +00:00
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 (
gajim . config . get ( ' autoawaytime ' ) * 60 ,
2005-04-21 23:20:18 +00:00
gajim . config . get ( ' autoxatime ' ) * 60 )
2005-03-28 01:20:47 +00:00
self . systray_enabled = False
2004-12-14 12:57:45 +00:00
try :
2005-07-19 19:41:23 +00:00
import egg . trayicon # use gnomepythonextras trayicon
2004-12-14 12:57:45 +00:00
except :
2005-03-14 13:25:34 +00:00
try :
import trayicon # use yann's
except : # user doesn't have trayicon capabilities
2005-03-29 16:16:42 +00:00
self . systray_capabilities = False
2005-03-14 17:39:18 +00:00
else :
2005-03-29 16:16:42 +00:00
self . systray_capabilities = True
2005-04-14 17:07:55 +00:00
self . systray = systray . Systray ( self )
2004-12-14 12:57:45 +00:00
else :
2005-03-29 21:28:58 +00:00
self . systray_capabilities = True
2005-04-14 17:07:55 +00:00
self . systray = systray . Systray ( self )
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-05-07 14:02:16 +00:00
check_for_new_version . Check_for_new_version_dialog ( self )
2005-04-16 23:15:03 +00:00
2005-03-27 20:30:00 +00:00
self . init_regexp ( )
2005-03-26 21:09:49 +00:00
# get instances for windows/dialogs that will show_all()/hide()
2005-06-10 21:14:16 +00:00
self . windows [ ' preferences ' ] = config . PreferencesWindow ( self )
2005-04-19 23:43:58 +00:00
self . windows [ ' add_remove_emoticons ' ] = \
2005-06-10 21:14:16 +00:00
config . ManageEmoticonsWindow ( self )
2005-03-27 19:39:50 +00:00
self . windows [ ' roster ' ] = self . roster
2005-04-14 07:58:54 +00:00
for account in gajim . connections :
self . register_handlers ( gajim . connections [ 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-04-12 21:09:06 +00:00
try : # Import Psyco if available
import psyco
psyco . full ( )
except ImportError :
pass
2005-04-18 14:05:30 +00:00
Interface ( )
2005-04-12 21:09:06 +00:00
gtk . main ( )