begin to use the new functions to handle contacts and gc_contacts

This commit is contained in:
Yann Leboulanger 2005-12-22 21:40:40 +00:00
parent a15a6e8e6e
commit a3d6c3c43f
9 changed files with 208 additions and 141 deletions

View File

@ -298,9 +298,9 @@ class Chat:
def get_message_type(self, jid): def get_message_type(self, jid):
if self.widget_name == 'groupchat_window': if self.widget_name == 'groupchat_window':
return 'gc' return 'gc'
if gajim.contacts[self.account].has_key(jid): if gajim.contacts.is_pm_from_jid(self.account, jid):
return 'chat' return 'pm'
return 'pm' return 'chat'
def on_window_destroy(self, widget, kind): #kind is 'chats' or 'gc' def on_window_destroy(self, widget, kind): #kind is 'chats' or 'gc'
'''clean gajim.interface.instances[self.account][kind]''' '''clean gajim.interface.instances[self.account][kind]'''
@ -425,7 +425,7 @@ class Chat:
if self.widget_name == 'tabbed_chat_window': if self.widget_name == 'tabbed_chat_window':
jid = self.get_active_jid() jid = self.get_active_jid()
c = gajim.get_first_contact_instance_from_jid(self.account, jid) c = gajim.contacts.get_first_contact_from_jid(self.account, jid)
if _('not in the roster') in c.groups: # for add_to_roster_menuitem if _('not in the roster') in c.groups: # for add_to_roster_menuitem
childs[5].show() childs[5].show()
childs[5].set_no_show_all(False) childs[5].set_no_show_all(False)
@ -463,7 +463,7 @@ class Chat:
childs[3].set_active(isactive) childs[3].set_active(isactive)
childs[3].set_property('sensitive', issensitive) childs[3].set_property('sensitive', issensitive)
# If we don't have resource, we can't do file transfert # If we don't have resource, we can't do file transfert
c = gajim.get_first_contact_instance_from_jid(self.account, jid) c = gajim.contacts.get_first_contact_from_jid(self.account, jid)
if not c.resource: if not c.resource:
childs[2].set_sensitive(False) childs[2].set_sensitive(False)
else: else:

View File

@ -129,37 +129,28 @@ class Contacts:
# It was the last resource of this contact ? # It was the last resource of this contact ?
if not len(self._contacts[account][contact.jid]): if not len(self._contacts[account][contact.jid]):
self._contacts[account].remove(contact.jid) self._contacts[account].remove(contact.jid)
def create_gc_contact(self, room_jid='', nick='', show='', status='',
role='', affiliation='', jid=''):
return GC_Contact(room_jid, nick, show, status, role, affiliation, jid)
def add_gc_contact(self, account, gc_contact): def remove_jid(self, account, jid):
# No such account before ? '''Removes all contacts for a given jid'''
if not self._gc_contacts.has_key(account): if not self._contacts.has_key(account):
self._contacts[account] = {gc_contact.room_jid : {gc_contact.nick: \
gc_contact}}
return return
# No such room_jid before ? if not self._contacts[account].has_key(contact.jid):
if not self._gc_contacts[account].has_key(gc_contact.room_jid):
self._gc_contacts[account][gc_contact.room_jid] = {gc_contact.nick: \
gc_contact}
return return
self._gc_contacts[account][gc_contact.room_jid][gc_contact.nick] = \ del self._contacts[account][jid]
gc_contact
def remove_gc_contact(self, account, gc_contact): def get_contact(self, account, jid, resource = None):
if not self._gc_contacts.has_key(account): '''Returns the list of contact instances for this jid (one per resource)
return if no resource is given
if not self._gc_contacts[account].has_key(gc_contact.room_jid): returns the contact instance for the given resource if it's given
return or None if there is not'''
if not self._gc_contacts[account][gc_contact.room_jid].has_key( if jid in self._contacts[account]:
gc_contact.nick): contacts = self._contacts[account][jid]
return if not resource:
self._gc_contacts[account][gc_contact.room_jid].remove(gc_contact.nick) return contacts
# It was the last nick in room ? for c in contacts:
if not len(self._gc_contacts[account][gc_contact.room_jid]): if c.resource == resource:
self._gc_contacts[account].remove(gc_contact.room_jid) return c
return None
def is_subcontact(self, account, contact): def is_subcontact(self, account, contact):
if contact.jid in self._sub_contacts[account]: if contact.jid in self._sub_contacts[account]:
@ -213,14 +204,87 @@ class Contacts:
parrent_jid) parrent_jid)
return contact return contact
def is_pm_from_jid(self, account, jid):
'''Returns True if the given jid is a private message jid'''
if jid in self._contacts[account]:
return False
return True
def is_pm_from_contact(self, account, contact):
'''Returns True if the given contact is a private message contact'''
if isinstance(contact, Contcat):
return False
return True
def get_jid_list(self, account):
return self._contacts[account].keys()
def contact_from_gc_contact(self, gc_contact): def contact_from_gc_contact(self, gc_contact):
'''Create a Contact instance from a GC_Contact instance''' '''Create a Contact instance from a GC_Contact instance'''
return Contact(jid = gc_contact.get_full_jid(), name = gc_contact.nick, return Contact(jid = gc_contact.get_full_jid(), name = gc_contact.nick,
groups = ['none'], show = gc_contact.show, status = gc_contact.status, groups = ['none'], show = gc_contact.show, status = gc_contact.status,
sub = 'none') sub = 'none')
def is_pm_from_jid(self, account, jid): def create_gc_contact(self, room_jid='', nick='', show='', status='',
'''Returns True if the given jid is a private message jid''' role='', affiliation='', jid=''):
if jid in self._contacts[account]: return GC_Contact(room_jid, nick, show, status, role, affiliation, jid)
return False
return True def add_gc_contact(self, account, gc_contact):
# No such account before ?
if not self._gc_contacts.has_key(account):
self._contacts[account] = {gc_contact.room_jid : {gc_contact.nick: \
gc_contact}}
return
# No such room_jid before ?
if not self._gc_contacts[account].has_key(gc_contact.room_jid):
self._gc_contacts[account][gc_contact.room_jid] = {gc_contact.nick: \
gc_contact}
return
self._gc_contacts[account][gc_contact.room_jid][gc_contact.nick] = \
gc_contact
def remove_gc_contact(self, account, gc_contact):
if not self._gc_contacts.has_key(account):
return
if not self._gc_contacts[account].has_key(gc_contact.room_jid):
return
if not self._gc_contacts[account][gc_contact.room_jid].has_key(
gc_contact.nick):
return
self._gc_contacts[account][gc_contact.room_jid].remove(gc_contact.nick)
# It was the last nick in room ?
if not len(self._gc_contacts[account][gc_contact.room_jid]):
self._gc_contacts[account].remove(gc_contact.room_jid)
def remove_room(self, account, room_jid):
if not self._gc_contacts.has_key(account):
return
if not self._gc_contacts[account].has_key(room_jid):
return
self._gc_contacts[account].remove(room_jid)
def get_gc_contact(self, account, room_jid, nick):
if not self._gc_contacts.has_key(account):
return
if not self._gc_contacts[account].has_key(room_jid):
return
if not self._gc_contacts[account][room_jid].has_key(nick):
return
self._gc_contacts[account][room_jid].remove(nick)
def get_gc_list(self, account):
if not self._gc_contacts.has_key(account):
return []
return self._gc_contacts[account].keys()
def get_nick_list(self, account, room_jid):
gc_list = self.get_gc_list(account)
if not room_jid in gc_list:
return []
return self._gc_contacts[account][room_jid].keys()
def get_gc_contact(self, account, room_jid, nick):
nick_list = self.get_nick_list(account, room_jid)
if not nick in nick_list:
return None
return self._gc_contacts[account][room_jid][nick]

