Author: asterix
Date: 2006-07-26 00:26:07 +0200 (Wed, 26 Jul 2006)
New Revision: 6602
Modified:
trunk/src/common/connection.py
trunk/src/common/connection_handlers.py
trunk/src/common/gajim.py
trunk/src/dialogs.py
trunk/src/gajim.py
trunk/src/roster_window.py
Log:
we can now invite to new room
Modified: trunk/src/common/connection.py
===================================================================
--- trunk/src/common/connection.py 2006-07-25 09:31:01 UTC (rev 6601)
+++ trunk/src/common/connection.py 2006-07-25 22:26:07 UTC (rev 6602)
@@ -84,6 +84,7 @@
self.on_connect_failure = None
self.retrycount = 0
self.jids_for_auto_auth = [] # list of jid to auto-authorize
+ self.muc_jid = None
# END __init__
def build_user_nick(self, user_nick):
Modified: trunk/src/common/connection_handlers.py
===================================================================
--- trunk/src/common/connection_handlers.py 2006-07-25 09:31:01 UTC (rev 6601)
+++ trunk/src/common/connection_handlers.py 2006-07-25 22:26:07 UTC (rev 6602)
@@ -724,11 +724,15 @@
qc = iq_obj.getQueryChildren()
if not qc:
qc = []
+ is_muc = False
for i in qc:
if i.getName() == 'identity':
attr = {}
for key in i.getAttrs().keys():
attr[key] = i.getAttr(key)
+ if attr.has_key('category') and attr['category'] == 'conference' \
+ and attr.has_key('type') and attr['type'] == 'text':
+ is_muc = True
identities.append(attr)
elif i.getName() == 'feature':
features.append(i.getAttr('var'))
@@ -742,6 +746,8 @@
if id[0] == 'p':
if features.__contains__(common.xmpp.NS_BYTESTREAM):
gajim.proxy65_manager.resolve(jid, self.connection, self.name)
+ if features.__contains__(common.xmpp.NS_MUC) and is_muc:
+ self.muc_jid = jid
self.dispatch('AGENT_INFO_INFO', (jid, node, identities,
features, data))
Modified: trunk/src/common/gajim.py
===================================================================
--- trunk/src/common/gajim.py 2006-07-25 09:31:01 UTC (rev 6601)
+++ trunk/src/common/gajim.py 2006-07-25 22:26:07 UTC (rev 6602)
@@ -90,6 +90,7 @@
contacts = Contacts()
gc_connected = {} # tell if we are connected to the room or not {acct: {room_jid: True}}
gc_passwords = {} # list of the pass required to enter a room {room_jid: password}
+automatic_rooms = {} # list of rooms that must be automaticaly configured and for which we have a list of invities {account: {room_jid: {'invities': []}}}
groups = {} # list of groups
newly_added = {} # list of contacts that has just signed in
Modified: trunk/src/dialogs.py
===================================================================
--- trunk/src/dialogs.py 2006-07-25 09:31:01 UTC (rev 6601)
+++ trunk/src/dialogs.py 2006-07-25 22:26:07 UTC (rev 6602)
@@ -923,8 +923,13 @@
self.window.destroy()
class JoinGroupchatWindow:
- def __init__(self, account, server = '', room = '', nick = ''):
+ def __init__(self, account, server = '', room = '', nick = '',
+ automatic = False):
+ '''automatic is a dict like {'invities': []}
+ If automatic is not empty, this means room must be automaticaly configured
+ and when done, invities must be automatically invited'''
self.account = account
+ self.automatic = automatic
if nick == '':
nick = gajim.nicks[self.account]
if gajim.connections[account].connected < 2:
@@ -1026,10 +1031,12 @@
def on_join_button_clicked(self, widget):
'''When Join button is clicked'''
- nickname = self.xml.get_widget('nickname_entry').get_text().decode('utf-8')
+ nickname = self.xml.get_widget('nickname_entry').get_text().decode(
+ 'utf-8')
room = self.xml.get_widget('room_entry').get_text().decode('utf-8')
server = self.xml.get_widget('server_entry').get_text().decode('utf-8')
- password = self.xml.get_widget('password_entry').get_text().decode('utf-8')
+ password = self.xml.get_widget('password_entry').get_text().decode(
+ 'utf-8')
jid = '%s@%s' % (room, server)
try:
jid = helpers.parse_jid(jid)
@@ -1044,7 +1051,9 @@
if len(self.recently_groupchat) > 10:
self.recently_groupchat = self.recently_groupchat[0:10]
gajim.config.set('recently_groupchat', ' '.join(self.recently_groupchat))
-
+
+ if self.automatic:
+ gajim.automatic_rooms[self.account][jid] = self.automatic
gajim.interface.roster.join_gc_room(self.account, jid, nickname, password)
self.window.destroy()
Modified: trunk/src/gajim.py
===================================================================
--- trunk/src/gajim.py 2006-07-25 09:31:01 UTC (rev 6601)
+++ trunk/src/gajim.py 2006-07-25 22:26:07 UTC (rev 6602)
@@ -899,10 +899,18 @@
def handle_event_gc_config(self, account, array):
#('GC_CONFIG', account, (jid, config)) config is a dict
- jid = array[0].split('/')[0]
- if not self.instances[account]['gc_config'].has_key(jid):
- self.instances[account]['gc_config'][jid] = \
- config.GroupchatConfigWindow(account, jid, array[1])
+ room_jid = array[0].split('/')[0]
+ if room_jid in gajim.automatic_rooms[account]:
+ # use default configuration
+ gajim.connections[account].send_gc_config(room_jid, array[1])
+ # invite contacts
+ if gajim.automatic_rooms[account][room_jid].has_key('invities'):
+ for jid in gajim.automatic_rooms[account][room_jid]['invities']:
+ gajim.connections[account].send_invite(room_jid, jid)
+ del gajim.automatic_rooms[account][room_jid]
+ elif not self.instances[account]['gc_config'].has_key(room_jid):
+ self.instances[account]['gc_config'][room_jid] = \
+ config.GroupchatConfigWindow(account, room_jid, array[1])
def handle_event_gc_affiliation(self, account, array):
#('GC_AFFILIATION', account, (room_jid, affiliation, list)) list is list
@@ -1840,6 +1848,7 @@
gajim.contacts.add_account(a)
gajim.groups[a] = {}
gajim.gc_connected[a] = {}
+ gajim.automatic_rooms[a] = {}
gajim.newly_added[a] = []
gajim.to_be_removed[a] = []
gajim.awaiting_events[a] = {}
Modified: trunk/src/roster_window.py
===================================================================
--- trunk/src/roster_window.py 2006-07-25 09:31:01 UTC (rev 6601)
+++ trunk/src/roster_window.py 2006-07-25 22:26:07 UTC (rev 6602)
@@ -1393,24 +1393,30 @@
send_single_message_menuitem.connect('activate',
self.on_send_single_message_menuitem_activate, account, contact)
+ submenu = gtk.Menu()
+ invite_menuitem.set_submenu(submenu)
+ menuitem = gtk.ImageMenuItem(_('_New room'))
+ icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU)
+ menuitem.set_image(icon)
+ menuitem.connect('activate', self.on_invite_to_new_room, [(contact,
+ account)])
+ submenu.append(menuitem)
rooms = [] # a list of (room_jid, account) tuple
for gc_control in gajim.interface.msg_win_mgr.get_controls(
message_control.TYPE_GC):
- acct = gc_control.account
+ account = gc_control.account
room_jid = gc_control.room_jid
- if gajim.gc_connected[acct].has_key(room_jid) and \
- gajim.gc_connected[acct][room_jid]:
- rooms.append((room_jid, acct))
+ if gajim.gc_connected[account].has_key(room_jid) and \
+ gajim.gc_connected[account][room_jid]:
+ rooms.append((room_jid, account))
if len(rooms):
- submenu = gtk.Menu()
- invite_menuitem.set_submenu(submenu)
+ item = gtk.SeparatorMenuItem() # separator
+ submenu.append(item)
for (room_jid, acct) in rooms:
menuitem = gtk.MenuItem(room_jid.split('@')[0])
menuitem.connect('activate', self.on_invite_to_room,
[(contact, account)], room_jid, acct)
submenu.append(menuitem)
- else:
- invite_menuitem.set_sensitive(False)
rename_menuitem.connect('activate', self.on_rename, iter, path)
remove_from_roster_menuitem.connect('activate', self.on_req_usub,
[(contact, account)])
@@ -1480,8 +1486,6 @@
remove_from_roster_menuitem]:
widget.set_sensitive(False)
- #FIXME: create menu for sub contacts
-
event_button = gtkgui_helpers.get_possible_button_event(event)
roster_contact_context_menu.attach_to_widget(self.tree, None)
@@ -1492,11 +1496,29 @@
event.time)
def on_invite_to_new_room(self, widget, list_):
- print 'TODO: create a new room'
- # Create room
- # configure room
- # send invitations
+ account_list = []
+ jid_list = []
+ for (contact, account) in list_:
+ if contact.jid not in jid_list:
+ jid_list.append(contact.jid)
+ if account not in account_list:
+ account_list.append(account)
+ for account in account_list:
+ if gajim.connections[account].muc_jid:
+ # create invities list
+ # create the room on this muc server
+ if gajim.interface.instances[account].has_key('join_gc'):
+ gajim.interface.instances[account]['join_gc'].window.destroy()
+ try:
+ gajim.interface.instances[account]['join_gc'] = \
+ dialogs.JoinGroupchatWindow(account,
+ server = gajim.connections[account].muc_jid,
+ automatic = {'invities': jid_list})
+ except RuntimeError:
+ continue
+ break
+
def on_invite_to_room(self, widget, list_, room_jid, account):
for (contact, acct) in list_:
gajim.connections[account].send_invite(room_jid, contact.jid)