From 43aef76dd9099df689bbd08bce1ae0a7061c5e55 Mon Sep 17 00:00:00 2001 From: Nikos Kouremenos <kourem@gmail.com> Date: Sun, 11 Sep 2005 15:02:22 +0000 Subject: [PATCH] [sef and me] now we also handle receiving invitations --- src/common/connection.py | 12 +++++++++-- src/common/gajim.py | 11 +++++++++- src/dialogs.py | 43 ++++++++++++++-------------------------- src/gajim.py | 18 ++++++++++++++++- src/groupchat_window.py | 2 +- src/gtkgui.glade | 34 +++++++++++++++++++++++++------ 6 files changed, 81 insertions(+), 39 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index e6211456e5..4e3b3b8e40 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -252,11 +252,16 @@ class Connection: xtags = msg.getTags('x') encTag = None decmsg = '' + invite = None for xtag in xtags: if xtag.getNamespace() == common.xmpp.NS_ENCRYPTED: encTag = xtag break - + #invitations + for xtag in xtags: + if xtag.getNamespace() == common.xmpp.NS_MUC_USER and xtag.getTag('invite'): + invite = xtag + # chatstates - look for chatstate tags in a message children = msg.getChildren() for child in children: @@ -292,7 +297,10 @@ class Connection: log_msgtxt = _('Subject: %s\n%s') % (subject, msgtxt) gajim.logger.write('incoming', log_msgtxt, unicode(msg.getFrom()), tim = tim) - self.dispatch('MSG', (unicode(msg.getFrom()), msgtxt, tim, + if invite is not None: + self.dispatch('GC_INVITATION',(unicode(msg.getFrom()), invite)) + else: + self.dispatch('MSG', (unicode(msg.getFrom()), msgtxt, tim, encrypted, mtype, subject, None)) else: # it's type 'chat' if not msg.getTag('body') and chatstate is None: #no <body> diff --git a/src/common/gajim.py b/src/common/gajim.py index 4d3741d4fe..8081813bb4 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -77,11 +77,20 @@ def get_nick_from_jid(jid): pos = jid.find('@') return jid[:pos] +def get_server_from_jid(jid): + pos = jid.find('@') + return jid[pos:] + def get_nick_from_fjid(jid): # fake jid is the jid for a contact in a room # gaim@conference.jabber.no/nick/nick-continued return jid.split('/', 1)[1] +def get_room_name_and_server_from_room_jid(jid): + room_name = get_nick_from_jid(jid) + server = get_server_from_jid(jid) + return room_name, server + def get_room_and_nick_from_fjid(jid): # fake jid is the jid for a contact in a room # gaim@conference.jabber.no/nick/nick-continued @@ -132,7 +141,7 @@ def construct_fjid(room_jid, nick): ''' nick is in utf8 (taken from treeview); room_jid is in unicode''' # fake jid is the jid for a contact in a room # gaim@conference.jabber.org/nick - if type(nick) is str: + if isinstance(nick, str): nick = unicode(nick, 'utf-8') return room_jid + '/' + nick diff --git a/src/dialogs.py b/src/dialogs.py index c56c2bfd66..8d4bf4d214 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -456,7 +456,8 @@ class HigDialog(gtk.MessageDialog): def get_response(self): self.show_all() - response = gtk.Dialog.run(self) + response = self.run() + #response = gtk.Dialog.run(self) self.destroy() return response @@ -1151,37 +1152,23 @@ class XMLConsoleWindow: # it's expanded!! self.input_textview.grab_focus() -class InvitationReceivedDialog(HigDialog): +class InvitationReceivedDialog: def __init__(self, plugin, account, room_jid, contact_jid, password = None, comment = None): - self.plugin = plugin - self.account = account - items = [('inv-deny', _('_Deny'), 0, 0, None), - ('inv-accept', ('_Accept'), 0, 0, None)] - - # use regular stock icons. - aliases = [('inv-deny', gtk.STOCK_CANCEL), - ('inv-accept', gtk.STOCK_APPLY),] - - gtk.stock_add(items) - factory = gtk.IconFactory() - factory.add_default() - style= window.get_style() - for new_stock, alias in aliases: - icon_set = style.lookup_icon_set(alias) - factory.add(new_stock, icon_set) - - # Create the relabeled buttons - btn_deny = gtk.Button(stock = 'inv-deny') - btn_accept = gtk.Button(stock = 'inv-accept') - - #FIXME: add pango markup + xml = gtk.glade.XML(GTKGUI_GLADE, 'invitation_received_dialog', APP) + dialog = xml.get_widget('invitation_received_dialog') + pritext = _('You have been invited to the %(room_jid)s room by %(contact_jid)s') % { 'room_jid': room_jid, 'contact_jid': contact_jid } if comment is not None: - string += '\n' + _('Comment: %s') % comment + sectext = _('Comment: %s') % comment - HigDialog.__init__(self, None, pritext, sectext, - gtk.STOCK_DIALOG_WARNING, [ [btn_deny, gtk.RESPONSE_NO], - [ btn_accept, gtk.RESPONSE_YES ] ]) + xml.get_widget('label').set_markup( + '<span size="larger" weight="bold">' + pritext + '</span>\n\n' + sectext) + response = dialog.run() + dialog.destroy() + if response == gtk.RESPONSE_YES: + room, server = gajim.get_room_name_and_server_from_room_jid(room_jid) + JoinGroupchatWindow(plugin, account, server = server, room = room) + diff --git a/src/gajim.py b/src/gajim.py index 7586bc4e9e..6965e93fdf 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -671,7 +671,22 @@ class Interface: if not self.windows[account]['gc_config'].has_key(jid): self.windows[account]['gc_config'][jid] = \ config.GroupchatConfigWindow(self, account, jid, array[1]) - + + def handle_event_gc_invitation(self, account, array): + #('GC_INVITATION', (unicode(msg.getFrom()), invite)) + items = array[1].getChildren() + password = None + reason = None + for item in items: + if item.getName() == 'invite': + contact_jid = item.getAttr('from') + reason = item.getTagData('reason') + if item.getName() == 'password': + password = item.getData() + + dialogs.InvitationReceivedDialog(self, account, array[0], contact_jid, + password, reason) + def handle_event_bad_passphrase(self, account, array): use_gpg_agent = gajim.config.get('use_gpg_agent') if use_gpg_agent: @@ -987,6 +1002,7 @@ class Interface: 'GC_MSG': self.handle_event_gc_msg, 'GC_SUBJECT': self.handle_event_gc_subject, 'GC_CONFIG': self.handle_event_gc_config, + 'GC_INVITATION': self.handle_event_gc_invitation, 'BAD_PASSPHRASE': self.handle_event_bad_passphrase, 'ROSTER_INFO': self.handle_event_roster_info, 'BOOKMARKS': self.handle_event_bookmarks, diff --git a/src/groupchat_window.py b/src/groupchat_window.py index 2350e1d7fb..db80331e20 100644 --- a/src/groupchat_window.py +++ b/src/groupchat_window.py @@ -665,7 +665,7 @@ class GroupchatWindow(chat.Chat): splitted_arg = after_command.split() if len(splitted_arg): jid_to_invite = splitted_arg[0] - reason = ' '.join(a[1:]) + reason = ' '.join(splitted_arg[1:]) gajim.connections[self.account].send_invite(room_jid, jid_to_invite, reason) return # don't print the command diff --git a/src/gtkgui.glade b/src/gtkgui.glade index 2eeb9f2c45..490ca48981 100644 --- a/src/gtkgui.glade +++ b/src/gtkgui.glade @@ -18991,7 +18991,6 @@ Maybe I'll refactor later</property> <widget class="GtkDialog" id="invitation_received_dialog"> <property name="border_width">6</property> - <property name="visible">True</property> <property name="title" translatable="yes">Invitation Received</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> @@ -19018,13 +19017,13 @@ Maybe I'll refactor later</property> <property name="layout_style">GTK_BUTTONBOX_END</property> <child> - <widget class="GtkButton" id="button28"> + <widget class="GtkButton" id="deny_button"> <property name="visible">True</property> <property name="can_default">True</property> <property name="can_focus">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> - <property name="response_id">0</property> + <property name="response_id">-9</property> <child> <widget class="GtkAlignment" id="alignment95"> @@ -19093,13 +19092,14 @@ Maybe I'll refactor later</property> </child> <child> - <widget class="GtkButton" id="button29"> + <widget class="GtkButton" id="accept_button"> <property name="visible">True</property> <property name="can_default">True</property> + <property name="has_default">True</property> <property name="can_focus">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> - <property name="response_id">0</property> + <property name="response_id">-8</property> <child> <widget class="GtkAlignment" id="alignment94"> @@ -19176,7 +19176,29 @@ Maybe I'll refactor later</property> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">True</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> </child> </widget> </child> -- GitLab