View File

@ -549,7 +549,7 @@ class PreferencesWindow:
# open new tabbed chat windows # open new tabbed chat windows
for jid in jids: for jid in jids:
if kind == 'chats': if kind == 'chats':
c = gajim.get_contact_instance_with_highest_priority(acct, jid) c = gajim.contacts.get_contact_with_highest_priority(acct, jid)
gajim.interface.roster.new_chat(c, acct) gajim.interface.roster.new_chat(c, acct)
if kind == 'gc': if kind == 'gc':
gajim.interface.roster.new_room(jid, saved_var[jid]['nick'], acct) gajim.interface.roster.new_room(jid, saved_var[jid]['nick'], acct)
@ -578,7 +578,7 @@ class PreferencesWindow:
# open new tabbed chat windows # open new tabbed chat windows
for jid in jids: for jid in jids:
if kind == 'chats': if kind == 'chats':
c = gajim.get_contact_instance_with_highest_priority(acct, jid) c = gajim.contacts.get_contact_with_highest_priority(acct, jid)
gajim.interface.roster.new_chat(c, acct) gajim.interface.roster.new_chat(c, acct)
if kind == 'gc': if kind == 'gc':
gajim.interface.roster.new_room(jid, saved_var[jid]['nick'], acct) gajim.interface.roster.new_room(jid, saved_var[jid]['nick'], acct)
@ -1268,8 +1268,6 @@ class AccountModificationWindow:
gajim.allow_notifications[name] = \ gajim.allow_notifications[name] = \
gajim.allow_notifications[self.account] gajim.allow_notifications[self.account]
gajim.groups[name] = gajim.groups[self.account] gajim.groups[name] = gajim.groups[self.account]
gajim.contacts[name] = gajim.contacts[self.account]
gajim.gc_contacts[name] = gajim.gc_contacts[self.account]
gajim.gc_connected[name] = gajim.gc_connected[self.account] gajim.gc_connected[name] = gajim.gc_connected[self.account]
gajim.newly_added[name] = gajim.newly_added[self.account] gajim.newly_added[name] = gajim.newly_added[self.account]
gajim.to_be_removed[name] = gajim.to_be_removed[self.account] gajim.to_be_removed[name] = gajim.to_be_removed[self.account]
@ -1281,6 +1279,8 @@ class AccountModificationWindow:
gajim.status_before_autoaway[self.account] gajim.status_before_autoaway[self.account]
gajim.events_for_ui[name] = gajim.events_for_ui[self.account] gajim.events_for_ui[name] = gajim.events_for_ui[self.account]
gajim.contacts.change_account_name(self.account, name)
#upgrade account variable in opened windows #upgrade account variable in opened windows
for kind in ('infos', 'disco', 'chats', 'gc', 'gc_config'): for kind in ('infos', 'disco', 'chats', 'gc', 'gc_config'):
for j in gajim.interface.instances[name][kind]: for j in gajim.interface.instances[name][kind]:
@ -1297,8 +1297,6 @@ class AccountModificationWindow:
del gajim.nicks[self.account] del gajim.nicks[self.account]
del gajim.allow_notifications[self.account] del gajim.allow_notifications[self.account]
del gajim.groups[self.account] del gajim.groups[self.account]
del gajim.contacts[self.account]
del gajim.gc_contacts[self.account]
del gajim.gc_connected[self.account] del gajim.gc_connected[self.account]
del gajim.newly_added[self.account] del gajim.newly_added[self.account]
del gajim.to_be_removed[self.account] del gajim.to_be_removed[self.account]
@ -2195,8 +2193,7 @@ class RemoveAccountWindow:
del gajim.nicks[self.account] del gajim.nicks[self.account]
del gajim.allow_notifications[self.account] del gajim.allow_notifications[self.account]
del gajim.groups[self.account] del gajim.groups[self.account]
del gajim.contacts[self.account] gajim.contacts.remove_account(self.account)
del gajim.gc_contacts[self.account]
del gajim.gc_connected[self.account] del gajim.gc_connected[self.account]
del gajim.to_be_removed[self.account] del gajim.to_be_removed[self.account]
del gajim.newly_added[self.account] del gajim.newly_added[self.account]
@ -2737,8 +2734,7 @@ _('You can set advanced account options by pressing Advanced button, or later by
gajim.awaiting_events[self.account] = {} gajim.awaiting_events[self.account] = {}
gajim.connections[self.account].connected = 0 gajim.connections[self.account].connected = 0
gajim.groups[self.account] = {} gajim.groups[self.account] = {}
gajim.contacts[self.account] = {} gajim.contacts.add_account(self.account)
gajim.gc_contacts[self.account] = {}
gajim.gc_connected[self.account] = {} gajim.gc_connected[self.account] = {}
gajim.newly_added[self.account] = [] gajim.newly_added[self.account] = []
gajim.to_be_removed[self.account] = [] gajim.to_be_removed[self.account] = []

View File

@ -370,8 +370,8 @@ class ConversationTextview(gtk.TextView):
self.on_join_group_chat_menuitem_activate, text) self.on_join_group_chat_menuitem_activate, text)
allow_add = False allow_add = False
if gajim.contacts[self.account].has_key(text): c = gajim.contacts.get_first_contact_from_jid(self.account, text)
c = gajim.contacts[self.account][text][0] if c and not gajim.contacts.is_pm_from_contact(self.account, c):
if _('not in the roster') in c.groups: if _('not in the roster') in c.groups:
allow_add = True allow_add = True
else: # he or she's not at all in the account contacts else: # he or she's not at all in the account contacts

