コード例 #1
0
 def _NH_CFGSettingsObjectDidChange(self, notification):
     if notification.sender is BlinkSettings():
         account_manager = AccountManager()
         if 'presence.offline_note' in notification.data.modified:
             for account in (account for account in account_manager.get_accounts() if account.xcap.discovered):
                 state = BlinkPresenceState(account).offline_state
                 account.xcap_manager.set_offline_status(OfflineStatus(state) if state is not None else None)
         if 'presence.icon' in notification.data.modified:
             icon = IconManager().get('avatar')
             status_icon = Icon(icon.content, icon.content_type) if icon is not None else None
             for account in (account for account in account_manager.get_accounts() if account.xcap.discovered):
                 account.xcap_manager.set_status_icon(status_icon)
         if 'presence.current_state' in notification.data.modified:
             for account in (account for account in account_manager.get_accounts() if account.enabled and account.presence.enabled):
                 account.presence_state = BlinkPresenceState(account).online_state
     else:
         account = notification.sender
         if {'xcap.enabled', 'xcap.xcap_root'}.intersection(notification.data.modified):
             account.xcap.icon = None
             account.save()
         elif {'presence.enabled', 'display_name', 'xcap.icon'}.intersection(notification.data.modified) and account.presence.enabled:
             account.presence_state = BlinkPresenceState(account).online_state
             if account.xcap.discovered and (set(notification.data.modified) != {'xcap.icon'} or account.id in self._should_set_offline_status):
                 state = BlinkPresenceState(account).offline_state
                 account.xcap_manager.set_offline_status(OfflineStatus(state) if state is not None else None)
             if account.id in self._should_set_offline_status:  # do not use set.discard() here to avoid race conditions. it should only be removed if present.
                 self._should_set_offline_status.remove(account.id)
コード例 #2
0
    def _NH_XCAPManagerDidReloadData(self, notification):
        account = notification.sender.account
        blink_settings = BlinkSettings()
        icon_manager = IconManager()

        offline_status = notification.data.offline_status
        status_icon = notification.data.status_icon

        try:
            offline_note = next(note
                                for service in offline_status.pidf.services
                                for note in service.notes)
        except (AttributeError, StopIteration):
            offline_note = None

        blink_settings.presence.offline_note = offline_note
        blink_settings.save()

        try:
            offline_icon = next(service.icon
                                for service in offline_status.pidf.services)
        except (AttributeError, StopIteration):
            offline_icon_hash = None
        else:
            offline_icon_hash = str(offline_icon).partition(
                '#blink-icon')[2] or None

        if status_icon:
            icon_hash = hashlib.sha1(status_icon.data).hexdigest()
            icon_desc = IconDescriptor(status_icon.url, icon_hash)
            if not blink_settings.presence.icon or blink_settings.presence.icon.etag != icon_hash:
                icon = icon_manager.store_data('avatar', status_icon.data)
                blink_settings.presence.icon = IconDescriptor(
                    FileURL(icon.filename),
                    icon_hash) if icon is not None else None
                blink_settings.save()
            elif account.xcap.icon != icon_desc and icon_hash != offline_icon_hash:
                self._should_set_offline_status.add(account.id)
        else:
            if blink_settings.presence.icon is None is not account.xcap.icon:
                self._should_set_offline_status.add(account.id)
            elif blink_settings.presence.icon is account.xcap.icon is offline_status is None and account.xcap_manager.pidf_manipulation.supported:
                state = BlinkPresenceState(account).offline_state
                account.xcap_manager.set_offline_status(
                    OfflineStatus(state) if state is not None else None)
            icon_desc = None
            icon_manager.remove('avatar')
            blink_settings.presence.icon = None
            blink_settings.save()

        account.xcap.icon = icon_desc
        account.save()
コード例 #3
0
 def _NH_CFGSettingsObjectDidChange(self, notification):
     if isinstance(notification.sender, Account):
         account = notification.sender
         if set(['xcap.enabled', 'xcap.xcap_root']).intersection(notification.data.modified):
             account.xcap.icon = None
             account.save()
         elif set(['display_name', 'presence.enabled', 'presence.disable_location', 'presence.disable_timezone', 'presence.homepage', 'xcap.icon']).intersection(notification.data.modified):
             account.presence_state = self.build_pidf(account)
             if 'presence.disable_location' in notification.data.modified and not account.presence.disable_location:
                 self.get_location([account])
     elif notification.sender is SIPSimpleSettings():
         account_manager = AccountManager()
         if set(['chat.disabled', 'video.device', 'screen_sharing_server.disabled', 'file_transfer.disabled', 'presence_state.icon', 'presence_state.status', 'presence_state.note']).intersection(notification.data.modified):
             self.publish()
         if 'presence_state.offline_note' in notification.data.modified:
             for account in (account for account in account_manager.get_accounts() if hasattr(account, 'xcap') and account.enabled and account.xcap.enabled and account.xcap.discovered):
                 offline_pidf = self.build_offline_pidf(account)
                 offline_status = OfflineStatus(offline_pidf) if offline_pidf is not None else None
                 account.xcap_manager.set_offline_status(offline_status)
         if 'presence_state.icon' in notification.data.modified:
             status_icon = self.build_status_icon()
             icon = Icon(status_icon, 'image/png') if status_icon is not None else None
             for account in (account for account in account_manager.get_accounts() if hasattr(account, 'xcap') and account.enabled and account.xcap.enabled and account.xcap.discovered):
                 account.xcap_manager.set_status_icon(icon)
コード例 #4
0
 def _NH_SIPAccountDidDiscoverXCAPSupport(self, notification):
     account = notification.sender
     offline_pidf = self.build_offline_pidf(account)
     offline_status = OfflineStatus(offline_pidf) if offline_pidf is not None else None
     account.xcap_manager.set_offline_status(offline_status)