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