View File

@ -303,10 +303,10 @@ _('Please fill in the data of the contact you want to add in account %s') %accou
liststore.append(['Jabber', '']) liststore.append(['Jabber', ''])
self.agents = ['Jabber'] self.agents = ['Jabber']
jid_agents = [] jid_agents = []
for j in gajim.contacts[account]: for j in gajim.contacts.get_jid_list(account):
user = gajim.contacts[account][j][0] contact = gajim.contacts.get_first_contact_from_jid(account, j)
if _('Transports') in user.groups and user.show != 'offline' and \ if _('Transports') in contact.groups and contact.show != 'offline' and\
user.show != 'error': contact.show != 'error':
jid_agents.append(j) jid_agents.append(j)
for a in jid_agents: for a in jid_agents:
if a.find('aim') > -1: if a.find('aim') > -1:
@ -381,8 +381,9 @@ _('Please fill in the data of the contact you want to add in account %s') %accou
return return
# Check if jid is already in roster # Check if jid is already in roster
if jid in gajim.contacts[self.account] and _('not in the roster') not in \ if jid in gajim.contacts.get_jid_list(self.account) and \
gajim.contacts[self.account][jid][0].groups: _('not in the roster') not in \
gajim.contacts.get_first_contact_from_jid(self.account, jid).groups:
ErrorDialog(_('Contact already in roster'), ErrorDialog(_('Contact already in roster'),
_('This contact is already listed in your roster.')).get_response() _('This contact is already listed in your roster.')).get_response()
return return
@ -628,7 +629,7 @@ class SubscriptionRequestWindow:
'''accept the request''' '''accept the request'''
gajim.connections[self.account].send_authorization(self.jid) gajim.connections[self.account].send_authorization(self.jid)
self.window.destroy() self.window.destroy()
if not gajim.contacts[self.account].has_key(self.jid): if self.jid not in gajim.contacts.get_jid_list(self.account):
AddNewContactWindow(self.account, self.jid) AddNewContactWindow(self.account, self.jid)
def on_contact_info_button_clicked(self, widget): def on_contact_info_button_clicked(self, widget):
@ -825,8 +826,8 @@ class PopupNotificationWindow:
event_type_label.set_markup('<b>' + event_type + '</b>') event_type_label.set_markup('<b>' + event_type + '</b>')
if self.jid in gajim.contacts[account]: if self.jid in gajim.contacts.get_jid_list(account):
txt = gajim.contacts[account][self.jid][0].name txt = gajim.contacts.get_first_contact_from_jid(account, self.jid).name
else: else:
txt = self.jid txt = self.jid
@ -866,7 +867,8 @@ class PopupNotificationWindow:
close_button.modify_bg(gtk.STATE_NORMAL, bg_color) close_button.modify_bg(gtk.STATE_NORMAL, bg_color)
eventbox.modify_bg(gtk.STATE_NORMAL, bg_color) eventbox.modify_bg(gtk.STATE_NORMAL, bg_color)
event_description_label.set_text(txt) event_description_label.set_text(txt)
elif event_type in (_('File Transfer Completed'), _('File Transfer Stopped')): elif event_type in (_('File Transfer Completed'),
_('File Transfer Stopped')):
bg_color = gtk.gdk.color_parse('yellowgreen') bg_color = gtk.gdk.color_parse('yellowgreen')
close_button.modify_bg(gtk.STATE_NORMAL, bg_color) close_button.modify_bg(gtk.STATE_NORMAL, bg_color)
eventbox.modify_bg(gtk.STATE_NORMAL, bg_color) eventbox.modify_bg(gtk.STATE_NORMAL, bg_color)
@ -874,8 +876,8 @@ class PopupNotificationWindow:
if file_props['type'] == 'r': if file_props['type'] == 'r':
# get the name of the sender, as it is in the roster # get the name of the sender, as it is in the roster
sender = unicode(file_props['sender']).split('/')[0] sender = unicode(file_props['sender']).split('/')[0]
name = gajim.get_first_contact_instance_from_jid( name = gajim.contacts.get_first_contact_from_jid(account,
account, sender).name sender).name
txt = _('From %s') % name txt = _('From %s') % name
else: else:
receiver = file_props['receiver'] receiver = file_props['receiver']
@ -883,8 +885,8 @@ class PopupNotificationWindow:
receiver = receiver.jid receiver = receiver.jid
receiver = receiver.split('/')[0] receiver = receiver.split('/')[0]
# get the name of the contact, as it is in the roster # get the name of the contact, as it is in the roster
name = gajim.get_first_contact_instance_from_jid( name = gajim.contacts.get_first_contact_from_jid(account,
account, receiver).name receiver).name
txt = _('To %s') % name txt = _('To %s') % name
else: else:
txt = '' txt = ''
@ -928,8 +930,8 @@ class PopupNotificationWindow:
return return
# use Contact class, new_chat expects it that way # use Contact class, new_chat expects it that way
# is it in the roster? # is it in the roster?
if gajim.contacts[self.account].has_key(self.jid): if self.jid in gajim.contacts.get_jid_list(self.account):
contact = gajim.get_contact_instance_with_highest_priority( contact = gajim.contacts.get_contact_with_highest_priority(
self.account, self.jid) self.account, self.jid)
else: else:
keyID = '' keyID = ''

