Ticket #378: add_to_roster.diff

File add_to_roster.diff, 6.4 kB (added by roidelapluie, 17 months ago)
  • src/dialogs.py

     
    20342034                        # it's expanded!! 
    20352035                        self.input_textview.grab_focus() 
    20362036 
     2037class RosterItemExchangeWindow: 
     2038        ''' Windows used when someone send you a exchange contact suggestion ''' 
     2039        def __init__(self, account, action, exchange_list, jid_from, message_body): 
     2040                self.account = account 
     2041                self.action = action 
     2042                self.exchange_list = exchange_list 
     2043                self.message_body = message_body 
     2044                self.jid_from = jid_from 
     2045 
     2046                # Connect to glade 
     2047                self.xml = gtkgui_helpers.get_glade('roster_item_exchange_window.glade') 
     2048                self.window = self.xml.get_widget('roster_item_exchange_window') 
     2049 
     2050                # Add Widgets. 
     2051                for widget_to_add in ['cancel_button', 'accept_button', 'type_label', 
     2052                'body_scrolledwidow', 'body_textview', 'items_list_treeview']: 
     2053                        self.__dict__[widget_to_add] = self.xml.get_widget(widget_to_add) 
     2054 
     2055                # Set labels 
     2056                #self.action can be 'add', 'modify' or 'remove' 
     2057                self.type_label.set_label(\ 
     2058                _('<b>%s</b> would like you to <b>%s</b> some contacts in your roster.') \ 
     2059                        % (jid_from, _(self.action))) 
     2060                if message_body: 
     2061                        buffer = self.body_textview.get_buffer() 
     2062                        buffer.set_text(self.message_body) 
     2063                else: 
     2064                        self.body_scrolledwindow.hide() 
     2065                # Treeview 
     2066                model = gtk.ListStore(bool, str, str, str, str) 
     2067                self.items_list_treeview.set_model(model) 
     2068                # columns 
     2069                renderer1 = gtk.CellRendererToggle() 
     2070                renderer1.set_property('activatable', True) 
     2071                renderer1.connect('toggled', self.toggled_callback) 
     2072                self.items_list_treeview.insert_column_with_attributes(-1, 
     2073                                        _(self.action), renderer1, active = 0) 
     2074                renderer2 = gtk.CellRendererText() 
     2075                self.items_list_treeview.insert_column_with_attributes(-1, 
     2076                                        _('Jabber ID'), renderer2, text = 1) 
     2077                renderer3 = gtk.CellRendererText() 
     2078                self.items_list_treeview.insert_column_with_attributes(-1, 
     2079                                        _('Name'), renderer3, text = 2) 
     2080                renderer4 = gtk.CellRendererText() 
     2081                self.items_list_treeview.insert_column_with_attributes(-1, 
     2082                                        _('Groups'), renderer4, text = 3) 
     2083 
     2084                # Init contacts 
     2085                model = self.items_list_treeview.get_model() 
     2086                model.clear() 
     2087 
     2088                for jid in self.exchange_list: 
     2089                        groups = '' 
     2090                        is_in_roster = True 
     2091                        contact = gajim.contacts.get_contact_with_highest_priority(\ 
     2092                                self.account, jid) 
     2093                        if not contact: 
     2094                                is_in_roster = False 
     2095                        name = self.exchange_list[jid][0] 
     2096                        num_list = len(self.exchange_list[jid][1]) 
     2097                        current = 0 
     2098                        for group in self.exchange_list[jid][1]: 
     2099                                current += 1 
     2100                                if contact and not group in contact.groups: 
     2101                                        is_in_roster = False 
     2102                                if current == num_list: 
     2103                                        groups = groups + group 
     2104                                else: 
     2105                                        groups = groups + group + ', ' 
     2106                        if not is_in_roster: 
     2107                                iter = model.append() 
     2108                                model.set(iter, 0, True, 1, jid, 2, name, 3, groups) 
     2109 
     2110                self.window.show_all() 
     2111 
     2112                self.xml.signal_autoconnect(self) 
     2113 
     2114        def toggled_callback(self, cell, path): 
     2115                model = self.items_list_treeview.get_model() 
     2116                iter = model.get_iter(path) 
     2117                model[iter][0] = not cell.get_active() 
     2118 
     2119        def on_accept_button_clicked(self, widget): 
     2120                model = self.items_list_treeview.get_model() 
     2121                iter = model.get_iter_root() 
     2122                if self.action == 'add': 
     2123                        a = 0 
     2124                        while iter: 
     2125                                if model[iter][0]: 
     2126                                        a+=1 
     2127                                        # it is selected 
     2128                                        #remote_jid = model[iter][1].decode('utf-8') 
     2129                                        message = _('%s suggested me to add you in my roster.' % self.jid_from) 
     2130                                        # keep same groups and same nickname 
     2131                                        groups = model[iter][3].split(', ') 
     2132                                        if groups == ['']: 
     2133                                                groups = [] 
     2134                                        gajim.interface.roster.req_sub(self, model[iter][1], message, 
     2135                                                self.account, groups = groups, 
     2136                                                nickname = model[iter][2], auto_auth = True) 
     2137                                iter = model.iter_next(iter) 
     2138                        InformationDialog('Added  %s contacts' % str(a)) 
     2139                self.window.destroy() 
     2140 
    20372141class PrivacyListWindow: 
    20382142        '''Window that is used for creating NEW or EDITING already there privacy 
    20392143        lists''' 
  • src/gajim.py

     
    18141814                        _('You are already connected to this account with the same resource. Please type a new one'), input_str = gajim.connections[account].server_resource, 
    18151815                        is_modal = False, ok_handler = on_ok) 
    18161816 
     1817        def handle_event_roster_item_exchange(self, account, data): 
     1818                # data = (action in [add, delete, modify], exchange_list, jid_from, body) 
     1819                dialogs.RosterItemExchangeWindow(account, data[0], data[1], data[2], data[3]) 
     1820 
    18171821        def read_sleepy(self): 
    18181822                '''Check idle status and change that status if needed''' 
    18191823                if not self.sleeper.poll(): 
     
    21412145                        'SEARCH_FORM': self.handle_event_search_form, 
    21422146                        'SEARCH_RESULT': self.handle_event_search_result, 
    21432147                        'RESOURCE_CONFLICT': self.handle_event_resource_conflict, 
     2148                        'ROSTERX': self.handle_event_roster_item_exchange, 
    21442149                } 
    21452150                gajim.handlers = self.handlers 
    21462151 
  • src/common/connection_handlers.py

     
    14081408                                self.dispatch('GMAIL_NOTIFY', (jid, newmsgs, gmail_messages_list)) 
    14091409                        raise common.xmpp.NodeProcessed 
    14101410 
     1411        def _rosterItemExchangeCB(self, con, msg): 
     1412                ''' XEP-0144 Roster Item Echange ''' 
     1413                exchange_items_list = {} 
     1414                jid_from = msg.getAttr('from') 
     1415                items_list = msg.getTag('x').getChildren() 
     1416                action = items_list[0].getAttr('action') 
     1417                if action == None: 
     1418                        action = 'add' 
     1419                for item in msg.getTag('x').getChildren(): 
     1420                        jid = item.getAttr('jid') 
     1421                        name = item.getAttr('name') 
     1422                        groups=[] 
     1423                        for group in item.getChildren(): 
     1424                                groups.append(group.getData()) 
     1425                        exchange_items_list[jid] = [] 
     1426                        exchange_items_list[jid].append(name) 
     1427                        exchange_items_list[jid].append(groups) 
     1428                self.dispatch('ROSTERX', (action, exchange_items_list, jid_from, msg.getBody())) 
     1429 
    14111430        def _messageCB(self, con, msg): 
    14121431                '''Called when we receive a message''' 
    14131432                # check if the message is pubsub#event 
    14141433                if msg.getTag('event') is not None: 
    14151434                        self._pubsubEventCB(con, msg) 
    14161435                        return 
     1436                # check if the message is a roster item exchange (XEP-0144) 
     1437                if msg.getTag('x') and msg.getTag('x').namespace == \ 
     1438                common.xmpp.NS_ROSTERX: 
     1439                        self._rosterItemExchangeCB(con, msg) 
     1440                        return 
    14171441                # check if the message is a xep70-confirmation-request 
    14181442                if msg.getTag('confirm') and msg.getTag('confirm').namespace == \ 
    14191443                common.xmpp.NS_HTTP_AUTH: