[sef and me] now we also handle receiving invitations
This commit is contained in:
		
							parent
							
								
									a311b5dd61
								
							
						
					
					
						commit
						43aef76dd9
					
				
					 6 changed files with 80 additions and 38 deletions
				
			
		|  | @ -252,10 +252,15 @@ class Connection: | ||||||
| 		xtags = msg.getTags('x') | 		xtags = msg.getTags('x') | ||||||
| 		encTag = None | 		encTag = None | ||||||
| 		decmsg = '' | 		decmsg = '' | ||||||
|  | 		invite = None | ||||||
| 		for xtag in xtags: | 		for xtag in xtags: | ||||||
| 			if xtag.getNamespace() == common.xmpp.NS_ENCRYPTED: | 			if xtag.getNamespace() == common.xmpp.NS_ENCRYPTED: | ||||||
| 				encTag = xtag | 				encTag = xtag | ||||||
| 				break | 				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 | 		# chatstates - look for chatstate tags in a message | ||||||
| 		children = msg.getChildren() | 		children = msg.getChildren() | ||||||
|  | @ -292,7 +297,10 @@ class Connection: | ||||||
| 				log_msgtxt = _('Subject: %s\n%s') % (subject, msgtxt) | 				log_msgtxt = _('Subject: %s\n%s') % (subject, msgtxt) | ||||||
| 			gajim.logger.write('incoming', log_msgtxt, unicode(msg.getFrom()), | 			gajim.logger.write('incoming', log_msgtxt, unicode(msg.getFrom()), | ||||||
| 				tim = tim) | 				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)) | 				encrypted, mtype, subject, None)) | ||||||
| 		else: # it's type 'chat' | 		else: # it's type 'chat' | ||||||
| 			if not msg.getTag('body') and chatstate is None: #no <body> | 			if not msg.getTag('body') and chatstate is None: #no <body> | ||||||
|  |  | ||||||
|  | @ -77,11 +77,20 @@ def get_nick_from_jid(jid): | ||||||
| 	pos = jid.find('@') | 	pos = jid.find('@') | ||||||
| 	return jid[:pos] | 	return jid[:pos] | ||||||
| 
 | 
 | ||||||
|  | def get_server_from_jid(jid): | ||||||
|  | 	pos = jid.find('@') | ||||||
|  | 	return jid[pos:] | ||||||
|  | 
 | ||||||
| def get_nick_from_fjid(jid): | def get_nick_from_fjid(jid): | ||||||
| 	# fake jid is the jid for a contact in a room | 	# fake jid is the jid for a contact in a room | ||||||
| 	# gaim@conference.jabber.no/nick/nick-continued | 	# gaim@conference.jabber.no/nick/nick-continued | ||||||
| 	return jid.split('/', 1)[1] | 	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): | def get_room_and_nick_from_fjid(jid): | ||||||
| 	# fake jid is the jid for a contact in a room | 	# fake jid is the jid for a contact in a room | ||||||
| 	# gaim@conference.jabber.no/nick/nick-continued | 	# 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''' | 	''' nick is in utf8 (taken from treeview); room_jid is in unicode''' | ||||||
| 	# fake jid is the jid for a contact in a room | 	# fake jid is the jid for a contact in a room | ||||||
| 	# gaim@conference.jabber.org/nick | 	# gaim@conference.jabber.org/nick | ||||||
| 	if type(nick) is str: | 	if isinstance(nick, str): | ||||||
| 		nick = unicode(nick, 'utf-8') | 		nick = unicode(nick, 'utf-8') | ||||||
| 	return room_jid + '/' + nick | 	return room_jid + '/' + nick | ||||||
| 	 | 	 | ||||||
|  |  | ||||||
|  | @ -456,7 +456,8 @@ class HigDialog(gtk.MessageDialog): | ||||||
| 
 | 
 | ||||||
| 	def get_response(self): | 	def get_response(self): | ||||||
| 		self.show_all() | 		self.show_all() | ||||||
| 		response = gtk.Dialog.run(self) | 		response = self.run() | ||||||
|  | 		#response = gtk.Dialog.run(self) | ||||||
| 		self.destroy() | 		self.destroy() | ||||||
| 		return response | 		return response | ||||||
| 
 | 
 | ||||||