View File

@ -1193,9 +1193,10 @@ class ToplevelAgentBrowser(AgentBrowser):
if self.register_button and xmpp.NS_REGISTER in features: if self.register_button and xmpp.NS_REGISTER in features:
# We can register this agent # We can register this agent
registered_transports = [] registered_transports = []
contacts = gajim.contacts[self.account] jid_list = gajim.contacts.get_jid_list(self.account)
for j in contacts: for j in jid_list:
if _('Transports') in contacts[j][0].groups: contact = gajim.contacts.get_first_contact_from_jid(self.account, j)
if _('Transports') in contact.groups:
registered_transports.append(j) registered_transports.append(j)
if jid in registered_transports: if jid in registered_transports:
self.register_button.set_label(_('_Edit')) self.register_button.set_label(_('_Edit'))

View File

@ -177,7 +177,7 @@ class FileTransfersWindow:
helpers.convert_bytes(file_props['size']) helpers.convert_bytes(file_props['size'])
if file_props['type'] == 'r': if file_props['type'] == 'r':
jid = unicode(file_props['sender']).split('/')[0] jid = unicode(file_props['sender']).split('/')[0]
sender_name = gajim.get_first_contact_instance_from_jid( sender_name = gajim.contacts.get_first_contact_from_jid(
file_props['tt_account'], jid).name file_props['tt_account'], jid).name
sender = gtkgui_helpers.escape_for_pango_markup(sender_name) sender = gtkgui_helpers.escape_for_pango_markup(sender_name)
else: else:
@ -187,7 +187,7 @@ class FileTransfersWindow:
sectext += '\n\t' +_('Recipient: ') sectext += '\n\t' +_('Recipient: ')
if file_props['type'] == 's': if file_props['type'] == 's':
jid = unicode(file_props['receiver']).split('/')[0] jid = unicode(file_props['receiver']).split('/')[0]
receiver_name = gajim.get_first_contact_instance_from_jid( receiver_name = gajim.contacts.get_first_contact_from_jid(
file_props['tt_account'], jid).name file_props['tt_account'], jid).name
recipient = gtkgui_helpers.escape_for_pango_markup(receiver_name) recipient = gtkgui_helpers.escape_for_pango_markup(receiver_name)
else: else:

View File

