2003-11-30 22:40:24 +00:00
## plugins/gtkgui.py
##
## Gajim Team:
2005-01-07 21:52:38 +00:00
## - Yann Le Boulanger <asterix@lagaule.org>
2004-06-18 09:25:15 +00:00
## - Vincent Hanquez <tab@snarc.org>
2005-03-03 22:14:50 +00:00
## - Nikos Kouremenos <nkour@jabber.org>
2005-03-05 18:47:12 +00:00
## - Alex Podaras <bigpod@jabber.org>
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.
##
2004-07-17 21:00:38 +00:00
def usage ( ) :
#TODO: use i18n
print " usage : " , sys . argv [ 0 ] , ' [OPTION] '
2005-03-01 13:46:22 +00:00
print " -p \t port on which the sock plugin listen "
2004-07-17 21:00:38 +00:00
print " -h, --help \t display this help and exit "
if __name__ == " __main__ " :
import getopt , pickle , sys , socket
try :
opts , args = getopt . getopt ( sys . argv [ 1 : ] , " p:h " , [ " help " ] )
except getopt . GetoptError :
# print help information and exit:
usage ( )
sys . exit ( 2 )
port = 8255
for o , a in opts :
if o == ' -p ' :
port = a
if o in ( " -h " , " --help " ) :
usage ( )
sys . exit ( )
sock = socket . socket ( socket . AF_INET , socket . SOCK_STREAM )
try :
sock . connect ( ( ' ' , 8255 ) )
except :
#TODO: use i18n
2005-03-05 21:02:38 +00:00
print " unable to connect to localhost on port " , port
2004-07-17 21:00:38 +00:00
else :
evp = pickle . dumps ( ( ' EXEC_PLUGIN ' , ' ' , ' gtkgui ' ) )
sock . send ( ' < ' + evp + ' > ' )
sock . close ( )
sys . exit ( )
2003-11-30 22:40:24 +00:00
import pygtk
pygtk . require ( ' 2.0 ' )
import gtk
2005-02-28 18:15:48 +00:00
import gtk . glade
import gobject
import os
import time
import Queue
import sys
import common . optparser
import common . sleepy
2004-05-16 23:47:14 +00:00
from common import i18n
2005-02-28 18:15:48 +00:00
2004-05-16 23:47:14 +00:00
_ = i18n . _
APP = i18n . APP
gtk . glade . bindtextdomain ( APP , i18n . DIR )
gtk . glade . textdomain ( APP )
2004-02-17 02:23:38 +00:00
2004-05-15 16:50:38 +00:00
from dialogs import *
2004-09-06 14:55:10 +00:00
from config import *
2004-05-15 16:50:38 +00:00
2004-02-17 02:23:38 +00:00
GTKGUI_GLADE = ' plugins/gtkgui/gtkgui.glade '
2003-11-30 22:40:24 +00:00
2004-06-28 01:29:02 +00:00
class ImageCellRenderer ( gtk . GenericCellRenderer ) :
__gproperties__ = {
" image " : ( gobject . TYPE_OBJECT , " Image " ,
" Image " , gobject . PARAM_READWRITE ) ,
}
2005-02-28 18:15:48 +00:00
2004-06-28 01:29:02 +00:00
def __init__ ( self ) :
self . __gobject_init__ ( )
self . image = None
def do_set_property ( self , pspec , value ) :
setattr ( self , pspec . name , value )
def do_get_property ( self , pspec ) :
return getattr ( self , pspec . name )
2004-07-01 15:42:39 +00:00
def func ( self , model , path , iter , ( image , tree ) ) :
if model . get_value ( iter , 0 ) == image :
self . redraw = 1
cell_area = tree . get_cell_area ( path , tree . get_column ( 0 ) )
2005-03-02 22:34:16 +00:00
tree . queue_draw_area ( cell_area . x , cell_area . y , cell_area . width , \
cell_area . height )
2004-07-01 15:42:39 +00:00
2004-06-28 01:29:02 +00:00
def animation_timeout ( self , tree , image ) :
if image . get_storage_type ( ) == gtk . IMAGE_ANIMATION :
2004-07-01 15:42:39 +00:00
self . redraw = 0
2004-06-28 01:29:02 +00:00
image . get_data ( ' iter ' ) . advance ( )
2004-07-01 15:42:39 +00:00
model = tree . get_model ( )
model . foreach ( self . func , ( image , tree ) )
if self . redraw :
2005-03-02 22:34:16 +00:00
gobject . timeout_add ( image . get_data ( ' iter ' ) . get_delay_time ( ) , \
self . animation_timeout , tree , image )
2004-07-01 15:42:39 +00:00
else :
image . set_data ( ' iter ' , None )
2004-06-28 01:29:02 +00:00
def on_render ( self , window , widget , background_area , cell_area , \
expose_area , flags ) :
2005-03-02 23:16:28 +00:00
if not self . image :
return
2004-06-28 01:29:02 +00:00
pix_rect = gtk . gdk . Rectangle ( )
2005-03-02 22:34:16 +00:00
pix_rect . x , pix_rect . y , pix_rect . width , pix_rect . height = \
self . on_get_size ( widget , cell_area )
2004-06-28 01:29:02 +00:00
pix_rect . x + = cell_area . x
pix_rect . y + = cell_area . y
pix_rect . width - = 2 * self . get_property ( " xpad " )
pix_rect . height - = 2 * self . get_property ( " ypad " )
draw_rect = cell_area . intersect ( pix_rect )
draw_rect = expose_area . intersect ( draw_rect )
2004-10-25 22:02:16 +00:00
2004-06-28 01:29:02 +00:00
if self . image . get_storage_type ( ) == gtk . IMAGE_ANIMATION :
if not self . image . get_data ( ' iter ' ) :
animation = self . image . get_animation ( )
self . image . set_data ( ' iter ' , animation . get_iter ( ) )
2005-03-02 22:34:16 +00:00
gobject . timeout_add ( self . image . get_data ( ' iter ' ) . get_delay_time ( ) , \
self . animation_timeout , widget , self . image )
2004-06-28 01:29:02 +00:00
pix = self . image . get_data ( ' iter ' ) . get_pixbuf ( )
elif self . image . get_storage_type ( ) == gtk . IMAGE_PIXBUF :
pix = self . image . get_pixbuf ( )
2004-12-27 21:07:01 +00:00
else :
return
window . draw_pixbuf ( widget . style . black_gc , pix , \
draw_rect . x - pix_rect . x , draw_rect . y - pix_rect . y , draw_rect . x , \
draw_rect . y + 2 , draw_rect . width , draw_rect . height , \
gtk . gdk . RGB_DITHER_NONE , 0 , 0 )
2004-06-28 01:29:02 +00:00
def on_get_size ( self , widget , cell_area ) :
2005-03-02 23:16:28 +00:00
if not self . image :
return 0 , 0 , 0 , 0
2004-06-28 01:29:02 +00:00
if self . image . get_storage_type ( ) == gtk . IMAGE_ANIMATION :
animation = self . image . get_animation ( )
pix = animation . get_iter ( ) . get_pixbuf ( )
elif self . image . get_storage_type ( ) == gtk . IMAGE_PIXBUF :
pix = self . image . get_pixbuf ( )
2004-12-27 21:07:01 +00:00
else :
return 0 , 0 , 0 , 0
2004-06-28 01:29:02 +00:00
pixbuf_width = pix . get_width ( )
pixbuf_height = pix . get_height ( )
calc_width = self . get_property ( " xpad " ) * 2 + pixbuf_width
calc_height = self . get_property ( " ypad " ) * 2 + pixbuf_height
x_offset = 0
y_offset = 0
if cell_area and pixbuf_width > 0 and pixbuf_height > 0 :
2005-03-02 22:34:16 +00:00
x_offset = self . get_property ( " xalign " ) * ( cell_area . width - \
calc_width - self . get_property ( " xpad " ) )
y_offset = self . get_property ( " yalign " ) * ( cell_area . height - \
calc_height - self . get_property ( " ypad " ) )
2004-06-28 01:29:02 +00:00
return x_offset , y_offset , calc_width , calc_height
gobject . type_register ( ImageCellRenderer )
2005-03-02 20:27:09 +00:00
class User :
2005-03-01 23:48:05 +00:00
""" Information concerning each users """
2003-11-30 22:40:24 +00:00
def __init__ ( self , * args ) :
if len ( args ) == 0 :
self . jid = ' '
self . name = ' '
self . groups = [ ]
self . show = ' '
self . status = ' '
2004-06-06 01:27:18 +00:00
self . sub = ' '
2004-11-18 17:15:15 +00:00
self . ask = ' '
2004-06-06 01:27:18 +00:00
self . resource = ' '
2004-11-18 17:15:15 +00:00
self . priority = 1
2004-10-07 14:43:59 +00:00
self . keyID = ' '
2004-11-18 17:15:15 +00:00
elif len ( args ) == 10 :
2003-11-30 22:40:24 +00:00
self . jid = args [ 0 ]
self . name = args [ 1 ]
self . groups = args [ 2 ]
self . show = args [ 3 ]
self . status = args [ 4 ]
self . sub = args [ 5 ]
2004-11-18 17:15:15 +00:00
self . ask = args [ 6 ]
self . resource = args [ 7 ]
self . priority = args [ 8 ]
self . keyID = args [ 9 ]
2004-05-16 23:47:14 +00:00
else : raise TypeError , _ ( ' bad arguments ' )
2003-11-30 22:40:24 +00:00
2005-03-02 13:04:47 +00:00
class tabbed_chat_window :
2005-01-27 11:02:01 +00:00
""" Class for tabbed chat window """
def __init__ ( self , user , plugin , account ) :
2005-03-02 22:34:16 +00:00
self . xml = gtk . glade . XML ( GTKGUI_GLADE , ' tabbed_chat_window ' , APP )
self . chat_notebook = self . xml . get_widget ( ' chat_notebook ' )
self . chat_notebook . remove_page ( 0 )
2005-01-27 11:02:01 +00:00
self . plugin = plugin
self . account = account
2005-03-02 22:34:16 +00:00
self . xmls = { }
2005-02-24 14:34:22 +00:00
self . tagIn = { }
self . tagOut = { }
self . tagStatus = { }
2005-03-02 22:34:16 +00:00
self . users = { }
self . nb_unread = { }
2005-03-07 11:16:09 +00:00
self . last_message_time = { }
2005-03-02 22:34:16 +00:00
self . window = self . xml . get_widget ( ' tabbed_chat_window ' )
2005-02-24 14:34:22 +00:00
self . new_user ( user )
2005-01-27 11:02:01 +00:00
self . show_title ( )
2005-03-07 16:50:26 +00:00
self . xml . signal_connect ( ' on_tabbed_chat_window_destroy ' , \
self . on_tabbed_chat_window_destroy )
2005-03-07 11:16:09 +00:00
self . xml . signal_connect ( ' on_tabbed_chat_window_delete_event ' , \
self . on_tabbed_chat_window_delete_event )
2005-03-02 22:34:16 +00:00
self . xml . signal_connect ( ' on_tabbed_chat_window_focus_in_event ' , \
self . on_tabbed_chat_window_focus_in_event )
self . xml . signal_connect ( ' on_tabbed_chat_window_key_press_event ' , \
self . on_tabbed_chat_window_key_press_event )
self . xml . signal_connect ( ' on_chat_notebook_switch_page ' , \
self . on_chat_notebook_switch_page )
2005-03-06 09:01:42 +00:00
#self.xml.signal_autoconnect(self) #FIXME: (nk) THIS SEGFAULTS GAJIM. WHY? -> (asterix) we delete the first page, so we delete the widgets, so we don't want to connect associated signals.
2005-01-27 11:02:01 +00:00
2005-02-11 23:13:19 +00:00
def update_tags ( self ) :
for jid in self . tagIn :
self . tagIn [ jid ] . set_property ( " foreground " , \
self . plugin . config [ ' inmsgcolor ' ] )
self . tagOut [ jid ] . set_property ( " foreground " , \
self . plugin . config [ ' outmsgcolor ' ] )
self . tagStatus [ jid ] . set_property ( " foreground " , \
self . plugin . config [ ' statusmsgcolor ' ] )
2005-01-27 11:02:01 +00:00
def show_title ( self ) :
2005-03-02 22:34:16 +00:00
""" redraw the window ' s title """
2005-01-27 11:02:01 +00:00
unread = 0
2005-01-28 18:51:23 +00:00
for jid in self . nb_unread :
unread + = self . nb_unread [ jid ]
2005-01-27 11:02:01 +00:00
start = " "
if unread > 1 :
start = " [ " + str ( unread ) + " ] "
elif unread == 1 :
start = " * "
2005-03-02 23:35:28 +00:00
chat = self . users [ jid ] . name
if len ( self . xmls ) > 1 :
chat = ' Chat '
self . window . set_title ( start + chat + ' ( ' + self . account + ' ) ' )
2005-01-27 11:02:01 +00:00
2005-01-28 18:51:23 +00:00
def draw_widgets ( self , user ) :
2005-03-02 22:34:16 +00:00
""" draw the widgets in a tab (status_image, contact_button ...)
according to the the information in the user variable """
jid = user . jid
status_image = self . xmls [ jid ] . get_widget ( ' status_image ' )
2005-01-27 11:02:01 +00:00
image = self . plugin . roster . pixbufs [ user . show ]
if image . get_storage_type ( ) == gtk . IMAGE_ANIMATION :
2005-03-02 22:34:16 +00:00
status_image . set_from_animation ( image . get_animation ( ) )
2005-01-27 11:02:01 +00:00
elif image . get_storage_type ( ) == gtk . IMAGE_PIXBUF :
2005-03-02 22:34:16 +00:00
status_image . set_from_pixbuf ( image . get_pixbuf ( ) )
contact_button = self . xmls [ jid ] . get_widget ( ' contact_button ' )
contact_button . set_label ( user . name + ' < ' + jid + ' > ' )
2005-01-27 11:02:01 +00:00
if not user . keyID :
2005-03-02 22:34:16 +00:00
self . xmls [ jid ] . get_widget ( ' gpg_togglebutton ' ) . set_sensitive ( False )
2005-01-27 11:02:01 +00:00
2005-01-28 18:51:23 +00:00
def redraw_tab ( self , jid ) :
2005-03-02 22:34:16 +00:00
""" redraw the label of the tab """
2005-01-27 11:02:01 +00:00
start = ' '
2005-01-28 18:51:23 +00:00
if self . nb_unread [ jid ] > 1 :
start = " [ " + str ( self . nb_unread [ jid ] ) + " ] "
elif self . nb_unread [ jid ] == 1 :
2005-01-27 11:02:01 +00:00
start = " * "
2005-03-02 22:34:16 +00:00
child = self . xmls [ jid ] . get_widget ( ' chat_vbox ' )
self . chat_notebook . set_tab_label_text ( child , start + self . users [ jid ] . name )
2005-01-27 11:02:01 +00:00
2005-01-28 20:01:49 +00:00
def set_image ( self , image , jid ) :
if image . get_storage_type ( ) == gtk . IMAGE_ANIMATION :
2005-03-02 22:34:16 +00:00
self . xmls [ jid ] . get_widget ( ' status_image ' ) . \
2005-01-28 20:01:49 +00:00
set_from_animation ( image . get_animation ( ) )
elif image . get_storage_type ( ) == gtk . IMAGE_PIXBUF :
2005-03-02 22:34:16 +00:00
self . xmls [ jid ] . get_widget ( ' status_image ' ) . \
2005-01-28 20:01:49 +00:00
set_from_pixbuf ( image . get_pixbuf ( ) )
2005-03-07 11:16:09 +00:00
def on_tabbed_chat_window_delete_event ( self , widget , event ) :
2005-01-27 11:02:01 +00:00
""" close window """
2005-03-07 11:16:09 +00:00
for jid in self . users :
2005-03-07 17:01:56 +00:00
if time . time ( ) - self . last_message_time [ jid ] < 2 : # 2 seconds
dialog = Confirmation_dialog ( _ ( ' You received a message from %s in the last two seconds. \n Do you still want to close this window ? ' ) % jid )
2005-03-07 11:16:09 +00:00
if dialog . get_response ( ) != gtk . RESPONSE_YES :
return True #stop the propagation of the event
2005-03-07 16:50:26 +00:00
def on_tabbed_chat_window_destroy ( self , widget ) :
#clean self.plugin.windows[self.account]['chats']
2005-01-28 18:51:23 +00:00
for jid in self . users :
del self . plugin . windows [ self . account ] [ ' chats ' ] [ jid ]
2005-03-02 22:34:16 +00:00
if self . plugin . windows [ self . account ] [ ' chats ' ] . has_key ( ' tabbed ' ) :
del self . plugin . windows [ self . account ] [ ' chats ' ] [ ' tabbed ' ]
2005-01-27 11:02:01 +00:00
2005-01-28 18:51:23 +00:00
def get_active_jid ( self ) :
2005-03-02 22:34:16 +00:00
active_child = self . chat_notebook . get_nth_page ( \
self . chat_notebook . get_current_page ( ) )
active_jid = ' '
for jid in self . xmls :
child = self . xmls [ jid ] . get_widget ( ' chat_vbox ' )
if child == active_child :
active_jid = jid
2005-01-28 18:51:23 +00:00
break
2005-03-02 22:34:16 +00:00
return active_jid
2005-01-28 18:51:23 +00:00
2005-03-02 22:34:16 +00:00
def on_clear_button_clicked ( self , widget ) :
2005-01-27 11:02:01 +00:00
""" When clear button is pressed :
clear the conversation """
2005-01-28 18:51:23 +00:00
jid = self . get_active_jid ( )
2005-03-02 22:34:16 +00:00
conversation_buffer = self . xmls [ jid ] . get_widget ( ' conversation_textview ' ) . \
get_buffer ( )
deb , end = conversation_buffer . get_bounds ( )
conversation_buffer . delete ( deb , end )
2005-01-27 11:02:01 +00:00
2005-03-02 22:34:16 +00:00
def on_close_button_clicked ( self , button ) :
2005-01-28 20:41:36 +00:00
""" When close button is pressed :
close a tab """
jid = self . get_active_jid ( )
2005-03-02 10:24:49 +00:00
self . remove_tab ( jid )
2005-01-28 20:41:36 +00:00
2005-03-02 22:34:16 +00:00
def on_tabbed_chat_window_focus_in_event ( self , widget , event ) :
2005-01-27 11:02:01 +00:00
""" When window get focus """
2005-01-28 18:51:23 +00:00
jid = self . get_active_jid ( )
2005-03-05 17:07:42 +00:00
conversation_textview = self . xmls [ jid ] . \
get_widget ( ' conversation_textview ' )
conversation_buffer = conversation_textview . get_buffer ( )
end_iter = conversation_buffer . get_end_iter ( )
end_rect = conversation_textview . get_iter_location ( end_iter )
visible_rect = conversation_textview . get_visible_rect ( )
if end_rect . y < = ( visible_rect . y + visible_rect . height ) :
#we are at the end
if self . nb_unread [ jid ] > 0 :
self . nb_unread [ jid ] = 0
self . redraw_tab ( jid )
self . show_title ( )
self . plugin . systray . remove_jid ( jid , self . account )
2005-01-27 11:02:01 +00:00
2005-03-02 22:34:16 +00:00
def on_history_button_clicked ( self , widget ) :
""" When history button is pressed : call history window """
2005-01-28 18:51:23 +00:00
jid = self . get_active_jid ( )
if not self . plugin . windows [ ' logs ' ] . has_key ( jid ) :
2005-03-02 13:04:47 +00:00
self . plugin . windows [ ' logs ' ] [ jid ] = history_window ( self . plugin , jid )
2005-02-23 14:59:41 +00:00
2005-03-02 22:34:16 +00:00
def on_chat_notebook_switch_page ( self , notebook , page , page_num ) :
new_child = notebook . get_nth_page ( page_num )
new_jid = ' '
for jid in self . xmls :
child = self . xmls [ jid ] . get_widget ( ' chat_vbox ' )
if child == new_child :
new_jid = jid
2005-02-11 22:13:49 +00:00
break
2005-03-05 17:07:42 +00:00
conversation_textview = self . xmls [ new_jid ] . \
get_widget ( ' conversation_textview ' )
conversation_buffer = conversation_textview . get_buffer ( )
end_iter = conversation_buffer . get_end_iter ( )
end_rect = conversation_textview . get_iter_location ( end_iter )
visible_rect = conversation_textview . get_visible_rect ( )
if end_rect . y < = ( visible_rect . y + visible_rect . height ) :
#we are at the end
if self . nb_unread [ new_jid ] > 0 :
self . nb_unread [ new_jid ] = 0
self . redraw_tab ( new_jid )
self . show_title ( )
self . plugin . systray . remove_jid ( new_jid , self . account )
2005-01-28 22:40:05 +00:00
def active_tab ( self , jid ) :
2005-03-02 22:34:16 +00:00
child = self . xmls [ jid ] . get_widget ( ' chat_vbox ' )
self . chat_notebook . set_current_page ( \
self . chat_notebook . page_num ( child ) )
2005-02-23 14:59:41 +00:00
2005-03-02 10:24:49 +00:00
def remove_tab ( self , jid ) :
2005-03-07 11:16:09 +00:00
if time . time ( ) - self . last_message_time [ jid ] < 2 :
dialog = Confirmation_dialog ( _ ( ' You received a message from %s in the last two secondes. \n Do you still want to close this tab ? ' ) % jid )
if dialog . get_response ( ) != gtk . RESPONSE_YES :
return
2005-03-02 22:34:16 +00:00
if len ( self . xmls ) == 1 :
2005-03-02 10:24:49 +00:00
self . window . destroy ( )
else :
2005-03-02 22:34:16 +00:00
self . chat_notebook . remove_page ( \
self . chat_notebook . get_current_page ( ) )
2005-03-02 10:24:49 +00:00
del self . plugin . windows [ self . account ] [ ' chats ' ] [ jid ]
del self . users [ jid ]
del self . nb_unread [ jid ]
2005-03-07 11:16:09 +00:00
del self . last_message_time [ jid ]
2005-03-02 22:34:16 +00:00
del self . xmls [ jid ]
2005-03-02 10:24:49 +00:00
del self . tagIn [ jid ]
del self . tagOut [ jid ]
del self . tagStatus [ jid ]
2005-03-02 22:34:16 +00:00
if len ( self . xmls ) == 1 :
self . chat_notebook . set_show_tabs ( False )
2005-03-02 23:35:28 +00:00
self . show_title ( )
2005-03-02 10:24:49 +00:00
2005-01-27 11:02:01 +00:00
def new_user ( self , user ) :
2005-01-28 22:23:46 +00:00
self . nb_unread [ user . jid ] = 0
2005-03-07 11:16:09 +00:00
self . last_message_time [ user . jid ] = 0
2005-02-11 18:18:52 +00:00
self . users [ user . jid ] = user
2005-03-02 22:34:16 +00:00
self . xmls [ user . jid ] = gtk . glade . XML ( GTKGUI_GLADE , ' chat_vbox ' , APP )
2005-02-23 14:59:41 +00:00
2005-03-02 22:34:16 +00:00
conversation_textview = \
self . xmls [ user . jid ] . get_widget ( ' conversation_textview ' )
conversation_buffer = conversation_textview . get_buffer ( )
end_iter = conversation_buffer . get_end_iter ( )
conversation_buffer . create_mark ( ' end ' , end_iter , 0 )
self . tagIn [ user . jid ] = conversation_buffer . create_tag ( ' incoming ' )
2005-01-28 18:51:23 +00:00
color = self . plugin . config [ ' inmsgcolor ' ]
2005-03-02 22:34:16 +00:00
self . tagIn [ user . jid ] . set_property ( ' foreground ' , color )
self . tagOut [ user . jid ] = conversation_buffer . create_tag ( ' outgoing ' )
2005-01-28 18:51:23 +00:00
color = self . plugin . config [ ' outmsgcolor ' ]
2005-03-02 22:34:16 +00:00
self . tagOut [ user . jid ] . set_property ( ' foreground ' , color )
self . tagStatus [ user . jid ] = conversation_buffer . create_tag ( ' status ' )
2005-01-28 18:51:23 +00:00
color = self . plugin . config [ ' statusmsgcolor ' ]
2005-03-02 22:34:16 +00:00
self . tagStatus [ user . jid ] . set_property ( ' foreground ' , color )
2005-03-05 02:15:38 +00:00
self . link_tag = conversation_buffer . create_tag ( ' hyperlink ' , foreground = ' blue ' )
2005-03-02 22:34:16 +00:00
self . xmls [ user . jid ] . signal_autoconnect ( self )
2005-03-06 09:01:42 +00:00
conversation_scrolledwindow = self . xmls [ user . jid ] . \
get_widget ( ' conversation_scrolledwindow ' )
conversation_scrolledwindow . get_vadjustment ( ) . connect ( ' value-changed ' , \
self . on_conversation_vadjustment_value_changed )
2005-03-02 22:34:16 +00:00
self . chat_notebook . append_page ( self . xmls [ user . jid ] . \
get_widget ( ' chat_vbox ' ) )
if len ( self . xmls ) > 1 :
self . chat_notebook . set_show_tabs ( True )
2005-02-23 14:59:41 +00:00
2005-01-28 18:51:23 +00:00
self . redraw_tab ( user . jid )
self . draw_widgets ( user )
2005-03-02 23:35:28 +00:00
self . show_title ( )
2005-01-27 11:02:01 +00:00
2005-02-23 14:59:41 +00:00
#print queued messages
2005-02-14 20:04:37 +00:00
if self . plugin . queues [ self . account ] . has_key ( user . jid ) :
self . read_queue ( self . plugin . queues [ self . account ] [ user . jid ] )
2005-02-14 20:11:11 +00:00
if user . show != ' online ' :
self . print_conversation ( _ ( " %s is now %s ( %s ) " ) % ( user . name , \
user . show , user . status ) , user . jid , ' status ' )
2005-02-14 20:04:37 +00:00
2005-03-02 22:34:16 +00:00
def on_message_textview_key_press_event ( self , widget , event ) :
2005-01-27 11:02:01 +00:00
""" When a key is pressed :
if enter is pressed without the shit key , message ( if not empty ) is sent
and printed in the conversation """
if event . keyval == gtk . keysyms . Return :
if ( event . state & gtk . gdk . SHIFT_MASK ) :
return 0
2005-03-02 22:34:16 +00:00
message_buffer = widget . get_buffer ( )
start_iter = message_buffer . get_start_iter ( )
end_iter = message_buffer . get_end_iter ( )
message = message_buffer . get_text ( start_iter , end_iter , 0 )
if message != ' ' :
2005-01-27 11:02:01 +00:00
keyID = ' '
2005-02-11 18:18:52 +00:00
jid = self . get_active_jid ( )
2005-03-02 22:34:16 +00:00
if self . xmls [ jid ] . get_widget ( ' gpg_togglebutton ' ) . get_active ( ) :
2005-02-11 18:18:52 +00:00
keyID = self . users [ jid ] . keyID
2005-03-02 22:34:16 +00:00
self . plugin . send ( ' MSG ' , self . account , ( jid , message , keyID ) )
message_buffer . set_text ( ' ' , - 1 )
self . print_conversation ( message , jid , jid )
2005-01-27 11:02:01 +00:00
return 1
return 0
2005-03-02 22:34:16 +00:00
def on_tabbed_chat_window_key_press_event ( self , widget , event ) :
2005-03-05 17:34:33 +00:00
st = ' 1234567890 ' # zero is here cause humans count from 1, pc from 0 :P
2005-03-03 20:33:39 +00:00
jid = self . get_active_jid ( )
2005-03-05 17:34:33 +00:00
if event . keyval == gtk . keysyms . Escape : # ESCAPE
2005-03-02 10:24:49 +00:00
self . remove_tab ( jid )
2005-02-24 14:34:22 +00:00
elif event . string and event . string in st \
2005-03-05 17:34:33 +00:00
and ( event . state & gtk . gdk . MOD1_MASK ) : # alt + 1,2,3..
2005-03-02 22:34:16 +00:00
self . chat_notebook . set_current_page ( st . index ( event . string ) )
2005-03-05 17:34:33 +00:00
elif event . keyval == gtk . keysyms . Page_Down : # PAGE DOWN
2005-03-03 20:33:39 +00:00
if event . state & gtk . gdk . CONTROL_MASK :
current = self . chat_notebook . get_current_page ( )
if current > 0 :
self . chat_notebook . set_current_page ( current - 1 )
# else:
# self.chat_notebook.set_current_page(\
# self.chat_notebook.get_n_pages()-1)
elif event . state & gtk . gdk . SHIFT_MASK :
conversation_textview = self . xmls [ jid ] . \
get_widget ( ' conversation_textview ' )
rect = conversation_textview . get_visible_rect ( )
iter = conversation_textview . get_iter_at_location ( rect . x , \
rect . y + rect . height )
conversation_textview . scroll_to_iter ( iter , 0.1 , True , 0 , 0 )
2005-03-05 17:34:33 +00:00
elif event . keyval == gtk . keysyms . Page_Up : # PAGE UP
2005-03-03 20:33:39 +00:00
if event . state & gtk . gdk . CONTROL_MASK :
current = self . chat_notebook . get_current_page ( )
if current < ( self . chat_notebook . get_n_pages ( ) - 1 ) :
self . chat_notebook . set_current_page ( current + 1 )
# else:
# self.chat_notebook.set_current_page(0)
elif event . state & gtk . gdk . SHIFT_MASK :
conversation_textview = self . xmls [ jid ] . \
get_widget ( ' conversation_textview ' )
rect = conversation_textview . get_visible_rect ( )
iter = conversation_textview . get_iter_at_location ( rect . x , rect . y )
conversation_textview . scroll_to_iter ( iter , 0.1 , True , 0 , 1 )
elif event . keyval == gtk . keysyms . Tab and \
2005-03-05 17:34:33 +00:00
( event . state & gtk . gdk . CONTROL_MASK ) : # CTRL + TAB
2005-03-02 22:34:16 +00:00
current = self . chat_notebook . get_current_page ( )
if current < ( self . chat_notebook . get_n_pages ( ) - 1 ) :
self . chat_notebook . set_current_page ( current + 1 )
2005-02-27 00:03:10 +00:00
else :
2005-03-02 22:34:16 +00:00
self . chat_notebook . set_current_page ( 0 )
2005-03-05 17:34:33 +00:00
else : # it's a normal key press make sure message_textview has focus
2005-03-05 19:47:49 +00:00
message_textview = self . xmls [ jid ] . get_widget ( ' message_textview ' )
2005-03-05 17:34:33 +00:00
if not message_textview . is_focus ( ) :
message_textview . grab_focus ( )
2005-01-27 11:02:01 +00:00
2005-03-02 22:34:16 +00:00
def on_contact_button_clicked ( self , widget ) :
2005-02-02 20:58:33 +00:00
""" When button contact is clicked """
jid = self . get_active_jid ( )
user = self . users [ jid ]
self . plugin . roster . on_info ( widget , user , self . account )
2005-01-27 11:02:01 +00:00
def read_queue ( self , q ) :
""" read queue and print messages containted in it """
2005-01-28 18:51:23 +00:00
jid = self . get_active_jid ( )
user = self . users [ jid ]
2005-01-27 11:02:01 +00:00
while not q . empty ( ) :
2005-03-02 22:34:16 +00:00
event = q . get ( )
self . print_conversation ( event [ 0 ] , jid , tim = event [ 1 ] )
2005-01-27 11:02:01 +00:00
self . plugin . roster . nb_unread - = 1
self . plugin . roster . show_title ( )
2005-01-28 18:51:23 +00:00
del self . plugin . queues [ self . account ] [ jid ]
self . plugin . roster . redraw_jid ( jid , self . account )
self . plugin . systray . remove_jid ( jid , self . account )
2005-01-27 11:02:01 +00:00
showOffline = self . plugin . config [ ' showoffline ' ]
if ( user . show == ' offline ' or user . show == ' error ' ) and \
not showOffline :
2005-01-28 18:51:23 +00:00
if len ( self . plugin . roster . contacts [ self . account ] [ jid ] ) == 1 :
2005-01-27 11:02:01 +00:00
self . plugin . roster . remove_user ( user , self . account )
2005-03-06 09:01:42 +00:00
def on_conversation_vadjustment_value_changed ( self , widget ) :
2005-03-05 17:07:42 +00:00
jid = self . get_active_jid ( )
if not self . nb_unread [ jid ] :
return
conversation_textview = self . xmls [ jid ] . get_widget ( ' conversation_textview ' )
conversation_buffer = conversation_textview . get_buffer ( )
end_iter = conversation_buffer . get_end_iter ( )
end_rect = conversation_textview . get_iter_location ( end_iter )
visible_rect = conversation_textview . get_visible_rect ( )
2005-03-06 09:01:42 +00:00
if end_rect . y < = ( visible_rect . y + visible_rect . height ) and \
self . window . is_active ( ) :
2005-03-05 17:07:42 +00:00
#we are at the end
self . nb_unread [ jid ] = 0
self . redraw_tab ( jid )
self . show_title ( )
self . plugin . systray . remove_jid ( jid , self . account )
2005-03-06 09:01:42 +00:00
def print_conversation ( self , text , jid , contact = ' ' , tim = None ) :
2005-01-27 11:02:01 +00:00
""" Print a line in the conversation :
if contact is set to status : it ' s a status message
if contact is set to another value : it ' s an outgoing message
if contact is not set : it ' s an incomming message " " "
2005-01-28 18:51:23 +00:00
user = self . users [ jid ]
2005-03-02 22:34:16 +00:00
conversation_textview = self . xmls [ jid ] . get_widget ( ' conversation_textview ' )
conversation_buffer = conversation_textview . get_buffer ( )
if not text :
2005-03-05 21:02:38 +00:00
text = ' '
2005-03-02 22:34:16 +00:00
end_iter = conversation_buffer . get_end_iter ( )
2005-01-27 11:02:01 +00:00
if not tim :
tim = time . localtime ( )
2005-03-05 21:02:38 +00:00
tim_format = time . strftime ( " [ % H: % M: % S] " , tim )
conversation_buffer . insert ( end_iter , tim_format + ' ' )
2005-01-27 11:02:01 +00:00
2005-03-02 22:34:16 +00:00
otext = ' '
ttext = ' '
2005-02-11 18:18:52 +00:00
if contact == ' status ' :
2005-01-27 11:02:01 +00:00
tag = ' status '
2005-03-02 22:34:16 +00:00
ttext = text + ' \n '
2005-01-27 11:02:01 +00:00
else :
if contact :
tag = ' outgoing '
name = self . plugin . nicks [ self . account ]
else :
tag = ' incoming '
name = user . name
2005-03-07 11:16:09 +00:00
self . last_message_time [ jid ] = time . time ( )
2005-01-27 11:02:01 +00:00
2005-03-05 21:59:04 +00:00
if text . startswith ( ' /me ' ) :
2005-03-06 02:19:22 +00:00
ttext = name + text [ 3 : ] + ' \n '
2005-01-27 11:02:01 +00:00
else :
2005-03-02 22:34:16 +00:00
ttext = ' < ' + name + ' > '
otext = text + ' \n '
2005-01-27 11:02:01 +00:00
2005-03-02 22:34:16 +00:00
conversation_buffer . insert_with_tags_by_name ( end_iter , ttext , tag )
if len ( otext ) > 0 :
2005-01-27 11:02:01 +00:00
beg = 0
if self . plugin . config [ ' useemoticons ' ] :
index = 0
2005-03-02 22:34:16 +00:00
while index < len ( otext ) :
if otext [ index ] in self . plugin . roster . begin_emot :
2005-01-27 11:02:01 +00:00
for s in self . plugin . roster . emoticons :
l = len ( s )
2005-03-02 22:34:16 +00:00
if s == otext [ index : index + l ] :
conversation_buffer . insert ( end_iter , otext [ beg : index ] )
conversation_buffer . insert_pixbuf ( end_iter , \
2005-02-11 18:18:52 +00:00
self . plugin . roster . emoticons [ s ] )
2005-01-27 11:02:01 +00:00
index + = l
beg = index
index + = 1
2005-03-05 02:11:01 +00:00
2005-03-06 00:36:27 +00:00
conversation_buffer . insert ( end_iter , otext [ beg : ] )
2005-01-27 11:02:01 +00:00
#scroll to the end of the textview
2005-03-05 17:07:42 +00:00
end_rect = conversation_textview . get_iter_location ( end_iter )
visible_rect = conversation_textview . get_visible_rect ( )
end = False
if end_rect . y < = ( visible_rect . y + visible_rect . height ) :
#we are at the end
end = True
conversation_textview . scroll_to_mark ( conversation_buffer . \
get_mark ( ' end ' ) , 0.1 , 0 , 0 , 0 )
2005-03-06 09:01:42 +00:00
if ( ( jid != self . get_active_jid ( ) ) or ( not self . window . is_active ( ) ) or \
( not end ) ) and contact == ' ' :
2005-01-28 18:51:23 +00:00
self . nb_unread [ jid ] + = 1
self . redraw_tab ( jid )
2005-01-27 11:02:01 +00:00
self . show_title ( )
2005-03-05 01:53:51 +00:00
class Groupchat_window :
2005-03-07 16:50:26 +00:00
def on_groupchat_window_delete_event ( self , widget , event ) :
2004-08-04 22:40:22 +00:00
""" close window """
2005-03-07 11:29:11 +00:00
for room_jid in self . xmls :
if time . time ( ) - self . last_message_time [ room_jid ] < 2 :
dialog = Confirmation_dialog ( _ ( ' You received a message in the room %s in the last two secondes. \n Do you still want to close this window ? ' ) % \
room_jid . split ( ' @ ' ) [ 0 ] )
if dialog . get_response ( ) != gtk . RESPONSE_YES :
return True #stop the propagation of the event
2005-03-07 16:50:26 +00:00
def on_groupchat_window_destroy ( self , widget ) :
2005-03-05 13:16:52 +00:00
for room_jid in self . xmls :
self . plugin . send ( ' GC_STATUS ' , self . account , ( self . nicks [ room_jid ] , \
room_jid , ' offline ' , ' offline ' ) )
del self . plugin . windows [ self . account ] [ ' gc ' ] [ room_jid ]
if self . plugin . windows [ self . account ] [ ' gc ' ] . has_key ( ' tabbed ' ) :
del self . plugin . windows [ self . account ] [ ' gc ' ] [ ' tabbed ' ]
2004-08-04 22:40:22 +00:00
2005-03-05 13:16:52 +00:00
def update_tags ( self ) :
for room_jid in self . tagIn :
2005-03-06 20:15:11 +00:00
self . tagIn [ room_jid ] . set_property ( ' foreground ' , \
2005-03-05 13:16:52 +00:00
self . plugin . config [ ' inmsgcolor ' ] )
2005-03-06 20:15:11 +00:00
self . tagInBold [ room_jid ] . set_property ( ' foreground ' , \
self . plugin . config [ ' inmsgcolor ' ] )
self . tagOut [ room_jid ] . set_property ( ' foreground ' , \
2005-03-05 13:16:52 +00:00
self . plugin . config [ ' outmsgcolor ' ] )
2005-03-06 20:15:11 +00:00
self . tagStatus [ room_jid ] . set_property ( ' foreground ' , \
2005-03-05 13:16:52 +00:00
self . plugin . config [ ' statusmsgcolor ' ] )
def get_role_iter ( self , room_jid , name ) :
model = self . list_treeview [ room_jid ] . get_model ( )
2004-09-25 15:19:07 +00:00
fin = False
2004-08-05 21:56:54 +00:00
iter = model . get_iter_root ( )
if not iter :
return None
2004-09-25 15:19:07 +00:00
while not fin :
account_name = model . get_value ( iter , 1 )
if name == account_name :
2004-08-05 21:56:54 +00:00
return iter
iter = model . iter_next ( iter )
2004-09-25 15:19:07 +00:00
if not iter :
fin = True
return None
2005-03-05 13:16:52 +00:00
def get_user_iter ( self , room_jid , jid ) :
model = self . list_treeview [ room_jid ] . get_model ( )
2004-09-25 15:19:07 +00:00
fin = False
role = model . get_iter_root ( )
if not role :
return None
while not fin :
fin2 = False
user = model . iter_children ( role )
if not user :
fin2 = True
while not fin2 :
if jid == model . get_value ( user , 1 ) :
return user
user = model . iter_next ( user )
if not user :
fin2 = True
role = model . iter_next ( role )
if not role :
fin = True
2004-08-05 21:56:54 +00:00
return None
2004-08-05 23:13:40 +00:00
2005-03-05 13:16:52 +00:00
def get_user_list ( self , room_jid ) :
model = self . list_treeview [ room_jid ] . get_model ( )
2005-03-05 00:06:04 +00:00
list = [ ]
fin = False
role = model . get_iter_root ( )
if not role :
return list
while not fin :
fin2 = False
user = model . iter_children ( role )
if not user :
fin2 = True
while not fin2 :
nick = model . get_value ( user , 1 )
list . append ( nick )
user = model . iter_next ( user )
if not user :
fin2 = True
role = model . iter_next ( role )
if not role :
fin = True
return list
2005-03-05 13:16:52 +00:00
def remove_user ( self , room_jid , nick ) :
2004-08-05 23:13:40 +00:00
""" Remove a user from the roster """
2005-03-05 13:16:52 +00:00
model = self . list_treeview [ room_jid ] . get_model ( )
iter = self . get_user_iter ( room_jid , nick )
2005-03-04 14:58:00 +00:00
if not iter :
return
2004-09-25 15:19:07 +00:00
parent_iter = model . iter_parent ( iter )
2004-08-05 23:13:40 +00:00
model . remove ( iter )
2004-09-25 15:19:07 +00:00
if model . iter_n_children ( parent_iter ) == 0 :
model . remove ( parent_iter )
2004-08-05 21:56:54 +00:00
2005-03-05 13:16:52 +00:00
def add_user_to_roster ( self , room_jid , nick , show , role , jid ) :
model = self . list_treeview [ room_jid ] . get_model ( )
2004-08-05 23:13:40 +00:00
img = self . plugin . roster . pixbufs [ show ]
2005-03-05 13:16:52 +00:00
role_iter = self . get_role_iter ( room_jid , role )
2004-09-25 15:19:07 +00:00
if not role_iter :
role_iter = model . append ( None , ( self . plugin . roster . pixbufs [ ' closed ' ] \
2005-03-04 19:59:07 +00:00
, role , role ) )
iter = model . append ( role_iter , ( img , nick , jid ) )
2005-03-05 13:16:52 +00:00
self . list_treeview [ room_jid ] . expand_row ( ( model . get_path ( role_iter ) ) , \
False )
2004-09-25 15:19:07 +00:00
return iter
2005-03-05 13:16:52 +00:00
def get_role ( self , room_jid , jid_iter ) :
model = self . list_treeview [ room_jid ] . get_model ( )
2004-09-25 15:19:07 +00:00
path = model . get_path ( jid_iter ) [ 0 ]
iter = model . get_iter ( path )
return model . get_value ( iter , 1 )
2004-08-05 21:56:54 +00:00
2005-03-05 13:16:52 +00:00
def chg_user_status ( self , room_jid , nick , show , status , role , affiliation , \
jid , reason , actor , statusCode , account ) :
2004-08-05 21:56:54 +00:00
""" When a user change his status """
2005-03-05 13:16:52 +00:00
model = self . list_treeview [ room_jid ] . get_model ( )
2004-08-05 21:56:54 +00:00
if show == ' offline ' or show == ' error ' :
2004-09-25 15:19:07 +00:00
if statusCode == ' 307 ' :
2005-03-04 19:59:07 +00:00
self . print_conversation ( _ ( ' %s has been kicked by %s : %s ' ) % ( nick , \
2005-01-27 11:02:01 +00:00
jid , actor , reason ) )
2005-03-05 13:16:52 +00:00
self . remove_user ( room_jid , nick )
2004-08-05 21:56:54 +00:00
else :
2005-03-05 13:16:52 +00:00
iter = self . get_user_iter ( room_jid , nick )
2005-03-04 22:32:16 +00:00
ji = jid
if jid :
ji = jid . split ( ' / ' ) [ 0 ]
2004-08-05 23:13:40 +00:00
if not iter :
2005-03-05 13:16:52 +00:00
iter = self . add_user_to_roster ( room_jid , nick , show , role , ji )
2004-08-05 23:13:40 +00:00
else :
2005-03-05 13:16:52 +00:00
actual_role = self . get_role ( room_jid , iter )
2004-09-25 15:19:07 +00:00
if role != actual_role :
2005-03-05 13:16:52 +00:00
self . remove_user ( room_jid , nick )
self . add_user_to_roster ( room_jid , nick , show , role , ji )
2004-09-25 15:19:07 +00:00
else :
img = self . plugin . roster . pixbufs [ show ]
model . set_value ( iter , 0 , img )
2005-03-04 21:27:45 +00:00
2005-03-05 01:53:51 +00:00
def show_title ( self ) :
""" redraw the window ' s title """
unread = 0
2005-03-05 13:16:52 +00:00
for room_jid in self . nb_unread :
unread + = self . nb_unread [ room_jid ]
2005-03-05 01:53:51 +00:00
start = " "
if unread > 1 :
start = " [ " + str ( unread ) + " ] "
elif unread == 1 :
start = " * "
2005-03-05 13:16:52 +00:00
chat = ' Groupchat in ' + room_jid
if len ( self . xmls ) > 1 :
2005-03-05 01:53:51 +00:00
chat = ' Groupchat '
self . window . set_title ( start + chat + ' ( ' + self . account + ' ) ' )
2005-03-05 13:16:52 +00:00
def redraw_tab ( self , room_jid ) :
""" redraw the label of the tab """
start = ' '
if self . nb_unread [ room_jid ] > 1 :
start = " [ " + str ( self . nb_unread [ room_jid ] ) + " ] "
elif self . nb_unread [ room_jid ] == 1 :
start = " * "
room = room_jid . split ( ' @ ' ) [ 0 ]
child = self . xmls [ room_jid ] . get_widget ( ' group_vbox ' )
self . chat_notebook . set_tab_label_text ( child , start + room )
2005-03-05 01:53:51 +00:00
2005-03-05 13:16:52 +00:00
def get_active_jid ( self ) :
active_child = self . chat_notebook . get_nth_page ( \
self . chat_notebook . get_current_page ( ) )
active_jid = ' '
for room_jid in self . xmls :
child = self . xmls [ room_jid ] . get_widget ( ' group_vbox ' )
if child == active_child :
active_jid = room_jid
break
return active_jid
def set_subject ( self , room_jid , subject ) :
self . subjects [ room_jid ] = subject
2005-03-04 21:27:45 +00:00
self . xml . get_widget ( ' subject_entry ' ) . set_text ( subject )
2004-08-05 21:56:54 +00:00
2005-03-05 01:53:51 +00:00
def on_set_button_clicked ( self , widget ) :
2005-03-05 13:16:52 +00:00
room_jid = self . get_active_jid ( )
2005-03-05 01:53:51 +00:00
subject = self . xml . get_widget ( ' subject_entry ' ) . get_text ( )
2005-03-05 13:16:52 +00:00
self . plugin . send ( ' GC_SUBJECT ' , self . account , ( room_jid , subject ) )
def on_close_button_clicked ( self , button ) :
room_jid = self . get_active_jid ( )
self . remove_tab ( room_jid )
2005-03-05 01:53:51 +00:00
def on_message_textview_key_press_event ( self , widget , event ) :
2005-03-05 19:47:49 +00:00
""" When a key is pressed:
2004-08-05 19:14:31 +00:00
if enter is pressed without the shit key , message ( if not empty ) is sent
2005-03-05 19:47:49 +00:00
and printed in the conversation . Tab does autocompete in nickames """
if event . keyval == gtk . keysyms . Return : # ENTER
2004-08-05 19:14:31 +00:00
if ( event . state & gtk . gdk . SHIFT_MASK ) :
return 0
2005-03-05 01:53:51 +00:00
message_buffer = widget . get_buffer ( )
start_iter = message_buffer . get_start_iter ( )
end_iter = message_buffer . get_end_iter ( )
txt = message_buffer . get_text ( start_iter , end_iter , 0 )
2004-08-05 19:14:31 +00:00
if txt != ' ' :
2005-03-05 13:16:52 +00:00
room_jid = self . get_active_jid ( )
self . plugin . send ( ' GC_MSG ' , self . account , ( room_jid , txt ) )
2005-03-05 01:53:51 +00:00
message_buffer . set_text ( ' ' , - 1 )
2004-08-05 19:14:31 +00:00
widget . grab_focus ( )
return 1
2005-03-05 19:47:49 +00:00
elif event . keyval == gtk . keysyms . Tab : # TAB
2005-03-05 13:16:52 +00:00
room_jid = self . get_active_jid ( )
list_nick = self . get_user_list ( room_jid )
2005-03-05 01:53:51 +00:00
message_buffer = widget . get_buffer ( )
start_iter = message_buffer . get_start_iter ( )
cursor_position = message_buffer . get_insert ( )
end_iter = message_buffer . get_iter_at_mark ( cursor_position )
txt = message_buffer . get_text ( start_iter , end_iter , 0 )
2005-03-05 00:06:04 +00:00
begin = txt . split ( ) [ - 1 ]
for nick in list_nick :
if nick . find ( begin ) == 0 :
2005-03-05 19:47:49 +00:00
message_buffer . insert_at_cursor ( nick [ len ( begin ) : ] + ' : ' )
2005-03-05 00:06:04 +00:00
return 1
2004-08-05 19:14:31 +00:00
return 0
2005-03-05 13:16:52 +00:00
def on_groupchat_window_key_press_event ( self , widget , event ) :
2005-03-05 19:47:49 +00:00
st = " 1234567890 " # humans count from 1, pc from 0 :P
2005-03-05 13:16:52 +00:00
room_jid = self . get_active_jid ( )
2005-03-05 19:47:49 +00:00
if event . keyval == gtk . keysyms . Escape : #ESCAPE
2005-03-05 13:16:52 +00:00
self . remove_tab ( room_jid )
elif event . string and event . string in st \
2005-03-05 19:47:49 +00:00
and ( event . state & gtk . gdk . MOD1_MASK ) : # alt + 1,2,3 ...
2005-03-05 13:16:52 +00:00
self . chat_notebook . set_current_page ( st . index ( event . string ) )
2005-03-05 19:47:49 +00:00
elif event . keyval == gtk . keysyms . Page_Down : # PAGEDOWN
2005-03-05 13:16:52 +00:00
if event . state & gtk . gdk . CONTROL_MASK :
current = self . chat_notebook . get_current_page ( )
if current > 0 :
self . chat_notebook . set_current_page ( current - 1 )
# else:
# self.chat_notebook.set_current_page(\
# self.chat_notebook.get_n_pages()-1)
elif event . state & gtk . gdk . SHIFT_MASK :
conversation_textview = self . xmls [ room_jid ] . \
get_widget ( ' conversation_textview ' )
rect = conversation_textview . get_visible_rect ( )
iter = conversation_textview . get_iter_at_location ( rect . x , \
rect . y + rect . height )
conversation_textview . scroll_to_iter ( iter , 0.1 , True , 0 , 0 )
2005-03-05 19:47:49 +00:00
elif event . keyval == gtk . keysyms . Page_Up : # PAGEUP
2005-03-05 13:16:52 +00:00
if event . state & gtk . gdk . CONTROL_MASK :
current = self . chat_notebook . get_current_page ( )
if current < ( self . chat_notebook . get_n_pages ( ) - 1 ) :
self . chat_notebook . set_current_page ( current + 1 )
# else:
# self.chat_notebook.set_current_page(0)
elif event . state & gtk . gdk . SHIFT_MASK :
conversation_textview = self . xmls [ room_jid ] . \
get_widget ( ' conversation_textview ' )
rect = conversation_textview . get_visible_rect ( )
iter = conversation_textview . get_iter_at_location ( rect . x , rect . y )
conversation_textview . scroll_to_iter ( iter , 0.1 , True , 0 , 1 )
elif event . keyval == gtk . keysyms . Tab and \
2005-03-05 19:47:49 +00:00
( event . state & gtk . gdk . CONTROL_MASK ) : # CTRL+TAB
2005-03-05 13:16:52 +00:00
current = self . chat_notebook . get_current_page ( )
if current < ( self . chat_notebook . get_n_pages ( ) - 1 ) :
self . chat_notebook . set_current_page ( current + 1 )
else :
self . chat_notebook . set_current_page ( 0 )
2005-03-05 19:47:49 +00:00
''' FIXME:
NOT GOOD steals focus from Subject entry and I cannot find a way to prevent this
else : # it's a normal key press make sure message_textview has focus
message_textview = self . xmls [ room_jid ] . get_widget ( ' message_textview ' )
if not message_textview . is_focus ( ) :
message_textview . grab_focus ( )
'''
2005-03-05 13:16:52 +00:00
2005-03-06 02:19:22 +00:00
def print_conversation ( self , text , room_jid , contact = ' ' , tim = None ) :
2004-08-04 22:40:22 +00:00
""" Print a line in the conversation :
if contact is set : it ' s a message from someone
if contact is not set : it ' s a message from the server " " "
2005-03-05 13:16:52 +00:00
conversation_textview = self . xmls [ room_jid ] . \
get_widget ( ' conversation_textview ' )
2005-03-05 01:53:51 +00:00
conversation_buffer = conversation_textview . get_buffer ( )
2005-03-05 21:02:38 +00:00
if not text :
text = ' '
2005-03-05 01:53:51 +00:00
end_iter = conversation_buffer . get_end_iter ( )
2004-08-04 22:40:22 +00:00
if not tim :
2004-09-27 17:51:51 +00:00
tim = time . localtime ( )
2005-03-06 02:19:22 +00:00
tim_format = time . strftime ( ' [ % H: % M: % S] ' , tim )
2005-03-06 19:24:26 +00:00
conversation_buffer . insert ( end_iter , tim_format + ' ' )
2005-03-06 02:19:22 +00:00
otext = ' '
ttext = ' '
2004-08-04 22:40:22 +00:00
if contact :
2005-03-05 13:16:52 +00:00
if contact == self . nicks [ room_jid ] :
2005-03-06 02:19:22 +00:00
tag = ' outgoing '
2004-08-04 22:40:22 +00:00
else :
2005-03-06 20:15:11 +00:00
if self . nicks [ room_jid ] . lower ( ) in text . lower ( ) . split ( ) :
tag = ' incoming_bold '
else :
tag = ' incoming '
2005-03-07 11:29:11 +00:00
self . last_message_time [ room_jid ] = time . time ( )
2005-03-06 02:19:22 +00:00
if text . startswith ( ' /me ' ) :
ttext = contact + text [ 3 : ] + ' \n '
else :
ttext = ' < ' + contact + ' > '
otext = text + ' \n '
2004-08-04 22:40:22 +00:00
else :
2005-03-06 02:19:22 +00:00
tag = ' status '
ttext = text + ' \n '
conversation_buffer . insert_with_tags_by_name ( end_iter , ttext , tag )
#TODO: emoticons, url grabber
conversation_buffer . insert ( end_iter , otext )
2004-08-04 22:40:22 +00:00
#scroll to the end of the textview
2005-03-05 01:53:51 +00:00
conversation_textview . scroll_to_mark ( conversation_buffer . get_mark ( ' end ' ) , \
0.1 , 0 , 0 , 0 )
2005-03-05 13:16:52 +00:00
if not self . window . is_active ( ) and contact != ' ' :
self . nb_unread [ room_jid ] + = 1
self . redraw_tab ( room_jid )
2005-03-05 01:53:51 +00:00
self . show_title ( )
2004-08-04 22:40:22 +00:00
2004-09-25 15:19:07 +00:00
def kick ( self , widget , room_jid , nick ) :
""" kick a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_ROLE ' , self . account , ( room_jid , nick , ' none ' ) )
2004-09-25 15:19:07 +00:00
def grant_voice ( self , widget , room_jid , nick ) :
""" grant voice privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_ROLE ' , self . account , ( room_jid , nick , \
2004-09-25 15:19:07 +00:00
' participant ' ) )
def revoke_voice ( self , widget , room_jid , nick ) :
""" revoke voice privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_ROLE ' , self . account , ( room_jid , nick , ' visitor ' ) )
2004-09-25 15:19:07 +00:00
def grant_moderator ( self , widget , room_jid , nick ) :
""" grant moderator privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_ROLE ' , self . account , ( room_jid , nick , ' moderator ' ) )
2004-09-25 15:19:07 +00:00
def revoke_moderator ( self , widget , room_jid , nick ) :
""" revoke moderator privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_ROLE ' , self . account , ( room_jid , nick , \
2004-09-25 15:19:07 +00:00
' participant ' ) )
2005-03-04 19:59:07 +00:00
def ban ( self , widget , room_jid , jid ) :
2004-09-25 15:19:07 +00:00
""" ban a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_AFFILIATION ' , self . account , ( room_jid , jid , \
2004-09-25 15:19:07 +00:00
' outcast ' ) )
2005-03-04 19:59:07 +00:00
def grant_membership ( self , widget , room_jid , jid ) :
2004-09-25 15:19:07 +00:00
""" grant membership privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_AFFILIATION ' , self . account , ( room_jid , jid , \
2004-09-25 15:19:07 +00:00
' member ' ) )
2005-03-04 19:59:07 +00:00
def revoke_membership ( self , widget , room_jid , jid ) :
2004-09-25 15:19:07 +00:00
""" revoke membership privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_AFFILIATION ' , self . account , ( room_jid , jid , \
2004-09-25 15:19:07 +00:00
' none ' ) )
2005-03-04 19:59:07 +00:00
def grant_admin ( self , widget , room_jid , jid ) :
2004-09-25 15:19:07 +00:00
""" grant administrative privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_AFFILIATION ' , self . account , ( room_jid , jid , \
2004-09-25 15:19:07 +00:00
' admin ' ) )
2005-03-04 19:59:07 +00:00
def revoke_admin ( self , widget , room_jid , jid ) :
2004-09-25 15:19:07 +00:00
""" revoke administrative privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_AFFILIATION ' , self . account , ( room_jid , jid , \
2004-09-25 15:19:07 +00:00
' member ' ) )
2005-03-04 19:59:07 +00:00
def grant_owner ( self , widget , room_jid , jid ) :
2004-09-25 15:19:07 +00:00
""" grant owner privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_AFFILIATION ' , self . account , ( room_jid , jid , \
2004-09-25 15:19:07 +00:00
' owner ' ) )
2005-03-04 19:59:07 +00:00
def revoke_owner ( self , widget , room_jid , jid ) :
2004-09-25 15:19:07 +00:00
""" revoke owner privilege to a user """
2005-03-04 19:59:07 +00:00
self . plugin . send ( ' GC_SET_AFFILIATION ' , self . account , ( room_jid , jid , \
2004-09-25 15:19:07 +00:00
' admin ' ) )
2005-03-04 22:27:06 +00:00
def on_info ( self , widget , jid ) :
""" Call vcard_information_window class to display user ' s information """
if not self . plugin . windows [ self . account ] [ ' infos ' ] . has_key ( jid ) :
self . plugin . windows [ self . account ] [ ' infos ' ] [ jid ] = \
vcard_information_window ( jid , self . plugin , self . account , True )
self . plugin . send ( ' ASK_VCARD ' , self . account , jid )
2005-03-05 13:16:52 +00:00
def mk_menu ( self , room_jid , event , iter ) :
2004-09-25 15:19:07 +00:00
""" Make user ' s popup menu """
2005-03-05 13:16:52 +00:00
model = self . list_treeview [ room_jid ] . get_model ( )
2004-09-25 15:19:07 +00:00
nick = model . get_value ( iter , 1 )
2005-03-04 19:59:07 +00:00
jid = model . get_value ( iter , 2 )
2004-09-25 15:19:07 +00:00
menu = gtk . Menu ( )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' MUC ' ) )
2004-09-25 15:19:07 +00:00
menu . append ( item )
menu_sub = gtk . Menu ( )
item . set_submenu ( menu_sub )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Kick ' ) )
2004-09-25 15:19:07 +00:00
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . kick , room_jid , nick )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Grant voice ' ) )
2004-09-25 15:19:07 +00:00
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . grant_voice , room_jid , nick )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Revoke voice ' ) )
2004-09-25 15:19:07 +00:00
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . revoke_voice , room_jid , nick )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Grant moderator ' ) )
2004-09-25 15:19:07 +00:00
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . grant_moderator , room_jid , nick )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Revoke moderator ' ) )
2004-09-25 15:19:07 +00:00
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . revoke_moderator , room_jid , nick )
2005-03-04 19:59:07 +00:00
if jid :
item = gtk . MenuItem ( )
menu_sub . append ( item )
item = gtk . MenuItem ( _ ( ' Ban ' ) )
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . ban , room_jid , jid )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Grant membership ' ) )
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . grant_membership , room_jid , jid )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Revoke membership ' ) )
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . revoke_membership , room_jid , jid )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Grant admin ' ) )
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . grant_admin , room_jid , jid )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Revoke admin ' ) )
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . revoke_admin , room_jid , jid )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Grant owner ' ) )
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . grant_owner , room_jid , jid )
2005-03-04 19:59:07 +00:00
item = gtk . MenuItem ( _ ( ' Revoke owner ' ) )
menu_sub . append ( item )
2005-03-05 13:16:52 +00:00
item . connect ( ' activate ' , self . revoke_owner , room_jid , jid )
2005-03-04 22:27:06 +00:00
item = gtk . MenuItem ( )
menu . append ( item )
item = gtk . MenuItem ( _ ( ' Information ' ) )
menu . append ( item )
item . connect ( ' activate ' , self . on_info , jid )
2004-09-25 15:19:07 +00:00
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
menu . reposition ( )
2005-03-05 01:53:51 +00:00
def on_groupchat_window_focus_in_event ( self , widget , event ) :
2004-09-06 14:55:10 +00:00
""" When window get focus """
2005-03-05 13:16:52 +00:00
room_jid = self . get_active_jid ( )
if self . nb_unread [ room_jid ] > 0 :
self . nb_unread [ room_jid ] = 0
self . redraw_tab ( room_jid )
self . show_title ( )
self . plugin . systray . remove_jid ( room_jid , self . account )
def on_chat_notebook_switch_page ( self , notebook , page , page_num ) :
new_child = notebook . get_nth_page ( page_num )
new_jid = ' '
for room_jid in self . xmls :
child = self . xmls [ room_jid ] . get_widget ( ' group_vbox ' )
if child == new_child :
new_jid = room_jid
break
self . xml . get_widget ( ' subject_entry ' ) . set_text ( self . subjects [ new_jid ] )
if self . nb_unread [ new_jid ] > 0 :
self . nb_unread [ new_jid ] = 0
self . redraw_tab ( new_jid )
self . show_title ( )
self . plugin . systray . remove_jid ( new_jid , self . account )
def active_tab ( self , room_jid ) :
child = self . xmls [ room_jid ] . get_widget ( ' group_vbox ' )
self . chat_notebook . set_current_page ( self . chat_notebook . page_num ( child ) )
self . xmls [ room_jid ] . get_widget ( ' message_textview ' ) . grab_focus ( )
def remove_tab ( self , room_jid ) :
2005-03-07 11:29:11 +00:00
if time . time ( ) - self . last_message_time [ room_jid ] < 2 :
dialog = Confirmation_dialog ( _ ( ' You received a message in the room %s in the last two secondes. \n Do you still want to close this tab ? ' ) % \
room_jid . split ( ' @ ' ) [ 0 ] )
if dialog . get_response ( ) != gtk . RESPONSE_YES :
return
2005-03-05 13:16:52 +00:00
if len ( self . xmls ) == 1 :
self . window . destroy ( )
else :
self . plugin . send ( ' GC_STATUS ' , self . account , ( self . nicks [ room_jid ] , \
room_jid , ' offline ' , ' offline ' ) )
self . chat_notebook . remove_page ( self . chat_notebook . get_current_page ( ) )
del self . plugin . windows [ self . account ] [ ' gc ' ] [ room_jid ]
del self . nicks [ room_jid ]
del self . nb_unread [ room_jid ]
2005-03-07 11:29:11 +00:00
del self . last_message_time [ room_jid ]
2005-03-05 13:16:52 +00:00
del self . xmls [ room_jid ]
del self . tagIn [ room_jid ]
2005-03-06 20:15:11 +00:00
del self . tagInBold [ room_jid ]
2005-03-05 13:16:52 +00:00
del self . tagOut [ room_jid ]
del self . tagStatus [ room_jid ]
del self . list_treeview [ room_jid ]
del self . subjects [ room_jid ]
if len ( self . xmls ) == 1 :
self . chat_notebook . set_show_tabs ( False )
2005-03-05 01:53:51 +00:00
self . show_title ( )
2005-03-05 13:16:52 +00:00
def new_group ( self , room_jid , nick ) :
self . nb_unread [ room_jid ] = 0
2005-03-07 11:29:11 +00:00
self . last_message_time [ room_jid ] = 0
2005-03-05 13:16:52 +00:00
self . nicks [ room_jid ] = nick
self . subjects [ room_jid ] = ' '
self . xmls [ room_jid ] = gtk . glade . XML ( GTKGUI_GLADE , ' group_vbox ' , APP )
self . list_treeview [ room_jid ] = self . xmls [ room_jid ] . \
get_widget ( ' list_treeview ' )
#status_image, nickname, real_jid
store = gtk . TreeStore ( gtk . Image , str , str )
column = gtk . TreeViewColumn ( ' contacts ' )
render_text = ImageCellRenderer ( )
column . pack_start ( render_text , expand = False )
column . add_attribute ( render_text , ' image ' , 0 )
render_text = gtk . CellRendererText ( )
column . pack_start ( render_text , expand = True )
column . add_attribute ( render_text , ' text ' , 1 )
self . list_treeview [ room_jid ] . append_column ( column )
self . list_treeview [ room_jid ] . set_model ( store )
column = gtk . TreeViewColumn ( )
render = gtk . CellRendererPixbuf ( )
column . pack_start ( render , expand = False )
self . list_treeview [ room_jid ] . append_column ( column )
column . set_visible ( False )
self . list_treeview [ room_jid ] . set_expander_column ( column )
conversation_textview = self . xmls [ room_jid ] . \
get_widget ( ' conversation_textview ' )
conversation_buffer = conversation_textview . get_buffer ( )
end_iter = conversation_buffer . get_end_iter ( )
conversation_buffer . create_mark ( ' end ' , end_iter , 0 )
self . tagIn [ room_jid ] = conversation_buffer . create_tag ( ' incoming ' )
2005-03-06 20:15:11 +00:00
self . tagInBold [ room_jid ] = conversation_buffer . create_tag ( ' incoming_bold ' )
2005-03-05 13:16:52 +00:00
color = self . plugin . config [ ' inmsgcolor ' ]
self . tagIn [ room_jid ] . set_property ( ' foreground ' , color )
2005-03-06 20:15:11 +00:00
self . tagInBold [ room_jid ] . set_property ( ' foreground ' , color )
self . tagInBold [ room_jid ] . set_property ( ' weight ' , 700 )
2005-03-05 13:16:52 +00:00
self . tagOut [ room_jid ] = conversation_buffer . create_tag ( ' outgoing ' )
color = self . plugin . config [ ' outmsgcolor ' ]
self . tagOut [ room_jid ] . set_property ( ' foreground ' , color )
self . tagStatus [ room_jid ] = conversation_buffer . create_tag ( ' status ' )
color = self . plugin . config [ ' statusmsgcolor ' ]
self . tagStatus [ room_jid ] . set_property ( ' foreground ' , color )
self . xmls [ room_jid ] . signal_autoconnect ( self )
self . chat_notebook . append_page ( self . xmls [ room_jid ] . \
get_widget ( ' group_vbox ' ) )
if len ( self . xmls ) > 1 :
self . chat_notebook . set_show_tabs ( True )
self . redraw_tab ( room_jid )
self . show_title ( )
2004-09-06 14:55:10 +00:00
2005-03-05 01:53:51 +00:00
def on_list_treeview_button_press_event ( self , widget , event ) :
2004-09-25 15:19:07 +00:00
""" popup user ' s group ' s or agent menu """
if event . type == gtk . gdk . BUTTON_PRESS :
if event . button == 3 :
try :
2005-03-05 13:16:52 +00:00
path , column , x , y = widget . get_path_at_pos ( int ( event . x ) , \
int ( event . y ) )
2004-09-25 15:19:07 +00:00
except TypeError :
2005-03-05 13:16:52 +00:00
widget . get_selection ( ) . unselect_all ( )
2005-03-01 13:46:22 +00:00
return False
2005-03-05 13:16:52 +00:00
model = widget . get_model ( )
2004-09-25 15:19:07 +00:00
iter = model . get_iter ( path )
if len ( path ) == 2 :
2005-03-05 16:01:20 +00:00
room_jid = self . get_active_jid ( )
2005-03-05 13:16:52 +00:00
self . mk_menu ( room_jid , event , iter )
2005-03-01 13:46:22 +00:00
return True
2004-09-25 15:19:07 +00:00
if event . button == 1 :
try :
2005-03-05 13:16:52 +00:00
path , column , x , y = widget . get_path_at_pos ( int ( event . x ) , \
int ( event . y ) )
2004-09-25 15:19:07 +00:00
except TypeError :
2005-03-05 13:16:52 +00:00
widget . get_selection ( ) . unselect_all ( )
2005-03-05 01:53:51 +00:00
return False
def on_list_treeview_key_release_event ( self , widget , event ) :
2004-09-25 15:19:07 +00:00
if event . type == gtk . gdk . KEY_RELEASE :
if event . keyval == gtk . keysyms . Escape :
2005-03-05 13:16:52 +00:00
widget . get_selection ( ) . unselect_all ( )
2005-03-01 13:46:22 +00:00
return False
2004-09-25 15:19:07 +00:00
2005-03-05 01:53:51 +00:00
def on_list_treeview_row_activated ( self , widget , path , col = 0 ) :
2004-09-25 15:19:07 +00:00
""" When an iter is dubble clicked :
open the chat window """
2005-03-05 13:16:52 +00:00
model = widget . get_model ( )
2004-09-25 15:19:07 +00:00
iter = model . get_iter ( path )
if len ( path ) == 1 :
2005-03-05 13:16:52 +00:00
if ( widget . row_expanded ( path ) ) :
widget . collapse_row ( path )
2004-09-25 15:19:07 +00:00
else :
2005-03-05 13:16:52 +00:00
widget . expand_row ( path , False )
2004-09-25 15:19:07 +00:00
2005-03-05 01:53:51 +00:00
def on_list_treeview_row_expanded ( self , widget , iter , path ) :
2004-09-25 15:19:07 +00:00
""" When a row is expanded :
change the icon of the arrow """
2005-03-05 13:16:52 +00:00
model = widget . get_model ( )
2004-09-25 15:19:07 +00:00
model . set_value ( iter , 0 , self . plugin . roster . pixbufs [ ' opened ' ] )
2005-03-05 01:53:51 +00:00
def on_list_treeview_row_collapsed ( self , widget , iter , path ) :
2004-09-25 15:19:07 +00:00
""" When a row is collapsed :
change the icon of the arrow """
2005-03-05 13:16:52 +00:00
model = widget . get_model ( )
2004-09-25 15:19:07 +00:00
model . set_value ( iter , 0 , self . plugin . roster . pixbufs [ ' closed ' ] )
2005-03-05 13:16:52 +00:00
def __init__ ( self , room_jid , nick , plugin , account ) :
self . xml = gtk . glade . XML ( GTKGUI_GLADE , ' groupchat_window ' , APP )
self . chat_notebook = self . xml . get_widget ( ' chat_notebook ' )
self . chat_notebook . remove_page ( 0 )
2004-08-04 22:40:22 +00:00
self . plugin = plugin
self . account = account
2005-03-05 13:16:52 +00:00
self . xmls = { }
self . tagIn = { }
2005-03-06 20:15:11 +00:00
self . tagInBold = { }
2005-03-05 13:16:52 +00:00
self . tagOut = { }
self . tagStatus = { }
self . nicks = { }
self . nb_unread = { }
2005-03-07 11:29:11 +00:00
self . last_message_time = { }
2005-03-05 13:16:52 +00:00
self . list_treeview = { }
self . subjects = { }
2005-03-05 01:53:51 +00:00
self . window = self . xml . get_widget ( ' groupchat_window ' )
2005-03-05 13:16:52 +00:00
self . new_group ( room_jid , nick )
self . show_title ( )
2005-03-07 16:50:26 +00:00
self . xml . signal_connect ( ' on_groupchat_window_destroy ' , \
self . on_groupchat_window_destroy )
2005-03-07 11:29:11 +00:00
self . xml . signal_connect ( ' on_groupchat_window_delete_event ' , \
self . on_groupchat_window_delete_event )
2005-03-05 13:16:52 +00:00
self . xml . signal_connect ( ' on_groupchat_window_focus_in_event ' , \
self . on_groupchat_window_focus_in_event )
self . xml . signal_connect ( ' on_groupchat_window_key_press_event ' , \
self . on_groupchat_window_key_press_event )
self . xml . signal_connect ( ' on_chat_notebook_switch_page ' , \
self . on_chat_notebook_switch_page )
self . xml . signal_connect ( ' on_set_button_clicked ' , \
self . on_set_button_clicked )
2005-03-05 19:47:49 +00:00
#FIXME: (nk) WHY AUTOCONNECT segfaults? [haven't test here but looks the same] with tabbed chat window ;P
2004-08-04 22:40:22 +00:00
2005-03-02 13:04:47 +00:00
class history_window :
2004-04-04 22:09:56 +00:00
""" Class for bowser agent window :
to know the agents on the selected server """
2005-03-01 17:18:23 +00:00
def on_history_window_destroy ( self , widget ) :
2004-04-04 22:09:56 +00:00
""" close window """
del self . plugin . windows [ ' logs ' ] [ self . jid ]
2005-03-01 17:18:23 +00:00
def on_close_button_clicked ( self , widget ) :
2004-04-04 22:09:56 +00:00
""" When Close button is clicked """
widget . get_toplevel ( ) . destroy ( )
2005-03-01 17:18:23 +00:00
def on_earliest_button_clicked ( self , widget ) :
start , end = self . history_buffer . get_bounds ( )
self . history_buffer . delete ( start , end )
self . earliest_button . set_sensitive ( False )
self . previous_button . set_sensitive ( False )
self . forward_button . set_sensitive ( True )
self . latest_button . set_sensitive ( True )
2004-04-04 22:09:56 +00:00
end = 50
if end > self . nb_line :
2004-05-01 22:30:53 +00:00
end = self . nb_line
2004-04-04 22:09:56 +00:00
self . plugin . send ( ' LOG_GET_RANGE ' , None , ( self . jid , 0 , end ) )
self . num_begin = self . nb_line
2005-03-01 17:18:23 +00:00
def on_previous_button_clicked ( self , widget ) :
start , end = self . history_buffer . get_bounds ( )
self . history_buffer . delete ( start , end )
self . earliest_button . set_sensitive ( True )
self . previous_button . set_sensitive ( True )
self . forward_button . set_sensitive ( True )
self . latest_button . set_sensitive ( True )
2004-04-04 22:09:56 +00:00
begin = self . num_begin - 50
if begin < 0 :
begin = 0
end = begin + 50
if end > self . nb_line :
end = self . nb_line
self . plugin . send ( ' LOG_GET_RANGE ' , None , ( self . jid , begin , end ) )
self . num_begin = self . nb_line
2005-03-01 17:18:23 +00:00
def on_forward_button_clicked ( self , widget ) :
start , end = self . history_buffer . get_bounds ( )
self . history_buffer . delete ( start , end )
self . earliest_button . set_sensitive ( True )
self . previous_button . set_sensitive ( True )
self . forward_button . set_sensitive ( True )
self . latest_button . set_sensitive ( True )
2004-04-04 22:09:56 +00:00
begin = self . num_begin + 50
if begin > self . nb_line :
begin = self . nb_line
end = begin + 50
if end > self . nb_line :
end = self . nb_line
self . plugin . send ( ' LOG_GET_RANGE ' , None , ( self . jid , begin , end ) )
self . num_begin = self . nb_line
2005-03-01 17:18:23 +00:00
def on_latest_button_clicked ( self , widget ) :
start , end = self . history_buffer . get_bounds ( )
self . history_buffer . delete ( start , end )
self . earliest_button . set_sensitive ( True )
self . previous_button . set_sensitive ( True )
self . forward_button . set_sensitive ( False )
self . latest_button . set_sensitive ( False )
2004-04-04 22:09:56 +00:00
begin = self . nb_line - 50
if begin < 0 :
begin = 0
self . plugin . send ( ' LOG_GET_RANGE ' , None , ( self . jid , begin , self . nb_line ) )
self . num_begin = self . nb_line
def new_line ( self , infos ) :
""" write a new line """
#infos = [num_line, date, type, data]
if infos [ 0 ] < self . num_begin :
self . num_begin = infos [ 0 ]
2005-03-01 17:18:23 +00:00
if infos [ 0 ] == 50 :
self . earliest_button . set_sensitive ( False )
self . previous_button . set_sensitive ( False )
2004-04-04 22:09:56 +00:00
if infos [ 0 ] == self . nb_line :
2005-03-01 17:18:23 +00:00
self . forward_button . set_sensitive ( False )
self . latest_button . set_sensitive ( False )
start_iter = self . history_buffer . get_start_iter ( )
end_iter = self . history_buffer . get_end_iter ( )
2004-04-04 22:09:56 +00:00
tim = time . strftime ( " [ %x %X ] " , time . localtime ( float ( infos [ 1 ] ) ) )
2005-03-01 17:18:23 +00:00
self . history_buffer . insert ( start_iter , tim )
2004-04-04 22:09:56 +00:00
if infos [ 2 ] == ' recv ' :
2005-03-05 21:02:38 +00:00
msg = ' : ' . join ( infos [ 3 ] [ 0 : ] )
msg = msg . replace ( ' \\ n ' , ' \n ' )
2005-03-01 17:18:23 +00:00
self . history_buffer . insert_with_tags_by_name ( start_iter , msg , \
' incoming ' )
2004-04-04 22:09:56 +00:00
elif infos [ 2 ] == ' sent ' :
2005-03-05 21:02:38 +00:00
msg = ' : ' . join ( infos [ 3 ] [ 0 : ] )
msg = msg . replace ( ' \\ n ' , ' \n ' )
2005-03-01 17:18:23 +00:00
self . history_buffer . insert_with_tags_by_name ( start_iter , msg , \
' outgoing ' )
2004-04-04 22:09:56 +00:00
else :
2005-03-06 00:36:27 +00:00
msg = ' : ' . join ( infos [ 3 ] [ 1 : ] )
2005-03-05 21:02:38 +00:00
msg = msg . replace ( ' \\ n ' , ' \n ' )
2005-03-01 17:18:23 +00:00
self . history_buffer . insert_with_tags_by_name ( start_iter , \
_ ( ' Status is now : ' ) + infos [ 3 ] [ 0 ] + ' : ' + msg , ' status ' )
2004-04-04 22:09:56 +00:00
def set_nb_line ( self , nb_line ) :
self . nb_line = nb_line
self . num_begin = nb_line
def __init__ ( self , plugin , jid ) :
self . plugin = plugin
self . jid = jid
self . nb_line = 0
self . num_begin = 0
2005-03-01 17:18:23 +00:00
xml = gtk . glade . XML ( GTKGUI_GLADE , ' history_window ' , APP )
self . window = xml . get_widget ( ' history_window ' )
self . history_buffer = xml . get_widget ( ' history_textview ' ) . get_buffer ( )
self . earliest_button = xml . get_widget ( ' earliest_button ' )
self . previous_button = xml . get_widget ( ' previous_button ' )
self . forward_button = xml . get_widget ( ' forward_button ' )
self . latest_button = xml . get_widget ( ' latest_button ' )
xml . signal_autoconnect ( self )
tagIn = self . history_buffer . create_tag ( ' incoming ' )
2004-04-04 22:09:56 +00:00
color = self . plugin . config [ ' inmsgcolor ' ]
2005-03-01 17:18:23 +00:00
tagIn . set_property ( ' foreground ' , color )
tagOut = self . history_buffer . create_tag ( ' outgoing ' )
2004-04-04 22:09:56 +00:00
color = self . plugin . config [ ' outmsgcolor ' ]
2005-03-01 17:18:23 +00:00
tagOut . set_property ( ' foreground ' , color )
tagStatus = self . history_buffer . create_tag ( ' status ' )
2004-04-04 22:09:56 +00:00
color = self . plugin . config [ ' statusmsgcolor ' ]
2005-03-01 17:18:23 +00:00
tagStatus . set_property ( ' foreground ' , color )
2004-04-04 22:09:56 +00:00
self . plugin . send ( ' LOG_NB_LINE ' , None , jid )
2005-03-01 23:48:05 +00:00
class roster_window :
""" Class for main window of gtkgui plugin """
2004-03-13 03:09:12 +00:00
def get_account_iter ( self , name ) :
2005-01-17 10:39:45 +00:00
if self . regroup :
return None
2004-03-13 03:09:12 +00:00
model = self . tree . get_model ( )
fin = False
2004-03-16 18:53:49 +00:00
account = model . get_iter_root ( )
if not account :
return None
2004-03-13 03:09:12 +00:00
while not fin :
account_name = model . get_value ( account , 3 )
2004-03-16 18:53:49 +00:00
if name == account_name :
2004-03-13 03:09:12 +00:00
return account
2004-03-18 16:38:14 +00:00
account = model . iter_next ( account )
if not account :
2004-03-13 03:09:12 +00:00
fin = True
return None
def get_group_iter ( self , name , account ) :
model = self . tree . get_model ( )
2004-03-16 18:53:49 +00:00
root = self . get_account_iter ( account )
2004-03-13 03:09:12 +00:00
fin = False
group = model . iter_children ( root )
if not group :
fin = True
while not fin :
group_name = model . get_value ( group , 3 )
if name == group_name :
return group
2004-03-18 16:38:14 +00:00
group = model . iter_next ( group )
if not group :
2004-03-13 03:09:12 +00:00
fin = True
return None
def get_user_iter ( self , jid , account ) :
model = self . tree . get_model ( )
2004-03-16 18:53:49 +00:00
acct = self . get_account_iter ( account )
2004-03-13 03:09:12 +00:00
found = [ ]
fin = False
2004-03-16 18:53:49 +00:00
group = model . iter_children ( acct )
2004-03-13 03:09:12 +00:00
if not group :
return found
while not fin :
fin2 = False
user = model . iter_children ( group )
2004-03-16 18:53:49 +00:00
if not user :
fin2 = True
2004-03-13 03:09:12 +00:00
while not fin2 :
if jid == model . get_value ( user , 3 ) :
found . append ( user )
2004-03-18 16:38:14 +00:00
user = model . iter_next ( user )
if not user :
2004-03-13 03:09:12 +00:00
fin2 = True
2004-03-18 16:38:14 +00:00
group = model . iter_next ( group )
if not group :
2004-03-13 03:09:12 +00:00
fin = True
return found
def add_account_to_roster ( self , account ) :
2005-01-17 10:39:45 +00:00
if self . regroup :
return
2004-03-16 18:53:49 +00:00
model = self . tree . get_model ( )
2004-03-13 03:09:12 +00:00
if self . get_account_iter ( account ) :
return
2004-05-01 22:30:53 +00:00
statuss = [ ' offline ' , ' online ' , ' away ' , ' xa ' , ' dnd ' , ' invisible ' ]
status = statuss [ self . plugin . connected [ account ] ]
2004-03-23 21:48:19 +00:00
model . append ( None , ( self . pixbufs [ status ] , account , ' account ' , account , \
2005-03-01 13:46:22 +00:00
account , False ) )
2004-03-13 03:09:12 +00:00
2004-10-09 14:50:39 +00:00
def add_user_to_roster ( self , jid , account ) :
2004-01-20 12:46:27 +00:00
""" Add a user to the roster and add groups if they aren ' t in roster """
2004-03-16 15:39:36 +00:00
showOffline = self . plugin . config [ ' showoffline ' ]
2004-06-06 01:27:18 +00:00
if not self . contacts [ account ] . has_key ( jid ) :
return
users = self . contacts [ account ] [ jid ]
user = users [ 0 ]
2004-03-13 03:09:12 +00:00
if user . groups == [ ] :
2005-03-05 21:02:38 +00:00
if user . jid . find ( " @ " ) < = 0 :
2004-03-13 03:09:12 +00:00
user . groups . append ( ' Agents ' )
2003-12-20 22:42:10 +00:00
else :
2004-03-13 03:09:12 +00:00
user . groups . append ( ' general ' )
2004-03-29 11:17:48 +00:00
2004-03-31 01:09:07 +00:00
if ( user . show == ' offline ' or user . show == ' error ' ) and not showOffline \
2004-06-10 13:58:24 +00:00
and not ' Agents ' in user . groups and \
not self . plugin . queues [ account ] . has_key ( user . jid ) :
2004-03-29 11:17:48 +00:00
return
model = self . tree . get_model ( )
for g in user . groups :
iterG = self . get_group_iter ( g , account )
if not iterG :
2004-06-06 01:27:18 +00:00
IterAcct = self . get_account_iter ( account )
iterG = model . append ( IterAcct , \
2004-03-29 11:17:48 +00:00
( self . pixbufs [ ' closed ' ] , g , ' group ' , \
2005-03-01 13:46:22 +00:00
g , account , False ) )
2004-07-12 21:14:12 +00:00
if not self . groups [ account ] . has_key ( g ) : #It can probably never append
if account + g in self . hidden_lines :
self . groups [ account ] [ g ] = { ' expand ' : False }
else :
self . groups [ account ] [ g ] = { ' expand ' : True }
2005-01-18 19:45:55 +00:00
if not account in self . hidden_lines and not self . plugin . config [ ' mergeaccounts ' ] :
2004-07-12 21:14:12 +00:00
self . tree . expand_row ( ( model . get_path ( iterG ) [ 0 ] ) , False )
2004-03-29 11:17:48 +00:00
typestr = ' user '
if g == ' Agents ' :
typestr = ' agent '
model . append ( iterG , ( self . pixbufs [ user . show ] , \
2005-01-17 10:39:45 +00:00
user . name , typestr , user . jid , account , False ) )
2004-03-29 11:17:48 +00:00
if self . groups [ account ] [ g ] [ ' expand ' ] :
2004-06-06 01:27:18 +00:00
self . tree . expand_row ( model . get_path ( iterG ) , False )
self . redraw_jid ( jid , account )
2004-01-21 23:09:03 +00:00
2004-03-13 03:09:12 +00:00
def remove_user ( self , user , account ) :
2004-04-22 12:31:20 +00:00
""" Remove a user from the roster """
2004-01-21 23:09:03 +00:00
model = self . tree . get_model ( )
2004-03-13 03:09:12 +00:00
for i in self . get_user_iter ( user . jid , account ) :
2004-01-21 23:09:03 +00:00
parent_i = model . iter_parent ( i )
2004-03-13 03:09:12 +00:00
model . remove ( i )
if model . iter_n_children ( parent_i ) == 0 :
2004-01-21 23:09:03 +00:00
model . remove ( parent_i )
2004-06-06 01:27:18 +00:00
def redraw_jid ( self , jid , account ) :
""" draw the correct pixbuf and name """
model = self . tree . get_model ( )
iters = self . get_user_iter ( jid , account )
if len ( iters ) == 0 :
return
users = self . contacts [ account ] [ jid ]
name = users [ 0 ] . name
if len ( users ) > 1 :
name + = " ( " + str ( len ( users ) ) + " ) "
prio = 0
2004-11-18 17:15:15 +00:00
user = users [ 0 ]
2004-06-06 01:27:18 +00:00
for u in users :
if u . priority > prio :
prio = u . priority
2004-11-18 17:15:15 +00:00
user = u
2004-06-06 01:27:18 +00:00
for iter in iters :
2004-06-09 15:29:32 +00:00
if self . plugin . queues [ account ] . has_key ( jid ) :
2004-06-28 01:29:02 +00:00
img = self . pixbufs [ ' message ' ]
2004-06-09 15:29:32 +00:00
else :
2004-11-18 17:15:15 +00:00
if user . sub == ' none ' :
if user . ask == ' subscribe ' :
img = self . pixbufs [ ' requested ' ]
else :
2005-03-02 20:27:09 +00:00
img = self . pixbufs [ ' not in the roster ' ]
2004-11-18 17:15:15 +00:00
else :
img = self . pixbufs [ user . show ]
2004-06-28 01:29:02 +00:00
model . set_value ( iter , 0 , img )
2004-06-06 01:27:18 +00:00
model . set_value ( iter , 1 , name )
2004-03-20 21:58:21 +00:00
2005-03-01 23:48:05 +00:00
def makemenu ( self ) :
""" create the browse agents, add contact & join groupchat sub menus """
2005-03-04 23:09:17 +00:00
# try to avoid WIDGET_REALIZED_FOR_EVENT failed which freezes gajim
new_message_menuitem = self . xml . get_widget ( ' new_message_menuitem ' )
join_gc_menuitem = self . xml . get_widget ( ' join_gc_menuitem ' )
add_contact_menuitem = self . xml . get_widget ( ' add_contact_menuitem ' )
browse_agents_menuitem = self . xml . get_widget ( ' browse_agents_menuitem ' )
2004-04-22 12:31:20 +00:00
if len ( self . plugin . accounts . keys ( ) ) > 0 :
2005-03-04 23:09:17 +00:00
new_message_menuitem . set_sensitive ( True )
join_gc_menuitem . set_sensitive ( True )
add_contact_menuitem . set_sensitive ( True )
browse_agents_menuitem . set_sensitive ( True )
2004-04-22 12:31:20 +00:00
else :
2005-03-04 23:09:17 +00:00
new_message_menuitem . set_sensitive ( False )
join_gc_menuitem . set_sensitive ( False )
add_contact_menuitem . set_sensitive ( False )
browse_agents_menuitem . set_sensitive ( False )
2005-03-01 23:48:05 +00:00
if len ( self . plugin . accounts . keys ( ) ) > 1 : # 2 or more accounts? make submenus
2004-03-20 21:58:21 +00:00
#add
menu_sub = gtk . Menu ( )
2005-03-04 23:09:17 +00:00
add_contact_menuitem . set_submenu ( menu_sub )
2005-03-04 21:34:08 +00:00
for account in self . plugin . accounts . keys ( ) :
2005-03-04 21:36:23 +00:00
item = gtk . MenuItem ( ' using ' + account + ' account ' )
2004-03-20 21:58:21 +00:00
menu_sub . append ( item )
2005-03-04 21:34:08 +00:00
item . connect ( " activate " , self . on_add_contact , account )
2004-03-20 21:58:21 +00:00
menu_sub . show_all ( )
#agents
menu_sub = gtk . Menu ( )
2005-03-04 23:09:17 +00:00
browse_agents_menuitem . set_submenu ( menu_sub )
2005-03-04 21:34:08 +00:00
for account in self . plugin . accounts . keys ( ) :
2005-03-04 21:36:23 +00:00
item = gtk . MenuItem ( ' using ' + account + ' account ' )
2004-03-20 21:58:21 +00:00
menu_sub . append ( item )
2005-03-04 21:34:08 +00:00
item . connect ( " activate " , self . on_browse_agents , account )
2004-03-20 21:58:21 +00:00
menu_sub . show_all ( )
2004-08-04 22:40:22 +00:00
#join gc
menu_sub = gtk . Menu ( )
2005-03-04 23:09:17 +00:00
join_gc_menuitem . set_submenu ( menu_sub )
2005-03-04 21:34:08 +00:00
for account in self . plugin . accounts . keys ( ) :
2005-03-04 21:36:23 +00:00
item = gtk . MenuItem ( ' using ' + account + ' account ' )
2004-08-04 22:40:22 +00:00
menu_sub . append ( item )
2005-03-04 21:34:08 +00:00
item . connect ( " activate " , self . on_join_gc , account )
2004-08-04 22:40:22 +00:00
menu_sub . show_all ( )
2005-03-01 23:48:05 +00:00
#new message
menu_sub = gtk . Menu ( )
2005-03-04 23:09:17 +00:00
new_message_menuitem . set_submenu ( menu_sub )
2005-03-04 21:34:08 +00:00
for account in self . plugin . accounts . keys ( ) :
2005-03-04 21:36:23 +00:00
item = gtk . MenuItem ( ' using ' + account + ' account ' )
2005-03-01 23:48:05 +00:00
menu_sub . append ( item )
2005-03-04 21:34:08 +00:00
item . connect ( " activate " , self . on_new_message_menuitem_activate , account )
2005-03-01 23:48:05 +00:00
menu_sub . show_all ( )
2004-03-28 14:43:37 +00:00
elif len ( self . plugin . accounts . keys ( ) ) == 1 :
2004-03-20 21:58:21 +00:00
#add
2005-03-02 13:42:33 +00:00
if not self . add_contact_handler_id :
2005-03-01 23:48:05 +00:00
self . add_contact_handler_id = self . xml . get_widget ( ' add_contact_menuitem ' ) . connect (
" activate " , self . on_add_contact , self . plugin . accounts . keys ( ) [ 0 ] )
2004-03-20 21:58:21 +00:00
#agents
2005-03-02 13:42:33 +00:00
if not self . browse_agents_handler_id :
2005-03-01 23:48:05 +00:00
self . browse_agents_handler_id = self . xml . get_widget (
' browse_agents_menuitem ' ) . connect ( " activate " , self . on_browse_agents ,
2005-01-14 20:29:08 +00:00
self . plugin . accounts . keys ( ) [ 0 ] )
2004-08-04 22:40:22 +00:00
#join_gc
2005-03-02 13:42:33 +00:00
if not self . join_gc_handler_id :
2005-03-01 23:48:05 +00:00
self . join_gc_handler_id = self . xml . get_widget ( ' join_gc_menuitem ' ) . connect (
2005-01-14 20:29:08 +00:00
" activate " , self . on_join_gc , self . plugin . accounts . keys ( ) [ 0 ] )
2003-12-31 10:55:13 +00:00
def draw_roster ( self ) :
2004-01-20 12:46:27 +00:00
""" Clear and draw roster """
2005-03-01 23:48:05 +00:00
self . makemenu ( )
2004-01-18 22:56:28 +00:00
self . tree . get_model ( ) . clear ( )
2004-03-16 15:39:36 +00:00
for acct in self . contacts . keys ( ) :
2004-03-13 03:09:12 +00:00
self . add_account_to_roster ( acct )
2004-06-06 01:27:18 +00:00
for jid in self . contacts [ acct ] . keys ( ) :
2004-10-09 14:50:39 +00:00
self . add_user_to_roster ( jid , acct )
2003-12-20 22:42:10 +00:00
2004-03-13 03:09:12 +00:00
def mklists ( self , array , account ) :
""" fill self.contacts and self.groups """
2004-03-24 15:33:40 +00:00
if not self . contacts . has_key ( account ) :
self . contacts [ account ] = { }
if not self . groups . has_key ( account ) :
self . groups [ account ] = { }
2004-03-13 03:09:12 +00:00
for jid in array . keys ( ) :
2005-03-05 21:02:38 +00:00
jids = jid . split ( ' / ' )
2004-03-13 03:09:12 +00:00
#get jid
ji = jids [ 0 ]
#get resource
resource = ' '
if len ( jids ) > 1 :
resource = jids [ 1 : ]
#get name
name = array [ jid ] [ ' name ' ]
2003-11-30 22:40:24 +00:00
if not name :
2005-03-05 21:02:38 +00:00
if ji . find ( " @ " ) < = 0 :
2003-11-30 22:40:24 +00:00
name = ji
else :
2005-03-05 21:02:38 +00:00
name = jid . split ( ' @ ' ) [ 0 ]
2004-03-13 03:09:12 +00:00
#get show
show = array [ jid ] [ ' show ' ]
2003-11-30 22:40:24 +00:00
if not show :
show = ' offline '
2005-03-02 20:27:09 +00:00
user1 = User ( ji , name , array [ jid ] [ ' groups ' ] , show , \
2004-11-18 17:15:15 +00:00
array [ jid ] [ ' status ' ] , array [ jid ] [ ' sub ' ] , array [ jid ] [ ' ask ' ] , \
resource , 0 , ' ' )
2004-05-24 19:23:02 +00:00
#when we draw the roster, we can't have twice the same user with
# 2 resources
self . contacts [ account ] [ ji ] = [ user1 ]
2004-03-13 03:09:12 +00:00
for g in array [ jid ] [ ' groups ' ] :
if not g in self . groups [ account ] . keys ( ) :
2004-07-12 21:14:12 +00:00
if account + g in self . hidden_lines :
self . groups [ account ] [ g ] = { ' expand ' : False }
else :
self . groups [ account ] [ g ] = { ' expand ' : True }
2004-03-13 03:09:12 +00:00
def chg_user_status ( self , user , show , status , account ) :
2004-03-11 21:14:09 +00:00
""" When a user change his status """
2004-03-16 15:39:36 +00:00
showOffline = self . plugin . config [ ' showoffline ' ]
2004-06-06 01:27:18 +00:00
model = self . tree . get_model ( )
2004-06-10 13:58:24 +00:00
if ( show == ' offline ' or show == ' error ' ) and not showOffline and \
not self . plugin . queues [ account ] . has_key ( user . jid ) :
2004-06-06 01:27:18 +00:00
if len ( self . contacts [ account ] [ user . jid ] ) > 1 :
luser = self . contacts [ account ] [ user . jid ]
for u in luser :
if u . resource == user . resource :
luser . remove ( u )
self . redraw_jid ( user . jid , account )
break
2003-11-30 22:40:24 +00:00
else :
2004-06-06 01:27:18 +00:00
self . remove_user ( user , account )
iters = [ ]
else :
if not self . get_user_iter ( user . jid , account ) :
2004-10-09 14:50:39 +00:00
self . add_user_to_roster ( user . jid , account )
2004-06-06 01:27:18 +00:00
self . redraw_jid ( user . jid , account )
2004-07-18 21:38:14 +00:00
users = self . contacts [ account ] [ user . jid ]
for u in users :
2004-05-25 16:22:15 +00:00
if u . resource == user . resource :
u . show = show
u . status = status
2004-10-07 14:43:59 +00:00
u . keyID = user . keyID
2004-05-25 16:22:15 +00:00
break
2004-03-11 21:14:09 +00:00
#Print status in chat window
2004-03-18 16:38:14 +00:00
if self . plugin . windows [ account ] [ ' chats ' ] . has_key ( user . jid ) :
2004-07-18 21:38:14 +00:00
prio = 0
sho = users [ 0 ] . show
for u in users :
if u . priority > prio :
prio = u . priority
sho = u . show
img = self . pixbufs [ sho ]
2005-01-28 20:01:49 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ user . jid ] . \
set_image ( img , user . jid )
2004-05-25 01:18:56 +00:00
name = user . name
if user . resource != ' ' :
name + = ' / ' + user . resource
2004-03-18 16:38:14 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ user . jid ] . print_conversation ( \
2005-01-27 11:02:01 +00:00
_ ( " %s is now %s ( %s ) " ) % ( name , show , status ) , user . jid , ' status ' )
2004-01-14 01:06:27 +00:00
2004-03-16 15:39:36 +00:00
def on_info ( self , widget , user , account ) :
2005-03-02 13:04:47 +00:00
""" Call vcard_information_window class to display user ' s information """
2004-03-18 16:38:14 +00:00
if not self . plugin . windows [ account ] [ ' infos ' ] . has_key ( user . jid ) :
self . plugin . windows [ account ] [ ' infos ' ] [ user . jid ] = \
2005-03-02 13:04:47 +00:00
vcard_information_window ( user , self . plugin , account )
2004-03-04 20:56:39 +00:00
2004-03-16 15:39:36 +00:00
def on_agent_logging ( self , widget , jid , state , account ) :
2004-03-04 20:56:39 +00:00
""" When an agent is requested to log in or off """
2004-03-16 15:39:36 +00:00
self . plugin . send ( ' AGENT_LOGGING ' , account , ( jid , state ) )
2004-05-25 15:30:56 +00:00
2004-06-21 17:06:43 +00:00
def on_remove_agent ( self , widget , jid , account ) :
""" When an agent is requested to log in or off """
2005-03-05 18:47:12 +00:00
window = Confirmation_dialog ( _ ( ' Are you sure you want to remove the agent %s from your roster? ' ) % jid )
2005-03-03 13:45:12 +00:00
if window . get_response ( ) == gtk . RESPONSE_YES :
2004-06-21 17:06:43 +00:00
self . plugin . send ( ' UNSUB_AGENT ' , account , jid )
for u in self . contacts [ account ] [ jid ] :
self . remove_user ( u , account )
del self . contacts [ account ] [ u . jid ]
2005-03-03 23:50:11 +00:00
def on_rename ( self , widget , iter , path ) :
2004-06-06 01:27:18 +00:00
model = self . tree . get_model ( )
2005-01-17 10:39:45 +00:00
model . set_value ( iter , 5 , True )
2004-05-25 15:30:56 +00:00
self . tree . set_cursor ( path , self . tree . get_column ( 0 ) , True )
2004-03-04 20:56:39 +00:00
2004-04-17 19:38:43 +00:00
def on_history ( self , widget , user ) :
""" When history button is pressed : call log window """
if not self . plugin . windows [ ' logs ' ] . has_key ( user . jid ) :
2005-03-02 13:04:47 +00:00
self . plugin . windows [ ' logs ' ] [ user . jid ] = history_window ( self . plugin , \
2004-04-17 19:38:43 +00:00
user . jid )
2004-03-16 15:39:36 +00:00
def mk_menu_user ( self , event , iter ) :
2004-01-20 12:46:27 +00:00
""" Make user ' s popup menu """
2004-01-18 22:56:28 +00:00
model = self . tree . get_model ( )
2004-03-16 15:39:36 +00:00
jid = model . get_value ( iter , 3 )
2004-01-18 22:56:28 +00:00
path = model . get_path ( iter )
2005-01-17 10:39:45 +00:00
account = model . get_value ( iter , 4 )
2004-05-24 19:23:02 +00:00
user = self . contacts [ account ] [ jid ] [ 0 ]
2004-03-18 16:38:14 +00:00
2004-03-04 20:56:39 +00:00
menu = gtk . Menu ( )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Start chat " ) )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2005-02-28 16:28:15 +00:00
item . connect ( " activate " , self . on_roster_treeview_row_activated , path )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Rename " ) )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2005-03-03 23:50:11 +00:00
item . connect ( " activate " , self . on_rename , iter , path )
2003-11-30 22:40:24 +00:00
item = gtk . MenuItem ( )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Subscription " ) )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2003-11-30 22:40:24 +00:00
menu_sub = gtk . Menu ( )
item . set_submenu ( menu_sub )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Resend authorization to " ) )
2003-11-30 22:40:24 +00:00
menu_sub . append ( item )
2004-03-22 13:09:59 +00:00
item . connect ( " activate " , self . authorize , jid , account )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Rerequest authorization from " ) )
2003-11-30 22:40:24 +00:00
menu_sub . append ( item )
2004-01-24 20:32:51 +00:00
item . connect ( " activate " , self . req_sub , jid , \
2004-05-16 23:47:14 +00:00
_ ( ' I would like to add you to my contact list, please. ' ) , account )
2003-11-30 22:40:24 +00:00
item = gtk . MenuItem ( )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Remove " ) )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2004-03-18 16:38:14 +00:00
item . connect ( " activate " , self . on_req_usub , user , account )
2004-01-14 01:06:27 +00:00
item = gtk . MenuItem ( )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2005-02-28 12:47:23 +00:00
item = gtk . MenuItem ( _ ( " Information " ) )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2004-03-18 16:38:14 +00:00
item . connect ( " activate " , self . on_info , user , account )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " History " ) )
2004-04-17 19:38:43 +00:00
menu . append ( item )
item . connect ( " activate " , self . on_history , user )
2004-01-14 01:06:27 +00:00
2004-03-04 20:56:39 +00:00
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
2004-06-15 00:45:34 +00:00
menu . reposition ( )
2003-11-30 22:40:24 +00:00
2005-03-03 23:50:11 +00:00
def mk_menu_g ( self , event , iter ) :
2004-01-20 12:46:27 +00:00
""" Make group ' s popup menu """
2005-03-03 23:50:11 +00:00
model = self . tree . get_model ( )
path = model . get_path ( iter )
2004-03-04 20:56:39 +00:00
menu = gtk . Menu ( )
2005-03-03 23:50:11 +00:00
item = gtk . MenuItem ( _ ( ' Rename ' ) )
menu . append ( item )
item . connect ( ' activate ' , self . on_rename , iter , path )
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
menu . reposition ( )
2004-03-04 20:56:39 +00:00
def mk_menu_agent ( self , event , iter ) :
""" Make agent ' s popup menu """
model = self . tree . get_model ( )
2004-03-16 15:39:36 +00:00
jid = model . get_value ( iter , 3 )
2004-03-24 15:33:40 +00:00
path = model . get_path ( iter )
2005-01-17 10:39:45 +00:00
account = model . get_value ( iter , 4 )
2004-03-04 20:56:39 +00:00
menu = gtk . Menu ( )
2004-05-28 17:54:40 +00:00
item = gtk . MenuItem ( _ ( " Log on " ) )
2004-05-24 19:23:02 +00:00
if self . contacts [ account ] [ jid ] [ 0 ] . show != ' offline ' :
2005-03-01 13:46:22 +00:00
item . set_sensitive ( False )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2004-03-24 15:33:40 +00:00
item . connect ( " activate " , self . on_agent_logging , jid , ' available ' , account )
2004-03-04 20:56:39 +00:00
2004-05-28 17:54:40 +00:00
item = gtk . MenuItem ( _ ( " Log off " ) )
2004-05-24 19:23:02 +00:00
if self . contacts [ account ] [ jid ] [ 0 ] . show == ' offline ' :
2005-03-01 13:46:22 +00:00
item . set_sensitive ( False )
2004-03-04 20:56:39 +00:00
menu . append ( item )
2004-06-21 17:06:43 +00:00
item . connect ( " activate " , self . on_agent_logging , jid , ' unavailable ' , \
account )
item = gtk . MenuItem ( )
menu . append ( item )
item = gtk . MenuItem ( _ ( " Remove " ) )
menu . append ( item )
item . connect ( " activate " , self . on_remove_agent , jid , account )
2004-03-24 15:33:40 +00:00
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
2004-06-15 00:45:34 +00:00
menu . reposition ( )
2004-03-24 15:33:40 +00:00
2004-05-02 16:25:04 +00:00
def on_edit_account ( self , widget , account ) :
2005-03-07 17:01:56 +00:00
if not self . plugin . windows . has_key ( ' account_modification_window ' ) :
2004-10-10 18:44:38 +00:00
infos = self . plugin . accounts [ account ]
infos [ ' accname ' ] = account
infos [ ' jid ' ] = self . plugin . accounts [ account ] [ " name " ] + \
' @ ' + self . plugin . accounts [ account ] [ " hostname " ]
2005-03-07 17:01:56 +00:00
self . plugin . windows [ ' account_modification_window ' ] = \
Account_modification_window ( self . plugin , infos )
2004-05-02 16:25:04 +00:00
2004-03-24 15:33:40 +00:00
def mk_menu_account ( self , event , iter ) :
""" Make account ' s popup menu """
model = self . tree . get_model ( )
account = model . get_value ( iter , 3 )
menu = gtk . Menu ( )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Status " ) )
2004-03-24 15:33:40 +00:00
menu . append ( item )
menu_sub = gtk . Menu ( )
item . set_submenu ( menu_sub )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Online " ) )
2004-03-24 15:33:40 +00:00
menu_sub . append ( item )
item . connect ( " activate " , self . change_status , account , ' online ' )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Away " ) )
2004-03-24 15:33:40 +00:00
menu_sub . append ( item )
item . connect ( " activate " , self . change_status , account , ' away ' )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " NA " ) )
2004-03-24 15:33:40 +00:00
menu_sub . append ( item )
2004-06-14 03:36:55 +00:00
item . connect ( " activate " , self . change_status , account , ' xa ' )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " DND " ) )
2004-03-24 15:33:40 +00:00
menu_sub . append ( item )
item . connect ( " activate " , self . change_status , account , ' dnd ' )
2004-05-31 18:12:57 +00:00
item = gtk . MenuItem ( _ ( " Invisible " ) )
menu_sub . append ( item )
item . connect ( " activate " , self . change_status , account , ' invisible ' )
2004-03-24 15:33:40 +00:00
item = gtk . MenuItem ( )
menu_sub . append ( item )
2004-05-16 23:47:14 +00:00
item = gtk . MenuItem ( _ ( " Offline " ) )
2004-03-24 15:33:40 +00:00
menu_sub . append ( item )
item . connect ( " activate " , self . change_status , account , ' offline ' )
item = gtk . MenuItem ( )
menu . append ( item )
2004-03-04 20:56:39 +00:00
2004-11-18 19:03:58 +00:00
item = gtk . MenuItem ( _ ( " _Edit account " ) )
2004-05-02 16:25:04 +00:00
menu . append ( item )
item . connect ( " activate " , self . on_edit_account , account )
2004-09-06 14:55:10 +00:00
item = gtk . MenuItem ( _ ( " _Browse agents " ) )
menu . append ( item )
2005-03-01 23:48:05 +00:00
item . connect ( " activate " , self . on_browse_agents , account )
2004-11-18 19:03:58 +00:00
item = gtk . MenuItem ( _ ( " _Add contact " ) )
menu . append ( item )
2005-03-01 23:48:05 +00:00
item . connect ( " activate " , self . on_add_contact , account )
2005-03-04 23:09:17 +00:00
item = gtk . MenuItem ( _ ( ' _New message ' ) )
2005-03-01 23:48:05 +00:00
menu . append ( item )
item . connect ( " activate " , self . on_new_message_menuitem_activate , account )
2004-11-18 19:03:58 +00:00
if not self . plugin . connected [ account ] :
item . set_sensitive ( False )
2004-05-02 16:25:04 +00:00
2004-03-04 20:56:39 +00:00
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
2004-06-15 00:45:34 +00:00
menu . reposition ( )
2003-11-30 22:40:24 +00:00
2004-03-16 15:39:36 +00:00
def authorize ( self , widget , jid , account ) :
2004-01-20 12:46:27 +00:00
""" Authorize a user """
2004-03-16 15:39:36 +00:00
self . plugin . send ( ' AUTH ' , account , jid )
2003-11-30 22:40:24 +00:00
2005-02-04 07:58:40 +00:00
def req_sub ( self , widget , jid , txt , account , pseudo = None ) :
2004-01-20 12:46:27 +00:00
""" Request subscription to a user """
2005-02-04 07:58:40 +00:00
if not pseudo :
pseudo = jid
2004-03-16 15:39:36 +00:00
self . plugin . send ( ' SUB ' , account , ( jid , txt ) )
if not self . contacts [ account ] . has_key ( jid ) :
2005-03-03 13:45:12 +00:00
user1 = User ( jid , pseudo , [ ' general ' ] , ' requested ' , \
2004-11-18 17:15:15 +00:00
' requested ' , ' none ' , ' subscribe ' , ' ' , 0 , ' ' )
2004-06-06 01:27:18 +00:00
self . contacts [ account ] [ jid ] = [ user1 ]
2004-10-09 14:51:57 +00:00
self . add_user_to_roster ( jid , account )
2005-02-28 15:25:04 +00:00
def on_roster_treeview_key_release_event ( self , widget , event ) :
2005-02-28 16:43:16 +00:00
""" when a key is pressed in the treeviews """
2005-02-28 15:25:04 +00:00
if event . keyval == gtk . keysyms . Escape :
self . tree . get_selection ( ) . unselect_all ( )
2005-03-03 20:33:39 +00:00
if event . keyval == gtk . keysyms . F2 :
treeselection = self . tree . get_selection ( )
model , iter = treeselection . get_selected ( )
if not iter :
return
type = model . get_value ( iter , 2 )
2005-03-03 23:50:11 +00:00
if type == ' user ' or type == ' group ' :
2005-03-03 20:33:39 +00:00
path = model . get_path ( iter )
model . set_value ( iter , 5 , True )
self . tree . set_cursor ( path , self . tree . get_column ( 0 ) , True )
2005-03-05 15:09:54 +00:00
if event . keyval == gtk . keysyms . Delete :
treeselection = self . tree . get_selection ( )
model , iter = treeselection . get_selected ( )
if not iter :
return
jid = model . get_value ( iter , 3 )
account = model . get_value ( iter , 4 )
type = model . get_value ( iter , 2 )
if type == ' user ' :
user = self . contacts [ account ] [ jid ] [ 0 ]
self . on_req_usub ( widget , user , account )
elif type == ' agent ' :
self . on_remove_agent ( widget , jid , account )
2005-03-01 13:46:22 +00:00
return False
2004-01-05 15:02:03 +00:00
2005-02-28 15:25:04 +00:00
def on_roster_treeview_button_press_event ( self , widget , event ) :
2004-01-20 12:46:27 +00:00
""" popup user ' s group ' s or agent menu """
2004-05-18 23:39:11 +00:00
if event . type == gtk . gdk . BUTTON_PRESS :
if event . button == 3 :
try :
path , column , x , y = self . tree . get_path_at_pos ( int ( event . x ) , \
int ( event . y ) )
except TypeError :
self . tree . get_selection ( ) . unselect_all ( )
return
model = self . tree . get_model ( )
iter = model . get_iter ( path )
type = model . get_value ( iter , 2 )
if type == ' group ' :
2005-03-03 23:50:11 +00:00
self . mk_menu_g ( event , iter )
2004-05-18 23:39:11 +00:00
elif type == ' agent ' :
self . mk_menu_agent ( event , iter )
elif type == ' user ' :
self . mk_menu_user ( event , iter )
elif type == ' account ' :
self . mk_menu_account ( event , iter )
2005-03-01 13:46:22 +00:00
return True
2004-05-18 23:39:11 +00:00
if event . button == 1 :
try :
path , column , x , y = self . tree . get_path_at_pos ( int ( event . x ) , \
int ( event . y ) )
except TypeError :
self . tree . get_selection ( ) . unselect_all ( )
2005-03-06 08:31:09 +00:00
return False
model = self . tree . get_model ( )
iter = model . get_iter ( path )
type = model . get_value ( iter , 2 )
2005-03-06 13:33:12 +00:00
if ( type == ' group ' or type == ' account ' ) :
2005-03-06 08:31:09 +00:00
# The integer 30 is the width of the first CellRenderer (see
# iconCellDataFunc function)
if x < = 30 :
if ( self . tree . row_expanded ( path ) ) :
self . tree . collapse_row ( path )
else :
self . tree . expand_row ( path , False )
2005-03-01 13:46:22 +00:00
return False
2004-03-16 15:39:36 +00:00
2004-03-18 16:38:14 +00:00
def on_req_usub ( self , widget , user , account ) :
2004-01-20 12:46:27 +00:00
""" Remove a user """
2005-03-05 18:47:12 +00:00
window = Confirmation_dialog ( _ ( " Are you sure you want to remove %s ( %s ) from your roster? " ) % ( user . name , user . jid ) )
2005-03-03 13:45:12 +00:00
if window . get_response ( ) == gtk . RESPONSE_YES :
2004-04-26 00:59:23 +00:00
self . plugin . send ( ' UNSUB ' , account , user . jid )
2004-05-24 19:23:02 +00:00
for u in self . contacts [ account ] [ user . jid ] :
self . remove_user ( u , account )
del self . contacts [ account ] [ u . jid ]
2003-11-30 22:40:24 +00:00
2004-12-02 00:00:57 +00:00
def send_status ( self , account , status , txt , autoconnect = 0 ) :
2004-10-07 14:43:59 +00:00
if status != ' offline ' :
2005-01-17 22:12:45 +00:00
if not self . plugin . connected [ account ] :
model = self . tree . get_model ( )
accountIter = self . get_account_iter ( account )
if accountIter :
model . set_value ( accountIter , 0 , self . pixbufs [ ' connecting ' ] )
self . plugin . systray . set_status ( ' connecting ' )
2004-11-01 13:41:00 +00:00
save_pass = 0
2005-03-06 22:56:49 +00:00
if self . plugin . accounts [ account ] . has_key ( ' savepass ' ) :
save_pass = self . plugin . accounts [ account ] [ ' savepass ' ]
2004-11-01 13:41:00 +00:00
if not save_pass and not self . plugin . connected [ account ] :
passphrase = ' '
2005-03-07 17:01:56 +00:00
w = Passphrase_dialog ( _ ( ' Enter your password for account %s ' \
% account , ' Save password ' , autoconnect ) )
2004-12-02 00:00:57 +00:00
if autoconnect :
gtk . main ( )
2005-01-08 00:19:40 +00:00
passphrase , save = w . get_pass ( )
2004-12-02 00:00:57 +00:00
else :
2005-01-08 00:19:40 +00:00
passphrase , save = w . run ( )
2004-11-01 13:41:00 +00:00
if passphrase == - 1 :
2005-01-17 22:12:45 +00:00
if accountIter :
model . set_value ( accountIter , 0 , self . pixbufs [ ' offline ' ] )
self . set_cb ( )
2004-11-01 13:41:00 +00:00
return
self . plugin . send ( ' PASSPHRASE ' , account , passphrase )
2005-01-08 00:19:40 +00:00
if save :
self . plugin . accounts [ account ] [ ' savepass ' ] = 1
self . plugin . accounts [ account ] [ ' password ' ] = passphrase
2004-11-01 13:41:00 +00:00
2004-10-07 14:43:59 +00:00
keyid = None
2004-10-10 18:44:38 +00:00
save_gpg_pass = 0
2005-03-06 22:56:49 +00:00
if self . plugin . accounts [ account ] . has_key ( ' savegpgpass ' ) :
save_gpg_pass = self . plugin . accounts [ account ] [ ' savegpgpass ' ]
if self . plugin . accounts [ account ] . has_key ( ' keyid ' ) :
keyid = self . plugin . accounts [ account ] [ ' keyid ' ]
2004-10-16 09:37:32 +00:00
if keyid and not self . plugin . connected [ account ] and \
self . plugin . config [ ' usegpg ' ] :
2004-10-10 18:44:38 +00:00
if save_gpg_pass :
2005-01-06 12:44:50 +00:00
passphrase = self . plugin . accounts [ account ] [ ' gpgpassword ' ]
2004-10-10 18:44:38 +00:00
else :
2004-10-07 14:43:59 +00:00
passphrase = ' '
2005-03-07 20:51:27 +00:00
w = Passphrase_dialog ( \
_ ( ' Enter GPG key passphrase for account %s ' ) % account , \
' Save passphrase ' , autoconnect )
2004-12-02 00:00:57 +00:00
if autoconnect :
gtk . main ( )
2005-01-08 00:19:40 +00:00
passphrase , save = w . get_pass ( )
2004-12-02 00:00:57 +00:00
else :
2005-01-08 00:19:40 +00:00
passphrase , save = w . run ( )
2004-10-10 18:44:38 +00:00
if passphrase == - 1 :
passphrase = ' '
2005-01-08 00:19:40 +00:00
if save :
self . plugin . accounts [ account ] [ ' savegpgpass ' ] = 1
self . plugin . accounts [ account ] [ ' gpgpassword ' ] = passphrase
2004-11-01 13:41:00 +00:00
self . plugin . send ( ' GPGPASSPHRASE ' , account , passphrase )
2004-10-07 14:43:59 +00:00
self . plugin . send ( ' STATUS ' , account , ( status , txt ) )
2005-03-07 15:46:07 +00:00
for room_jid in self . plugin . windows [ account ] [ ' gc ' ] :
if room_jid != ' tabbed ' :
nick = self . plugin . windows [ account ] [ ' gc ' ] [ room_jid ] . nicks [ room_jid ]
self . plugin . send ( ' GC_STATUS ' , account , ( nick , room_jid , status , \
txt ) )
2004-10-20 22:53:15 +00:00
if status == ' online ' and self . plugin . sleeper . getState ( ) != \
common . sleepy . STATE_UNKNOWN :
2004-10-07 14:43:59 +00:00
self . plugin . sleeper_state [ account ] = 1
else :
self . plugin . sleeper_state [ account ] = 0
2005-03-06 22:56:49 +00:00
def get_status_message ( self , status ) :
if ( status == ' online ' and not self . plugin . config [ ' ask_online_status ' ] ) \
or ( status == ' offline ' and not \
self . plugin . config [ ' ask_offline_status ' ] ) :
return status
2005-03-07 17:01:56 +00:00
w = Away_message_dialog ( self . plugin )
2005-03-06 22:56:49 +00:00
message = w . run ( )
return message
2004-03-24 15:33:40 +00:00
def change_status ( self , widget , account , status ) :
2005-03-06 22:56:49 +00:00
message = self . get_status_message ( status )
if message == - 1 :
return
self . send_status ( account , status , message )
2004-03-24 15:33:40 +00:00
2004-11-01 13:28:26 +00:00
def on_cb_changed ( self , widget ) :
2004-01-20 12:46:27 +00:00
""" When we change our status """
2004-11-01 13:28:26 +00:00
model = self . cb . get_model ( )
active = self . cb . get_active ( )
if active < 0 :
return
2004-11-09 20:33:40 +00:00
accounts = self . plugin . accounts . keys ( )
if len ( accounts ) == 0 :
2005-03-05 18:47:12 +00:00
Error_dialog ( _ ( " You must setup an account before connecting to jabber network. " ) )
2004-11-09 20:33:40 +00:00
self . set_cb ( )
return
2004-11-01 13:28:26 +00:00
status = model [ active ] [ 0 ]
2005-03-06 22:56:49 +00:00
message = self . get_status_message ( status )
if message == - 1 :
self . set_cb ( )
return
2004-03-16 15:39:36 +00:00
for acct in accounts :
2004-10-18 08:37:16 +00:00
if self . plugin . accounts [ acct ] . has_key ( ' active ' ) :
if not self . plugin . accounts [ acct ] [ ' active ' ] :
continue
2005-03-06 22:56:49 +00:00
self . send_status ( acct , status , message )
2004-05-01 22:30:53 +00:00
2004-11-01 13:28:26 +00:00
def set_cb ( self ) :
#table to change index in plugin.connected to index in combobox
table = { 0 : 5 , 1 : 0 , 2 : 1 , 3 : 2 , 4 : 3 , 5 : 4 }
2004-11-16 14:25:28 +00:00
maxi = 0
if len ( self . plugin . connected . values ( ) ) :
maxi = max ( self . plugin . connected . values ( ) )
2004-05-01 23:50:07 +00:00
#temporarily block signal in order not to send status that we show
2004-11-01 13:28:26 +00:00
#in the combobox
self . cb . handler_block ( self . id_signal_cb )
self . cb . set_active ( table [ maxi ] )
self . cb . handler_unblock ( self . id_signal_cb )
2004-06-09 14:22:27 +00:00
statuss = [ ' offline ' , ' online ' , ' away ' , ' xa ' , ' dnd ' , ' invisible ' ]
2004-06-11 03:31:40 +00:00
self . plugin . systray . set_status ( statuss [ maxi ] )
2003-11-30 22:40:24 +00:00
2004-03-11 21:14:09 +00:00
def on_status_changed ( self , account , status ) :
2004-03-16 15:39:36 +00:00
""" the core tells us that our status has changed """
2004-04-27 02:29:48 +00:00
if not self . contacts . has_key ( account ) :
return
2004-03-23 21:48:19 +00:00
model = self . tree . get_model ( )
accountIter = self . get_account_iter ( account )
if accountIter :
model . set_value ( accountIter , 0 , self . pixbufs [ status ] )
2004-05-01 22:30:53 +00:00
statuss = [ ' offline ' , ' online ' , ' away ' , ' xa ' , ' dnd ' , ' invisible ' ]
2004-03-11 21:14:09 +00:00
if status == ' offline ' :
2004-03-18 16:38:14 +00:00
for jid in self . contacts [ account ] :
2004-05-24 19:23:02 +00:00
luser = self . contacts [ account ] [ jid ]
for user in luser :
self . chg_user_status ( user , ' offline ' , ' Disconnected ' , account )
2004-05-02 00:47:29 +00:00
self . plugin . connected [ account ] = statuss . index ( status )
2004-11-01 13:28:26 +00:00
self . set_cb ( )
2004-03-11 21:14:09 +00:00
2005-01-27 11:02:01 +00:00
def new_chat ( self , user , account ) :
2005-03-02 22:34:16 +00:00
if self . plugin . config [ ' usetabbedchat ' ] :
2005-01-27 11:02:01 +00:00
if not self . plugin . windows [ account ] [ ' chats ' ] . has_key ( ' tabbed ' ) :
self . plugin . windows [ account ] [ ' chats ' ] [ ' tabbed ' ] = \
2005-03-02 13:04:47 +00:00
tabbed_chat_window ( user , self . plugin , account )
2005-01-27 11:02:01 +00:00
else :
self . plugin . windows [ account ] [ ' chats ' ] [ ' tabbed ' ] . new_user ( user )
self . plugin . windows [ account ] [ ' chats ' ] [ user . jid ] = \
self . plugin . windows [ account ] [ ' chats ' ] [ ' tabbed ' ]
2005-02-02 12:02:12 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ ' tabbed ' ] . window . present ( )
2005-01-27 11:02:01 +00:00
else :
self . plugin . windows [ account ] [ ' chats ' ] [ user . jid ] = \
2005-03-02 22:34:16 +00:00
tabbed_chat_window ( user , self . plugin , account )
2005-01-27 11:02:01 +00:00
2005-03-05 13:16:52 +00:00
def new_group ( self , jid , nick , account ) :
if self . plugin . config [ ' usetabbedchat ' ] :
if not self . plugin . windows [ account ] [ ' gc ' ] . has_key ( ' tabbed ' ) :
self . plugin . windows [ account ] [ ' gc ' ] [ ' tabbed ' ] = \
Groupchat_window ( jid , nick , self . plugin , account )
else :
self . plugin . windows [ account ] [ ' gc ' ] [ ' tabbed ' ] . new_group ( jid , nick )
self . plugin . windows [ account ] [ ' gc ' ] [ jid ] = \
self . plugin . windows [ account ] [ ' gc ' ] [ ' tabbed ' ]
self . plugin . windows [ account ] [ ' gc ' ] [ ' tabbed ' ] . window . present ( )
else :
self . plugin . windows [ account ] [ ' gc ' ] [ user . jid ] = \
Groupchat_window ( jid , nick , self . plugin , account )
2004-09-27 17:51:51 +00:00
def on_message ( self , jid , msg , tim , account ) :
2004-03-11 21:14:09 +00:00
""" when we receive a message """
2004-03-20 21:58:21 +00:00
if not self . contacts [ account ] . has_key ( jid ) :
2005-03-02 20:27:09 +00:00
user1 = User ( jid , jid , [ ' not in the roster ' ] , \
' not in the roster ' , ' not in the roster ' , ' none ' , None , ' ' , 0 , ' ' )
2004-06-06 01:27:18 +00:00
self . contacts [ account ] [ jid ] = [ user1 ]
2004-10-09 14:51:57 +00:00
self . add_user_to_roster ( jid , account )
2004-06-10 13:58:24 +00:00
iters = self . get_user_iter ( jid , account )
if iters :
path = self . tree . get_model ( ) . get_path ( iters [ 0 ] )
2004-05-20 15:43:41 +00:00
else :
path = None
2004-03-11 21:14:09 +00:00
autopopup = self . plugin . config [ ' autopopup ' ]
2004-06-10 02:54:07 +00:00
autopopupaway = self . plugin . config [ ' autopopupaway ' ]
if ( autopopup == 0 or ( not autopopupaway and \
self . plugin . connected [ account ] > 1 ) ) and not \
2004-03-18 16:38:14 +00:00
self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
2004-03-11 21:14:09 +00:00
#We save it in a queue
2004-03-16 15:39:36 +00:00
if not self . plugin . queues [ account ] . has_key ( jid ) :
2004-03-11 21:14:09 +00:00
model = self . tree . get_model ( )
2004-03-16 15:39:36 +00:00
self . plugin . queues [ account ] [ jid ] = Queue . Queue ( 50 )
2004-06-09 15:29:32 +00:00
self . redraw_jid ( jid , account )
2004-06-13 18:26:40 +00:00
self . plugin . systray . add_jid ( jid , account )
2004-09-27 17:51:51 +00:00
# tim = time.strftime("[%H:%M:%S]")
2004-03-16 15:39:36 +00:00
self . plugin . queues [ account ] [ jid ] . put ( ( msg , tim ) )
2004-12-06 20:11:12 +00:00
self . nb_unread + = 1
self . show_title ( )
2004-06-10 13:58:24 +00:00
if not path :
2004-10-09 14:51:57 +00:00
self . add_user_to_roster ( jid , account )
2004-06-10 13:58:24 +00:00
iters = self . get_user_iter ( jid , account )
path = self . tree . get_model ( ) . get_path ( iters [ 0 ] )
2005-03-01 13:46:22 +00:00
self . tree . expand_row ( path [ 0 : 1 ] , False )
self . tree . expand_row ( path [ 0 : 2 ] , False )
2004-06-10 13:58:24 +00:00
self . tree . scroll_to_cell ( path )
self . tree . set_cursor ( path )
2004-05-20 15:43:41 +00:00
else :
if not self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
2005-01-27 11:02:01 +00:00
self . new_chat ( self . contacts [ account ] [ jid ] [ 0 ] , account )
2004-05-20 15:43:41 +00:00
if path :
2005-03-01 13:46:22 +00:00
self . tree . expand_row ( path [ 0 : 1 ] , False )
self . tree . expand_row ( path [ 0 : 2 ] , False )
2004-05-20 15:43:41 +00:00
self . tree . scroll_to_cell ( path )
self . tree . set_cursor ( path )
2004-09-27 17:51:51 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . print_conversation ( msg , \
2005-01-27 11:02:01 +00:00
jid , tim = tim )
2004-06-11 03:31:40 +00:00
if not self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . window . \
get_property ( ' is-active ' ) :
2004-06-13 18:26:40 +00:00
self . plugin . systray . add_jid ( jid , account )
2004-03-11 21:14:09 +00:00
2005-03-01 23:48:05 +00:00
def on_preferences_menuitem_activate ( self , widget ) :
2004-01-20 12:46:27 +00:00
""" When preferences is selected :
2005-03-01 23:48:05 +00:00
call the preferences_window class """
2004-03-16 15:39:36 +00:00
if not self . plugin . windows . has_key ( ' preferences ' ) :
2005-03-01 13:46:22 +00:00
self . plugin . windows [ ' preferences ' ] = preferences_window ( self . plugin )
2003-12-29 18:37:31 +00:00
2005-03-01 23:48:05 +00:00
def on_add_contact ( self , widget , account ) :
2004-01-20 12:46:27 +00:00
""" When add user is selected :
2005-03-01 23:48:05 +00:00
call the add_contact_window class """
add_contact_window ( self . plugin , account )
2003-11-30 22:40:24 +00:00
2004-08-04 22:40:22 +00:00
def on_join_gc ( self , widget , account ) :
""" When Join Groupchat is selected :
call the join_gc class """
2005-03-02 18:38:27 +00:00
join_groupchat_window ( self . plugin , account )
2004-08-04 22:40:22 +00:00
2005-03-01 23:48:05 +00:00
def on_new_message_menuitem_activate ( self , widget , account ) :
2005-03-03 22:14:50 +00:00
""" When new message menuitem is activated:
2005-03-05 18:47:12 +00:00
call the New_message_dialog class """
New_message_dialog ( self . plugin , account )
2005-03-01 23:48:05 +00:00
def on_about_menuitem_activate ( self , widget ) :
2004-01-20 12:46:27 +00:00
""" When about is selected :
call the about class """
2005-03-02 18:38:27 +00:00
about_window ( self . plugin )
2003-11-30 22:40:24 +00:00
2005-03-01 23:48:05 +00:00
def on_accounts_menuitem_activate ( self , widget ) :
2004-01-20 12:46:27 +00:00
""" When accounts is seleted :
call the accounts class to modify accounts """
2005-03-07 17:01:56 +00:00
if not self . plugin . windows . has_key ( ' accounts_window ' ) :
self . plugin . windows [ ' accounts_window ' ] = Accounts_window ( self . plugin )
2004-08-04 22:40:22 +00:00
def close_all ( self , dic ) :
""" close all the windows in the given dictionary """
for w in dic . values ( ) :
if type ( w ) == type ( { } ) :
self . close_all ( w )
else :
2004-09-06 14:55:10 +00:00
w . window . destroy ( )
2003-11-30 22:40:24 +00:00
2005-03-02 15:48:13 +00:00
def on_gajim_window_delete_event ( self , widget , event ) :
2005-01-16 21:40:31 +00:00
""" When we want to close the window """
if self . plugin . systray_visible :
2005-02-28 15:25:04 +00:00
self . window . iconify ( )
2005-01-16 21:40:31 +00:00
else :
2005-03-02 00:13:34 +00:00
self . quit_gtkgui_plugin ( )
2005-01-16 21:40:31 +00:00
return 1
2005-03-02 00:13:34 +00:00
def quit_gtkgui_plugin ( self ) :
2004-01-20 12:46:27 +00:00
""" When we quit the gtk plugin :
tell that to the core and exit gtk """
2005-01-17 22:19:44 +00:00
if self . plugin . config . has_key ( ' saveposition ' ) :
if self . plugin . config [ ' saveposition ' ] :
self . plugin . config [ ' x-position ' ] , self . plugin . config [ ' y-position ' ] = \
2005-02-28 15:25:04 +00:00
self . window . get_position ( )
2005-01-17 22:19:44 +00:00
self . plugin . config [ ' width ' ] , self . plugin . config [ ' height ' ] = \
2005-02-28 15:25:04 +00:00
self . window . get_size ( )
2005-01-17 22:19:44 +00:00
2005-03-05 21:02:38 +00:00
self . plugin . config [ ' hiddenlines ' ] = ' \t ' . join ( self . hidden_lines )
2004-11-04 01:03:17 +00:00
self . plugin . send ( ' CONFIG ' , None , ( ' GtkGui ' , self . plugin . config , ' GtkGui ' ) )
2004-09-27 17:51:51 +00:00
self . plugin . send ( ' QUIT ' , None , ( ' gtkgui ' , 1 ) )
2004-05-16 23:47:14 +00:00
print _ ( " plugin gtkgui stopped " )
2004-09-06 14:55:10 +00:00
self . close_all ( self . plugin . windows )
2004-12-14 12:57:45 +00:00
self . plugin . hide_systray ( )
2004-08-04 22:40:22 +00:00
gtk . main_quit ( )
2003-11-30 22:40:24 +00:00
2005-03-01 23:48:05 +00:00
def on_quit_menuitem_activate ( self , widget ) :
2005-03-02 00:13:34 +00:00
self . quit_gtkgui_plugin ( )
2005-02-28 15:25:04 +00:00
def on_roster_treeview_row_activated ( self , widget , path , col = 0 ) :
2004-01-20 12:46:27 +00:00
""" When an iter is dubble clicked :
open the chat window """
2004-01-18 22:56:28 +00:00
model = self . tree . get_model ( )
iter = model . get_iter ( path )
2005-01-17 10:39:45 +00:00
account = model . get_value ( iter , 4 )
2004-03-16 15:39:36 +00:00
type = model . get_value ( iter , 2 )
jid = model . get_value ( iter , 3 )
2004-03-20 21:58:21 +00:00
if ( type == ' group ' ) or ( type == ' account ' ) :
2003-12-10 11:03:57 +00:00
if ( self . tree . row_expanded ( path ) ) :
self . tree . collapse_row ( path )
else :
2004-03-23 21:48:19 +00:00
self . tree . expand_row ( path , False )
2003-12-10 11:03:57 +00:00
else :
2004-03-18 16:38:14 +00:00
if self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
2005-03-02 22:34:16 +00:00
if self . plugin . config [ ' usetabbedchat ' ] :
2005-01-28 22:40:05 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . active_tab ( jid )
2005-02-02 12:02:12 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . window . present ( )
2004-03-16 15:39:36 +00:00
elif self . contacts [ account ] . has_key ( jid ) :
2005-01-27 11:02:01 +00:00
self . new_chat ( self . contacts [ account ] [ jid ] [ 0 ] , account )
2005-03-02 22:34:16 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . active_tab ( jid )
2003-12-10 11:03:57 +00:00
2005-02-28 15:25:04 +00:00
def on_roster_treeview_row_expanded ( self , widget , iter , path ) :
2004-01-20 12:46:27 +00:00
""" When a row is expanded :
change the icon of the arrow """
2004-03-23 21:48:19 +00:00
model = self . tree . get_model ( )
2005-01-17 10:39:45 +00:00
account = model . get_value ( iter , 4 )
2004-03-23 21:48:19 +00:00
type = model . get_value ( iter , 2 )
if type == ' group ' :
model . set_value ( iter , 0 , self . pixbufs [ ' opened ' ] )
jid = model . get_value ( iter , 3 )
self . groups [ account ] [ jid ] [ ' expand ' ] = True
2004-07-12 21:14:12 +00:00
if account + jid in self . hidden_lines :
self . hidden_lines . remove ( account + jid )
2004-03-23 21:48:19 +00:00
elif type == ' account ' :
2004-07-12 21:14:12 +00:00
if account in self . hidden_lines :
self . hidden_lines . remove ( account )
2004-03-23 21:48:19 +00:00
for g in self . groups [ account ] :
groupIter = self . get_group_iter ( g , account )
if groupIter and self . groups [ account ] [ g ] [ ' expand ' ] :
pathG = model . get_path ( groupIter )
self . tree . expand_row ( pathG , False )
2003-12-10 11:03:57 +00:00
2005-02-28 15:25:04 +00:00
def on_roster_treeview_row_collapsed ( self , widget , iter , path ) :
2004-01-20 12:46:27 +00:00
""" When a row is collapsed :
change the icon of the arrow """
2004-03-23 21:48:19 +00:00
model = self . tree . get_model ( )
2005-01-17 10:39:45 +00:00
account = model . get_value ( iter , 4 )
2004-03-23 21:48:19 +00:00
type = model . get_value ( iter , 2 )
if type == ' group ' :
model . set_value ( iter , 0 , self . pixbufs [ ' closed ' ] )
jid = model . get_value ( iter , 3 )
self . groups [ account ] [ jid ] [ ' expand ' ] = False
2004-07-12 21:14:12 +00:00
if not account + jid in self . hidden_lines :
self . hidden_lines . append ( account + jid )
elif type == ' account ' :
if not account in self . hidden_lines :
self . hidden_lines . append ( account )
2003-11-30 22:40:24 +00:00
2004-06-06 01:27:18 +00:00
def on_editing_canceled ( self , cell ) :
""" editing have been canceled """
#TODO: get iter
2005-01-17 10:39:45 +00:00
#model.set_value(iter, 5, False)
2004-06-06 01:27:18 +00:00
pass
2003-11-30 22:40:24 +00:00
def on_cell_edited ( self , cell , row , new_text ) :
2004-01-20 12:46:27 +00:00
""" When an iter is editer :
2004-06-06 01:27:18 +00:00
if text has changed , rename the user """
2004-01-18 22:56:28 +00:00
model = self . tree . get_model ( )
iter = model . get_iter_from_string ( row )
2004-03-18 16:38:14 +00:00
path = model . get_path ( iter )
2005-01-17 10:39:45 +00:00
account = model . get_value ( iter , 4 )
2004-03-18 16:38:14 +00:00
jid = model . get_value ( iter , 3 )
2005-03-03 23:50:11 +00:00
type = model . get_value ( iter , 2 )
if type == ' user ' :
old_text = self . contacts [ account ] [ jid ] [ 0 ] . name
if old_text != new_text :
for u in self . contacts [ account ] [ jid ] :
u . name = new_text
self . plugin . send ( ' UPDUSER ' , account , ( jid , new_text , \
self . contacts [ account ] [ jid ] [ 0 ] . groups ) )
self . redraw_jid ( jid , account )
elif type == ' group ' :
old_name = model . get_value ( iter , 1 )
#get all users in that group
for jid in self . contacts [ account ] :
user = self . contacts [ account ] [ jid ] [ 0 ]
if old_name in user . groups :
#set them in the new one and remove it from the old
self . remove_user ( user , account )
user . groups . remove ( old_name )
user . groups . append ( new_text )
self . add_user_to_roster ( user . jid , account )
self . plugin . send ( ' UPDUSER ' , account , ( user . jid , user . name , \
user . groups ) )
2005-01-17 10:39:45 +00:00
model . set_value ( iter , 5 , False )
2003-11-30 22:40:24 +00:00
2005-03-01 23:48:05 +00:00
def on_browse_agents ( self , widget , account ) :
2004-01-20 12:46:27 +00:00
""" When browse agent is selected :
Call browse class """
2004-03-20 21:58:21 +00:00
if not self . plugin . windows [ account ] . has_key ( ' browser ' ) :
2004-09-25 15:19:07 +00:00
self . plugin . windows [ account ] [ ' browser ' ] = \
2005-03-01 14:59:46 +00:00
agent_browser_window ( self . plugin , account )
2003-11-30 22:40:24 +00:00
2005-01-20 12:09:26 +00:00
def image_is_ok ( self , image ) :
if not os . path . exists ( image ) :
return 0
img = gtk . Image ( )
try :
img . set_from_file ( image )
except :
return 0
if img . get_storage_type ( ) == gtk . IMAGE_PIXBUF :
pix = img . get_pixbuf ( )
else :
return 0
if pix . get_width ( ) > 24 or pix . get_height ( ) > 24 :
return 0
return 1
2005-01-18 10:17:03 +00:00
def mkemoticons ( self ) :
2005-03-05 17:34:33 +00:00
""" initialize emoticons dictionary """
self . emoticons = dict ( )
self . begin_emot = ' '
2005-03-05 21:02:38 +00:00
split_line = self . plugin . config [ ' emoticons ' ] . split ( ' \t ' )
2005-01-20 12:09:26 +00:00
for i in range ( 0 , len ( split_line ) / 2 ) :
2005-03-06 20:53:58 +00:00
# (nk) lost you here. if you remember add some comments about the idea of the algo
2005-03-06 00:36:27 +00:00
emot_file = split_line [ 2 * i + 1 ]
if not self . image_is_ok ( emot_file ) :
2005-01-18 10:17:03 +00:00
continue
2005-03-06 00:36:27 +00:00
pix = gtk . gdk . pixbuf_new_from_file ( emot_file )
2005-01-20 12:09:26 +00:00
self . emoticons [ split_line [ 2 * i ] ] = pix
if not split_line [ 2 * i ] [ 0 ] in self . begin_emot :
self . begin_emot + = split_line [ 2 * i ] [ 0 ]
2005-01-18 10:17:03 +00:00
2003-12-30 01:07:38 +00:00
def mkpixbufs ( self ) :
2004-01-20 12:46:27 +00:00
""" initialise pixbufs array """
2004-03-16 15:39:36 +00:00
iconstyle = self . plugin . config [ ' iconstyle ' ]
if not iconstyle :
iconstyle = ' sun '
self . path = ' plugins/gtkgui/icons/ ' + iconstyle + ' / '
2003-12-30 01:07:38 +00:00
self . pixbufs = { }
2005-01-17 22:12:45 +00:00
for state in ( ' connecting ' , ' online ' , ' chat ' , ' away ' , ' xa ' , ' dnd ' , \
' invisible ' , ' offline ' , ' error ' , ' requested ' , ' message ' , ' opened ' , \
2005-03-02 20:27:09 +00:00
' closed ' , ' not in the roster ' ) :
2004-02-17 02:23:38 +00:00
# try to open a pixfile with the correct method
2004-12-19 18:34:29 +00:00
state_file = state . replace ( " " , " _ " )
2004-02-17 02:23:38 +00:00
files = [ ]
2004-12-19 18:34:29 +00:00
files . append ( self . path + state_file + ' .gif ' )
files . append ( self . path + state_file + ' .png ' )
files . append ( self . path + state_file + ' .xpm ' )
2004-06-28 01:29:02 +00:00
image = gtk . Image ( )
image . show ( )
self . pixbufs [ state ] = image
2004-02-17 02:23:38 +00:00
for file in files :
if not os . path . exists ( file ) :
continue
2005-03-01 14:14:56 +00:00
image . set_from_file ( file )
2004-02-17 02:23:38 +00:00
break
2003-12-30 01:07:38 +00:00
2005-02-10 00:07:55 +00:00
def sound_is_ok ( self , sound ) :
if not os . path . exists ( sound ) :
return 0
return 1
2005-03-01 23:48:05 +00:00
def on_show_offline_contacts_menuitem_activate ( self , widget ) :
""" when show offline option is changed:
2004-01-20 12:46:27 +00:00
redraw the treeview """
2004-03-16 15:39:36 +00:00
self . plugin . config [ ' showoffline ' ] = 1 - self . plugin . config [ ' showoffline ' ]
2004-11-04 01:03:17 +00:00
self . plugin . send ( ' CONFIG ' , None , ( ' GtkGui ' , self . plugin . config , ' GtkGui ' ) )
2004-03-22 13:09:59 +00:00
self . draw_roster ( )
2003-12-31 10:55:13 +00:00
2004-03-29 01:38:22 +00:00
def iconCellDataFunc ( self , column , renderer , model , iter , data = None ) :
2004-03-30 03:26:53 +00:00
""" When a row is added, set properties for icon renderer """
2004-03-29 01:38:22 +00:00
if model . get_value ( iter , 2 ) == ' account ' :
2004-10-11 22:57:29 +00:00
renderer . set_property ( ' cell-background ' , \
self . plugin . config [ ' accountbgcolor ' ] )
2004-03-29 01:38:22 +00:00
renderer . set_property ( ' xalign ' , 0 )
elif model . get_value ( iter , 2 ) == ' group ' :
2004-10-11 22:57:29 +00:00
renderer . set_property ( ' cell-background ' , \
self . plugin . config [ ' groupbgcolor ' ] )
2004-03-29 01:38:22 +00:00
renderer . set_property ( ' xalign ' , 0.3 )
else :
2004-10-11 22:57:29 +00:00
renderer . set_property ( ' cell-background ' , \
self . plugin . config [ ' userbgcolor ' ] )
2004-03-29 01:38:22 +00:00
renderer . set_property ( ' xalign ' , 1 )
renderer . set_property ( ' width ' , 30 )
def nameCellDataFunc ( self , column , renderer , model , iter , data = None ) :
2004-03-30 03:26:53 +00:00
""" When a row is added, set properties for name renderer """
2004-03-29 01:38:22 +00:00
if model . get_value ( iter , 2 ) == ' account ' :
2004-10-11 22:57:29 +00:00
renderer . set_property ( ' foreground ' , \
self . plugin . config [ ' accounttextcolor ' ] )
renderer . set_property ( ' cell-background ' , \
self . plugin . config [ ' accountbgcolor ' ] )
2004-10-12 10:13:47 +00:00
renderer . set_property ( ' font ' , self . plugin . config [ ' accountfont ' ] )
2004-03-29 01:38:22 +00:00
renderer . set_property ( ' xpad ' , 0 )
elif model . get_value ( iter , 2 ) == ' group ' :
2004-10-11 22:57:29 +00:00
renderer . set_property ( ' foreground ' , \
self . plugin . config [ ' grouptextcolor ' ] )
renderer . set_property ( ' cell-background ' , \
self . plugin . config [ ' groupbgcolor ' ] )
2004-10-12 10:13:47 +00:00
renderer . set_property ( ' font ' , self . plugin . config [ ' groupfont ' ] )
2004-03-29 01:38:22 +00:00
renderer . set_property ( ' xpad ' , 8 )
else :
2004-10-11 22:57:29 +00:00
renderer . set_property ( ' foreground ' , \
self . plugin . config [ ' usertextcolor ' ] )
renderer . set_property ( ' cell-background ' , \
self . plugin . config [ ' userbgcolor ' ] )
2004-10-12 10:13:47 +00:00
renderer . set_property ( ' font ' , self . plugin . config [ ' userfont ' ] )
2004-03-29 01:38:22 +00:00
renderer . set_property ( ' xpad ' , 16 )
2004-03-30 03:26:53 +00:00
def compareIters ( self , model , iter1 , iter2 , data = None ) :
""" Compare two iters to sort them """
name1 = model . get_value ( iter1 , 1 )
name2 = model . get_value ( iter2 , 1 )
if not name1 or not name2 :
return 0
type = model . get_value ( iter1 , 2 )
if type == ' group ' :
if name1 == ' Agents ' :
return 1
if name2 == ' Agents ' :
return - 1
if name1 . lower ( ) < name2 . lower ( ) :
return - 1
if name2 . lower < name1 . lower ( ) :
return 1
return 0
2004-08-02 22:17:29 +00:00
def drag_data_get_data ( self , treeview , context , selection , target_id , etime ) :
treeselection = treeview . get_selection ( )
model , iter = treeselection . get_selected ( )
path = model . get_path ( iter )
data = " "
if len ( path ) == 3 :
data = model . get_value ( iter , 3 )
selection . set ( selection . target , 8 , data )
def drag_data_received_data ( self , treeview , context , x , y , selection , info ,
etime ) :
model = treeview . get_model ( )
data = selection . data
if not data :
return
drop_info = treeview . get_dest_row_at_pos ( x , y )
if not drop_info :
return
path_dest , position = drop_info
if position == gtk . TREE_VIEW_DROP_BEFORE and len ( path_dest ) == 2 \
and path_dest [ 1 ] == 0 : #droped before the first group
return
if position == gtk . TREE_VIEW_DROP_BEFORE and len ( path_dest ) == 2 :
#droped before a group : we drop it in the previous group
path_dest = ( path_dest [ 0 ] , path_dest [ 1 ] - 1 )
iter_dest = model . get_iter ( path_dest )
iter_source = treeview . get_selection ( ) . get_selected ( ) [ 1 ]
path_source = model . get_path ( iter_source )
if len ( path_dest ) == 1 : #droped on an account
return
if path_dest [ 0 ] != path_source [ 0 ] : #droped in another account
return
grp_source = model . get_value ( model . iter_parent ( iter_source ) , 3 )
2005-03-02 11:45:20 +00:00
if grp_source == ' Agents ' :
return
2004-08-02 22:17:29 +00:00
account = model . get_value ( model . get_iter ( path_dest [ 0 ] ) , 3 )
if len ( path_dest ) == 2 :
grp_dest = model . get_value ( iter_dest , 3 )
elif len ( path_dest ) == 3 :
grp_dest = model . get_value ( model . iter_parent ( iter_dest ) , 3 )
2005-01-17 09:08:48 +00:00
if grp_source == grp_dest :
2004-08-02 22:17:29 +00:00
return
for u in self . contacts [ account ] [ data ] :
u . groups . remove ( grp_source )
u . groups . append ( grp_dest )
self . plugin . send ( ' UPDUSER ' , account , ( u . jid , u . name , u . groups ) )
parent_i = model . iter_parent ( iter_source )
if model . iter_n_children ( parent_i ) == 1 : #this was the only child
model . remove ( parent_i )
2004-10-09 14:51:57 +00:00
self . add_user_to_roster ( data , account )
2004-08-02 22:17:29 +00:00
if context . action == gtk . gdk . ACTION_MOVE :
context . finish ( True , True , etime )
return
2004-12-06 20:11:12 +00:00
def show_title ( self ) :
start = " "
if self . nb_unread > 1 :
start = " [ " + str ( self . nb_unread ) + " ] "
elif self . nb_unread == 1 :
start = " * "
2005-02-28 15:25:04 +00:00
self . window . set_title ( start + " Gajim " )
2004-12-06 20:11:12 +00:00
2004-03-11 21:14:09 +00:00
def __init__ ( self , plugin ) :
2005-02-28 16:43:16 +00:00
self . xml = gtk . glade . XML ( GTKGUI_GLADE , ' gajim_window ' , APP )
self . window = self . xml . get_widget ( ' gajim_window ' )
2005-02-28 15:25:04 +00:00
self . tree = self . xml . get_widget ( ' roster_treeview ' )
2004-03-11 21:14:09 +00:00
self . plugin = plugin
2004-12-06 20:11:12 +00:00
self . nb_unread = 0
2005-03-01 23:48:05 +00:00
self . add_contact_handler_id = 0
self . browse_agents_handler_id = 0
self . join_gc_handler_id = 0
2005-01-17 10:39:45 +00:00
self . regroup = 0
2005-01-17 13:43:15 +00:00
if self . plugin . config . has_key ( ' mergeaccounts ' ) :
self . regroup = self . plugin . config [ ' mergeaccounts ' ]
2004-10-13 21:46:10 +00:00
if self . plugin . config . has_key ( ' saveposition ' ) :
2005-02-28 15:25:04 +00:00
self . window . hide ( )
2004-10-13 21:46:10 +00:00
if self . plugin . config [ ' saveposition ' ] :
if self . plugin . config . has_key ( ' x-position ' ) and \
self . plugin . config . has_key ( ' y-position ' ) :
2005-02-28 15:25:04 +00:00
self . window . move ( self . plugin . config [ ' x-position ' ] , \
2004-10-13 21:46:10 +00:00
self . plugin . config [ ' y-position ' ] )
if self . plugin . config . has_key ( ' width ' ) and \
self . plugin . config . has_key ( ' height ' ) :
2005-02-28 15:25:04 +00:00
self . window . resize ( self . plugin . config [ ' width ' ] , \
2004-10-13 21:46:10 +00:00
self . plugin . config [ ' height ' ] )
2005-02-28 15:25:04 +00:00
self . window . show_all ( )
2004-03-16 18:53:49 +00:00
self . groups = { }
2004-03-16 15:39:36 +00:00
self . contacts = { }
for a in self . plugin . accounts . keys ( ) :
self . contacts [ a ] = { }
2004-03-20 21:58:21 +00:00
self . groups [ a ] = { }
2005-01-17 10:39:45 +00:00
#(icon, name, type, jid, account, editable)
model = gtk . TreeStore ( gtk . Image , str , str , str , str , gobject . TYPE_BOOLEAN )
2004-03-30 03:26:53 +00:00
model . set_sort_func ( 1 , self . compareIters )
model . set_sort_column_id ( 1 , gtk . SORT_ASCENDING )
2004-01-18 22:56:28 +00:00
self . tree . set_model ( model )
2003-12-30 01:07:38 +00:00
self . mkpixbufs ( )
2005-01-18 10:17:03 +00:00
if self . plugin . config [ ' useemoticons ' ] :
self . mkemoticons ( )
2004-11-01 13:28:26 +00:00
liststore = gtk . ListStore ( gobject . TYPE_STRING , gtk . Image )
self . cb = gtk . ComboBox ( )
self . xml . get_widget ( ' vbox1 ' ) . pack_end ( self . cb , False )
cell = ImageCellRenderer ( )
self . cb . pack_start ( cell , False )
self . cb . add_attribute ( cell , ' image ' , 1 )
cell = gtk . CellRendererText ( )
self . cb . pack_start ( cell , True )
self . cb . add_attribute ( cell , ' text ' , 0 )
for status in [ ' online ' , ' away ' , ' xa ' , ' dnd ' , ' invisible ' , ' offline ' ] :
iter = liststore . append ( [ status , self . pixbufs [ status ] ] )
self . cb . show_all ( )
self . cb . set_model ( liststore )
self . cb . set_active ( 5 )
2003-11-30 22:40:24 +00:00
2004-03-16 15:39:36 +00:00
showOffline = self . plugin . config [ ' showoffline ' ]
2005-03-01 23:48:05 +00:00
self . xml . get_widget ( ' show_offline_contacts_menuitem ' ) . set_active ( showOffline )
2003-12-04 19:57:06 +00:00
2003-11-30 22:40:24 +00:00
#columns
2004-01-18 22:56:28 +00:00
col = gtk . TreeViewColumn ( )
2004-03-29 01:38:22 +00:00
self . tree . append_column ( col )
2004-06-28 01:29:02 +00:00
render_pixbuf = ImageCellRenderer ( )
2004-01-18 22:56:28 +00:00
col . pack_start ( render_pixbuf , expand = False )
2004-06-28 01:29:02 +00:00
col . add_attribute ( render_pixbuf , ' image ' , 0 )
2004-03-29 01:38:22 +00:00
col . set_cell_data_func ( render_pixbuf , self . iconCellDataFunc , None )
2003-11-30 22:40:24 +00:00
render_text = gtk . CellRendererText ( )
render_text . connect ( ' edited ' , self . on_cell_edited )
2004-06-06 01:27:18 +00:00
#need gtk2.4
#render_text.connect('editing-canceled', self.on_editing_canceled)
2004-01-18 22:56:28 +00:00
col . pack_start ( render_text , expand = True )
col . add_attribute ( render_text , ' text ' , 1 )
2005-01-17 10:39:45 +00:00
col . add_attribute ( render_text , ' editable ' , 5 )
2004-03-29 01:38:22 +00:00
col . set_cell_data_func ( render_text , self . nameCellDataFunc , None )
2004-01-18 22:56:28 +00:00
col = gtk . TreeViewColumn ( )
2003-12-10 11:03:57 +00:00
render_pixbuf = gtk . CellRendererPixbuf ( )
2004-01-18 22:56:28 +00:00
col . pack_start ( render_pixbuf , expand = False )
self . tree . append_column ( col )
2005-03-01 13:46:22 +00:00
col . set_visible ( False )
2004-03-29 01:38:22 +00:00
self . tree . set_expander_column ( col )
2003-11-30 22:40:24 +00:00
#signals
2004-08-02 22:17:29 +00:00
TARGETS = [ ( ' MY_TREE_MODEL_ROW ' , gtk . TARGET_SAME_WIDGET , 0 ) ]
self . tree . enable_model_drag_source ( gtk . gdk . BUTTON1_MASK , TARGETS ,
gtk . gdk . ACTION_DEFAULT | gtk . gdk . ACTION_MOVE )
self . tree . enable_model_drag_dest ( TARGETS , gtk . gdk . ACTION_DEFAULT )
self . tree . connect ( " drag_data_get " , self . drag_data_get_data )
self . tree . connect ( " drag_data_received " , self . drag_data_received_data )
2005-02-28 15:25:04 +00:00
self . xml . signal_autoconnect ( self )
2004-11-01 13:28:26 +00:00
self . id_signal_cb = self . cb . connect ( ' changed ' , self . on_cb_changed )
2003-11-30 22:40:24 +00:00
2005-03-05 21:02:38 +00:00
self . hidden_lines = self . plugin . config [ ' hiddenlines ' ] . split ( ' \t ' )
2004-03-18 16:38:14 +00:00
self . draw_roster ( )
2004-06-21 20:22:10 +00:00
class systrayDummy :
""" Class when we don ' t want icon in the systray """
def add_jid ( self , jid , account ) :
pass
def remove_jid ( self , jid , account ) :
pass
def set_status ( self , status ) :
pass
2004-12-14 12:57:45 +00:00
def show_icon ( self ) :
pass
def hide_icon ( self ) :
pass
2004-06-21 20:22:10 +00:00
def __init__ ( self ) :
2004-07-31 23:06:14 +00:00
self . t = gtk . Button ( )
2004-06-21 20:22:10 +00:00
2004-06-11 03:31:40 +00:00
class systray :
""" Class for icon in the systray """
def set_img ( self ) :
if len ( self . jids ) > 0 :
status = ' message '
else :
status = self . status
2004-06-28 01:29:02 +00:00
image = self . plugin . roster . pixbufs [ status ]
if image . get_storage_type ( ) == gtk . IMAGE_ANIMATION :
self . img_tray . set_from_animation ( image . get_animation ( ) )
elif image . get_storage_type ( ) == gtk . IMAGE_PIXBUF :
self . img_tray . set_from_pixbuf ( image . get_pixbuf ( ) )
2004-06-11 03:31:40 +00:00
2004-06-13 18:26:40 +00:00
def add_jid ( self , jid , account ) :
list = [ account , jid ]
if not list in self . jids :
self . jids . append ( list )
2004-06-11 03:31:40 +00:00
self . set_img ( )
2004-06-13 18:26:40 +00:00
def remove_jid ( self , jid , account ) :
list = [ account , jid ]
if list in self . jids :
self . jids . remove ( list )
2004-06-11 03:31:40 +00:00
self . set_img ( )
def set_status ( self , status ) :
self . status = status
self . set_img ( )
2004-11-01 13:28:26 +00:00
def set_cb ( self , widget , status ) :
2005-01-06 12:47:24 +00:00
statuss = [ ' online ' , ' away ' , ' xa ' , ' dnd ' , ' invisible ' , ' offline ' ]
2004-11-23 20:52:20 +00:00
self . plugin . roster . cb . set_active ( statuss . index ( status ) )
2004-06-11 21:36:17 +00:00
2004-06-16 19:25:02 +00:00
def start_chat ( self , widget , account , jid ) :
if self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . window . present ( )
elif self . plugin . roster . contacts [ account ] . has_key ( jid ) :
2005-01-27 11:02:01 +00:00
self . plugin . roster . new_chat (
self . plugin . roster . contacts [ account ] [ jid ] [ 0 ] , account )
2004-06-16 19:25:02 +00:00
2004-06-11 21:36:17 +00:00
def mk_menu ( self , event ) :
menu = gtk . Menu ( )
2004-06-17 17:11:29 +00:00
item = gtk . TearoffMenuItem ( )
menu . append ( item )
2004-06-11 21:36:17 +00:00
item = gtk . MenuItem ( _ ( " Status " ) )
menu . append ( item )
menu_sub = gtk . Menu ( )
item . set_submenu ( menu_sub )
item = gtk . MenuItem ( _ ( " Online " ) )
menu_sub . append ( item )
2004-11-01 13:28:26 +00:00
item . connect ( " activate " , self . set_cb , ' online ' )
2004-06-11 21:36:17 +00:00
item = gtk . MenuItem ( _ ( " Away " ) )
menu_sub . append ( item )
2004-11-01 13:28:26 +00:00
item . connect ( " activate " , self . set_cb , ' away ' )
2004-06-11 21:36:17 +00:00
item = gtk . MenuItem ( _ ( " NA " ) )
menu_sub . append ( item )
2004-11-01 13:28:26 +00:00
item . connect ( " activate " , self . set_cb , ' xa ' )
2004-06-11 21:36:17 +00:00
item = gtk . MenuItem ( _ ( " DND " ) )
menu_sub . append ( item )
2004-11-01 13:28:26 +00:00
item . connect ( " activate " , self . set_cb , ' dnd ' )
2004-06-11 21:36:17 +00:00
item = gtk . MenuItem ( _ ( " Invisible " ) )
menu_sub . append ( item )
2004-11-01 13:28:26 +00:00
item . connect ( " activate " , self . set_cb , ' invisible ' )
2004-06-11 21:36:17 +00:00
item = gtk . MenuItem ( )
menu_sub . append ( item )
item = gtk . MenuItem ( _ ( " Offline " ) )
menu_sub . append ( item )
2004-11-01 13:28:26 +00:00
item . connect ( " activate " , self . set_cb , ' offline ' )
2004-06-11 21:36:17 +00:00
item = gtk . MenuItem ( )
menu . append ( item )
2004-06-16 19:25:02 +00:00
item = gtk . MenuItem ( _ ( " Chat with " ) )
menu . append ( item )
menu_account = gtk . Menu ( )
item . set_submenu ( menu_account )
for account in self . plugin . accounts . keys ( ) :
item = gtk . MenuItem ( account )
menu_account . append ( item )
menu_group = gtk . Menu ( )
item . set_submenu ( menu_group )
for group in self . plugin . roster . groups [ account ] . keys ( ) :
if group == ' Agents ' :
continue
item = gtk . MenuItem ( group )
menu_group . append ( item )
menu_user = gtk . Menu ( )
item . set_submenu ( menu_user )
for users in self . plugin . roster . contacts [ account ] . values ( ) :
user = users [ 0 ]
if group in user . groups and user . show != ' offline ' and \
user . show != ' error ' :
2005-03-05 21:02:38 +00:00
item = gtk . MenuItem ( user . name . replace ( ' _ ' , ' __ ' ) )
2004-06-16 19:25:02 +00:00
menu_user . append ( item )
item . connect ( " activate " , self . start_chat , account , user . jid )
item = gtk . MenuItem ( )
menu . append ( item )
2004-06-11 21:36:17 +00:00
item = gtk . MenuItem ( _ ( " Quit " ) )
menu . append ( item )
2005-03-01 23:48:05 +00:00
item . connect ( " activate " , self . plugin . roster . on_quit_menuitem_activate )
2004-06-11 21:36:17 +00:00
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
menu . reposition ( )
def on_clicked ( self , widget , event ) :
2005-01-16 17:21:45 +00:00
if event . type == gtk . gdk . BUTTON_PRESS and event . button == 1 :
2004-06-13 18:26:40 +00:00
if len ( self . jids ) == 0 :
2005-02-28 16:43:16 +00:00
win = self . plugin . roster . window
2005-02-07 22:43:34 +00:00
if win . iconify_initially :
2004-06-13 18:26:40 +00:00
win . deiconify ( )
else :
2005-02-07 22:07:19 +00:00
if win . is_active ( ) :
win . iconify ( )
else :
win . present ( )
2004-06-13 18:26:40 +00:00
else :
account = self . jids [ 0 ] [ 0 ]
jid = self . jids [ 0 ] [ 1 ]
2004-09-26 16:38:57 +00:00
if self . plugin . windows [ account ] [ ' gc ' ] . has_key ( jid ) :
self . plugin . windows [ account ] [ ' gc ' ] [ jid ] . window . present ( )
2005-03-04 22:39:41 +00:00
elif self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
2004-06-13 18:26:40 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . window . present ( )
2004-06-15 03:42:58 +00:00
else :
2005-01-27 11:02:01 +00:00
self . plugin . roster . new_chat (
self . plugin . roster . contacts [ account ] [ jid ] [ 0 ] , account )
2004-06-11 21:36:17 +00:00
if event . button == 3 :
self . mk_menu ( event )
2004-12-14 12:57:45 +00:00
def show_icon ( self ) :
if not self . t :
self . t = trayicon . TrayIcon ( " Gajim " )
eb = gtk . EventBox ( )
eb . connect ( " button-press-event " , self . on_clicked )
self . tip = gtk . Tooltips ( )
self . tip . set_tip ( self . t , ' Gajim ' )
self . img_tray = gtk . Image ( )
eb . add ( self . img_tray )
self . t . add ( eb )
self . set_img ( )
self . t . show_all ( )
def hide_icon ( self ) :
if self . t :
self . t . destroy ( )
self . t = None
2004-06-11 03:31:40 +00:00
def __init__ ( self , plugin ) :
self . plugin = plugin
self . jids = [ ]
2004-12-14 12:57:45 +00:00
self . t = None
2004-06-11 03:31:40 +00:00
self . img_tray = gtk . Image ( )
self . status = ' offline '
2003-11-30 22:40:24 +00:00
class plugin :
2004-01-20 12:46:27 +00:00
""" Class called by the core in a new thread """
2004-03-11 21:14:09 +00:00
class accounts :
""" Class where are stored the accounts and users in them """
def __init__ ( self ) :
self . __accounts = { }
def add_account ( self , account , users = ( ) ) :
#users must be like (user1, user2)
self . __accounts [ account ] = users
def add_user_to_account ( self , account , user ) :
if self . __accounts . has_key ( account ) :
self . __accounts [ account ] . append ( user )
else :
return 1
def get_accounts ( self ) :
return self . __accounts . keys ( ) ;
def get_users ( self , account ) :
if self . __accounts . has_key ( account ) :
return self . __accounts [ account ]
else :
return None
def which_account ( self , user ) :
for a in self . __accounts . keys ( ) :
if user in self . __accounts [ a ] :
return a
return None
2005-02-10 00:07:55 +00:00
def play_timeout ( self , pid ) :
pidp , r = os . waitpid ( pid , os . WNOHANG )
return 0
def play_sound ( self , event ) :
2005-02-16 00:24:36 +00:00
if not os . name == ' posix ' :
return
2005-02-14 22:30:04 +00:00
if not self . config [ event ] :
return
file = self . config [ event + ' _file ' ]
if not os . path . exists ( file ) :
2005-02-10 00:07:55 +00:00
return
pid = os . fork ( )
if pid == 0 :
argv = self . config [ ' soundplayer ' ] . split ( )
2005-02-14 22:30:04 +00:00
argv . append ( file )
2005-02-10 00:07:55 +00:00
try :
os . execvp ( argv [ 0 ] , argv )
2005-03-05 17:34:33 +00:00
except :
2005-03-05 21:02:38 +00:00
print _ ( " error while running %s : " ) % ' ' . join ( argv ) , \
2005-02-10 00:07:55 +00:00
sys . exc_info ( ) [ 1 ]
os . _exit ( 1 )
pidp , r = os . waitpid ( pid , os . WNOHANG )
if pidp == 0 :
gtk . timeout_add ( 10000 , self . play_timeout , pid )
2004-03-11 21:14:09 +00:00
def send ( self , event , account , data ) :
self . queueOUT . put ( ( event , account , data ) )
2004-01-24 20:32:51 +00:00
def wait ( self , what ) :
""" Wait for a message from Core """
2004-02-17 02:23:38 +00:00
#TODO: timeout
temp_q = Queue . Queue ( 50 )
2004-01-24 20:32:51 +00:00
while 1 :
if not self . queueIN . empty ( ) :
ev = self . queueIN . get ( )
2004-03-11 21:14:09 +00:00
if ev [ 0 ] == what and ev [ 2 ] [ 0 ] == ' GtkGui ' :
2004-02-17 02:23:38 +00:00
#Restore messages
while not temp_q . empty ( ) :
ev2 = temp_q . get ( )
2004-02-17 18:40:14 +00:00
self . queueIN . put ( ev2 )
2004-03-11 21:14:09 +00:00
return ev [ 2 ] [ 1 ]
2004-02-17 02:23:38 +00:00
else :
#Save messages
temp_q . put ( ev )
2004-06-20 21:58:12 +00:00
2004-08-01 16:25:41 +00:00
def handle_event_roster ( self , account , data ) :
#('ROSTER', account, (state, array))
statuss = [ ' offline ' , ' online ' , ' away ' , ' xa ' , ' dnd ' , ' invisible ' ]
self . roster . on_status_changed ( account , statuss [ data [ 0 ] ] )
self . roster . mklists ( data [ 1 ] , account )
2004-06-20 21:58:12 +00:00
self . roster . draw_roster ( )
2004-06-20 22:01:42 +00:00
def handle_event_warning ( self , unused , msg ) :
2005-03-05 18:47:12 +00:00
Warning_dialog ( msg )
2004-06-20 21:58:12 +00:00
def handle_event_status ( self , account , status ) :
#('STATUS', account, status)
self . roster . on_status_changed ( account , status )
2005-03-04 14:17:55 +00:00
image = self . roster . pixbufs [ status ]
if image . get_storage_type ( ) == gtk . IMAGE_ANIMATION :
pixbuf = image . get_animation ( ) . get_static_image ( )
self . roster . window . set_icon ( pixbuf )
elif image . get_storage_type ( ) == gtk . IMAGE_PIXBUF :
self . roster . window . set_icon ( image . get_pixbuf ( ) )
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,
# role, affiliation, real_jid, reason, actor, statusCode))
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-03-05 21:02:38 +00:00
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
2004-10-07 14:43:59 +00:00
keyID = array [ 5 ]
2004-06-20 21:58:12 +00:00
resource = array [ 3 ]
if not resource :
resource = ' '
priority = array [ 4 ]
2005-03-05 21:02:38 +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
if self . roster . contacts [ account ] . has_key ( ji ) :
luser = self . roster . contacts [ account ] [ ji ]
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 :
old_show = statuss . index ( user1 . show )
else :
2004-06-20 21:58:12 +00:00
user1 = self . roster . 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-03-05 21:02:38 +00:00
luser [ 0 ] . show != ' offline ' ) ) and not jid . find ( " @ " ) < = 0 :
2005-02-14 23:48:32 +00:00
old_show = 0
2005-03-02 20:27:09 +00:00
user1 = User ( user1 . jid , user1 . name , user1 . groups , user1 . show , \
2004-11-18 17:15:15 +00:00
user1 . status , user1 . sub , user1 . ask , user1 . resource , \
2004-10-07 14:43:59 +00:00
user1 . priority , user1 . keyID )
2004-06-20 21:58:12 +00:00
luser . append ( user1 )
user1 . resource = resource
user1 . show = array [ 1 ]
user1 . status = array [ 2 ]
user1 . priority = priority
2004-10-07 14:43:59 +00:00
user1 . keyID = keyID
2005-03-05 21:02:38 +00:00
if jid . find ( " @ " ) < = 0 :
2004-06-20 21:58:12 +00:00
#It must be an agent
2004-06-21 17:06:43 +00:00
if self . roster . contacts [ account ] . has_key ( ji ) :
2004-06-20 21:58:12 +00:00
#Update existing iter
self . roster . redraw_jid ( ji , account )
elif self . roster . contacts [ account ] . has_key ( ji ) :
#It isn't an agent
self . roster . chg_user_status ( user1 , array [ 1 ] , array [ 2 ] , account )
2005-02-14 23:48:32 +00:00
#play sound
2005-02-15 17:35:43 +00:00
if old_show < 2 and statuss . index ( user1 . show ) > 1 and \
2005-02-14 23:48:32 +00:00
self . config [ ' sound_contact_connected ' ] :
self . play_sound ( ' sound_contact_connected ' )
2005-02-15 17:35:43 +00:00
elif old_show > 1 and statuss . index ( user1 . show ) < 2 and \
2005-02-14 23:48:32 +00:00
self . config [ ' sound_contact_disconnected ' ] :
self . play_sound ( ' sound_contact_disconnected ' )
2004-08-05 21:56:54 +00:00
elif self . windows [ account ] [ ' gc ' ] . has_key ( ji ) :
#it is a groupchat presence
2005-03-05 13:16:52 +00:00
self . windows [ account ] [ ' gc ' ] [ ji ] . chg_user_status ( ji , resource , \
array [ 1 ] , array [ 2 ] , array [ 6 ] , array [ 7 ] , array [ 8 ] , array [ 9 ] , \
array [ 10 ] , array [ 11 ] , account )
2004-06-21 00:12:25 +00:00
2004-06-20 21:58:12 +00:00
def handle_event_msg ( self , account , array ) :
2004-09-27 17:51:51 +00:00
#('MSG', account, (user, msg, time))
2005-03-05 21:02:38 +00:00
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
if jid . find ( " @ " ) < = 0 :
jid = jid . replace ( ' @ ' , ' ' )
2005-02-14 22:30:04 +00:00
first = 0
if not self . windows [ account ] [ ' chats ' ] . has_key ( jid ) and \
not self . queues [ account ] . has_key ( jid ) :
first = 1
2004-09-27 17:51:51 +00:00
self . roster . on_message ( jid , array [ 1 ] , array [ 2 ] , account )
2005-02-14 22:30:04 +00:00
if self . config [ ' sound_first_message_received ' ] and first :
self . play_sound ( ' sound_first_message_received ' )
if self . config [ ' sound_next_message_received ' ] and not first :
self . play_sound ( ' sound_next_message_received ' )
2004-01-24 20:32:51 +00:00
2004-07-08 19:46:24 +00:00
def handle_event_msgerror ( self , account , array ) :
2004-09-27 17:51:51 +00:00
#('MSGERROR', account, (user, error_code, error_msg, msg, time))
2005-03-05 21:02:38 +00:00
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
if jid . find ( " @ " ) < = 0 :
jid = jid . replace ( ' @ ' , ' ' )
2004-07-08 19:46:24 +00:00
self . roster . on_message ( jid , _ ( " error while sending " ) + " \" %s \" ( %s ) " % \
2004-09-27 17:51:51 +00:00
( 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 ) :
#('MSG', account, (jid, msg, keyID))
self . play_sound ( ' sound_message_sent ' )
2004-06-20 21:58:12 +00:00
def handle_event_subscribe ( self , account , array ) :
#('SUBSCRIBE', account, (jid, text))
2005-03-02 13:04:47 +00:00
subscription_request_window ( self , array [ 0 ] , array [ 1 ] , account )
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 ]
if self . roster . contacts [ account ] . has_key ( jid ) :
u = self . roster . 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-03-02 20:27:09 +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 :
u . groups = [ ' general ' ]
self . roster . add_user_to_roster ( u . jid , account )
2005-02-04 07:58:40 +00:00
self . send ( ' UPDUSER ' , account , ( u . jid , u . name , u . groups ) )
2004-06-20 21:58:12 +00:00
else :
2005-03-02 20:27:09 +00:00
user1 = User ( jid , jid , [ ' general ' ] , ' online ' , \
2005-02-04 07:58:40 +00:00
' online ' , ' to ' , ' ' , array [ 1 ] , 0 , ' ' )
2004-06-20 21:58:12 +00:00
self . roster . contacts [ account ] [ jid ] = [ user1 ]
2004-10-09 14:51:57 +00:00
self . roster . add_user_to_roster ( jid , account )
2005-03-05 18:47:12 +00:00
Information_dialog ( _ ( " You are now authorized by %s " ) % jid )
2004-06-20 21:58:12 +00:00
def handle_event_unsubscribed ( self , account , jid ) :
2005-03-05 18:47:12 +00:00
Information_dialog ( _ ( " You are now unsubscribed by %s " ) % jid )
2004-06-20 21:58:12 +00:00
2004-09-06 14:55:10 +00:00
def handle_event_agents ( self , account , agents ) :
2004-06-20 21:58:12 +00:00
#('AGENTS', account, agents)
if self . windows [ account ] . has_key ( ' browser ' ) :
2004-09-06 14:55:10 +00:00
self . windows [ account ] [ ' browser ' ] . agents ( agents )
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))
if self . windows [ account ] . has_key ( ' browser ' ) :
self . windows [ account ] [ ' browser ' ] . agent_info ( array [ 0 ] , array [ 1 ] , \
array [ 2 ] , array [ 3 ] )
def handle_event_reg_agent_info ( self , account , array ) :
#('REG_AGENTS_INFO', account, (agent, infos))
2004-06-20 21:58:12 +00:00
if not array [ 1 ] . has_key ( ' instructions ' ) :
2005-03-05 18:47:12 +00:00
Error_dialog ( _ ( " error contacting %s " ) % array [ 0 ] )
2004-06-20 21:58:12 +00:00
else :
2005-03-02 13:04:47 +00:00
agent_registration_window ( array [ 0 ] , array [ 1 ] , self , account )
2004-06-20 21:58:12 +00:00
def handle_event_acc_ok ( self , account , array ) :
2005-03-07 17:01:56 +00:00
#('ACC_OK', account, (hostname, login, pasword, name, resource, prio,
2004-06-20 21:58:12 +00:00
#use_proxy, proxyhost, proxyport))
2005-03-07 20:41:28 +00:00
name = array [ 3 ]
2005-03-07 17:01:56 +00:00
if self . windows [ ' account_modification_window ' ] :
self . windows [ ' account_modification_window ' ] . account_is_ok ( array [ 1 ] )
2005-03-07 20:41:28 +00:00
else :
2005-03-07 20:42:15 +00:00
self . accounts [ name ] = { ' name ' : array [ 1 ] , \
2005-03-07 20:41:28 +00:00
' hostname ' : array [ 0 ] , \
' password ' : array [ 2 ] , \
' resource ' : array [ 4 ] , \
' priority ' : array [ 5 ] , \
' use_proxy ' : array [ 6 ] , \
' proxyhost ' : array [ 7 ] , \
' proxyport ' : array [ 8 ] }
self . send ( ' CONFIG ' , None , ( ' accounts ' , self . accounts , ' GtkGui ' ) )
2004-08-05 21:56:54 +00:00
self . windows [ name ] = { ' infos ' : { } , ' chats ' : { } , ' gc ' : { } }
2004-06-20 21:58:12 +00:00
self . queues [ name ] = { }
self . connected [ name ] = 0
2004-11-17 22:00:20 +00:00
self . nicks [ name ] = array [ 1 ]
2004-06-20 21:58:12 +00:00
self . roster . groups [ name ] = { }
self . roster . contacts [ name ] = { }
2004-11-17 22:00:20 +00:00
self . sleeper_state [ name ] = 0
2005-03-07 17:01:56 +00:00
if self . windows . has_key ( ' accounts_window ' ) :
self . windows [ ' accounts_window ' ] . init_accounts ( )
2004-07-01 19:49:26 +00:00
self . roster . draw_roster ( )
2004-06-20 21:58:12 +00:00
def handle_event_quit ( self , p1 , p2 ) :
2005-02-28 15:25:04 +00:00
self . roster . on_quit ( )
2004-06-20 21:58:12 +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 ' ]
2004-06-20 21:58:12 +00:00
if nick == ' ' :
2004-06-21 00:12:25 +00:00
nick = self . accounts [ account ] [ ' name ' ]
self . 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 ) :
if self . windows [ account ] [ ' infos ' ] . has_key ( array [ ' jid ' ] ) :
self . windows [ account ] [ ' infos ' ] [ array [ ' jid ' ] ] . set_values ( array )
2004-06-20 21:58:12 +00:00
def handle_event_log_nb_line ( self , account , array ) :
#('LOG_NB_LINE', account, (jid, nb_line))
if self . windows [ ' logs ' ] . has_key ( array [ 0 ] ) :
self . windows [ ' logs ' ] [ array [ 0 ] ] . set_nb_line ( array [ 1 ] )
begin = 0
if array [ 1 ] > 50 :
begin = array [ 1 ] - 50
self . send ( ' LOG_GET_RANGE ' , None , ( array [ 0 ] , begin , array [ 1 ] ) )
def handle_event_log_line ( self , account , array ) :
#('LOG_LINE', account, (jid, num_line, date, type, data))
# if type = 'recv' or 'sent' data = [msg]
# else type = jid and data = [status, away_msg]
if self . windows [ ' logs ' ] . has_key ( array [ 0 ] ) :
self . windows [ ' logs ' ] [ array [ 0 ] ] . new_line ( array [ 1 : ] )
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-03-05 21:02:38 +00:00
jids = array [ 0 ] . split ( ' / ' )
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 ] )
2004-08-05 21:56:54 +00:00
if not self . windows [ account ] [ ' gc ' ] [ jid ] . window . \
2004-08-04 22:40:22 +00:00
get_property ( ' is-active ' ) :
self . systray . add_jid ( jid , account )
2005-03-04 21:27:45 +00:00
def handle_event_gc_subject ( self , account , array ) :
#('GC_SUBJECT', account, (jid, subject))
2005-03-05 21:02:38 +00:00
jids = array [ 0 ] . split ( ' / ' )
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
2004-10-10 18:44:38 +00:00
def handle_event_bad_passphrase ( self , account , array ) :
2005-03-05 18:47:12 +00:00
Warning_dialog ( _ ( " Your GPG passphrase is wrong, so you are connected without your GPG key. " ) )
2004-10-10 18:44:38 +00:00
def handle_event_gpg_secrete_keys ( self , account , keys ) :
keys [ ' None ' ] = ' None '
if self . windows . has_key ( ' gpg_keys ' ) :
self . windows [ ' gpg_keys ' ] . fill_tree ( keys )
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 ]
if not self . roster . contacts [ account ] . has_key ( jid ) :
return
users = self . roster . contacts [ account ] [ jid ]
if not ( array [ 2 ] or array [ 3 ] ) :
self . roster . remove_user ( users [ 0 ] , account )
del self . roster . contacts [ account ] [ jid ]
#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 ]
user . groups = array [ 4 ]
self . roster . redraw_jid ( jid , account )
2003-11-30 22:40:24 +00:00
def read_queue ( self ) :
2004-01-20 12:46:27 +00:00
""" Read queue from the core and execute commands from it """
2003-11-30 22:40:24 +00:00
while self . queueIN . empty ( ) == 0 :
ev = self . queueIN . get ( )
if ev [ 0 ] == ' ROSTER ' :
2004-06-20 22:01:42 +00:00
self . handle_event_roster ( ev [ 1 ] , ev [ 2 ] )
2004-01-07 23:49:23 +00:00
elif ev [ 0 ] == ' WARNING ' :
2004-06-20 22:01:42 +00:00
self . handle_event_warning ( ev [ 1 ] , ev [ 2 ] )
2004-01-07 23:49:23 +00:00
elif ev [ 0 ] == ' STATUS ' :
2004-06-20 21:58:12 +00:00
self . handle_event_status ( ev [ 1 ] , ev [ 2 ] )
2003-11-30 22:40:24 +00:00
elif ev [ 0 ] == ' NOTIFY ' :
2004-06-20 21:58:12 +00:00
self . handle_event_notify ( ev [ 1 ] , ev [ 2 ] )
2003-11-30 22:40:24 +00:00
elif ev [ 0 ] == ' MSG ' :
2004-06-20 21:58:12 +00:00
self . handle_event_msg ( ev [ 1 ] , ev [ 2 ] )
2004-07-08 19:46:24 +00:00
elif ev [ 0 ] == ' MSGERROR ' :
self . handle_event_msgerror ( ev [ 1 ] , ev [ 2 ] )
2005-02-15 00:10:10 +00:00
elif ev [ 0 ] == ' MSGSENT ' :
self . handle_event_msgsent ( ev [ 1 ] , ev [ 2 ] )
2003-11-30 22:40:24 +00:00
elif ev [ 0 ] == ' SUBSCRIBE ' :
2004-06-20 21:58:12 +00:00
self . handle_event_subscribe ( ev [ 1 ] , ev [ 2 ] )
2003-11-30 22:40:24 +00:00
elif ev [ 0 ] == ' SUBSCRIBED ' :
2004-06-20 21:58:12 +00:00
self . handle_event_subscribed ( ev [ 1 ] , ev [ 2 ] )
2004-01-21 23:09:03 +00:00
elif ev [ 0 ] == ' UNSUBSCRIBED ' :
2004-06-20 21:58:12 +00:00
self . handle_event_unsubscribed ( ev [ 1 ] , ev [ 2 ] )
2003-11-30 22:40:24 +00:00
elif ev [ 0 ] == ' AGENTS ' :
2004-06-20 21:58:12 +00:00
self . handle_event_agents ( ev [ 1 ] , ev [ 2 ] )
2003-11-30 22:40:24 +00:00
elif ev [ 0 ] == ' AGENT_INFO ' :
2004-06-20 21:58:12 +00:00
self . handle_event_agent_info ( ev [ 1 ] , ev [ 2 ] )
2004-09-06 14:55:10 +00:00
elif ev [ 0 ] == ' REG_AGENT_INFO ' :
self . handle_event_reg_agent_info ( ev [ 1 ] , ev [ 2 ] )
2003-12-14 00:47:00 +00:00
elif ev [ 0 ] == ' ACC_OK ' :
2004-06-20 21:58:12 +00:00
self . handle_event_acc_ok ( ev [ 1 ] , ev [ 2 ] )
2004-01-17 15:38:29 +00:00
elif ev [ 0 ] == ' QUIT ' :
2004-06-20 21:58:12 +00:00
self . handle_event_quit ( ev [ 1 ] , ev [ 2 ] )
2004-04-22 12:31:20 +00:00
elif ev [ 0 ] == ' MYVCARD ' :
2004-06-20 21:58:12 +00:00
self . handle_event_myvcard ( ev [ 1 ] , ev [ 2 ] )
2004-02-19 04:20:40 +00:00
elif ev [ 0 ] == ' VCARD ' :
2004-06-20 21:58:12 +00:00
self . handle_event_vcard ( ev [ 1 ] , ev [ 2 ] )
2004-04-04 22:09:56 +00:00
elif ev [ 0 ] == ' LOG_NB_LINE ' :
2004-06-20 21:58:12 +00:00
self . handle_event_log_nb_line ( ev [ 1 ] , ev [ 2 ] )
2004-04-04 22:09:56 +00:00
elif ev [ 0 ] == ' LOG_LINE ' :
2004-06-20 21:58:12 +00:00
self . handle_event_log_line ( ev [ 1 ] , ev [ 2 ] )
2004-08-04 22:40:22 +00:00
elif ev [ 0 ] == ' GC_MSG ' :
self . handle_event_gc_msg ( ev [ 1 ] , ev [ 2 ] )
2005-03-04 21:27:45 +00:00
elif ev [ 0 ] == ' GC_SUBJECT ' :
self . handle_event_gc_subject ( ev [ 1 ] , ev [ 2 ] )
2004-10-10 18:44:38 +00:00
elif ev [ 0 ] == ' BAD_PASSPHRASE ' :
self . handle_event_bad_passphrase ( ev [ 1 ] , ev [ 2 ] )
elif ev [ 0 ] == ' GPG_SECRETE_KEYS ' :
self . handle_event_gpg_secrete_keys ( ev [ 1 ] , ev [ 2 ] )
2004-11-18 17:15:15 +00:00
elif ev [ 0 ] == ' ROSTER_INFO ' :
self . handle_event_roster_info ( ev [ 1 ] , ev [ 2 ] )
2003-11-30 22:40:24 +00:00
return 1
2004-01-02 15:21:02 +00:00
2004-01-20 12:46:27 +00:00
def read_sleepy ( self ) :
""" Check if we are idle """
2004-10-20 22:53:15 +00:00
if not self . sleeper . poll ( ) :
2004-05-29 04:05:06 +00:00
return 1
state = self . sleeper . getState ( )
for account in self . accounts . keys ( ) :
if not self . sleeper_state [ account ] :
continue
if state == common . sleepy . STATE_AWAKE and \
self . sleeper_state [ account ] > 1 :
#we go online
2004-10-07 22:35:14 +00:00
self . send ( ' STATUS ' , account , ( ' online ' , ' Online ' ) )
2004-05-29 04:05:06 +00:00
self . sleeper_state [ account ] = 1
elif state == common . sleepy . STATE_AWAY and \
self . sleeper_state [ account ] == 1 and \
self . config [ ' autoaway ' ] :
#we go away
self . send ( ' STATUS ' , account , ( ' away ' , ' auto away (idle) ' ) )
self . sleeper_state [ account ] = 2
elif state == common . sleepy . STATE_XAWAY and ( \
self . sleeper_state [ account ] == 2 or \
self . sleeper_state [ account ] == 1 ) and \
self . config [ ' autoxa ' ] :
#we go extended away
self . send ( ' STATUS ' , account , ( ' xa ' , ' auto away (idle) ' ) )
self . sleeper_state [ account ] = 3
2004-01-02 15:21:02 +00:00
return 1
2003-11-30 22:40:24 +00:00
2004-12-01 20:47:37 +00:00
def autoconnect ( self ) :
""" auto connect at startup """
for a in self . accounts . keys ( ) :
if self . accounts [ a ] . has_key ( ' autoconnect ' ) :
if self . accounts [ a ] [ ' autoconnect ' ] :
2004-12-02 00:00:57 +00:00
self . roster . send_status ( a , ' online ' , ' Online ' , 1 )
2004-12-01 20:47:37 +00:00
return 0
2004-12-14 12:57:45 +00:00
def show_systray ( self ) :
self . systray . show_icon ( )
2005-01-16 21:40:31 +00:00
self . systray_visible = 1
2004-12-14 12:57:45 +00:00
def hide_systray ( self ) :
self . systray . hide_icon ( )
2005-01-16 21:40:31 +00:00
self . systray_visible = 0
2004-12-14 12:57:45 +00:00
2003-11-30 22:40:24 +00:00
def __init__ ( self , quIN , quOUT ) :
2004-08-04 22:40:22 +00:00
gtk . gdk . threads_init ( )
2003-11-30 22:40:24 +00:00
self . queueIN = quIN
2004-03-11 21:14:09 +00:00
self . queueOUT = quOUT
2004-07-08 23:51:48 +00:00
self . send ( ' REG_MESSAGE ' , ' gtkgui ' , [ ' ROSTER ' , ' WARNING ' , ' STATUS ' , \
' NOTIFY ' , ' MSG ' , ' MSGERROR ' , ' SUBSCRIBED ' , ' UNSUBSCRIBED ' , \
2004-09-06 14:55:10 +00:00
' SUBSCRIBE ' , ' AGENTS ' , ' AGENT_INFO ' , ' REG_AGENT_INFO ' , ' QUIT ' , \
' ACC_OK ' , ' CONFIG ' , ' MYVCARD ' , ' VCARD ' , ' LOG_NB_LINE ' , ' LOG_LINE ' , \
2005-03-04 21:27:45 +00:00
' VISUAL ' , ' GC_MSG ' , ' GC_SUBJECT ' , ' BAD_PASSPHRASE ' , \
' GPG_SECRETE_KEYS ' , ' ROSTER_INFO ' , ' MSGSENT ' ] )
2005-03-06 19:30:32 +00:00
self . default_config = { ' autopopup ' : 1 , \
2004-06-10 02:54:07 +00:00
' autopopupaway ' : 1 , \
2004-02-25 00:33:06 +00:00
' showoffline ' : 0 , \
2004-06-21 18:17:21 +00:00
' autoaway ' : 1 , \
2004-02-25 00:33:06 +00:00
' autoawaytime ' : 10 , \
2004-06-21 18:17:21 +00:00
' autoxa ' : 1 , \
2004-02-25 00:33:06 +00:00
' autoxatime ' : 20 , \
2005-03-06 22:56:49 +00:00
' ask_online_status ' : 0 , \
' ask_offline_status ' : 0 , \
2004-10-25 22:02:16 +00:00
' last_msg ' : ' ' , \
2004-11-01 13:28:26 +00:00
' msg0_name ' : ' Brb ' , \
' msg0 ' : ' Back in some minutes. ' , \
' msg1_name ' : ' Eating ' , \
2004-11-01 13:41:00 +00:00
' msg1 ' : ' I \' m eating, so leave me a message. ' , \
2004-11-01 13:28:26 +00:00
' msg2_name ' : ' Film ' , \
' msg2 ' : ' I \' m watching a film. ' , \
2004-06-21 20:22:10 +00:00
' trayicon ' : 1 , \
2004-02-25 00:33:06 +00:00
' iconstyle ' : ' sun ' , \
2004-03-01 01:39:12 +00:00
' inmsgcolor ' : ' #ff0000 ' , \
2004-02-25 00:33:06 +00:00
' outmsgcolor ' : ' #0000ff ' , \
2004-07-12 21:14:12 +00:00
' statusmsgcolor ' : ' #1eaa1e ' , \
2004-10-11 22:57:29 +00:00
' hiddenlines ' : ' ' , \
' accounttextcolor ' : ' #ff0000 ' , \
' accountbgcolor ' : ' #9fdfff ' , \
2004-10-12 10:13:47 +00:00
' accountfont ' : ' Sans Bold 10 ' , \
2004-10-11 22:57:29 +00:00
' grouptextcolor ' : ' #0000ff ' , \
' groupbgcolor ' : ' #ffffff ' , \
2004-10-12 10:13:47 +00:00
' groupfont ' : ' Sans Italic 10 ' , \
2004-10-11 22:57:29 +00:00
' usertextcolor ' : ' #000000 ' , \
2004-10-12 10:13:47 +00:00
' userbgcolor ' : ' #ffffff ' , \
2004-10-13 21:46:10 +00:00
' userfont ' : ' Sans 10 ' , \
2004-10-25 22:02:16 +00:00
' saveposition ' : 1 , \
2005-01-17 13:43:15 +00:00
' mergeaccounts ' : 0 , \
2005-02-26 23:44:56 +00:00
' usetabbedchat ' : 1 , \
2005-01-18 10:17:03 +00:00
' useemoticons ' : 1 , \
2005-03-02 01:57:51 +00:00
' emoticons ' : ' :-) \t plugins/gtkgui/emoticons/smile.png \t (@) \t plugins/gtkgui/emoticons/pussy.png \t 8) \t plugins/gtkgui/emoticons/coolglasses.png \t :( \t plugins/gtkgui/emoticons/unhappy.png \t :) \t plugins/gtkgui/emoticons/smile.png \t (}) \t plugins/gtkgui/emoticons/hugleft.png \t :$ \t plugins/gtkgui/emoticons/blush.png \t (Y) \t plugins/gtkgui/emoticons/yes.png \t :-@ \t plugins/gtkgui/emoticons/angry.png \t :-D \t plugins/gtkgui/emoticons/biggrin.png \t (U) \t plugins/gtkgui/emoticons/brheart.png \t (F) \t plugins/gtkgui/emoticons/flower.png \t :-[ \t plugins/gtkgui/emoticons/bat.png \t :> \t plugins/gtkgui/emoticons/biggrin.png \t (T) \t plugins/gtkgui/emoticons/phone.png \t (l) \t plugins/gtkgui/emoticons/heart.png \t :-S \t plugins/gtkgui/emoticons/frowing.png \t :-P \t plugins/gtkgui/emoticons/tongue.png \t (h) \t plugins/gtkgui/emoticons/coolglasses.png \t (D) \t plugins/gtkgui/emoticons/drink.png \t :-O \t plugins/gtkgui/emoticons/oh.png \t (f) \t plugins/gtkgui/emoticons/flower.png \t (C) \t plugins/gtkgui/emoticons/coffee.png \t :-o \t plugins/gtkgui/emoticons/oh.png \t ( { ) \t plugins/gtkgui/emoticons/hugright.png \t (*) \t plugins/gtkgui/emoticons/star.png \t B-) \t plugins/gtkgui/emoticons/coolglasses.png \t (z) \t plugins/gtkgui/emoticons/boy.png \t :-d \t plugins/gtkgui/emoticons/biggrin.png \t (E) \t plugins/gtkgui/emoticons/mail.png \t (N) \t plugins/gtkgui/emoticons/no.png \t (p) \t plugins/gtkgui/emoticons/photo.png \t (K) \t plugins/gtkgui/emoticons/kiss.png \t (r) \t plugins/gtkgui/emoticons/rainbow.png \t :-| \t plugins/gtkgui/emoticons/stare.png \t :-s \t plugins/gtkgui/emoticons/frowing.png \t :-p \t plugins/gtkgui/emoticons/tongue.png \t (c) \t plugins/gtkgui/emoticons/coffee.png \t (e) \t plugins/gtkgui/emoticons/mail.png \t ;-) \t plugins/gtkgui/emoticons/wink.png \t ;-( \t plugins/gtkgui/emoticons/cry.png \t (6) \t plugins/gtkgui/emoticons/devil.png \t :o \t plugins/gtkgui/emoticons/oh.png \t (L) \t plugins/gtkgui/emoticons/heart.png \t (w) \t plugins/gtkgui/emoticons/brflower.png \t :d \t plugins/gtkgui/emoticons/biggrin.png \t (Z) \t plugins/gtkgui/emoticons/boy.png \t (u) \t plugins/gtkgui/emoticons/brheart.png \t :| \t plugins/gtkgui/emoticons/stare.png \t (P) \t plugins/gtkgui/emoticons/photo.png \t :O \t plugins/gtkgui/emoticons/oh.png \t (R) \t plugins/gtkgui/emoticons/rainbow.png \t (t) \t plugins/gtkgui/emoticons/phone.png \t (i) \t plugins/gtkgui/emoticons/lamp.png \t ;) \t plugins/gtkgui/emoticons/wink.png \t ;( \t plugins/gtkgui/emoticons/cry.png \t :p \t plugins/gtkgui/emoticons/tongue.png \t (H) \t plugins/gtkgui/emoticons/coolglasses.png \t :s \t plugins/gtkgui/emoticons/frowing.png \t ; \' -( \t plugins/gtkgui/emoticons/cry.png \t :-( \t plugins/gtkgui/emoticons/unhappy.png \t :-) \t plugins/gtkgui/emoticons/smile.png \t (b) \t plugins/gtkgui/emoticons/beer.png \t 8-) \t plugins/gtkgui/emoticons/coolglasses.png \t (B) \t plugins/gtkgui/emoticons/beer.png \t (W) \t plugins/gtkgui/emoticons/brflower.png \t :D \t plugins/gtkgui/emoticons/biggrin.png \t (y) \t plugins/gtkgui/emoticons/yes.png \t (8) \t plugins/gtkgui/emoticons/music.png \t :@ \t plugins/gtkgui/emoticons/angry.png \t B) \t plugins/gtkgui/emoticons/coolglasses.png \t :-$ \t plugins/gtkgui/emoticons/blush.png \t : \' ( \t plugins/gtkgui/emoticons/cry.png \t (n) \t plugins/gtkgui/emoticons/no.png \t (k) \t plugins/gtkgui/emoticons/kiss.png \t :-> \t plugins/gtkgui/emoticons/biggrin.png \t :[ \t plugins/gtkgui/emoticons/bat.png \t (I) \t plugins/gtkgui/emoticons/lamp.png \t :P \t plugins/gtkgui/emoticons/tongue.png \t ( % ) \t plugins/gtkgui/emoticons/cuffs.png \t (d) \t plugins/gtkgui/emoticons/drink.png \t :S \t plugins/gtkgui/emoticons/frowing.png \t :(S) \t plugins/gtkgui/emoticons/moon.png ' , \
2005-02-10 00:07:55 +00:00
' soundplayer ' : ' play ' , \
2005-02-14 22:30:04 +00:00
' sound_first_message_received ' : 1 , \
' sound_first_message_received_file ' : ' sounds/message1.wav ' , \
' sound_next_message_received ' : 0 , \
' sound_next_message_received_file ' : ' sounds/message2.wav ' , \
' sound_contact_connected ' : 1 , \
' sound_contact_connected_file ' : ' sounds/connected.wav ' , \
' sound_contact_disconnected ' : 1 , \
' sound_contact_disconnected_file ' : ' sounds/disconnected.wav ' , \
' sound_message_sent ' : 1 , \
' sound_message_sent_file ' : ' sounds/sent.wav ' , \
2005-03-05 00:31:39 +00:00
' openwith ' : ' gnome-open ' , \
' custombrowser ' : ' ' , \
' custommailapp ' : ' ' , \
2004-10-13 21:46:10 +00:00
' x-position ' : 0 , \
' y-position ' : 0 , \
' width ' : 150 , \
2005-03-06 19:30:32 +00:00
' height ' : 400 }
self . send ( ' ASK_CONFIG ' , None , ( ' GtkGui ' , ' GtkGui ' , self . default_config ) )
2004-01-24 20:32:51 +00:00
self . config = self . wait ( ' CONFIG ' )
2004-03-11 21:14:09 +00:00
self . send ( ' ASK_CONFIG ' , None , ( ' GtkGui ' , ' accounts ' ) )
2004-01-24 20:32:51 +00:00
self . accounts = self . wait ( ' CONFIG ' )
2004-04-04 22:09:56 +00:00
self . windows = { ' logs ' : { } }
2004-03-16 15:39:36 +00:00
self . queues = { }
2004-03-16 18:53:49 +00:00
self . connected = { }
2004-04-22 12:31:20 +00:00
self . nicks = { }
2004-05-28 04:20:30 +00:00
self . sleeper_state = { } #whether we pass auto away / xa or not
2004-03-16 15:39:36 +00:00
for a in self . accounts . keys ( ) :
2004-08-05 21:56:54 +00:00
self . windows [ a ] = { ' infos ' : { } , ' chats ' : { } , ' gc ' : { } }
2004-03-16 15:39:36 +00:00
self . queues [ a ] = { }
2004-03-16 18:53:49 +00:00
self . connected [ a ] = 0
2004-04-22 12:31:20 +00:00
self . nicks [ a ] = self . accounts [ a ] [ ' name ' ]
2004-05-29 04:05:06 +00:00
self . sleeper_state [ a ] = 0 #0:don't use sleeper for this account
#1:online and use sleeper
#2:autoaway and use sleeper
#3:autoxa and use sleeper
2004-08-01 16:25:41 +00:00
self . send ( ' ASK_ROSTER ' , a , self . queueIN )
2004-10-11 21:03:34 +00:00
#in pygtk2.4
iconstyle = self . config [ ' iconstyle ' ]
if not iconstyle :
iconstyle = ' sun '
path = ' plugins/gtkgui/icons/ ' + iconstyle + ' / '
files = [ path + ' online.gif ' , path + ' online.png ' , path + ' online.xpm ' ]
2004-10-21 19:42:46 +00:00
pix = None
2004-10-11 21:03:34 +00:00
for file in files :
if os . path . exists ( file ) :
pix = gtk . gdk . pixbuf_new_from_file ( file )
break
2004-10-21 19:42:46 +00:00
if pix :
gtk . window_set_default_icon ( pix )
2005-03-01 23:48:05 +00:00
self . roster = roster_window ( self )
2004-04-17 19:38:43 +00:00
gtk . timeout_add ( 100 , self . read_queue )
2004-11-16 09:32:27 +00:00
gtk . timeout_add ( 100 , self . read_sleepy )
2004-10-20 22:53:15 +00:00
self . sleeper = common . sleepy . Sleepy ( \
self . config [ ' autoawaytime ' ] * 60 , \
self . config [ ' autoxatime ' ] * 60 )
2005-01-16 21:40:31 +00:00
self . systray_visible = 0
2004-12-14 12:57:45 +00:00
try :
global trayicon
import trayicon
except :
self . config [ ' trayicon ' ] = 0
self . send ( ' CONFIG ' , None , ( ' GtkGui ' , self . config , ' GtkGui ' ) )
2004-06-21 20:22:10 +00:00
self . systray = systrayDummy ( )
2004-12-14 12:57:45 +00:00
else :
self . systray = systray ( self )
if self . config [ ' trayicon ' ] :
self . show_systray ( )
2004-10-21 15:17:02 +00:00
gtk . gdk . threads_enter ( )
2004-12-02 00:00:57 +00:00
self . autoconnect ( )
2003-11-30 22:40:24 +00:00
gtk . main ( )
2004-10-21 15:17:02 +00:00
gtk . gdk . threads_leave ( )
2003-11-30 22:40:24 +00:00
2004-05-16 23:47:14 +00:00
print _ ( " plugin gtkgui loaded " )