|  | @ -1151,37 +1152,23 @@ class XMLConsoleWindow: | ||||||
| 			# it's expanded!! | 			# it's expanded!! | ||||||
| 			self.input_textview.grab_focus() | 			self.input_textview.grab_focus() | ||||||
| 
 | 
 | ||||||
| class InvitationReceivedDialog(HigDialog): | class InvitationReceivedDialog: | ||||||
| 	def __init__(self, plugin, account, room_jid, contact_jid, password = None, comment = None): | 	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), | 		xml = gtk.glade.XML(GTKGUI_GLADE, 'invitation_received_dialog', APP) | ||||||
| 					('inv-accept', ('_Accept'), 0, 0, None)] | 		dialog = xml.get_widget('invitation_received_dialog') | ||||||
| 		 | 		 | ||||||
| 		# 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 |  | ||||||
| 		pritext = _('You have been invited to the %(room_jid)s room by %(contact_jid)s') % { | 		pritext = _('You have been invited to the %(room_jid)s room by %(contact_jid)s') % { | ||||||
| 		 'room_jid': room_jid, 'contact_jid': contact_jid } | 		 'room_jid': room_jid, 'contact_jid': contact_jid } | ||||||
| 		if comment is not None: | 		if comment is not None: | ||||||
| 			string += '\n' + _('Comment: %s') % comment | 			sectext = _('Comment: %s') % comment | ||||||
| 
 | 
 | ||||||
| 		HigDialog.__init__(self, None, pritext, sectext, | 		xml.get_widget('label').set_markup( | ||||||
| 			gtk.STOCK_DIALOG_WARNING, [ [btn_deny, gtk.RESPONSE_NO], | 			'<span size="larger" weight="bold">' + pritext + '</span>\n\n' + sectext) | ||||||
| 			[ btn_accept, gtk.RESPONSE_YES ] ]) | 		 | ||||||
|  | 		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) | ||||||
| 			 | 			 | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								src/gajim.py
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								src/gajim.py
									
										
									
									
									
								
							|  | @ -672,6 +672,21 @@ class Interface: | ||||||
| 			self.windows[account]['gc_config'][jid] = \ | 			self.windows[account]['gc_config'][jid] = \ | ||||||
| 			config.GroupchatConfigWindow(self, account, jid, array[1]) | 			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): | 	def handle_event_bad_passphrase(self, account, array): | ||||||
| 		use_gpg_agent = gajim.config.get('use_gpg_agent') | 		use_gpg_agent = gajim.config.get('use_gpg_agent') | ||||||
| 		if use_gpg_agent: | 		if use_gpg_agent: | ||||||
|  | @ -987,6 +1002,7 @@ class Interface: | ||||||
| 			'GC_MSG': self.handle_event_gc_msg, | 			'GC_MSG': self.handle_event_gc_msg, | ||||||
| 			'GC_SUBJECT': self.handle_event_gc_subject, | 			'GC_SUBJECT': self.handle_event_gc_subject, | ||||||
| 			'GC_CONFIG': self.handle_event_gc_config, | 			'GC_CONFIG': self.handle_event_gc_config, | ||||||
|  | 			'GC_INVITATION': self.handle_event_gc_invitation, | ||||||
| 			'BAD_PASSPHRASE': self.handle_event_bad_passphrase, | 			'BAD_PASSPHRASE': self.handle_event_bad_passphrase, | ||||||
| 			'ROSTER_INFO': self.handle_event_roster_info, | 			'ROSTER_INFO': self.handle_event_roster_info, | ||||||
| 			'BOOKMARKS': self.handle_event_bookmarks, | 			'BOOKMARKS': self.handle_event_bookmarks, | ||||||
|  |  | ||||||
|  | @ -665,7 +665,7 @@ class GroupchatWindow(chat.Chat): | ||||||
| 				splitted_arg = after_command.split() | 				splitted_arg = after_command.split() | ||||||
| 				if len(splitted_arg):  | 				if len(splitted_arg):  | ||||||
| 					jid_to_invite = splitted_arg[0] | 					jid_to_invite = splitted_arg[0] | ||||||
| 					reason = ' '.join(a[1:]) | 					reason = ' '.join(splitted_arg[1:]) | ||||||
| 					gajim.connections[self.account].send_invite(room_jid, | 					gajim.connections[self.account].send_invite(room_jid, | ||||||
| 						jid_to_invite, reason) | 						jid_to_invite, reason) | ||||||
| 					return # don't print the command | 					return # don't print the command | ||||||
|  |  | ||||||
|  | @ -18991,7 +18991,6 @@ Maybe I'll refactor later</property> | ||||||
| 
 | 
 | ||||||