@ -276,8 +276,10 @@ class Interface:
else: else:
ji = jid ji = jid
# Update contact # Update contact
if gajim.contacts[account].has_key(ji):
lcontact = gajim.contacts[account][ji] jid_list = gajim.contacts.het_jid_list(account)
if ji in jid_list:
lcontact = gajim.contacts.get_contacts_from_jid(account, ji)
contact1 = None contact1 = None
resources = [] resources = []
for c in lcontact: for c in lcontact:
@ -291,7 +293,7 @@ class Interface:
if old_show == new_show and contact1.status == array[2]: #no change if old_show == new_show and contact1.status == array[2]: #no change
return return
else: else:
contact1 = gajim.contacts[account][ji][0] contact1 = gajim.contacts.get_first_contact_from_jid(account, ji)
if contact1.show in statuss: if contact1.show in statuss:
old_show = statuss.index(contact1.show) old_show = statuss.index(contact1.show)
if (resources != [''] and (len(lcontact) != 1 or if (resources != [''] and (len(lcontact) != 1 or
@ -324,13 +326,13 @@ class Interface:
contact1.keyID = keyID contact1.keyID = keyID
if jid.find('@') <= 0: if jid.find('@') <= 0:
# It must be an agent # It must be an agent
if gajim.contacts[account].has_key(ji): if ji in jid_list:
# Update existing iter # Update existing iter
self.roster.draw_contact(ji, account) self.roster.draw_contact(ji, account)
elif jid == gajim.get_jid_from_account(account): elif jid == gajim.get_jid_from_account(account):
# It's another of our resources. We don't need to see that! # It's another of our resources. We don't need to see that!
return return
elif gajim.contacts[account].has_key(ji): elif ji in jid_list:
# It isn't an agent # It isn't an agent
# reset chatstate if needed: # reset chatstate if needed:
# (when contact signs out or has errors) # (when contact signs out or has errors)
@ -418,7 +420,7 @@ class Interface:
return return
# Handle chat states # Handle chat states
contact = gajim.get_first_contact_instance_from_jid(account, jid) contact = gajim.contacts.get_first_contact_from_jid(account, jid)
if self.instances[account]['chats'].has_key(jid): if self.instances[account]['chats'].has_key(jid):
chat_win = self.instances[account]['chats'][jid] chat_win = self.instances[account]['chats'][jid]
if chatstate is not None: # he or she sent us reply, so he supports jep85 if chatstate is not None: # he or she sent us reply, so he supports jep85
@ -520,8 +522,8 @@ class Interface:
def handle_event_subscribed(self, account, array): def handle_event_subscribed(self, account, array):
#('SUBSCRIBED', account, (jid, resource)) #('SUBSCRIBED', account, (jid, resource))
jid = array[0] jid = array[0]
if gajim.contacts[account].has_key(jid): if jid in gajim.contacts.get_jid_list(account):
c = gajim.get_first_contact_instance_from_jid(account, jid) c = gajim.contacts.get_first_contact_from_jid(account, jid)
c.resource = array[1] c.resource = array[1]
self.roster.remove_contact(c, account) self.roster.remove_contact(c, account)
if _('not in the roster') in c.groups: if _('not in the roster') in c.groups:
@ -541,7 +543,7 @@ class Interface:
contact1 = gajim.contacts.create_contact(jid = jid, name = name, contact1 = gajim.contacts.create_contact(jid = jid, name = name,
groups = [_('General')], show = 'online', status = 'online', groups = [_('General')], show = 'online', status = 'online',
ask = 'to', resource = array[1], keyID = keyID) ask = 'to', resource = array[1], keyID = keyID)
gajim.contacts[account][jid] = [contact1] gajim.contacts.add_contact(account, contact1)
self.roster.add_contact_to_roster(jid, account) self.roster.add_contact_to_roster(jid, account)
dialogs.InformationDialog(_('Authorization accepted'), dialogs.InformationDialog(_('Authorization accepted'),
_('The contact "%s" has authorized you to see his or her status.') _('The contact "%s" has authorized you to see his or her status.')
@ -748,12 +750,12 @@ class Interface:
def handle_event_roster_info(self, account, array): def handle_event_roster_info(self, account, array):
#('ROSTER_INFO', account, (jid, name, sub, ask, groups)) #('ROSTER_INFO', account, (jid, name, sub, ask, groups))
jid = array[0] jid = array[0]
if not gajim.contacts[account].has_key(jid): if not jid in gajim.contacts.get_jid_list(account):
return return
contacts = gajim.contacts[account][jid] contacts = gajim.contacts.get_contacts_from_jid(account, jid)
if not (array[2] or array[3]): if not (array[2] or array[3]):
self.roster.remove_contact(contacts[0], account) self.roster.remove_contact(contacts[0], account)
del gajim.contacts[account][jid] gajim.contacts.remove_jid(account, jid)
#FIXME if it was the only one in its group, remove the group #FIXME if it was the only one in its group, remove the group
return return
for contact in contacts: for contact in contacts:
@ -860,10 +862,10 @@ class Interface:
def handle_event_file_request(self, account, array): def handle_event_file_request(self, account, array):
jid = array[0] jid = array[0]
if not gajim.contacts[account].has_key(jid): if jid not in gajim.contacts.get_jid_list(account):
return return
file_props = array[1] file_props = array[1]
contact = gajim.contacts[account][jid][0] contact = gajim.contacts.get_first_contact_from_jid(account, jid)
if gajim.popup_window(account): if gajim.popup_window(account):
self.instances['file_transfers'].show_file_request(account, contact, self.instances['file_transfers'].show_file_request(account, contact,
@ -1244,20 +1246,22 @@ class Interface:
if wins['chats'].has_key(jid): if wins['chats'].has_key(jid):
w = wins['chats'][jid] w = wins['chats'][jid]
else: else:
self.roster.new_chat(gajim.contacts[account][jid][0], account) contact = gajim.contacts.get_first_contact_from_jid(account, jid)
self.roster.new_chat(contact, account)
w = wins['chats'][jid] w = wins['chats'][jid]
elif typ == 'pm': elif typ == 'pm':
if wins['chats'].has_key(jid): if wins['chats'].has_key(jid):
w = wins['chats'][jid] w = wins['chats'][jid]
else: else:
room_jid, nick = jid.split('/', 1) room_jid, nick = jid.split('/', 1)
if gajim.gc_contacts[account][room_jid].has_key(nick): gc_contact = gajim.contacts.get_gc_contact(account, room_jid, nick)
show = gajim.gc_contacts[account][room_jid][nick].show if gc_contact:
show = gc_contact.show
else: else:
show = 'offline' show = 'offline'
gc_c = gajim.contacts.create_gc_contact(room_jid = room_jid, gc_contact = gajim.contacts.create_gc_contact(room_jid = room_jid,
nick = nick, show = show) nick = nick, show = show)
c = gajim.contacts.contact_from_gc_contct(c) c = gajim.contacts.contact_from_gc_contct(gc_contact)
self.roster.new_chat(c, account) self.roster.new_chat(c, account)
w = wins['chats'][jid] w = wins['chats'][jid]
elif typ in ('normal', 'file-request', 'file-request-error', elif typ in ('normal', 'file-request', 'file-request-error',
@ -1338,9 +1342,8 @@ class Interface:
for a in gajim.connections: for a in gajim.connections:
self.instances[a] = {'infos': {}, 'disco': {}, 'chats': {}, self.instances[a] = {'infos': {}, 'disco': {}, 'chats': {},
'gc': {}, 'gc_config': {}} 'gc': {}, 'gc_config': {}}
gajim.contacts[a] = {} gajim.contacts.add_account(a)
gajim.groups[a] = {} gajim.groups[a] = {}
gajim.gc_contacts[a] = {}
gajim.gc_connected[a] = {} gajim.gc_connected[a] = {}
gajim.newly_added[a] = [] gajim.newly_added[a] = []
gajim.to_be_removed[a] = [] gajim.to_be_removed[a] = []

View File

@ -120,8 +120,6 @@ class GroupchatWindow(chat.Chat):
'nick': self.nicks[room_jid], 'nick': self.nicks[room_jid],
'model': self.list_treeview[room_jid].get_model(), 'model': self.list_treeview[room_jid].get_model(),
'subject': self.subjects[room_jid], 'subject': self.subjects[room_jid],
'contacts': gajim.gc_contacts[self.account][room_jid],
'connected': gajim.gc_connected[self.account][room_jid],
} }
def load_var(self, room_jid, var): def load_var(self, room_jid, var):
@ -131,8 +129,6 @@ class GroupchatWindow(chat.Chat):
self.list_treeview[room_jid].expand_all() self.list_treeview[room_jid].expand_all()
self.set_subject(room_jid, var['subject']) self.set_subject(room_jid, var['subject'])
self.subjects[room_jid] = var['subject'] self.subjects[room_jid] = var['subject']
gajim.gc_contacts[self.account][room_jid] = var['contacts']
gajim.gc_connected[self.account][room_jid] = var['connected']
if gajim.gc_connected[self.account][room_jid]: if gajim.gc_connected[self.account][room_jid]:
self.got_connected(room_jid) self.got_connected(room_jid)
@ -193,7 +189,7 @@ class GroupchatWindow(chat.Chat):
def on_groupchat_window_destroy(self, widget): def on_groupchat_window_destroy(self, widget):
chat.Chat.on_window_destroy(self, widget, 'gc') chat.Chat.on_window_destroy(self, widget, 'gc')
for room_jid in self.xmls: for room_jid in self.xmls:
del gajim.gc_contacts[self.account][room_jid] gajim.contacts.remove_room(self.account, room_jid)
del gajim.gc_connected[self.account][room_jid] del gajim.gc_connected[self.account][room_jid]
def on_groupchat_window_focus_in_event(self, widget, event): def on_groupchat_window_focus_in_event(self, widget, event):
@ -346,18 +342,15 @@ class GroupchatWindow(chat.Chat):
fin = True fin = True
return None return None
def get_nick_list(self, room_jid):
'''get nicks of contacts in a room'''
return gajim.gc_contacts[self.account][room_jid].keys()
def remove_contact(self, room_jid, nick): def remove_contact(self, room_jid, nick):
'''Remove a user from the contacts_list''' '''Remove a user from the contacts_list'''
model = self.list_treeview[room_jid].get_model() model = self.list_treeview[room_jid].get_model()
iter = self.get_contact_iter(room_jid, nick) iter = self.get_contact_iter(room_jid, nick)
if not iter: if not iter:
return return
if gajim.gc_contacts[self.account][room_jid].has_key(nick): gc_contact = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
del gajim.gc_contacts[self.account][room_jid][nick] if gc_contact:
gajim.contacts.remove_gc_contact(self.account, gc_contact)
parent_iter = model.iter_parent(iter) parent_iter = model.iter_parent(iter)
model.remove(iter) model.remove(iter)
if model.iter_n_children(parent_iter) == 0: if model.iter_n_children(parent_iter) == 0:
@ -365,7 +358,6 @@ class GroupchatWindow(chat.Chat):
def add_contact_to_roster(self, room_jid, nick, show, role, jid, affiliation, status): def add_contact_to_roster(self, room_jid, nick, show, role, jid, affiliation, status):
model = self.list_treeview[room_jid].get_model() model = self.list_treeview[room_jid].get_model()
resource = ''
role_name = helpers.get_uf_role(role, plural = True) role_name = helpers.get_uf_role(role, plural = True)
if jid: if jid:
@ -381,11 +373,11 @@ class GroupchatWindow(chat.Chat):
(gajim.interface.roster.jabber_state_images['16']['closed'], 'role', role, (gajim.interface.roster.jabber_state_images['16']['closed'], 'role', role,
'<b>%s</b>' % role_name)) '<b>%s</b>' % role_name))
iter = model.append(role_iter, (None, 'contact', nick, name)) iter = model.append(role_iter, (None, 'contact', nick, name))
if not gajim.gc_contacts[self.account][room_jid].has_key(nick): if not nick in gajim.contacts.get_nick_list(self.account, room_jid, nick):
gajim.gc_contacts[self.account][room_jid][nick] = \ gc_contact = gajim.contacts.create_gc_contact(room_jid = room_jid,
gajim.contacts.create_gc_contact(room_jid = room_jid, nick = nick, nick = nick, show = show, status = status, role = role,
show = show, status = status, role = role,
affiliation = affiliation, jid = jid) affiliation = affiliation, jid = jid)
gajim.contacts.add_gc_contact(self.account, gc_contact)
self.draw_contact(room_jid, nick) self.draw_contact(room_jid, nick)
if nick == self.nicks[room_jid]: # we became online if nick == self.nicks[room_jid]: # we became online
self.got_connected(room_jid) self.got_connected(room_jid)
@ -398,15 +390,15 @@ class GroupchatWindow(chat.Chat):
if not iter: if not iter:
return return
model = self.list_treeview[room_jid].get_model() model = self.list_treeview[room_jid].get_model()
contact = gajim.gc_contacts[self.account][room_jid][nick] gc_contact = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
state_images = gajim.interface.roster.jabber_state_images['16'] state_images = gajim.interface.roster.jabber_state_images['16']
if gajim.awaiting_events[self.account].has_key(room_jid + '/' + nick): if gajim.awaiting_events[self.account].has_key(room_jid + '/' + nick):
image = state_images['message'] image = state_images['message']
else: else:
image = state_images[contact.show] image = state_images[gc_contact.show]
name = gtkgui_helpers.escape_for_pango_markup(contact.name) name = gtkgui_helpers.escape_for_pango_markup(gc_contact.name)
status = contact.status status = gc_contact.status
# add status msg, if not empty, under contact name in the treeview # add status msg, if not empty, under contact name in the treeview
if status and gajim.config.get('show_status_msgs_in_roster'): if status and gajim.config.get('show_status_msgs_in_roster'):
status = status.strip() status = status.strip()
@ -425,13 +417,11 @@ class GroupchatWindow(chat.Chat):
def draw_roster(self, room_jid): def draw_roster(self, room_jid):
model = self.list_treeview[room_jid].get_model() model = self.list_treeview[room_jid].get_model()
model.clear() model.clear()
for nick in gajim.gc_contacts[self.account][room_jid]: for nick in gajim.contact.get_nick_list(self.account, room_jid)0:
contact = gajim.gc_contacts[self.account][room_jid][nick] gc_contact = gajim.contact.get_gc_contact(self.account, room_jid, nick)
fjid = contact.jid self.add_contact_to_roster(room_jid, nick, gc_contact.show,
if contact.resource: gc_contact.role, gc_contact.jid, gc_contact.affiliation,
fjid += '/' + contact.resource gc_contact.status)
self.add_contact_to_roster(room_jid, nick, contact.show, contact.role,
fjid, contact.affiliation, contact.status)
def get_role(self, room_jid, nick): def get_role(self, room_jid, nick):
if gajim.gc_contacts[self.account][room_jid].has_key(nick): if gajim.gc_contacts[self.account][room_jid].has_key(nick):
@ -487,7 +477,7 @@ class GroupchatWindow(chat.Chat):
room_jid + '/' + nick): room_jid + '/' + nick):
self.remove_contact(room_jid, nick) self.remove_contact(room_jid, nick)
else: else:
c = gajim.gc_contacts[self.account][room_jid][nick] c = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
c.show = show c.show = show
c.status = status c.status = status
if nick == self.nicks[room_jid] and statusCode != '303': # We became offline if nick == self.nicks[room_jid] and statusCode != '303': # We became offline
@ -504,7 +494,7 @@ class GroupchatWindow(chat.Chat):
self.add_contact_to_roster(room_jid, nick, show, role, jid, self.add_contact_to_roster(room_jid, nick, show, role, jid,
affiliation, status) affiliation, status)
else: else:
c = gajim.gc_contacts[self.account][room_jid][nick] c = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
if c.show == show and c.status == status and \ if c.show == show and c.status == status and \
c.affiliation == affiliation: #no change c.affiliation == affiliation: #no change
return return
@ -544,7 +534,7 @@ class GroupchatWindow(chat.Chat):
# for room_jid & number of unread private msgs with each contact # for room_jid & number of unread private msgs with each contact
# that we have # that we have
nb = 0 nb = 0
for nick in self.get_nick_list(room_jid): for nick in gajim.contacts.get_nick_list(self.account, room_jid):
fjid = room_jid + '/' + nick fjid = room_jid + '/' + nick
if gajim.awaiting_events[self.account].has_key(fjid): if gajim.awaiting_events[self.account].has_key(fjid):
# gc can only have messages as event # gc can only have messages as event
@ -686,7 +676,8 @@ class GroupchatWindow(chat.Chat):
self.nick_hits[room_jid].pop(0) self.nick_hits[room_jid].pop(0)
else: else:
self.nick_hits[room_jid] = [] # clear the hit list self.nick_hits[room_jid] = [] # clear the hit list
list_nick = self.get_nick_list(room_jid) list_nick = gajim.contacts.get_nick_list(self.account,
room_jid)
for nick in list_nick: for nick in list_nick:
if nick.lower().startswith(begin.lower()): # the word is the begining of a nick if nick.lower().startswith(begin.lower()): # the word is the begining of a nick
self.nick_hits[room_jid].append(nick) self.nick_hits[room_jid].append(nick)
@ -804,7 +795,7 @@ class GroupchatWindow(chat.Chat):
# example: /query foo # example: /query foo
if len(message_array): if len(message_array):
nick = message_array.pop(0) nick = message_array.pop(0)
nicks = self.get_nick_list(room_jid) nicks = gajim.contacts.get_nick_list(self.account, room_jid)
if nick in nicks: if nick in nicks:
self.on_send_pm(nick = nick) self.on_send_pm(nick = nick)
self.clear(message_textview) self.clear(message_textview)
@ -819,7 +810,8 @@ class GroupchatWindow(chat.Chat):
if len(message_array): if len(message_array):
message_array = message_array[0].split() message_array = message_array[0].split()
nick = message_array.pop(0) nick = message_array.pop(0)
room_nicks = self.get_nick_list(room_jid) room_nicks = gajim.contacts.get_nick_list(self.account,
room_jid)
if nick in room_nicks: if nick in room_nicks:
privmsg = ' '.join(message_array) privmsg = ' '.join(message_array)
self.on_send_pm(nick=nick, msg=privmsg) self.on_send_pm(nick=nick, msg=privmsg)
@ -901,7 +893,8 @@ class GroupchatWindow(chat.Chat):
if len(message_array): if len(message_array):
message_array = message_array[0].split() message_array = message_array[0].split()
nick = message_array.pop(0) nick = message_array.pop(0)
room_nicks = self.get_nick_list(room_jid) room_nicks = gajim.contacts.get_nick_list(self.account,
room_jid)
reason = ' '.join(message_array) reason = ' '.join(message_array)
if nick in room_nicks: if nick in room_nicks:
ban_jid = gajim.construct_fjid(room_jid, nick) ban_jid = gajim.construct_fjid(room_jid, nick)
@ -921,7 +914,8 @@ class GroupchatWindow(chat.Chat):
if len(message_array): if len(message_array):
message_array = message_array[0].split() message_array = message_array[0].split()
nick = message_array.pop(0) nick = message_array.pop(0)
room_nicks = self.get_nick_list(room_jid) room_nicks = gajim.contacts.get_nick_list(self.account,
room_jid)
reason = ' '.join(message_array) reason = ' '.join(message_array)
if nick in room_nicks: if nick in room_nicks:
gajim.connections[self.account].gc_set_role(room_jid, nick, gajim.connections[self.account].gc_set_role(room_jid, nick,
@ -1159,7 +1153,7 @@ current room topic.') % command, room_jid)
def on_info(self, widget, room_jid, nick): def on_info(self, widget, room_jid, nick):
'''Call vcard_information_window class to display user's information''' '''Call vcard_information_window class to display user's information'''
c = gajim.gc_contacts[self.account][room_jid][nick] c = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
if c.jid and c.resource: if c.jid and c.resource:
# on GC, we know resource only if we're mod and up # on GC, we know resource only if we're mod and up
jid = c.jid jid = c.jid
@ -1190,7 +1184,7 @@ current room topic.') % command, room_jid)
room_jid = self.get_active_jid() room_jid = self.get_active_jid()
fjid = gajim.construct_fjid(room_jid, nick) # 'fake' jid fjid = gajim.construct_fjid(room_jid, nick) # 'fake' jid
if not gajim.interface.instances[self.account]['chats'].has_key(fjid): if not gajim.interface.instances[self.account]['chats'].has_key(fjid):
gc_c = gajim.gc_contacts[self.account][room_jid][nick] gc_c = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
gajim.interface.roster.new_chat(gc_c, self.account) gajim.interface.roster.new_chat(gc_c, self.account)
#make active here in case we need to send a message #make active here in case we need to send a message
@ -1234,15 +1228,15 @@ current room topic.') % command, room_jid)
'''Make contact's popup menu''' '''Make contact's popup menu'''
model = self.list_treeview[room_jid].get_model() model = self.list_treeview[room_jid].get_model()
nick = model[iter][C_NICK].decode('utf-8') nick = model[iter][C_NICK].decode('utf-8')
c = gajim.gc_contacts[self.account][room_jid][nick] c = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
jid = c.jid jid = c.jid
target_affiliation = c.affiliation target_affiliation = c.affiliation
target_role = c.role target_role = c.role
# looking for user's affiliation and role # looking for user's affiliation and role
user_nick = self.nicks[room_jid] user_nick = self.nicks[room_jid]
user_affiliation = gajim.gc_contacts[self.account][room_jid][user_nick].\ user_affiliation = gajim.contacts.get_gc_contact(self.account, room_jid,
affiliation user_nick].affiliation
user_role = self.get_role(room_jid, user_nick) user_role = self.get_role(room_jid, user_nick)
# making menu from glade # making menu from glade
@ -1333,8 +1327,8 @@ current room topic.') % command, room_jid)
room_jid, show='offline', status=reason) room_jid, show='offline', status=reason)
del self.nicks[room_jid] del self.nicks[room_jid]
# They can already be removed by the destroy function # They can already be removed by the destroy function
if gajim.gc_contacts[self.account].has_key(room_jid): if room_jid in gajim.contacts.get_room_list(self.account):
del gajim.gc_contacts[self.account][room_jid] gajim.contacts.remove_room(self.account, room_jid)
del gajim.gc_connected[self.account][room_jid] del gajim.gc_connected[self.account][room_jid]
del self.list_treeview[room_jid] del self.list_treeview[room_jid]
del self.subjects[room_jid] del self.subjects[room_jid]
@ -1350,7 +1344,11 @@ current room topic.') % command, room_jid)
def got_disconnected(self, room_jid): def got_disconnected(self, room_jid):
model = self.list_treeview[room_jid].get_model() model = self.list_treeview[room_jid].get_model()
model.clear() model.clear()
gajim.gc_contacts[self.account][room_jid] = {} nick_list = gajim.contacts.get_nick_list(self.account, room_jid)
for nick in nick_list:
gc_contact = gajim.contacts.get_gc_contact(self.account, room_jid,
nick)
gajim.contacts.remove_gc_contact(self.account, gc_contact)
gajim.gc_connected[self.account][room_jid] = False gajim.gc_connected[self.account][room_jid] = False
message_textview = self.message_textviews[room_jid] message_textview = self.message_textviews[room_jid]
message_textview.set_sensitive(False) message_textview.set_sensitive(False)
@ -1518,7 +1516,7 @@ current room topic.') % command, room_jid)
gajim.interface.systray.add_jid(fjid, self.account, 'pm') gajim.interface.systray.add_jid(fjid, self.account, 'pm')
self.show_title() self.show_title()
else: else:
gc_c = gajim.gc_contacts[self.account][room_jid][nick] gc_c = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
gajim.interface.roster.new_chat(gc_c, self.account) gajim.interface.roster.new_chat(gc_c, self.account)
# Scroll to line # Scroll to line
self.list_treeview[room_jid].expand_row(path[0:1], False) self.list_treeview[room_jid].expand_row(path[0:1], False)
@ -1553,7 +1551,8 @@ current room topic.') % command, room_jid)
self.tooltip.id = row self.tooltip.id = row
nick = model[iter][C_NICK].decode('utf-8') nick = model[iter][C_NICK].decode('utf-8')
self.tooltip.timeout = gobject.timeout_add(500, self.tooltip.timeout = gobject.timeout_add(500,
self.show_tooltip, gajim.gc_contacts[account][room_jid][nick]) self.show_tooltip, gajim.contacts.get_gc_contact(account,
room_jid, nick))
def on_list_treeview_leave_notify_event(self, widget, event): def on_list_treeview_leave_notify_event(self, widget, event):
model = widget.get_model() model = widget.get_model()
@ -1627,7 +1626,8 @@ current room topic.') % command, room_jid)
nick = model[iter][C_NICK].decode('utf-8') nick = model[iter][C_NICK].decode('utf-8')
fjid = gajim.construct_fjid(room_jid, nick) fjid = gajim.construct_fjid(room_jid, nick)
if not gajim.interface.instances[self.account]['chats'].has_key(fjid): if not gajim.interface.instances[self.account]['chats'].has_key(fjid):
gc_c = gajim.gc_contacts[self.account][room_jid][nick] gc_c = gajim.contacts.get_gc_contact(self.account, room_jid,
nick)
gajim.interface.roster.new_chat(gc_c, self.account) gajim.interface.roster.new_chat(gc_c, self.account)
gajim.interface.instances[self.account]['chats'][fjid].set_active_tab(fjid) gajim.interface.instances[self.account]['chats'][fjid].set_active_tab(fjid)
gajim.interface.instances[self.account]['chats'][fjid].window.present() gajim.interface.instances[self.account]['chats'][fjid].window.present()
@ -1644,7 +1644,8 @@ current room topic.') % command, room_jid)
model = widget.get_model() model = widget.get_model()
iter = model.get_iter(path) iter = model.get_iter(path)
nick = model[iter][C_NICK].decode('utf-8') nick = model[iter][C_NICK].decode('utf-8')
if not nick in gajim.gc_contacts[self.account][room_jid]: #it's a group if not nick in gajim.get_nick_list(self.account, room_jid):
#it's a group
if x < 20: # first cell in 1st column (the arrow SINGLE clicked) if x < 20: # first cell in 1st column (the arrow SINGLE clicked)
if (widget.row_expanded(path)): if (widget.row_expanded(path)):
widget.collapse_row(path) widget.collapse_row(path)
@ -1669,9 +1670,9 @@ current room topic.') % command, room_jid)
nick = model[iter][C_NICK].decode('utf-8') nick = model[iter][C_NICK].decode('utf-8')
jid = gajim.construct_fjid(room_jid, nick) jid = gajim.construct_fjid(room_jid, nick)
if not gajim.interface.instances[self.account]['chats'].has_key(jid): if not gajim.interface.instances[self.account]['chats'].has_key(jid):
gc_c = gajim.gc_contacts[self.account][room_jid][nick] gc_c = gajim.contacts.get_gc_contact(self.account, room_jid, nick)
gajim.interface.roster.new_chat(gc_c, self.account) gajim.interface.roster.new_chat(gc_c, self.account)
jid = contact.jid jid = gc_c.jid
gajim.interface.instances[self.account]['chats'][jid].set_active_tab(jid) gajim.interface.instances[self.account]['chats'][jid].set_active_tab(jid)
gajim.interface.instances[self.account]['chats'][jid].window.present() gajim.interface.instances[self.account]['chats'][jid].window.present()