| <widget class="GtkDialog" id="invitation_received_dialog"> | <widget class="GtkDialog" id="invitation_received_dialog"> | ||||||
|   <property name="border_width">6</property> |   <property name="border_width">6</property> | ||||||
|   <property name="visible">True</property> |  | ||||||
|   <property name="title" translatable="yes">Invitation Received</property> |   <property name="title" translatable="yes">Invitation Received</property> | ||||||
|   <property name="type">GTK_WINDOW_TOPLEVEL</property> |   <property name="type">GTK_WINDOW_TOPLEVEL</property> | ||||||
|   <property name="window_position">GTK_WIN_POS_NONE</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> | 	  <property name="layout_style">GTK_BUTTONBOX_END</property> | ||||||
| 
 | 
 | ||||||
| 	  <child> | 	  <child> | ||||||
| 	    <widget class="GtkButton" id="button28"> | 	    <widget class="GtkButton" id="deny_button"> | ||||||
| 	      <property name="visible">True</property> | 	      <property name="visible">True</property> | ||||||
| 	      <property name="can_default">True</property> | 	      <property name="can_default">True</property> | ||||||
| 	      <property name="can_focus">True</property> | 	      <property name="can_focus">True</property> | ||||||
| 	      <property name="relief">GTK_RELIEF_NORMAL</property> | 	      <property name="relief">GTK_RELIEF_NORMAL</property> | ||||||
| 	      <property name="focus_on_click">True</property> | 	      <property name="focus_on_click">True</property> | ||||||
| 	      <property name="response_id">0</property> | 	      <property name="response_id">-9</property> | ||||||
| 
 | 
 | ||||||
| 	      <child> | 	      <child> | ||||||
| 		<widget class="GtkAlignment" id="alignment95"> | 		<widget class="GtkAlignment" id="alignment95"> | ||||||
|  | @ -19093,13 +19092,14 @@ Maybe I'll refactor later</property> | ||||||
| 	  </child> | 	  </child> | ||||||
| 
 | 
 | ||||||
| 	  <child> | 	  <child> | ||||||
| 	    <widget class="GtkButton" id="button29"> | 	    <widget class="GtkButton" id="accept_button"> | ||||||
| 	      <property name="visible">True</property> | 	      <property name="visible">True</property> | ||||||
| 	      <property name="can_default">True</property> | 	      <property name="can_default">True</property> | ||||||
|  | 	      <property name="has_default">True</property> | ||||||
| 	      <property name="can_focus">True</property> | 	      <property name="can_focus">True</property> | ||||||
| 	      <property name="relief">GTK_RELIEF_NORMAL</property> | 	      <property name="relief">GTK_RELIEF_NORMAL</property> | ||||||
| 	      <property name="focus_on_click">True</property> | 	      <property name="focus_on_click">True</property> | ||||||
| 	      <property name="response_id">0</property> | 	      <property name="response_id">-8</property> | ||||||
| 
 | 
 | ||||||
| 	      <child> | 	      <child> | ||||||
| 		<widget class="GtkAlignment" id="alignment94"> | 		<widget class="GtkAlignment" id="alignment94"> | ||||||
|  | @ -19176,7 +19176,29 @@ Maybe I'll refactor later</property> | ||||||
|       </child> |       </child> | ||||||
| 
 | 
 | ||||||
|       <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> |       </child> | ||||||
|     </widget> |     </widget> | ||||||
|   </child> |   </child> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue